From b2517b47ddc163a87e03538a28f5655c7cc8f9e2 Mon Sep 17 00:00:00 2001 From: asb2m10 Date: Fri, 24 Jul 2015 00:21:23 -0400 Subject: [PATCH 01/14] Upgraded to JUCE 3.2. Added Dexed_data user direcotry and fixed Linux display issues. --- Builds/Linux/Makefile | 16 +- Builds/MacOSX/Dexed.xcodeproj/project.pbxproj | 5215 +++++++---------- .../UserInterfaceState.xcuserstate | Bin 185897 -> 188920 bytes Builds/VisualStudio2012/Dexed.vcxproj | 25 +- Builds/VisualStudio2012/Dexed.vcxproj.filters | 27 + Dexed.jucer | 6 +- JuceLibraryCode/AppConfig.h | 13 + .../buffers/juce_AudioDataConverters.cpp | 2 +- .../buffers/juce_AudioDataConverters.h | 44 +- .../buffers/juce_AudioSampleBuffer.cpp | 9 +- .../buffers/juce_AudioSampleBuffer.h | 2 +- .../buffers/juce_FloatVectorOperations.cpp | 292 +- .../buffers/juce_FloatVectorOperations.h | 44 +- .../juce_audio_basics/effects/juce_Decibels.h | 2 +- .../juce_audio_basics/effects/juce_FFT.cpp | 277 + .../juce_audio_basics/effects/juce_FFT.h | 92 + .../effects/juce_IIRFilter.cpp | 8 +- .../effects/juce_IIRFilter.h | 2 +- .../effects/juce_LagrangeInterpolator.cpp | 12 +- .../effects/juce_LagrangeInterpolator.h | 2 +- .../juce_audio_basics/effects/juce_Reverb.h | 137 +- .../juce_audio_basics/juce_audio_basics.cpp | 6 +- .../juce_audio_basics/juce_audio_basics.h | 6 +- .../juce_audio_basics/juce_audio_basics.mm | 2 +- .../juce_audio_basics/juce_module_info | 2 +- .../midi/juce_MidiBuffer.cpp | 10 +- .../juce_audio_basics/midi/juce_MidiBuffer.h | 2 +- .../juce_audio_basics/midi/juce_MidiFile.cpp | 2 +- .../juce_audio_basics/midi/juce_MidiFile.h | 2 +- .../midi/juce_MidiKeyboardState.cpp | 4 +- .../midi/juce_MidiKeyboardState.h | 2 +- .../midi/juce_MidiMessage.cpp | 2 +- .../juce_audio_basics/midi/juce_MidiMessage.h | 2 +- .../midi/juce_MidiMessageSequence.cpp | 38 +- .../midi/juce_MidiMessageSequence.h | 4 +- .../sources/juce_AudioSource.h | 2 +- .../sources/juce_BufferingAudioSource.cpp | 2 +- .../sources/juce_BufferingAudioSource.h | 2 +- .../juce_ChannelRemappingAudioSource.cpp | 2 +- .../juce_ChannelRemappingAudioSource.h | 2 +- .../sources/juce_IIRFilterAudioSource.cpp | 2 +- .../sources/juce_IIRFilterAudioSource.h | 2 +- .../sources/juce_MixerAudioSource.cpp | 2 +- .../sources/juce_MixerAudioSource.h | 2 +- .../sources/juce_PositionableAudioSource.h | 2 +- .../sources/juce_ResamplingAudioSource.cpp | 18 +- .../sources/juce_ResamplingAudioSource.h | 2 +- .../sources/juce_ReverbAudioSource.cpp | 2 +- .../sources/juce_ReverbAudioSource.h | 2 +- .../sources/juce_ToneGeneratorAudioSource.cpp | 2 +- .../sources/juce_ToneGeneratorAudioSource.h | 2 +- .../synthesisers/juce_Synthesiser.cpp | 200 +- .../synthesisers/juce_Synthesiser.h | 70 +- .../audio_cd/juce_AudioCDBurner.h | 2 +- .../audio_cd/juce_AudioCDReader.cpp | 2 +- .../audio_cd/juce_AudioCDReader.h | 2 +- .../audio_io/juce_AudioDeviceManager.cpp | 36 +- .../audio_io/juce_AudioDeviceManager.h | 3 +- .../audio_io/juce_AudioIODevice.cpp | 2 +- .../audio_io/juce_AudioIODevice.h | 2 +- .../audio_io/juce_AudioIODeviceType.cpp | 4 +- .../audio_io/juce_AudioIODeviceType.h | 4 +- .../audio_io/juce_SystemAudioVolume.h | 2 +- .../juce_audio_devices/juce_audio_devices.cpp | 4 +- .../juce_audio_devices/juce_audio_devices.h | 13 +- .../juce_audio_devices/juce_audio_devices.mm | 2 +- .../juce_audio_devices/juce_module_info | 2 +- .../midi_io/juce_MidiInput.h | 16 +- .../midi_io/juce_MidiMessageCollector.cpp | 2 +- .../midi_io/juce_MidiMessageCollector.h | 2 +- .../midi_io/juce_MidiOutput.cpp | 2 +- .../midi_io/juce_MidiOutput.h | 31 +- .../native/juce_MidiDataConcatenator.h | 2 +- .../native/juce_android_Audio.cpp | 2 +- .../native/juce_android_Midi.cpp | 2 +- .../native/juce_android_OpenSL.cpp | 14 +- .../native/juce_ios_Audio.cpp | 2 +- .../native/juce_linux_ALSA.cpp | 92 +- .../native/juce_linux_AudioCDReader.cpp | 2 +- .../native/juce_linux_JackAudio.cpp | 2 +- .../native/juce_linux_Midi.cpp | 31 +- .../native/juce_mac_AudioCDBurner.mm | 2 +- .../native/juce_mac_AudioCDReader.mm | 2 +- .../native/juce_mac_CoreAudio.cpp | 12 +- .../native/juce_mac_CoreMidi.cpp | 72 +- .../native/juce_win32_ASIO.cpp | 116 +- .../native/juce_win32_AudioCDBurner.cpp | 2 +- .../native/juce_win32_AudioCDReader.cpp | 2 +- .../native/juce_win32_DirectSound.cpp | 8 +- .../native/juce_win32_Midi.cpp | 18 +- .../native/juce_win32_WASAPI.cpp | 494 +- .../sources/juce_AudioSourcePlayer.cpp | 2 +- .../sources/juce_AudioSourcePlayer.h | 2 +- .../sources/juce_AudioTransportSource.cpp | 2 +- .../sources/juce_AudioTransportSource.h | 2 +- .../juce_audio_formats/codecs/flac/all.h | 2 +- .../juce_audio_formats/codecs/flac/alloc.h | 4 +- .../juce_audio_formats/codecs/flac/assert.h | 2 +- .../juce_audio_formats/codecs/flac/callback.h | 2 +- .../juce_audio_formats/codecs/flac/compat.h | 35 +- .../juce_audio_formats/codecs/flac/endswap.h | 30 +- .../juce_audio_formats/codecs/flac/export.h | 6 +- .../juce_audio_formats/codecs/flac/format.h | 6 +- .../codecs/flac/libFLAC/bitmath.c | 5 +- .../codecs/flac/libFLAC/bitreader.c | 16 +- .../codecs/flac/libFLAC/bitwriter.c | 36 +- .../codecs/flac/libFLAC/cpu.c | 605 +- .../codecs/flac/libFLAC/crc.c | 4 +- .../codecs/flac/libFLAC/fixed.c | 19 +- .../codecs/flac/libFLAC/float.c | 4 +- .../codecs/flac/libFLAC/format.c | 11 +- .../codecs/flac/libFLAC/include/private/all.h | 2 +- .../flac/libFLAC/include/private/bitmath.h | 81 +- .../flac/libFLAC/include/private/bitreader.h | 13 +- .../flac/libFLAC/include/private/bitwriter.h | 2 +- .../codecs/flac/libFLAC/include/private/cpu.h | 52 +- .../codecs/flac/libFLAC/include/private/crc.h | 4 +- .../flac/libFLAC/include/private/fixed.h | 19 +- .../flac/libFLAC/include/private/float.h | 2 +- .../flac/libFLAC/include/private/format.h | 2 +- .../codecs/flac/libFLAC/include/private/lpc.h | 43 +- .../codecs/flac/libFLAC/include/private/md5.h | 8 +- .../flac/libFLAC/include/private/memory.h | 2 +- .../flac/libFLAC/include/private/metadata.h | 2 +- .../libFLAC/include/private/stream_encoder.h | 67 + .../include/private/stream_encoder_framing.h | 2 +- .../flac/libFLAC/include/private/window.h | 4 +- .../flac/libFLAC/include/protected/all.h | 2 +- .../include/protected/stream_decoder.h | 3 +- .../include/protected/stream_encoder.h | 9 +- .../codecs/flac/libFLAC/lpc_flac.c | 30 +- .../codecs/flac/libFLAC/md5.c | 309 +- .../codecs/flac/libFLAC/memory.c | 29 +- .../codecs/flac/libFLAC/stream_decoder.c | 223 +- .../codecs/flac/libFLAC/stream_encoder.c | 299 +- .../flac/libFLAC/stream_encoder_framing.c | 4 +- .../codecs/flac/libFLAC/window_flac.c | 81 +- .../juce_audio_formats/codecs/flac/metadata.h | 4 +- .../juce_audio_formats/codecs/flac/ordinals.h | 2 +- .../codecs/flac/stream_decoder.h | 2 +- .../codecs/flac/stream_encoder.h | 69 +- .../codecs/flac/win_utf8_io.h | 69 + .../codecs/juce_AiffAudioFormat.cpp | 182 +- .../codecs/juce_AiffAudioFormat.h | 2 +- .../codecs/juce_CoreAudioFormat.cpp | 2 +- .../codecs/juce_CoreAudioFormat.h | 2 +- .../codecs/juce_FlacAudioFormat.cpp | 2 +- .../codecs/juce_FlacAudioFormat.h | 2 +- .../codecs/juce_LAMEEncoderAudioFormat.cpp | 6 +- .../codecs/juce_LAMEEncoderAudioFormat.h | 2 +- .../codecs/juce_MP3AudioFormat.cpp | 29 +- .../codecs/juce_MP3AudioFormat.h | 6 +- .../codecs/juce_OggVorbisAudioFormat.cpp | 4 +- .../codecs/juce_OggVorbisAudioFormat.h | 2 +- .../codecs/juce_QuickTimeAudioFormat.cpp | 12 +- .../codecs/juce_QuickTimeAudioFormat.h | 2 +- .../codecs/juce_WavAudioFormat.cpp | 76 +- .../codecs/juce_WavAudioFormat.h | 2 +- .../codecs/juce_WindowsMediaAudioFormat.cpp | 2 +- .../codecs/juce_WindowsMediaAudioFormat.h | 2 +- .../codecs/oggvorbis/bitwise.c | 4 + .../oggvorbis/libvorbis-1.3.2/lib/floor1.c | 6 +- .../libvorbis-1.3.2/lib/sharedbook.c | 4 + .../libvorbis-1.3.2/lib/vorbisfile.c | 4 + .../format/juce_AudioFormat.cpp | 2 +- .../format/juce_AudioFormat.h | 4 +- .../format/juce_AudioFormatManager.cpp | 2 +- .../format/juce_AudioFormatManager.h | 2 +- .../format/juce_AudioFormatReader.cpp | 28 +- .../format/juce_AudioFormatReader.h | 8 +- .../format/juce_AudioFormatReaderSource.cpp | 2 +- .../format/juce_AudioFormatReaderSource.h | 6 +- .../format/juce_AudioFormatWriter.cpp | 2 +- .../format/juce_AudioFormatWriter.h | 2 +- .../format/juce_AudioSubsectionReader.cpp | 13 +- .../format/juce_AudioSubsectionReader.h | 5 +- .../juce_BufferingAudioFormatReader.cpp | 5 +- .../format/juce_BufferingAudioFormatReader.h | 2 +- .../juce_MemoryMappedAudioFormatReader.h | 14 +- .../juce_audio_formats/juce_audio_formats.cpp | 2 +- .../juce_audio_formats/juce_audio_formats.h | 6 +- .../juce_audio_formats/juce_audio_formats.mm | 2 +- .../juce_audio_formats/juce_module_info | 2 +- .../sampler/juce_Sampler.cpp | 4 +- .../juce_audio_formats/sampler/juce_Sampler.h | 4 +- .../AAX/juce_AAX_Wrapper.cpp | 114 +- .../AAX/juce_AAX_Wrapper.mm | 2 +- .../AU/juce_AU_Resources.r | 2 +- .../AU/juce_AU_Wrapper.mm | 221 +- .../RTAS/juce_RTAS_DigiCode1.cpp | 2 +- .../RTAS/juce_RTAS_DigiCode2.cpp | 2 +- .../RTAS/juce_RTAS_DigiCode3.cpp | 2 +- .../RTAS/juce_RTAS_DigiCode_Header.h | 2 +- .../RTAS/juce_RTAS_MacUtilities.mm | 2 +- .../RTAS/juce_RTAS_WinUtilities.cpp | 2 +- .../RTAS/juce_RTAS_Wrapper.cpp | 52 +- .../Standalone/juce_StandaloneFilterWindow.h | 34 +- .../VST/juce_VST_Wrapper.cpp | 91 +- .../VST/juce_VST_Wrapper.mm | 22 +- .../VST3/juce_VST3_Wrapper.cpp | 47 +- .../VST3/juce_VST3_Wrapper.mm | 2 +- .../juce_audio_plugin_client.h | 2 +- .../juce_audio_plugin_client/juce_module_info | 6 +- .../utility/juce_CarbonVisibility.h | 10 +- .../utility/juce_CheckSettingMacros.h | 2 +- .../utility/juce_FakeMouseMoveGenerator.h | 2 +- .../utility/juce_IncludeModuleHeaders.h | 9 +- .../utility/juce_IncludeSystemHeaders.h | 2 +- .../utility/juce_PluginHostType.h | 19 +- .../utility/juce_PluginUtilities.cpp | 4 +- .../utility/juce_WindowsHooks.h | 2 +- .../format/juce_AudioPluginFormat.cpp | 2 +- .../format/juce_AudioPluginFormat.h | 2 +- .../format/juce_AudioPluginFormatManager.cpp | 2 +- .../format/juce_AudioPluginFormatManager.h | 2 +- .../format_types/juce_AudioUnitPluginFormat.h | 2 +- .../juce_AudioUnitPluginFormat.mm | 82 +- .../format_types/juce_LADSPAPluginFormat.cpp | 2 +- .../format_types/juce_LADSPAPluginFormat.h | 2 +- .../format_types/juce_VST3Common.h | 6 +- .../format_types/juce_VST3Headers.h | 2 +- .../format_types/juce_VST3PluginFormat.cpp | 229 +- .../format_types/juce_VST3PluginFormat.h | 2 +- .../format_types/juce_VSTMidiEventList.h | 4 +- .../format_types/juce_VSTPluginFormat.cpp | 176 +- .../format_types/juce_VSTPluginFormat.h | 2 +- .../juce_audio_processors.cpp | 2 +- .../juce_audio_processors.h | 2 +- .../juce_audio_processors.mm | 2 +- .../juce_audio_processors/juce_module_info | 2 +- .../processors/juce_AudioPlayHead.h | 14 +- .../processors/juce_AudioPluginInstance.h | 2 +- .../processors/juce_AudioProcessor.cpp | 10 +- .../processors/juce_AudioProcessor.h | 78 +- .../processors/juce_AudioProcessorEditor.cpp | 2 +- .../processors/juce_AudioProcessorEditor.h | 2 +- .../processors/juce_AudioProcessorGraph.cpp | 261 +- .../processors/juce_AudioProcessorGraph.h | 141 +- .../processors/juce_AudioProcessorListener.h | 2 +- .../processors/juce_AudioProcessorParameter.h | 4 +- .../juce_GenericAudioProcessorEditor.cpp | 4 +- .../juce_GenericAudioProcessorEditor.h | 2 +- .../processors/juce_PluginDescription.cpp | 2 +- .../processors/juce_PluginDescription.h | 2 +- .../scanning/juce_KnownPluginList.cpp | 2 +- .../scanning/juce_KnownPluginList.h | 2 +- .../scanning/juce_PluginDirectoryScanner.cpp | 2 +- .../scanning/juce_PluginDirectoryScanner.h | 2 +- .../scanning/juce_PluginListComponent.cpp | 55 +- .../scanning/juce_PluginListComponent.h | 24 +- .../gui/juce_AudioAppComponent.cpp | 50 + .../gui/juce_AudioAppComponent.h | 117 + .../gui/juce_AudioDeviceSelectorComponent.cpp | 4 +- .../gui/juce_AudioDeviceSelectorComponent.h | 2 +- .../gui/juce_AudioThumbnail.cpp | 6 +- .../gui/juce_AudioThumbnail.h | 2 +- .../gui/juce_AudioThumbnailBase.h | 2 +- .../gui/juce_AudioThumbnailCache.cpp | 2 +- .../gui/juce_AudioThumbnailCache.h | 2 +- .../gui/juce_MidiKeyboardComponent.cpp | 34 +- .../gui/juce_MidiKeyboardComponent.h | 4 +- .../juce_audio_utils/juce_audio_utils.cpp | 3 +- .../juce_audio_utils/juce_audio_utils.h | 3 +- .../juce_audio_utils/juce_audio_utils.mm | 2 +- .../modules/juce_audio_utils/juce_module_info | 2 +- .../players/juce_AudioProcessorPlayer.cpp | 2 +- .../players/juce_AudioProcessorPlayer.h | 2 +- .../containers/juce_AbstractFifo.cpp | 2 +- .../juce_core/containers/juce_AbstractFifo.h | 4 +- .../modules/juce_core/containers/juce_Array.h | 41 +- .../containers/juce_ArrayAllocationBase.h | 2 +- .../containers/juce_DynamicObject.cpp | 4 +- .../juce_core/containers/juce_DynamicObject.h | 4 +- .../containers/juce_ElementComparator.h | 2 +- .../juce_core/containers/juce_HashMap.h | 2 +- .../containers/juce_LinkedListPointer.h | 2 +- .../containers/juce_NamedValueSet.cpp | 12 +- .../juce_core/containers/juce_NamedValueSet.h | 6 +- .../juce_core/containers/juce_OwnedArray.h | 2 +- .../juce_core/containers/juce_PropertySet.cpp | 2 +- .../juce_core/containers/juce_PropertySet.h | 2 +- .../containers/juce_ReferenceCountedArray.h | 33 +- .../containers/juce_ScopedValueSetter.h | 2 +- .../juce_core/containers/juce_SortedSet.h | 2 +- .../juce_core/containers/juce_SparseSet.h | 2 +- .../juce_core/containers/juce_Variant.cpp | 32 +- .../juce_core/containers/juce_Variant.h | 23 +- .../files/juce_DirectoryIterator.cpp | 103 +- .../juce_core/files/juce_DirectoryIterator.h | 2 +- .../modules/juce_core/files/juce_File.cpp | 12 +- .../modules/juce_core/files/juce_File.h | 13 +- .../juce_core/files/juce_FileFilter.cpp | 2 +- .../modules/juce_core/files/juce_FileFilter.h | 2 +- .../juce_core/files/juce_FileInputStream.cpp | 4 +- .../juce_core/files/juce_FileInputStream.h | 2 +- .../juce_core/files/juce_FileOutputStream.cpp | 10 +- .../juce_core/files/juce_FileOutputStream.h | 2 +- .../juce_core/files/juce_FileSearchPath.cpp | 2 +- .../juce_core/files/juce_FileSearchPath.h | 2 +- .../juce_core/files/juce_MemoryMappedFile.h | 2 +- .../juce_core/files/juce_TemporaryFile.cpp | 2 +- .../juce_core/files/juce_TemporaryFile.h | 2 +- .../files/juce_WildcardFileFilter.cpp | 2 +- .../juce_core/files/juce_WildcardFileFilter.h | 2 +- .../juce_core/javascript/juce_JSON.cpp | 4 +- .../modules/juce_core/javascript/juce_JSON.h | 2 +- .../juce_core/javascript/juce_Javascript.cpp | 37 +- .../juce_core/javascript/juce_Javascript.h | 6 +- .../modules/juce_core/juce_core.cpp | 19 +- JuceLibraryCode/modules/juce_core/juce_core.h | 32 +- .../modules/juce_core/juce_core.mm | 2 +- .../modules/juce_core/juce_module_info | 2 +- .../juce_core/logging/juce_FileLogger.cpp | 14 +- .../juce_core/logging/juce_FileLogger.h | 10 +- .../modules/juce_core/logging/juce_Logger.cpp | 2 +- .../modules/juce_core/logging/juce_Logger.h | 2 +- .../juce_core/maths/juce_BigInteger.cpp | 2 +- .../modules/juce_core/maths/juce_BigInteger.h | 2 +- .../juce_core/maths/juce_Expression.cpp | 8 +- .../modules/juce_core/maths/juce_Expression.h | 2 +- .../juce_core/maths/juce_MathsFunctions.h | 91 +- .../juce_core/maths/juce_NormalisableRange.h | 6 +- .../modules/juce_core/maths/juce_Random.cpp | 2 +- .../modules/juce_core/maths/juce_Random.h | 2 +- .../modules/juce_core/maths/juce_Range.h | 2 +- .../modules/juce_core/memory/juce_Atomic.h | 2 +- .../modules/juce_core/memory/juce_ByteOrder.h | 4 +- .../memory/juce_ContainerDeletePolicy.h | 12 +- .../modules/juce_core/memory/juce_HeapBlock.h | 28 +- .../memory/juce_LeakedObjectDetector.h | 2 +- .../modules/juce_core/memory/juce_Memory.h | 24 +- .../juce_core/memory/juce_MemoryBlock.cpp | 4 +- .../juce_core/memory/juce_MemoryBlock.h | 2 +- .../memory/juce_OptionalScopedPointer.h | 2 +- .../memory/juce_ReferenceCountedObject.h | 2 +- .../juce_core/memory/juce_ScopedPointer.h | 2 +- .../memory/juce_SharedResourcePointer.h | 30 +- .../modules/juce_core/memory/juce_Singleton.h | 4 +- .../juce_core/memory/juce_WeakReference.h | 2 +- .../modules/juce_core/misc/juce_Result.cpp | 2 +- .../modules/juce_core/misc/juce_Result.h | 2 +- .../modules/juce_core/misc/juce_Uuid.cpp | 2 +- .../modules/juce_core/misc/juce_Uuid.h | 2 +- .../juce_core/misc/juce_WindowsRegistry.h | 2 +- .../native/java/JuceAppActivity.java | 252 +- .../native/juce_BasicNativeHeaders.h | 5 +- .../juce_core/native/juce_android_Files.cpp | 2 +- .../native/juce_android_JNIHelpers.h | 37 +- .../juce_core/native/juce_android_Misc.cpp | 2 +- .../juce_core/native/juce_android_Network.cpp | 7 +- .../native/juce_android_SystemStats.cpp | 4 +- .../juce_core/native/juce_android_Threads.cpp | 2 +- .../juce_core/native/juce_curl_Network.cpp | 471 ++ .../native/juce_linux_CommonFile.cpp | 6 +- .../juce_core/native/juce_linux_Files.cpp | 5 +- .../juce_core/native/juce_linux_Network.cpp | 160 +- .../native/juce_linux_SystemStats.cpp | 29 +- .../juce_core/native/juce_linux_Threads.cpp | 24 +- .../juce_core/native/juce_mac_Files.mm | 2 +- .../juce_core/native/juce_mac_Network.mm | 60 +- .../juce_core/native/juce_mac_Strings.mm | 20 +- .../juce_core/native/juce_mac_SystemStats.mm | 4 +- .../juce_core/native/juce_mac_Threads.mm | 2 +- .../juce_core/native/juce_osx_ObjCHelpers.h | 15 +- .../juce_core/native/juce_posix_NamedPipe.cpp | 2 +- .../juce_core/native/juce_posix_SharedCode.h | 59 +- .../juce_core/native/juce_win32_ComSmartPtr.h | 2 +- .../juce_core/native/juce_win32_Files.cpp | 50 +- .../juce_core/native/juce_win32_Network.cpp | 31 +- .../juce_core/native/juce_win32_Registry.cpp | 2 +- .../native/juce_win32_SystemStats.cpp | 14 +- .../juce_core/native/juce_win32_Threads.cpp | 4 +- .../juce_core/network/juce_IPAddress.cpp | 4 +- .../juce_core/network/juce_IPAddress.h | 2 +- .../juce_core/network/juce_MACAddress.cpp | 2 +- .../juce_core/network/juce_MACAddress.h | 2 +- .../juce_core/network/juce_NamedPipe.cpp | 2 +- .../juce_core/network/juce_NamedPipe.h | 2 +- .../modules/juce_core/network/juce_Socket.cpp | 413 +- .../modules/juce_core/network/juce_Socket.h | 120 +- .../modules/juce_core/network/juce_URL.cpp | 23 +- .../modules/juce_core/network/juce_URL.h | 25 +- .../streams/juce_BufferedInputStream.cpp | 2 +- .../streams/juce_BufferedInputStream.h | 2 +- .../streams/juce_FileInputSource.cpp | 2 +- .../juce_core/streams/juce_FileInputSource.h | 2 +- .../juce_core/streams/juce_InputSource.h | 2 +- .../juce_core/streams/juce_InputStream.cpp | 2 +- .../juce_core/streams/juce_InputStream.h | 2 +- .../streams/juce_MemoryInputStream.cpp | 2 +- .../streams/juce_MemoryInputStream.h | 2 +- .../streams/juce_MemoryOutputStream.cpp | 10 +- .../streams/juce_MemoryOutputStream.h | 4 +- .../juce_core/streams/juce_OutputStream.cpp | 2 +- .../juce_core/streams/juce_OutputStream.h | 2 +- .../streams/juce_SubregionStream.cpp | 2 +- .../juce_core/streams/juce_SubregionStream.h | 2 +- .../juce_core/system/juce_CompilerSupport.h | 25 +- .../juce_core/system/juce_PlatformDefs.h | 6 +- .../juce_core/system/juce_StandardHeader.h | 13 +- .../juce_core/system/juce_SystemStats.cpp | 11 +- .../juce_core/system/juce_SystemStats.h | 53 +- .../juce_core/system/juce_TargetPlatform.h | 2 +- .../juce_core/text/juce_CharPointer_ASCII.h | 8 +- .../juce_core/text/juce_CharPointer_UTF16.h | 8 +- .../juce_core/text/juce_CharPointer_UTF32.h | 2 +- .../juce_core/text/juce_CharPointer_UTF8.h | 14 +- .../text/juce_CharacterFunctions.cpp | 18 +- .../juce_core/text/juce_CharacterFunctions.h | 2 +- .../juce_core/text/juce_Identifier.cpp | 29 +- .../modules/juce_core/text/juce_Identifier.h | 16 +- .../juce_core/text/juce_LocalisedStrings.cpp | 2 +- .../juce_core/text/juce_LocalisedStrings.h | 2 +- .../modules/juce_core/text/juce_NewLine.h | 2 +- .../modules/juce_core/text/juce_String.cpp | 25 +- .../modules/juce_core/text/juce_String.h | 12 +- .../juce_core/text/juce_StringArray.cpp | 9 +- .../modules/juce_core/text/juce_StringArray.h | 6 +- .../juce_core/text/juce_StringPairArray.cpp | 2 +- .../juce_core/text/juce_StringPairArray.h | 2 +- .../juce_core/text/juce_StringPool.cpp | 2 +- .../modules/juce_core/text/juce_StringPool.h | 4 +- .../modules/juce_core/text/juce_StringRef.h | 2 +- .../modules/juce_core/text/juce_TextDiff.cpp | 2 +- .../modules/juce_core/text/juce_TextDiff.h | 2 +- .../juce_core/threads/juce_ChildProcess.cpp | 2 +- .../juce_core/threads/juce_ChildProcess.h | 2 +- .../juce_core/threads/juce_CriticalSection.h | 2 +- .../juce_core/threads/juce_DynamicLibrary.h | 2 +- .../threads/juce_HighResolutionTimer.cpp | 2 +- .../threads/juce_HighResolutionTimer.h | 2 +- .../juce_core/threads/juce_InterProcessLock.h | 2 +- .../modules/juce_core/threads/juce_Process.h | 2 +- .../juce_core/threads/juce_ReadWriteLock.cpp | 2 +- .../juce_core/threads/juce_ReadWriteLock.h | 2 +- .../juce_core/threads/juce_ScopedLock.h | 2 +- .../juce_core/threads/juce_ScopedReadLock.h | 2 +- .../juce_core/threads/juce_ScopedWriteLock.h | 2 +- .../modules/juce_core/threads/juce_SpinLock.h | 2 +- .../modules/juce_core/threads/juce_Thread.cpp | 2 +- .../modules/juce_core/threads/juce_Thread.h | 4 +- .../juce_core/threads/juce_ThreadLocalValue.h | 2 +- .../juce_core/threads/juce_ThreadPool.cpp | 2 +- .../juce_core/threads/juce_ThreadPool.h | 2 +- .../threads/juce_TimeSliceThread.cpp | 2 +- .../juce_core/threads/juce_TimeSliceThread.h | 2 +- .../juce_core/threads/juce_WaitableEvent.h | 2 +- .../time/juce_PerformanceCounter.cpp | 2 +- .../juce_core/time/juce_PerformanceCounter.h | 2 +- .../juce_core/time/juce_RelativeTime.cpp | 2 +- .../juce_core/time/juce_RelativeTime.h | 2 +- .../modules/juce_core/time/juce_Time.cpp | 33 +- .../modules/juce_core/time/juce_Time.h | 2 +- .../juce_core/unit_tests/juce_UnitTest.cpp | 2 +- .../juce_core/unit_tests/juce_UnitTest.h | 2 +- .../juce_core/xml/juce_XmlDocument.cpp | 27 +- .../modules/juce_core/xml/juce_XmlDocument.h | 6 +- .../modules/juce_core/xml/juce_XmlElement.cpp | 2 +- .../modules/juce_core/xml/juce_XmlElement.h | 4 +- .../zip/juce_GZIPCompressorOutputStream.cpp | 2 +- .../zip/juce_GZIPCompressorOutputStream.h | 4 +- .../zip/juce_GZIPDecompressorInputStream.cpp | 37 +- .../zip/juce_GZIPDecompressorInputStream.h | 22 +- .../modules/juce_core/zip/juce_ZipFile.cpp | 10 +- .../modules/juce_core/zip/juce_ZipFile.h | 28 +- .../modules/juce_core/zip/zlib/trees.c | 32 +- .../juce_ApplicationProperties.cpp | 2 +- .../juce_ApplicationProperties.h | 2 +- .../app_properties/juce_PropertiesFile.cpp | 2 +- .../app_properties/juce_PropertiesFile.h | 4 +- .../juce_data_structures.cpp | 3 +- .../juce_data_structures.h | 3 +- .../juce_data_structures.mm | 2 +- .../juce_data_structures/juce_module_info | 2 +- .../undomanager/juce_UndoManager.cpp | 10 +- .../undomanager/juce_UndoManager.h | 7 +- .../undomanager/juce_UndoableAction.h | 2 +- .../values/juce_Value.cpp | 12 +- .../juce_data_structures/values/juce_Value.h | 8 +- .../values/juce_ValueTree.cpp | 191 +- .../values/juce_ValueTree.h | 36 +- .../values/juce_ValueTreeSynchroniser.cpp | 217 + .../values/juce_ValueTreeSynchroniser.h | 98 + .../broadcasters/juce_ActionBroadcaster.cpp | 2 +- .../broadcasters/juce_ActionBroadcaster.h | 2 +- .../broadcasters/juce_ActionListener.h | 2 +- .../broadcasters/juce_AsyncUpdater.cpp | 2 +- .../broadcasters/juce_AsyncUpdater.h | 2 +- .../broadcasters/juce_ChangeBroadcaster.cpp | 10 +- .../broadcasters/juce_ChangeBroadcaster.h | 4 +- .../broadcasters/juce_ChangeListener.h | 2 +- .../broadcasters/juce_ListenerList.h | 2 +- .../juce_ConnectedChildProcess.cpp | 2 +- .../interprocess/juce_ConnectedChildProcess.h | 2 +- .../juce_InterprocessConnection.cpp | 2 +- .../juce_InterprocessConnection.h | 2 +- .../juce_InterprocessConnectionServer.cpp | 2 +- .../juce_InterprocessConnectionServer.h | 2 +- .../modules/juce_events/juce_events.cpp | 2 +- .../modules/juce_events/juce_events.h | 2 +- .../modules/juce_events/juce_events.mm | 2 +- .../modules/juce_events/juce_module_info | 2 +- .../messages/juce_ApplicationBase.cpp | 4 +- .../messages/juce_ApplicationBase.h | 5 +- .../messages/juce_CallbackMessage.h | 2 +- .../messages/juce_DeletedAtShutdown.cpp | 2 +- .../messages/juce_DeletedAtShutdown.h | 2 +- .../messages/juce_Initialisation.h | 2 +- .../juce_events/messages/juce_Message.h | 2 +- .../messages/juce_MessageListener.cpp | 2 +- .../messages/juce_MessageListener.h | 2 +- .../messages/juce_MessageManager.cpp | 24 +- .../messages/juce_MessageManager.h | 2 +- .../juce_MountedVolumeListChangeDetector.h | 2 +- .../messages/juce_NotificationType.h | 2 +- .../juce_events/native/juce_ScopedXLock.h | 2 +- .../native/juce_android_Messaging.cpp | 4 +- .../native/juce_ios_MessageManager.mm | 14 +- .../native/juce_linux_Messaging.cpp | 26 +- .../native/juce_mac_MessageManager.mm | 59 +- .../native/juce_osx_MessageQueue.h | 2 +- .../native/juce_win32_HiddenMessageWindow.h | 4 +- .../native/juce_win32_Messaging.cpp | 19 +- .../juce_events/timers/juce_MultiTimer.cpp | 2 +- .../juce_events/timers/juce_MultiTimer.h | 2 +- .../modules/juce_events/timers/juce_Timer.cpp | 94 +- .../modules/juce_events/timers/juce_Timer.h | 31 +- .../juce_graphics/colour/juce_Colour.cpp | 41 +- .../juce_graphics/colour/juce_Colour.h | 15 +- .../colour/juce_ColourGradient.cpp | 14 +- .../colour/juce_ColourGradient.h | 2 +- .../juce_graphics/colour/juce_Colours.cpp | 2 +- .../juce_graphics/colour/juce_Colours.h | 2 +- .../juce_graphics/colour/juce_FillType.cpp | 2 +- .../juce_graphics/colour/juce_FillType.h | 2 +- .../juce_graphics/colour/juce_PixelFormats.h | 462 +- .../contexts/juce_GraphicsContext.cpp | 8 +- .../contexts/juce_GraphicsContext.h | 18 +- .../contexts/juce_LowLevelGraphicsContext.h | 2 +- ...uce_LowLevelGraphicsPostScriptRenderer.cpp | 8 +- .../juce_LowLevelGraphicsPostScriptRenderer.h | 2 +- .../juce_LowLevelGraphicsSoftwareRenderer.cpp | 2 +- .../juce_LowLevelGraphicsSoftwareRenderer.h | 2 +- .../effects/juce_DropShadowEffect.cpp | 20 +- .../effects/juce_DropShadowEffect.h | 2 +- .../juce_graphics/effects/juce_GlowEffect.cpp | 2 +- .../juce_graphics/effects/juce_GlowEffect.h | 2 +- .../effects/juce_ImageEffectFilter.h | 2 +- .../fonts/juce_AttributedString.cpp | 2 +- .../fonts/juce_AttributedString.h | 2 +- .../fonts/juce_CustomTypeface.cpp | 2 +- .../juce_graphics/fonts/juce_CustomTypeface.h | 2 +- .../modules/juce_graphics/fonts/juce_Font.cpp | 8 +- .../modules/juce_graphics/fonts/juce_Font.h | 20 +- .../fonts/juce_GlyphArrangement.cpp | 67 +- .../fonts/juce_GlyphArrangement.h | 21 +- .../juce_graphics/fonts/juce_TextLayout.cpp | 155 +- .../juce_graphics/fonts/juce_TextLayout.h | 37 +- .../juce_graphics/fonts/juce_Typeface.cpp | 2 +- .../juce_graphics/fonts/juce_Typeface.h | 2 +- .../geometry/juce_AffineTransform.cpp | 2 +- .../geometry/juce_AffineTransform.h | 2 +- .../juce_graphics/geometry/juce_BorderSize.h | 2 +- .../juce_graphics/geometry/juce_EdgeTable.cpp | 2 +- .../juce_graphics/geometry/juce_EdgeTable.h | 2 +- .../juce_graphics/geometry/juce_Line.h | 28 +- .../juce_graphics/geometry/juce_Path.cpp | 45 +- .../juce_graphics/geometry/juce_Path.h | 44 +- .../geometry/juce_PathIterator.cpp | 2 +- .../geometry/juce_PathIterator.h | 2 +- .../geometry/juce_PathStrokeType.cpp | 2 +- .../geometry/juce_PathStrokeType.h | 2 +- .../juce_graphics/geometry/juce_Point.h | 5 +- .../juce_graphics/geometry/juce_Rectangle.h | 124 +- .../geometry/juce_RectangleList.h | 16 +- .../image_formats/jpglib/jinclude.h | 13 +- .../image_formats/juce_GIFLoader.cpp | 2 +- .../image_formats/juce_JPEGLoader.cpp | 2 +- .../image_formats/juce_PNGLoader.cpp | 2 +- .../juce_graphics/images/juce_Image.cpp | 23 +- .../modules/juce_graphics/images/juce_Image.h | 7 +- .../juce_graphics/images/juce_ImageCache.cpp | 6 +- .../juce_graphics/images/juce_ImageCache.h | 2 +- .../images/juce_ImageConvolutionKernel.cpp | 2 +- .../images/juce_ImageConvolutionKernel.h | 2 +- .../images/juce_ImageFileFormat.cpp | 2 +- .../images/juce_ImageFileFormat.h | 2 +- .../modules/juce_graphics/juce_graphics.cpp | 12 +- .../modules/juce_graphics/juce_graphics.h | 2 +- .../modules/juce_graphics/juce_graphics.mm | 2 +- .../modules/juce_graphics/juce_module_info | 2 +- .../native/juce_RenderingHelpers.h | 45 +- .../native/juce_android_Fonts.cpp | 56 +- .../native/juce_android_GraphicsContext.cpp | 2 +- .../native/juce_freetype_Fonts.cpp | 18 +- .../juce_graphics/native/juce_linux_Fonts.cpp | 2 +- .../native/juce_mac_CoreGraphicsContext.h | 18 +- .../native/juce_mac_CoreGraphicsContext.mm | 141 +- .../native/juce_mac_CoreGraphicsHelpers.h | 10 +- .../juce_graphics/native/juce_mac_Fonts.mm | 4 +- .../juce_win32_Direct2DGraphicsContext.cpp | 2 +- .../juce_win32_DirectWriteTypeLayout.cpp | 21 +- .../native/juce_win32_DirectWriteTypeface.cpp | 2 +- .../juce_graphics/native/juce_win32_Fonts.cpp | 18 +- .../placement/juce_Justification.h | 2 +- .../placement/juce_RectanglePlacement.cpp | 2 +- .../placement/juce_RectanglePlacement.h | 2 +- .../application/juce_Application.cpp | 2 +- .../application/juce_Application.h | 12 +- .../buttons/juce_ArrowButton.cpp | 2 +- .../buttons/juce_ArrowButton.h | 2 +- .../juce_gui_basics/buttons/juce_Button.cpp | 2 +- .../juce_gui_basics/buttons/juce_Button.h | 2 +- .../buttons/juce_DrawableButton.cpp | 3 +- .../buttons/juce_DrawableButton.h | 2 +- .../buttons/juce_HyperlinkButton.cpp | 2 +- .../buttons/juce_HyperlinkButton.h | 2 +- .../buttons/juce_ImageButton.cpp | 2 +- .../buttons/juce_ImageButton.h | 2 +- .../buttons/juce_ShapeButton.cpp | 2 +- .../buttons/juce_ShapeButton.h | 2 +- .../buttons/juce_TextButton.cpp | 5 +- .../juce_gui_basics/buttons/juce_TextButton.h | 4 +- .../buttons/juce_ToggleButton.cpp | 2 +- .../buttons/juce_ToggleButton.h | 2 +- .../buttons/juce_ToolbarButton.cpp | 2 +- .../buttons/juce_ToolbarButton.h | 2 +- .../commands/juce_ApplicationCommandID.h | 2 +- .../commands/juce_ApplicationCommandInfo.cpp | 2 +- .../commands/juce_ApplicationCommandInfo.h | 2 +- .../juce_ApplicationCommandManager.cpp | 2 +- .../commands/juce_ApplicationCommandManager.h | 4 +- .../juce_ApplicationCommandTarget.cpp | 2 +- .../commands/juce_ApplicationCommandTarget.h | 2 +- .../commands/juce_KeyPressMappingSet.cpp | 2 +- .../commands/juce_KeyPressMappingSet.h | 2 +- .../components/juce_CachedComponentImage.h | 2 +- .../components/juce_Component.cpp | 54 +- .../components/juce_Component.h | 77 +- .../components/juce_ComponentListener.cpp | 2 +- .../components/juce_ComponentListener.h | 2 +- .../components/juce_Desktop.cpp | 4 +- .../juce_gui_basics/components/juce_Desktop.h | 2 +- .../components/juce_ModalComponentManager.cpp | 4 +- .../components/juce_ModalComponentManager.h | 8 +- .../drawables/juce_Drawable.cpp | 3 +- .../juce_gui_basics/drawables/juce_Drawable.h | 9 +- .../drawables/juce_DrawableComposite.cpp | 2 +- .../drawables/juce_DrawableComposite.h | 10 +- .../drawables/juce_DrawableImage.cpp | 3 +- .../drawables/juce_DrawableImage.h | 2 +- .../drawables/juce_DrawablePath.cpp | 14 +- .../drawables/juce_DrawablePath.h | 6 +- .../drawables/juce_DrawableRectangle.cpp | 2 +- .../drawables/juce_DrawableRectangle.h | 2 +- .../drawables/juce_DrawableShape.cpp | 8 +- .../drawables/juce_DrawableShape.h | 2 +- .../drawables/juce_DrawableText.cpp | 2 +- .../drawables/juce_DrawableText.h | 2 +- .../drawables/juce_SVGParser.cpp | 102 +- ...juce_DirectoryContentsDisplayComponent.cpp | 2 +- .../juce_DirectoryContentsDisplayComponent.h | 2 +- .../juce_DirectoryContentsList.cpp | 2 +- .../filebrowser/juce_DirectoryContentsList.h | 2 +- .../filebrowser/juce_FileBrowserComponent.cpp | 13 +- .../filebrowser/juce_FileBrowserComponent.h | 27 +- .../filebrowser/juce_FileBrowserListener.h | 2 +- .../filebrowser/juce_FileChooser.cpp | 4 +- .../filebrowser/juce_FileChooser.h | 2 +- .../filebrowser/juce_FileChooserDialogBox.cpp | 2 +- .../filebrowser/juce_FileChooserDialogBox.h | 2 +- .../filebrowser/juce_FileListComponent.cpp | 2 +- .../filebrowser/juce_FileListComponent.h | 16 +- .../filebrowser/juce_FilePreviewComponent.h | 2 +- .../juce_FileSearchPathListComponent.cpp | 4 +- .../juce_FileSearchPathListComponent.h | 2 +- .../filebrowser/juce_FileTreeComponent.cpp | 2 +- .../filebrowser/juce_FileTreeComponent.h | 2 +- .../filebrowser/juce_FilenameComponent.cpp | 2 +- .../filebrowser/juce_FilenameComponent.h | 2 +- .../juce_ImagePreviewComponent.cpp | 2 +- .../filebrowser/juce_ImagePreviewComponent.h | 2 +- .../juce_gui_basics/juce_gui_basics.cpp | 7 +- .../modules/juce_gui_basics/juce_gui_basics.h | 14 +- .../juce_gui_basics/juce_gui_basics.mm | 2 +- .../modules/juce_gui_basics/juce_module_info | 2 +- .../keyboard/juce_CaretComponent.cpp | 2 +- .../keyboard/juce_CaretComponent.h | 2 +- .../keyboard/juce_KeyListener.cpp | 2 +- .../keyboard/juce_KeyListener.h | 2 +- .../keyboard/juce_KeyPress.cpp | 2 +- .../juce_gui_basics/keyboard/juce_KeyPress.h | 2 +- .../keyboard/juce_KeyboardFocusTraverser.cpp | 2 +- .../keyboard/juce_KeyboardFocusTraverser.h | 2 +- .../keyboard/juce_ModifierKeys.cpp | 2 +- .../keyboard/juce_ModifierKeys.h | 2 +- .../keyboard/juce_SystemClipboard.h | 2 +- .../keyboard/juce_TextEditorKeyMapper.h | 15 +- .../keyboard/juce_TextInputTarget.h | 3 +- .../layout/juce_AnimatedPosition.h | 8 +- .../layout/juce_AnimatedPositionBehaviours.h | 2 +- .../layout/juce_ComponentAnimator.cpp | 4 +- .../layout/juce_ComponentAnimator.h | 2 +- .../juce_ComponentBoundsConstrainer.cpp | 2 +- .../layout/juce_ComponentBoundsConstrainer.h | 2 +- .../layout/juce_ComponentBuilder.cpp | 6 +- .../layout/juce_ComponentBuilder.h | 6 +- .../layout/juce_ComponentMovementWatcher.cpp | 2 +- .../layout/juce_ComponentMovementWatcher.h | 2 +- .../layout/juce_ConcertinaPanel.cpp | 7 +- .../layout/juce_ConcertinaPanel.h | 7 +- .../layout/juce_GroupComponent.cpp | 2 +- .../layout/juce_GroupComponent.h | 2 +- .../layout/juce_MultiDocumentPanel.cpp | 2 +- .../layout/juce_MultiDocumentPanel.h | 2 +- .../layout/juce_ResizableBorderComponent.cpp | 2 +- .../layout/juce_ResizableBorderComponent.h | 2 +- .../layout/juce_ResizableCornerComponent.cpp | 2 +- .../layout/juce_ResizableCornerComponent.h | 2 +- .../layout/juce_ResizableEdgeComponent.cpp | 2 +- .../layout/juce_ResizableEdgeComponent.h | 2 +- .../juce_gui_basics/layout/juce_ScrollBar.cpp | 17 +- .../juce_gui_basics/layout/juce_ScrollBar.h | 5 +- .../layout/juce_StretchableLayoutManager.cpp | 2 +- .../layout/juce_StretchableLayoutManager.h | 2 +- .../juce_StretchableLayoutResizerBar.cpp | 2 +- .../layout/juce_StretchableLayoutResizerBar.h | 2 +- .../layout/juce_StretchableObjectResizer.cpp | 2 +- .../layout/juce_StretchableObjectResizer.h | 2 +- .../layout/juce_TabbedButtonBar.cpp | 2 +- .../layout/juce_TabbedButtonBar.h | 2 +- .../layout/juce_TabbedComponent.cpp | 2 +- .../layout/juce_TabbedComponent.h | 2 +- .../juce_gui_basics/layout/juce_Viewport.cpp | 34 +- .../juce_gui_basics/layout/juce_Viewport.h | 6 +- .../lookandfeel/juce_LookAndFeel.cpp | 2 +- .../lookandfeel/juce_LookAndFeel.h | 2 +- .../lookandfeel/juce_LookAndFeel_V1.cpp | 2 +- .../lookandfeel/juce_LookAndFeel_V1.h | 2 +- .../lookandfeel/juce_LookAndFeel_V2.cpp | 97 +- .../lookandfeel/juce_LookAndFeel_V2.h | 20 +- .../lookandfeel/juce_LookAndFeel_V3.cpp | 2 +- .../lookandfeel/juce_LookAndFeel_V3.h | 2 +- .../menus/juce_MenuBarComponent.cpp | 2 +- .../menus/juce_MenuBarComponent.h | 8 +- .../menus/juce_MenuBarModel.cpp | 2 +- .../juce_gui_basics/menus/juce_MenuBarModel.h | 2 +- .../juce_gui_basics/menus/juce_PopupMenu.cpp | 9 +- .../juce_gui_basics/menus/juce_PopupMenu.h | 2 +- .../misc/juce_BubbleComponent.cpp | 2 +- .../misc/juce_BubbleComponent.h | 2 +- .../misc/juce_DropShadower.cpp | 2 +- .../juce_gui_basics/misc/juce_DropShadower.h | 2 +- .../mouse/juce_ComponentDragger.cpp | 2 +- .../mouse/juce_ComponentDragger.h | 2 +- .../mouse/juce_DragAndDropContainer.cpp | 22 +- .../mouse/juce_DragAndDropContainer.h | 5 +- .../mouse/juce_DragAndDropTarget.h | 2 +- .../mouse/juce_FileDragAndDropTarget.h | 2 +- .../mouse/juce_LassoComponent.h | 2 +- .../mouse/juce_MouseCursor.cpp | 2 +- .../juce_gui_basics/mouse/juce_MouseCursor.h | 2 +- .../juce_gui_basics/mouse/juce_MouseEvent.cpp | 2 +- .../juce_gui_basics/mouse/juce_MouseEvent.h | 6 +- .../mouse/juce_MouseInactivityDetector.cpp | 13 +- .../mouse/juce_MouseInactivityDetector.h | 11 +- .../mouse/juce_MouseInputSource.cpp | 25 +- .../mouse/juce_MouseInputSource.h | 2 +- .../mouse/juce_MouseListener.cpp | 2 +- .../mouse/juce_MouseListener.h | 2 +- .../mouse/juce_SelectedItemSet.h | 4 +- .../mouse/juce_TextDragAndDropTarget.h | 2 +- .../mouse/juce_TooltipClient.h | 2 +- .../native/juce_MultiTouchMapper.h | 2 +- .../native/juce_android_FileChooser.cpp | 2 +- .../native/juce_android_Windowing.cpp | 60 +- .../native/juce_ios_UIViewComponentPeer.mm | 12 +- .../native/juce_ios_Windowing.mm | 37 +- .../native/juce_linux_Clipboard.cpp | 233 +- .../native/juce_linux_FileChooser.cpp | 10 +- .../native/juce_linux_Windowing.cpp | 1347 ++++- .../native/juce_mac_FileChooser.mm | 62 +- .../native/juce_mac_MainMenu.mm | 2 +- .../native/juce_mac_MouseCursor.mm | 81 +- .../native/juce_mac_NSViewComponentPeer.mm | 61 +- .../native/juce_mac_Windowing.mm | 93 +- .../native/juce_win32_DragAndDrop.cpp | 2 +- .../native/juce_win32_FileChooser.cpp | 6 +- .../native/juce_win32_Windowing.cpp | 82 +- .../positioning/juce_MarkerList.cpp | 2 +- .../positioning/juce_MarkerList.h | 2 +- .../positioning/juce_RelativeCoordinate.cpp | 2 +- .../positioning/juce_RelativeCoordinate.h | 37 +- .../juce_RelativeCoordinatePositioner.cpp | 2 +- .../juce_RelativeCoordinatePositioner.h | 6 +- .../juce_RelativeParallelogram.cpp | 2 +- .../positioning/juce_RelativeParallelogram.h | 2 +- .../positioning/juce_RelativePoint.cpp | 2 +- .../positioning/juce_RelativePoint.h | 2 +- .../positioning/juce_RelativePointPath.cpp | 2 +- .../positioning/juce_RelativePointPath.h | 2 +- .../positioning/juce_RelativeRectangle.cpp | 10 +- .../positioning/juce_RelativeRectangle.h | 4 +- .../juce_BooleanPropertyComponent.cpp | 2 +- .../juce_BooleanPropertyComponent.h | 2 +- .../juce_ButtonPropertyComponent.cpp | 2 +- .../properties/juce_ButtonPropertyComponent.h | 2 +- .../juce_ChoicePropertyComponent.cpp | 2 +- .../properties/juce_ChoicePropertyComponent.h | 2 +- .../properties/juce_PropertyComponent.cpp | 2 +- .../properties/juce_PropertyComponent.h | 4 +- .../properties/juce_PropertyPanel.cpp | 148 +- .../properties/juce_PropertyPanel.h | 22 +- .../juce_SliderPropertyComponent.cpp | 2 +- .../properties/juce_SliderPropertyComponent.h | 2 +- .../properties/juce_TextPropertyComponent.cpp | 2 +- .../properties/juce_TextPropertyComponent.h | 2 +- .../juce_gui_basics/widgets/juce_ComboBox.cpp | 96 +- .../juce_gui_basics/widgets/juce_ComboBox.h | 19 +- .../widgets/juce_ImageComponent.cpp | 2 +- .../widgets/juce_ImageComponent.h | 2 +- .../juce_gui_basics/widgets/juce_Label.cpp | 25 +- .../juce_gui_basics/widgets/juce_Label.h | 19 +- .../juce_gui_basics/widgets/juce_ListBox.cpp | 60 +- .../juce_gui_basics/widgets/juce_ListBox.h | 29 +- .../widgets/juce_ProgressBar.cpp | 2 +- .../widgets/juce_ProgressBar.h | 2 +- .../juce_gui_basics/widgets/juce_Slider.cpp | 149 +- .../juce_gui_basics/widgets/juce_Slider.h | 44 +- .../widgets/juce_TableHeaderComponent.cpp | 2 +- .../widgets/juce_TableHeaderComponent.h | 9 +- .../widgets/juce_TableListBox.cpp | 15 +- .../widgets/juce_TableListBox.h | 7 +- .../widgets/juce_TextEditor.cpp | 13 +- .../juce_gui_basics/widgets/juce_TextEditor.h | 17 +- .../juce_gui_basics/widgets/juce_Toolbar.cpp | 22 +- .../juce_gui_basics/widgets/juce_Toolbar.h | 8 +- .../widgets/juce_ToolbarItemComponent.cpp | 2 +- .../widgets/juce_ToolbarItemComponent.h | 2 +- .../widgets/juce_ToolbarItemFactory.h | 2 +- .../widgets/juce_ToolbarItemPalette.cpp | 2 +- .../widgets/juce_ToolbarItemPalette.h | 2 +- .../juce_gui_basics/widgets/juce_TreeView.cpp | 20 +- .../juce_gui_basics/widgets/juce_TreeView.h | 18 +- .../windows/juce_AlertWindow.cpp | 22 +- .../windows/juce_AlertWindow.h | 13 +- .../windows/juce_CallOutBox.cpp | 2 +- .../juce_gui_basics/windows/juce_CallOutBox.h | 4 +- .../windows/juce_ComponentPeer.cpp | 38 +- .../windows/juce_ComponentPeer.h | 2 +- .../windows/juce_DialogWindow.cpp | 2 +- .../windows/juce_DialogWindow.h | 14 +- .../windows/juce_DocumentWindow.cpp | 2 +- .../windows/juce_DocumentWindow.h | 4 +- .../windows/juce_NativeMessageBox.h | 2 +- .../windows/juce_ResizableWindow.cpp | 44 +- .../windows/juce_ResizableWindow.h | 22 +- .../windows/juce_ThreadWithProgressWindow.cpp | 2 +- .../windows/juce_ThreadWithProgressWindow.h | 6 +- .../windows/juce_TooltipWindow.cpp | 75 +- .../windows/juce_TooltipWindow.h | 28 +- .../windows/juce_TopLevelWindow.cpp | 4 +- .../windows/juce_TopLevelWindow.h | 4 +- .../juce_CPlusPlusCodeTokeniser.cpp | 2 +- .../code_editor/juce_CPlusPlusCodeTokeniser.h | 2 +- .../juce_CPlusPlusCodeTokeniserFunctions.h | 2 +- .../code_editor/juce_CodeDocument.cpp | 2 +- .../code_editor/juce_CodeDocument.h | 6 +- .../code_editor/juce_CodeEditorComponent.cpp | 6 +- .../code_editor/juce_CodeEditorComponent.h | 2 +- .../code_editor/juce_CodeTokeniser.h | 2 +- .../code_editor/juce_LuaCodeTokeniser.cpp | 2 +- .../code_editor/juce_LuaCodeTokeniser.h | 2 +- .../code_editor/juce_XMLCodeTokeniser.cpp | 2 +- .../code_editor/juce_XMLCodeTokeniser.h | 2 +- .../documents/juce_FileBasedDocument.cpp | 2 +- .../documents/juce_FileBasedDocument.h | 2 +- .../embedding/juce_ActiveXControlComponent.h | 2 +- .../embedding/juce_NSViewComponent.h | 2 +- .../embedding/juce_UIViewComponent.h | 2 +- .../modules/juce_gui_extra/juce_gui_extra.cpp | 4 +- .../modules/juce_gui_extra/juce_gui_extra.h | 3 +- .../modules/juce_gui_extra/juce_gui_extra.mm | 2 +- .../modules/juce_gui_extra/juce_module_info | 2 +- .../misc/juce_AnimatedAppComponent.cpp | 48 + .../misc/juce_AnimatedAppComponent.h | 77 + .../juce_gui_extra/misc/juce_AppleRemote.h | 2 +- .../misc/juce_BubbleMessageComponent.cpp | 2 +- .../misc/juce_BubbleMessageComponent.h | 2 +- .../misc/juce_ColourSelector.cpp | 2 +- .../juce_gui_extra/misc/juce_ColourSelector.h | 4 +- .../misc/juce_KeyMappingEditorComponent.cpp | 6 +- .../misc/juce_KeyMappingEditorComponent.h | 4 +- .../misc/juce_LiveConstantEditor.cpp | 54 +- .../misc/juce_LiveConstantEditor.h | 6 +- .../misc/juce_PreferencesPanel.cpp | 2 +- .../misc/juce_PreferencesPanel.h | 2 +- .../misc/juce_RecentlyOpenedFilesList.cpp | 2 +- .../misc/juce_RecentlyOpenedFilesList.h | 2 +- .../juce_gui_extra/misc/juce_SplashScreen.cpp | 2 +- .../juce_gui_extra/misc/juce_SplashScreen.h | 2 +- .../misc/juce_SystemTrayIconComponent.cpp | 2 +- .../misc/juce_SystemTrayIconComponent.h | 2 +- .../misc/juce_WebBrowserComponent.h | 10 +- .../juce_android_WebBrowserComponent.cpp | 6 +- .../native/juce_ios_UIViewComponent.mm | 2 +- .../native/juce_linux_SystemTrayIcon.cpp | 6 +- .../native/juce_linux_WebBrowserComponent.cpp | 6 +- .../native/juce_mac_AppleRemote.mm | 2 +- .../juce_mac_CarbonViewWrapperComponent.h | 2 +- .../native/juce_mac_NSViewComponent.mm | 4 +- .../native/juce_mac_SystemTrayIcon.cpp | 30 +- .../native/juce_mac_WebBrowserComponent.mm | 109 +- .../native/juce_win32_ActiveXComponent.cpp | 18 +- .../native/juce_win32_SystemTrayIcon.cpp | 2 +- .../native/juce_win32_WebBrowserComponent.cpp | 59 +- Source/CartManager.cpp | 2 +- Source/CartManager.h | 2 +- Source/DXComponents.cpp | 24 +- Source/DXComponents.h | 2 - Source/GlobalEditor.cpp | 10 +- Source/GlobalEditor.h | 4 +- Source/PluginData.cpp | 37 +- Source/PluginEditor.cpp | 2 +- Source/PluginParam.cpp | 2 +- Source/PluginProcessor.cpp | 5 +- 926 files changed, 14168 insertions(+), 8851 deletions(-) create mode 100644 JuceLibraryCode/modules/juce_audio_basics/effects/juce_FFT.cpp create mode 100644 JuceLibraryCode/modules/juce_audio_basics/effects/juce_FFT.h create mode 100644 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder.h create mode 100644 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/win_utf8_io.h create mode 100644 JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp create mode 100644 JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioAppComponent.h create mode 100644 JuceLibraryCode/modules/juce_core/native/juce_curl_Network.cpp create mode 100644 JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp create mode 100644 JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h create mode 100644 JuceLibraryCode/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp create mode 100644 JuceLibraryCode/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h diff --git a/Builds/Linux/Makefile b/Builds/Linux/Makefile index 64e4643..f3342d0 100644 --- a/Builds/Linux/Makefile +++ b/Builds/Linux/Makefile @@ -20,10 +20,9 @@ ifeq ($(CONFIG),Debug) CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ~/src/vstsdk2.4 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -fPIC -O0 - CXXFLAGS += $(CFLAGS) - LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -shared -L/usr/X11R6/lib/ -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt - LDDEPS := - RESFLAGS := -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ~/src/vstsdk2.4 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules + CXXFLAGS += $(CFLAGS) -std=c++11 + LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -Wl,--no-undefined -shared -L/usr/X11R6/lib/ -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt + TARGET := Dexed.so BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) CLEANCMD = rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) @@ -41,10 +40,9 @@ ifeq ($(CONFIG),Release) CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ~/src/vstsdk2.4 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -fPIC -Os - CXXFLAGS += $(CFLAGS) - LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -shared -fvisibility=hidden -L/usr/X11R6/lib/ -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt - LDDEPS := - RESFLAGS := -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ~/src/vstsdk2.4 -I ../../JuceLibraryCode -I ../../JuceLibraryCode/modules + CXXFLAGS += $(CFLAGS) -std=c++11 + LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -Wl,--no-undefined -shared -fvisibility=hidden -L/usr/X11R6/lib/ -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt + TARGET := Dexed.so BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) CLEANCMD = rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) @@ -94,7 +92,7 @@ OBJECTS := \ .PHONY: clean -$(OUTDIR)/$(TARGET): $(OBJECTS) $(LDDEPS) $(RESOURCES) +$(OUTDIR)/$(TARGET): $(OBJECTS) $(RESOURCES) @echo Linking Dexed -@mkdir -p $(BINDIR) -@mkdir -p $(LIBDIR) diff --git a/Builds/MacOSX/Dexed.xcodeproj/project.pbxproj b/Builds/MacOSX/Dexed.xcodeproj/project.pbxproj index a01c605..e56de5b 100644 --- a/Builds/MacOSX/Dexed.xcodeproj/project.pbxproj +++ b/Builds/MacOSX/Dexed.xcodeproj/project.pbxproj @@ -6,3008 +6,2289 @@ objectVersion = 46; objects = { -/* Begin PBXBuildFile section */ - 00C044DBB8BA1AF35CBC42E6 /* juce_VST_Wrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D6C6FCBA5ECA257959BFE674 /* juce_VST_Wrapper.cpp */; }; - 02B7485A3DD3F44C6058AB0E /* AUCarbonViewBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8ED1068B85DCEFEFDD3C4F82 /* AUCarbonViewBase.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - 069530C6CF2796C568DD3E90 /* juce_gui_basics.mm in Sources */ = {isa = PBXBuildFile; fileRef = 19B56FF22ED0090A8D7A3E04 /* juce_gui_basics.mm */; }; - 082D6FF34EFF195C3A3B0CFB /* OperatorEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 838E63F5800CA577B92EF6AE /* OperatorEditor.cpp */; }; - 09E5F88C9C879073B1B103F1 /* AUCarbonViewControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D8F138F48E933ECCF2DB2321 /* AUCarbonViewControl.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - 0D3132A8B412AE9E63024927 /* sin.cc in Sources */ = {isa = PBXBuildFile; fileRef = B0230FCCA099E6430411DFC9 /* sin.cc */; }; - 0E0B0D39FCB31A57F5298C7A /* AUInputElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6A462A15DB909F68F4A9BECC /* AUInputElement.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - 13F8BF7C26D50908163425CF /* juce_VST3_Wrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 01EF232D8B427B8CE38127C2 /* juce_VST3_Wrapper.mm */; }; - 1C87DA0B69D67481FC6CF4FD /* BinaryData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 54363D0B39B88D43447C0123 /* BinaryData.cpp */; }; - 1CBFE444B43C89E749602B7F /* PluginProcessor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 45ADFD8885BE76C7F7D999AC /* PluginProcessor.cpp */; }; - 1E2E719F9E93AD97BC37565F /* juce_RTAS_DigiCode2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D8038990994C30BDD631733E /* juce_RTAS_DigiCode2.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - 2360F3C87933B5A51B0D4839 /* AUBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0598D37F24E489C12F43EF93 /* AUBase.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - 26E1D92384FB66ED8FCF5101 /* AUBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C4DE747B720C310D6BC65936 /* AUBuffer.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - 3AB728E101D7B85DD39C5CC8 /* freqlut.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3715DFDD7A1B12083F051F5A /* freqlut.cc */; }; - 3D8568887BBA0D81340FF64D /* AUMIDIEffectBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3E301CD94F9029D7E3898EB2 /* AUMIDIEffectBase.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - 3FC0533D8E67D63666A51C64 /* AUEffectBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B8B14C1AA3491F103E6A5F7 /* AUEffectBase.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - 434647C21C803FA8A4D44A70 /* fm_op_kernel.cc in Sources */ = {isa = PBXBuildFile; fileRef = 78CA76788217B98287D9E007 /* fm_op_kernel.cc */; }; - 478699B4EF80A1A1C0D34C10 /* PluginEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 018D0FB9E97B68D2EB3E3F72 /* PluginEditor.cpp */; }; - 47C317B0F77A29ECA0400B2B /* dx7note.cc in Sources */ = {isa = PBXBuildFile; fileRef = AE09B4C2A4BDE8FDA01A8A13 /* dx7note.cc */; }; - 4B27ACC5993C8C74FFCDD3BB /* EngineOpl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61F792AFE04C15F413A4F766 /* EngineOpl.cpp */; }; - 52770E3D32989EC50834582A /* juce_data_structures.mm in Sources */ = {isa = PBXBuildFile; fileRef = 48BDF7DFA849127655B86873 /* juce_data_structures.mm */; }; - 52C0C94470D90310AF2F8433 /* juce_VST3_Wrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0178A36F6E46F92111E4883 /* juce_VST3_Wrapper.cpp */; }; - 556863C97636A308001CFD21 /* CarbonEventHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3A44529EBD28E325DAA12D80 /* CarbonEventHandler.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - 5B3A6A14A3951CF8E37608FF /* juce_gui_extra.mm in Sources */ = {isa = PBXBuildFile; fileRef = 6DC26B61BA1638AFAF142A6C /* juce_gui_extra.mm */; }; - 5F4FB65ABC71FAAD6EDD822E /* juce_RTAS_DigiCode1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 55E39FAA63BA8B9D40F40712 /* juce_RTAS_DigiCode1.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - 60686C2C30A9F2777CEF01BD /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0A56796E1B84D05D8DD1100D /* AudioToolbox.framework */; }; - 623AFA9E78826CA0136251DF /* PluginParam.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 59D15F780D468B587F9C7E78 /* PluginParam.cpp */; }; - 6252C45CDFF75E05CCDBF737 /* CartManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B3889626BDBB814F2387085 /* CartManager.cpp */; }; - 62798B841D9D5E0B71064A73 /* CAVectorUnit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2CA60524355CF872ADB42EA4 /* CAVectorUnit.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - 6443699C06267ECC22CF9D12 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E32283AE8CC5A022E1A6B30B /* Accelerate.framework */; }; - 68878920F603FF1473994736 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FC856709502EE15E8D3F448B /* IOKit.framework */; }; - 6970EC0E1FEDCF3793098929 /* CAStreamBasicDescription.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7B2E31BD7292002DEBCC366B /* CAStreamBasicDescription.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - 697C52FD23363CB2EB9075C6 /* EngineMkI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BEBEDCAD409EE3A5D383B6D /* EngineMkI.cpp */; }; - 69A60891A52C61989A205791 /* ProgramListBox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BF7A1720DADC7983F61E895C /* ProgramListBox.cpp */; }; - 6CE74A36A215C0D39041710F /* juce_events.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB6186E32E92664DEFA0C0A1 /* juce_events.mm */; }; - 7116DC8487DC8321F36CD3D8 /* DiscRecording.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 452C1184BD776249B33151E5 /* DiscRecording.framework */; }; - 77C3EA8D0A12986429BA466D /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 838A5E852BBD79A98CD9FDDD /* AudioUnit.framework */; }; - 7B82F1D5F8DED01AA8988D33 /* fm_core.cc in Sources */ = {isa = PBXBuildFile; fileRef = C01EE75D859C1F942DA3AE61 /* fm_core.cc */; }; - 7E444608AFB10ED54DB5C9AB /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E966C95FACF7B8D5A907FE3 /* WebKit.framework */; }; - 7E6DF76EEA834AC1E96470CE /* juce_AAX_Wrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3254CAE4C282C4432214B016 /* juce_AAX_Wrapper.mm */; }; - 8121E10419E2D99645EA254E /* DXComponents.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D984CE634945077E682B48F3 /* DXComponents.cpp */; }; - 813B2285513D65DDA30AA6E3 /* RecentFilesMenuTemplate.nib in Resources */ = {isa = PBXBuildFile; fileRef = 6F9852573AA442CFBAD9695F /* RecentFilesMenuTemplate.nib */; }; - 82253A3BBFF29FC56A08C972 /* CoreAudioKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 919DF1054C09D19EDA044BE8 /* CoreAudioKit.framework */; }; - 823ECA6DD062A4D0CC056CF0 /* juce_core.mm in Sources */ = {isa = PBXBuildFile; fileRef = 99078823EE2D77389696F0E5 /* juce_core.mm */; }; - 87B95D41180EF626460B2EA3 /* juce_audio_basics.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3DF47857774F10344F12BE65 /* juce_audio_basics.mm */; }; - 8BE2A084394DA3E45DDB5646 /* PluginData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7936BBAA586387B2FAFB958B /* PluginData.cpp */; }; - 8F3B0996452972F266C749E0 /* AlgoDisplay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 03813BF0D93D100F6F0393C9 /* AlgoDisplay.cpp */; }; - 927401C89B9B4F84AC1FE42F /* juce_audio_processors.mm in Sources */ = {isa = PBXBuildFile; fileRef = AA2F01B149F981C2997D583F /* juce_audio_processors.mm */; }; - 93279A1D631E5F4103EAB17E /* juce_AU_Wrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 502D49C82606515A80907EB3 /* juce_AU_Wrapper.mm */; }; - 95105DC8536836A06FD5C7BB /* pitchenv.cc in Sources */ = {isa = PBXBuildFile; fileRef = 51E5757E2D48E638F9A4CB61 /* pitchenv.cc */; }; - 95D4EF9899B0D0D3FC729312 /* AUOutputBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 16D7D354B7CBC971E8B0CFA5 /* AUOutputBase.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - 9D042F9D005532F763A72C26 /* juce_AU_Resources.r in Rez */ = {isa = PBXBuildFile; fileRef = 64CC83E4D891EAEC65EE41C4 /* juce_AU_Resources.r */; }; - 9EC12165834B1341938E951D /* env.cc in Sources */ = {isa = PBXBuildFile; fileRef = 00FDFD1ABE59B4CEF74BF5A3 /* env.cc */; }; - A451AE788A4BD5AA72174D4C /* juce_audio_formats.mm in Sources */ = {isa = PBXBuildFile; fileRef = 32FC163D919C52263303EF7E /* juce_audio_formats.mm */; }; - A6E2908774D7F669F21B1874 /* juce_RTAS_MacUtilities.mm in Sources */ = {isa = PBXBuildFile; fileRef = C7C6039A52C3EE370CA9E73A /* juce_RTAS_MacUtilities.mm */; }; - A7D45B047CA84D7EF7018CDC /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2F55D83145737DE69999DB92 /* QuartzCore.framework */; }; - AE7F0435D9C8D94FFDA16DCA /* AUMIDIBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6E1E415B080EA491A7D58D3A /* AUMIDIBase.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - B0A4786A252B14B604101175 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A01DC4DEBE65C313C7C8A44 /* CoreAudio.framework */; }; - B18C192606DF6079E7B9AEB9 /* PluginFx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BADEB7BF1A65E83A7A1736D /* PluginFx.cpp */; }; - B82FDEB3E53C9455BC6A5DAE /* juce_RTAS_Wrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAA5D8078BCC042BDF94C77A /* juce_RTAS_Wrapper.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - B96C21AF3AD25C7950EA6CE5 /* CAAudioChannelLayout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F3171B20C2BBF12A5786B1F5 /* CAAudioChannelLayout.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - C19B69B5974FA50D116A4F52 /* AUOutputElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 81A949AE03BA033D5D762E9F /* AUOutputElement.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - C2090920CAE913A6C56E0ACE /* juce_PluginUtilities.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B63E7FBEF314AA2B6A8083F4 /* juce_PluginUtilities.cpp */; }; - C510246D7D5E162C9DE63DDE /* GlobalEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 19CEF599CB23958AC63D427E /* GlobalEditor.cpp */; }; - CCC498943EDC85558AF6D8B8 /* ComponentBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 561A9793AA73B7FDDED14476 /* ComponentBase.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - CD1CF0C6B4AB9F4C8175FE08 /* ParamDialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F221CF21582EE0B8FE774583 /* ParamDialog.cpp */; }; - D5A4D43A16EA4C71D53E96CD /* DXLookNFeel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A02775EA788AD4BF7DD1B1A1 /* DXLookNFeel.cpp */; }; - DAC2F8A317486D36C0E0F81F /* CAMutex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A31C49ABA24290126250F574 /* CAMutex.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - DDD1E74DE1AC7E6493AF04CA /* juce_RTAS_DigiCode3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4574217C2F5219DEDDDC9656 /* juce_RTAS_DigiCode3.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - DFA8CE3B7D7FE269254C9BDD /* CAAUParameter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DB84FE1DF027D2AB0952F18 /* CAAUParameter.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - E293B9570C97E4BAD129D4A2 /* juce_RTAS_MacResources.r in Rez */ = {isa = PBXBuildFile; fileRef = FE39DD2B654DF778D919D554 /* juce_RTAS_MacResources.r */; }; - E3FA856CA4DB2009BB0F13E7 /* juce_AAX_Wrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 505852570B48EB3F18076B03 /* juce_AAX_Wrapper.cpp */; }; - E52CB89B4C49057C5A54CFFE /* juce_graphics.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9E3820CD63B47B5385AF2DB6 /* juce_graphics.mm */; }; - E8BEA8ABF5E288C5D5FCD620 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 817CC81F50861DAEEFB2043A /* Carbon.framework */; }; - E8D9A2B640A87FE92D2DA887 /* juce_VST_Wrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6F950B6ABB40B62AE4C0B78 /* juce_VST_Wrapper.mm */; }; - EB464CA0288DD69ABBAE73B3 /* AUDispatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02802D92B7CF0D835254B6C1 /* AUDispatch.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - EC23F9F2EE10A2DE3CB6D406 /* SysexComm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65BE679590BFE2466E16EA67 /* SysexComm.cpp */; }; - ED19C7C3EF2026BC9386CAA3 /* AUScopeElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BAADD431AF7666E435C6C4B3 /* AUScopeElement.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - ED2B6C710BC0474617D147B7 /* juce_audio_devices.mm in Sources */ = {isa = PBXBuildFile; fileRef = 31AEFAC2A9E8C7C96ECB4B96 /* juce_audio_devices.mm */; }; - EE173D0BBBF66A8977FE3A7E /* AUCarbonViewDispatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 173994FFD45CE7CB6D2CCAD7 /* AUCarbonViewDispatch.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - F1106DF1AB7F08D4FC6B6BBB /* MusicDeviceBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 68CCE716313990E1412107A8 /* MusicDeviceBase.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - F329522961F1313091764113 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2FDF76165C655B2E77BE4CFD /* Cocoa.framework */; }; - F9A9CC03BA0B3030E92675AD /* exp2.cc in Sources */ = {isa = PBXBuildFile; fileRef = F63CE53483AF125DCFB024F1 /* exp2.cc */; }; - FA2AF2015CFD98299593EA30 /* CoreMIDI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A81F4DC234E8D93BF9803529 /* CoreMIDI.framework */; }; - FAC9C3E771D11FDA4DFAF17E /* lfo.cc in Sources */ = {isa = PBXBuildFile; fileRef = 2D26E2304C0F6FC633936014 /* lfo.cc */; }; - FFA0B77789034ACCB5203F40 /* juce_audio_utils.mm in Sources */ = {isa = PBXBuildFile; fileRef = 6273BD6D40C9A904273C592F /* juce_audio_utils.mm */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 001A2BCC899370ADC99A8F3A /* juce_FileChooser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileChooser.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.h; sourceTree = SOURCE_ROOT; }; - 006FC3A3740D97EE2F4A78B3 /* juce_MessageManager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MessageManager.cpp; path = ../../JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.cpp; sourceTree = SOURCE_ROOT; }; - 00FDFD1ABE59B4CEF74BF5A3 /* env.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = env.cc; path = ../../Source/msfa/env.cc; sourceTree = SOURCE_ROOT; }; - 015FE0A32C2B3FDA879FAB57 /* juce_DragAndDropContainer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DragAndDropContainer.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h; sourceTree = SOURCE_ROOT; }; - 018D0FB9E97B68D2EB3E3F72 /* PluginEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PluginEditor.cpp; path = ../../Source/PluginEditor.cpp; sourceTree = SOURCE_ROOT; }; - 01EF232D8B427B8CE38127C2 /* juce_VST3_Wrapper.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_VST3_Wrapper.mm; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.mm; sourceTree = SOURCE_ROOT; }; - 02139A14E2732DE36631414F /* juce_TableHeaderComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TableHeaderComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp; sourceTree = SOURCE_ROOT; }; - 0236A082C107280C1505021A /* juce_ImageConvolutionKernel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ImageConvolutionKernel.h; path = ../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.h; sourceTree = SOURCE_ROOT; }; - 02802D92B7CF0D835254B6C1 /* AUDispatch.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUDispatch.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.cpp; sourceTree = DEVELOPER_DIR; }; - 02E962E65624D43B0906B0C6 /* juce_PerformanceCounter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PerformanceCounter.cpp; path = ../../JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.cpp; sourceTree = SOURCE_ROOT; }; - 0337F4D67CD2D5C29939E940 /* CAMutex.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAMutex.h; path = Extras/CoreAudio/PublicUtility/CAMutex.h; sourceTree = DEVELOPER_DIR; }; - 0353CE3273A1063693BC5D55 /* juce_win32_Files.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_Files.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_win32_Files.cpp; sourceTree = SOURCE_ROOT; }; - 037F8EB68705A98C29AEE6B0 /* juce_SystemStats.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_SystemStats.cpp; path = ../../JuceLibraryCode/modules/juce_core/system/juce_SystemStats.cpp; sourceTree = SOURCE_ROOT; }; - 03813BF0D93D100F6F0393C9 /* AlgoDisplay.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AlgoDisplay.cpp; path = ../../Source/AlgoDisplay.cpp; sourceTree = SOURCE_ROOT; }; - 03BC5E395E7CFFE130B7E5DE /* juce_RelativeTime.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_RelativeTime.h; path = ../../JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.h; sourceTree = SOURCE_ROOT; }; - 03C1DC01A1B211F7FCA5043C /* juce_AnimatedPosition.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AnimatedPosition.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_AnimatedPosition.h; sourceTree = SOURCE_ROOT; }; - 03F0A9F328C7E73E37F70774 /* juce_XmlDocument.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_XmlDocument.cpp; path = ../../JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.cpp; sourceTree = SOURCE_ROOT; }; - 040A33439B5E80CE3717319E /* juce_DocumentWindow.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DocumentWindow.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DocumentWindow.cpp; sourceTree = SOURCE_ROOT; }; - 041EA7D542B0EBF7213B9BA2 /* juce_ApplicationCommandID.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ApplicationCommandID.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h; sourceTree = SOURCE_ROOT; }; - 041F12CAFA1CD7215AEC5098 /* juce_Component.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Component.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h; sourceTree = SOURCE_ROOT; }; - 04E04837EB4F3E03908835C9 /* juce_win32_HiddenMessageWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_win32_HiddenMessageWindow.h; path = ../../JuceLibraryCode/modules/juce_events/native/juce_win32_HiddenMessageWindow.h; sourceTree = SOURCE_ROOT; }; - 0598D37F24E489C12F43EF93 /* AUBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUBase.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.cpp; sourceTree = DEVELOPER_DIR; }; - 05F4DA9558D39B50DA5DEF79 /* juce_SortedSet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SortedSet.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_SortedSet.h; sourceTree = SOURCE_ROOT; }; - 06387FD4ED709086E8E0152E /* juce_XmlDocument.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_XmlDocument.h; path = ../../JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.h; sourceTree = SOURCE_ROOT; }; - 06625FB929EB46E8D09E77F8 /* juce_ApplicationCommandInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ApplicationCommandInfo.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h; sourceTree = SOURCE_ROOT; }; - 06A207E085A240F774C4140D /* juce_mac_CoreGraphicsHelpers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_mac_CoreGraphicsHelpers.h; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h; sourceTree = SOURCE_ROOT; }; - 06C4DD7797E7526DB1B47AE5 /* juce_IPAddress.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_IPAddress.cpp; path = ../../JuceLibraryCode/modules/juce_core/network/juce_IPAddress.cpp; sourceTree = SOURCE_ROOT; }; - 07037505B34930CDA76B04A5 /* juce_StretchableObjectResizer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_StretchableObjectResizer.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp; sourceTree = SOURCE_ROOT; }; - 0707C87B401DC983E3FF4263 /* juce_MathsFunctions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MathsFunctions.h; path = ../../JuceLibraryCode/modules/juce_core/maths/juce_MathsFunctions.h; sourceTree = SOURCE_ROOT; }; - 07333A7932C6B7538F4DF21F /* juce_VST3Headers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_VST3Headers.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Headers.h; sourceTree = SOURCE_ROOT; }; - 0733471B6DA02299D2C9590A /* juce_StringArray.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_StringArray.cpp; path = ../../JuceLibraryCode/modules/juce_core/text/juce_StringArray.cpp; sourceTree = SOURCE_ROOT; }; - 075BB641199B15A84856DE6E /* juce_SliderPropertyComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_SliderPropertyComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp; sourceTree = SOURCE_ROOT; }; - 076C4F22CCC47AFEAC2D0C68 /* juce_LuaCodeTokeniser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_LuaCodeTokeniser.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h; sourceTree = SOURCE_ROOT; }; - 07CB27E064E2A82C2B1D3832 /* juce_AbstractFifo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AbstractFifo.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.h; sourceTree = SOURCE_ROOT; }; - 0831514ABD7A268115E6FD43 /* ProgramListBox.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ProgramListBox.h; path = ../../Source/ProgramListBox.h; sourceTree = SOURCE_ROOT; }; - 0A3CCDBDD4238A7F9CB559BD /* juce_FilenameComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FilenameComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h; sourceTree = SOURCE_ROOT; }; - 0A55490419140DC6D2FBB1DA /* juce_ComboBox.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComboBox.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.cpp; sourceTree = SOURCE_ROOT; }; - 0A56796E1B84D05D8DD1100D /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - 0B2C1056583363B66704DB9C /* juce_Array.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Array.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_Array.h; sourceTree = SOURCE_ROOT; }; - 0B338B58E9C37E83F0FD865D /* juce_Desktop.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Desktop.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.h; sourceTree = SOURCE_ROOT; }; - 0B7725520356AED2C80FC943 /* juce_MarkerList.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MarkerList.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.cpp; sourceTree = SOURCE_ROOT; }; - 0BD21CA621B7350EBED18C0A /* Dexed.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Dexed.h; path = ../../Source/Dexed.h; sourceTree = SOURCE_ROOT; }; - 0C0B6B8DAD62A3F5C926825F /* juce_DynamicLibrary.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DynamicLibrary.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_DynamicLibrary.h; sourceTree = SOURCE_ROOT; }; - 0CB234755B75E0DBC2FFB58E /* juce_ResizableCornerComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ResizableCornerComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp; sourceTree = SOURCE_ROOT; }; - 0D5761BE1D2DEA319B57D740 /* Switch_48x26.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Switch_48x26.png; path = ../../Resources/ui/Switch_48x26.png; sourceTree = SOURCE_ROOT; }; - 0DB84FE1DF027D2AB0952F18 /* CAAUParameter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CAAUParameter.cpp; path = Extras/CoreAudio/PublicUtility/CAAUParameter.cpp; sourceTree = DEVELOPER_DIR; }; - 0DCC7A5AD5AC5D3637FFAAFB /* juce_ToolbarButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ToolbarButton.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.h; sourceTree = SOURCE_ROOT; }; - 0DE1759C594D2719742E928A /* juce_ElementComparator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ElementComparator.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_ElementComparator.h; sourceTree = SOURCE_ROOT; }; - 0E3FA3D7B11FC7D19CC634BE /* about.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = about.png; path = ../../Resources/about.png; sourceTree = SOURCE_ROOT; }; - 0E989C4BC7933A41E9B0019E /* juce_KeyboardFocusTraverser.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_KeyboardFocusTraverser.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp; sourceTree = SOURCE_ROOT; }; - 0EA1F582E4E45EB90F02223A /* juce_mac_CoreGraphicsContext.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_CoreGraphicsContext.mm; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm; sourceTree = SOURCE_ROOT; }; - 0EF8098DE092ED5C25105241 /* juce_MouseInactivityDetector.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MouseInactivityDetector.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp; sourceTree = SOURCE_ROOT; }; - 0FB6B4A8DC064694A4A3B271 /* juce_MountedVolumeListChangeDetector.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MountedVolumeListChangeDetector.h; path = ../../JuceLibraryCode/modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h; sourceTree = SOURCE_ROOT; }; - 0FC4F5F1B7E65CC1C9FA915F /* juce_GroupComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_GroupComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.h; sourceTree = SOURCE_ROOT; }; - 0FDAC75611540A0DE7FE3E22 /* juce_SplashScreen.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_SplashScreen.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SplashScreen.cpp; sourceTree = SOURCE_ROOT; }; - 105DA88FCA60BE6C92A7249B /* juce_FloatVectorOperations.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FloatVectorOperations.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h; sourceTree = SOURCE_ROOT; }; - 108462DA6B96E6F49DBD521E /* juce_ScrollBar.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ScrollBar.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.cpp; sourceTree = SOURCE_ROOT; }; - 10E7F81B8369A5A923D5EE9A /* AUInputFormatConverter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUInputFormatConverter.h; path = Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUInputFormatConverter.h; sourceTree = DEVELOPER_DIR; }; - 112C97A7D8CEC06ED2E1B1BE /* juce_StringArray.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_StringArray.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_StringArray.h; sourceTree = SOURCE_ROOT; }; - 113019177161C70BFD9E655E /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_gui_extra/juce_module_info; sourceTree = SOURCE_ROOT; }; - 11329C73799FA61B7BC76418 /* juce_ResizableEdgeComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ResizableEdgeComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp; sourceTree = SOURCE_ROOT; }; - 11593E224B032FD1CD5AD0A2 /* juce_linux_Messaging.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_linux_Messaging.cpp; path = ../../JuceLibraryCode/modules/juce_events/native/juce_linux_Messaging.cpp; sourceTree = SOURCE_ROOT; }; - 116D0566C94C0FF5C3B68DF3 /* juce_TooltipWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TooltipWindow.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TooltipWindow.h; sourceTree = SOURCE_ROOT; }; - 11842D3DF751D5951BD039D4 /* juce_ThreadLocalValue.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ThreadLocalValue.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_ThreadLocalValue.h; sourceTree = SOURCE_ROOT; }; - 11AEAEFECC79A2800B56DDF9 /* juce_TimeSliceThread.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TimeSliceThread.cpp; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.cpp; sourceTree = SOURCE_ROOT; }; - 127F5C75CA1140A229F5C5FD /* juce_mac_FileChooser.mm */ = {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; }; - 1358A353CB770ABF4DF73417 /* juce_IncludeModuleHeaders.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_IncludeModuleHeaders.h; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_IncludeModuleHeaders.h; sourceTree = SOURCE_ROOT; }; - 135C6D9174F6937E278E86FB /* juce_ComponentAnimator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComponentAnimator.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp; sourceTree = SOURCE_ROOT; }; - 13785F78EFA77576147267E3 /* juce_CodeDocument.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CodeDocument.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeDocument.h; sourceTree = SOURCE_ROOT; }; - 13BE37C7C7C4904EE42B9CEA /* juce_PerformanceCounter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PerformanceCounter.h; path = ../../JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.h; sourceTree = SOURCE_ROOT; }; - 1407F2665A3CA985C142273B /* juce_AudioDataConverters.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioDataConverters.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp; sourceTree = SOURCE_ROOT; }; - 14AF9F1F28D50F8E47606660 /* juce_Slider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Slider.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Slider.h; sourceTree = SOURCE_ROOT; }; - 153D4DE95D01307F844AA15B /* juce_VST3PluginFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_VST3PluginFormat.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h; sourceTree = SOURCE_ROOT; }; - 153DD72C28F1B2C131090DEE /* juce_core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_core.h; path = ../../JuceLibraryCode/modules/juce_core/juce_core.h; sourceTree = SOURCE_ROOT; }; - 1585F30843449EA6EA078288 /* juce_ThreadWithProgressWindow.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ThreadWithProgressWindow.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp; sourceTree = SOURCE_ROOT; }; - 15B75D829C40872D542A38B8 /* builtin_pgm.zip */ = {isa = PBXFileReference; lastKnownFileType = file.zip; name = builtin_pgm.zip; path = ../../Resources/builtin_pgm.zip; sourceTree = SOURCE_ROOT; }; - 15F31F8C2BAC231631AC3156 /* juce_audio_basics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_audio_basics.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.h; sourceTree = SOURCE_ROOT; }; - 1600EDBEE9B363CBAB68CD43 /* juce_StringPool.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_StringPool.cpp; path = ../../JuceLibraryCode/modules/juce_core/text/juce_StringPool.cpp; sourceTree = SOURCE_ROOT; }; - 1629C7407F033B97102CEF6B /* juce_NormalisableRange.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_NormalisableRange.h; path = ../../JuceLibraryCode/modules/juce_core/maths/juce_NormalisableRange.h; sourceTree = SOURCE_ROOT; }; - 1635BBF869518BAA7A88A6A0 /* juce_FileSearchPathListComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileSearchPathListComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h; sourceTree = SOURCE_ROOT; }; - 163C2312B370BA53F482B84B /* juce_TabbedButtonBar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TabbedButtonBar.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h; sourceTree = SOURCE_ROOT; }; - 16D7D354B7CBC971E8B0CFA5 /* AUOutputBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUOutputBase.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.cpp; sourceTree = DEVELOPER_DIR; }; - 170F06D00B2197E66300D558 /* juce_TextPropertyComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TextPropertyComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.h; sourceTree = SOURCE_ROOT; }; - 173994FFD45CE7CB6D2CCAD7 /* AUCarbonViewDispatch.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUCarbonViewDispatch.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewDispatch.cpp; sourceTree = DEVELOPER_DIR; }; - 1754400A2E372510CB25043F /* juce_TopLevelWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TopLevelWindow.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TopLevelWindow.h; sourceTree = SOURCE_ROOT; }; - 1756BAFDC82F5E69704BEAFE /* juce_ComponentMovementWatcher.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComponentMovementWatcher.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp; sourceTree = SOURCE_ROOT; }; - 17A328AD02B5D7DA362E1D5D /* juce_ConnectedChildProcess.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ConnectedChildProcess.cpp; path = ../../JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp; sourceTree = SOURCE_ROOT; }; - 17C3024C2A1EE03BC0ED9C96 /* juce_mac_Windowing.mm */ = {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; }; - 17ED00953353016B7E7492B0 /* juce_ApplicationCommandInfo.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ApplicationCommandInfo.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp; sourceTree = SOURCE_ROOT; }; - 18AD1662D33E576F96C30A6A /* juce_TopLevelWindow.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TopLevelWindow.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp; sourceTree = SOURCE_ROOT; }; - 18D52C793029AFCC92C77A75 /* juce_LiveConstantEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_LiveConstantEditor.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp; sourceTree = SOURCE_ROOT; }; - 1914E45DEAEBD1592581F1FD /* juce_AudioPluginFormatManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioPluginFormatManager.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h; sourceTree = SOURCE_ROOT; }; - 195B617C1FF754108A97F645 /* juce_KeyPressMappingSet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_KeyPressMappingSet.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h; sourceTree = SOURCE_ROOT; }; - 19B56FF22ED0090A8D7A3E04 /* juce_gui_basics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_gui_basics.mm; path = ../../JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.mm; sourceTree = SOURCE_ROOT; }; - 19CEF599CB23958AC63D427E /* GlobalEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = GlobalEditor.cpp; path = ../../Source/GlobalEditor.cpp; sourceTree = SOURCE_ROOT; }; - 1A0415BC113C5E901B668D45 /* juce_DrawableShape.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawableShape.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp; sourceTree = SOURCE_ROOT; }; - 1A468C18B5B893C90F31EF6C /* juce_osx_MessageQueue.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_osx_MessageQueue.h; path = ../../JuceLibraryCode/modules/juce_events/native/juce_osx_MessageQueue.h; sourceTree = SOURCE_ROOT; }; - 1A5F53E93F3C800344F307DF /* juce_android_FileChooser.cpp */ = {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; }; - 1AB4868A9AC3151DB805E2ED /* juce_CodeDocument.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_CodeDocument.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp; sourceTree = SOURCE_ROOT; }; - 1B06A67DF2B4FD2969A9781A /* fm_core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = fm_core.h; path = ../../Source/msfa/fm_core.h; sourceTree = SOURCE_ROOT; }; - 1B08D87085D8D577F6CBB008 /* juce_LookAndFeel_V2.cpp */ = {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; }; - 1B9C8840393D305F594C613B /* juce_JPEGLoader.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_JPEGLoader.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp; sourceTree = SOURCE_ROOT; }; - 1BC34A19A42AE647894C4D57 /* juce_RectanglePlacement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_RectanglePlacement.h; path = ../../JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.h; sourceTree = SOURCE_ROOT; }; - 1BDDF13246E8EC9483F6826B /* juce_BubbleComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_BubbleComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.cpp; sourceTree = SOURCE_ROOT; }; - 1C30357241D1DC9CF46D556B /* juce_Image.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Image.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/images/juce_Image.cpp; sourceTree = SOURCE_ROOT; }; - 1C3A85D115878AA5A495199E /* CartManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CartManager.h; path = ../../Source/CartManager.h; sourceTree = SOURCE_ROOT; }; - 1D31136D1C9D959792023095 /* juce_RelativeTime.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RelativeTime.cpp; path = ../../JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.cpp; sourceTree = SOURCE_ROOT; }; - 1D72CD485011A4EA3E6B0FD5 /* NotoSans-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file.ttf; name = "NotoSans-Regular.ttf"; path = "../../Resources/ui/NotoSans-Regular.ttf"; sourceTree = SOURCE_ROOT; }; - 1D798858682A27299589F4E5 /* juce_ComponentListener.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComponentListener.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.cpp; sourceTree = SOURCE_ROOT; }; - 1D95A78059DCCC7B58782F07 /* juce_AudioSampleBuffer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioSampleBuffer.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h; sourceTree = SOURCE_ROOT; }; - 1E1A0627C2977D5FCB8440CC /* juce_LookAndFeel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_LookAndFeel.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h; sourceTree = SOURCE_ROOT; }; - 1EB6398B6F537A4302092240 /* juce_TextEditorKeyMapper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TextEditorKeyMapper.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h; sourceTree = SOURCE_ROOT; }; - 1F51658DEF590741920719FF /* juce_MACAddress.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MACAddress.cpp; path = ../../JuceLibraryCode/modules/juce_core/network/juce_MACAddress.cpp; sourceTree = SOURCE_ROOT; }; - 1F5C171B3E8790746AD764E6 /* juce_GZIPCompressorOutputStream.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GZIPCompressorOutputStream.cpp; path = ../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp; sourceTree = SOURCE_ROOT; }; - 1F982064915D0D00759C6B17 /* juce_GroupComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GroupComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.cpp; sourceTree = SOURCE_ROOT; }; - 1FDD2E98D27BD53D39C3AEB0 /* juce_ConcertinaPanel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ConcertinaPanel.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp; sourceTree = SOURCE_ROOT; }; - 1FDE28E257271B411780600C /* juce_EdgeTable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_EdgeTable.h; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.h; sourceTree = SOURCE_ROOT; }; - 2010DBBC52928BD3BA2E0704 /* juce_linux_SystemStats.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_linux_SystemStats.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_linux_SystemStats.cpp; sourceTree = SOURCE_ROOT; }; - 2068B2F409A743F7AA6005B8 /* juce_android_Network.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_Network.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_android_Network.cpp; sourceTree = SOURCE_ROOT; }; - 20D22F9CE83DD70583C68940 /* juce_BufferingAudioSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_BufferingAudioSource.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h; sourceTree = SOURCE_ROOT; }; - 20D4AE86B061E4D7F2F1F1BF /* juce_ToolbarItemComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ToolbarItemComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h; sourceTree = SOURCE_ROOT; }; - 210364718D006CC26958D583 /* CAVectorUnit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAVectorUnit.h; path = Extras/CoreAudio/PublicUtility/CAVectorUnit.h; sourceTree = DEVELOPER_DIR; }; - 212A0795619AC3D8387EB085 /* juce_Logger.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Logger.cpp; path = ../../JuceLibraryCode/modules/juce_core/logging/juce_Logger.cpp; sourceTree = SOURCE_ROOT; }; - 214092134C5925973C210C26 /* juce_Process.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Process.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_Process.h; sourceTree = SOURCE_ROOT; }; - 217D5E7DC9D4006AA1994A96 /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_audio_processors/juce_module_info; sourceTree = SOURCE_ROOT; }; - 21B76774F02A7242990E433C /* juce_AbstractFifo.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AbstractFifo.cpp; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.cpp; sourceTree = SOURCE_ROOT; }; - 21BB88DADCF2268F24A63357 /* juce_Memory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Memory.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_Memory.h; sourceTree = SOURCE_ROOT; }; - 21E609C00045B8F41BA21DFE /* juce_AudioProcessorGraph.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioProcessorGraph.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h; sourceTree = SOURCE_ROOT; }; - 22520CCBD52F680200524E87 /* juce_SubregionStream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SubregionStream.h; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.h; sourceTree = SOURCE_ROOT; }; - 226462AF67A3DAA0A74B5BF0 /* juce_audio_processors.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_audio_processors.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h; sourceTree = SOURCE_ROOT; }; - 227001AE4630FAA6E65DD252 /* juce_ShapeButton.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ShapeButton.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp; sourceTree = SOURCE_ROOT; }; - 238202B3EA9976135C833C3A /* juce_ComponentBuilder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComponentBuilder.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.h; sourceTree = SOURCE_ROOT; }; - 23E9F8B6075CCB7BA9FE4782 /* juce_CharPointer_ASCII.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CharPointer_ASCII.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_CharPointer_ASCII.h; sourceTree = SOURCE_ROOT; }; - 244636A4B3E48A7B6CC8E996 /* juce_Line.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Line.h; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Line.h; sourceTree = SOURCE_ROOT; }; - 247E415D0635F05B4067C255 /* juce_DirectoryIterator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DirectoryIterator.cpp; path = ../../JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.cpp; sourceTree = SOURCE_ROOT; }; - 2480150B544761DFA3DFF509 /* juce_MidiKeyboardComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiKeyboardComponent.cpp; path = ../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp; sourceTree = SOURCE_ROOT; }; - 2494BCA24C9E3AB3D20372F2 /* juce_PropertyPanel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PropertyPanel.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.cpp; sourceTree = SOURCE_ROOT; }; - 24C467D96909731EB0D68B4A /* juce_FilePreviewComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FilePreviewComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h; sourceTree = SOURCE_ROOT; }; - 24CFBAD49341D774EFA46056 /* juce_UIViewComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_UIViewComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/embedding/juce_UIViewComponent.h; sourceTree = SOURCE_ROOT; }; - 2599ADA2E34E536F438F1B76 /* juce_DrawableText.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawableText.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.h; sourceTree = SOURCE_ROOT; }; - 25F88A5C788D9CF7301569EB /* juce_FileListComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileListComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp; sourceTree = SOURCE_ROOT; }; - 268719C746B8E5EA06DDCF01 /* juce_android_Misc.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_Misc.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_android_Misc.cpp; sourceTree = SOURCE_ROOT; }; - 27077B2F6AA5ED05FAF0B5D8 /* juce_ImagePreviewComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ImagePreviewComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h; sourceTree = SOURCE_ROOT; }; - 271BCF94F884F0354E1EBCC7 /* juce_SplashScreen.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SplashScreen.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SplashScreen.h; sourceTree = SOURCE_ROOT; }; - 2752A284F49F193F36688FAA /* juce_MessageListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MessageListener.h; path = ../../JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.h; sourceTree = SOURCE_ROOT; }; - 2754940A96851188581A2218 /* juce_PluginDirectoryScanner.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PluginDirectoryScanner.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp; sourceTree = SOURCE_ROOT; }; - 27F84193A8E46E113C520776 /* juce_CustomTypeface.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_CustomTypeface.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.cpp; sourceTree = SOURCE_ROOT; }; - 2860C307AFC727F3591D9FBB /* juce_CallOutBox.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_CallOutBox.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_CallOutBox.cpp; sourceTree = SOURCE_ROOT; }; - 288C1D78EC7B90B96377863A /* juce_Timer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Timer.cpp; path = ../../JuceLibraryCode/modules/juce_events/timers/juce_Timer.cpp; sourceTree = SOURCE_ROOT; }; - 2898384503D98B9CDE677C8F /* juce_OutputStream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_OutputStream.h; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.h; sourceTree = SOURCE_ROOT; }; - 29A10DF10817FC573A384056 /* juce_FillType.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FillType.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.cpp; sourceTree = SOURCE_ROOT; }; - 29AE4D440A28441D61C76EF4 /* juce_KnownPluginList.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_KnownPluginList.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp; sourceTree = SOURCE_ROOT; }; - 29C1872028A449607E80B677 /* juce_android_WebBrowserComponent.cpp */ = {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; }; - 29D6A187B80D22EB609C256D /* DXLookNFeel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DXLookNFeel.h; path = ../../Source/DXLookNFeel.h; sourceTree = SOURCE_ROOT; }; - 29FCF15A6F116C0A823A186D /* juce_ChangeListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ChangeListener.h; path = ../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeListener.h; sourceTree = SOURCE_ROOT; }; - 2A1C3333AE8043F0588BBBDF /* juce_MenuBarComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MenuBarComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.h; sourceTree = SOURCE_ROOT; }; - 2A28E0E1ED91E3E66DD795C0 /* juce_FileLogger.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileLogger.cpp; path = ../../JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.cpp; sourceTree = SOURCE_ROOT; }; - 2A61EE6E849869617187D67A /* juce_AudioSampleBuffer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioSampleBuffer.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.cpp; sourceTree = SOURCE_ROOT; }; - 2B455841042E415B99DEE263 /* juce_SpinLock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SpinLock.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_SpinLock.h; sourceTree = SOURCE_ROOT; }; - 2B905EB5C391A1F8D80EA4EE /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_core/juce_module_info; sourceTree = SOURCE_ROOT; }; - 2BAC9F6B6869D1E85C51540B /* juce_Expression.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Expression.h; path = ../../JuceLibraryCode/modules/juce_core/maths/juce_Expression.h; sourceTree = SOURCE_ROOT; }; - 2BEBDED2BACDEEEE975583F3 /* juce_StringPool.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_StringPool.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_StringPool.h; sourceTree = SOURCE_ROOT; }; - 2C65FDA74486C92DF5EA5C87 /* juce_FileFilter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileFilter.h; path = ../../JuceLibraryCode/modules/juce_core/files/juce_FileFilter.h; sourceTree = SOURCE_ROOT; }; - 2CA19470CA427333F8CAC0A5 /* juce_ImagePreviewComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ImagePreviewComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp; sourceTree = SOURCE_ROOT; }; - 2CA60524355CF872ADB42EA4 /* CAVectorUnit.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CAVectorUnit.cpp; path = Extras/CoreAudio/PublicUtility/CAVectorUnit.cpp; sourceTree = DEVELOPER_DIR; }; - 2CB4C73C121FCDEF65CBAC79 /* juce_mac_MainMenu.mm */ = {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; }; - 2D26E2304C0F6FC633936014 /* lfo.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = lfo.cc; path = ../../Source/msfa/lfo.cc; sourceTree = SOURCE_ROOT; }; - 2D8A5B5929909ADD898D7E00 /* juce_HashMap.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_HashMap.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_HashMap.h; sourceTree = SOURCE_ROOT; }; - 2D9932D322EDA14CC872D08B /* juce_MemoryOutputStream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MemoryOutputStream.h; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.h; sourceTree = SOURCE_ROOT; }; - 2DC82CD2D824B8A3A7059E73 /* juce_Component.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Component.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.cpp; sourceTree = SOURCE_ROOT; }; - 2DF03B864D4F23315F18CC24 /* juce_Message.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Message.h; path = ../../JuceLibraryCode/modules/juce_events/messages/juce_Message.h; sourceTree = SOURCE_ROOT; }; - 2DF16794D7C916F177B31322 /* juce_RelativePoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_RelativePoint.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.h; sourceTree = SOURCE_ROOT; }; - 2DF4E9322A4790812A9E9273 /* juce_PopupMenu.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PopupMenu.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.h; sourceTree = SOURCE_ROOT; }; - 2EFC0DDB732834CABE62C36E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; }; - 2F55D83145737DE69999DB92 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - 2FB4EFE77128A64F13B97946 /* juce_Slider.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Slider.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Slider.cpp; sourceTree = SOURCE_ROOT; }; - 2FD26019A4D247FA8F38FE29 /* juce_StretchableLayoutResizerBar.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_StretchableLayoutResizerBar.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp; sourceTree = SOURCE_ROOT; }; - 2FDF76165C655B2E77BE4CFD /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; - 306255E12C87DF0405A5D9EE /* juce_ApplicationProperties.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ApplicationProperties.h; path = ../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h; sourceTree = SOURCE_ROOT; }; - 306D1B033E8EBB80F1E9A24A /* juce_GenericAudioProcessorEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_GenericAudioProcessorEditor.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h; sourceTree = SOURCE_ROOT; }; - 30956FDD9C1C2D706020AB84 /* juce_mac_Network.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_Network.mm; path = ../../JuceLibraryCode/modules/juce_core/native/juce_mac_Network.mm; sourceTree = SOURCE_ROOT; }; - 309E703B70110A64AABCC674 /* juce_ScrollBar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ScrollBar.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.h; sourceTree = SOURCE_ROOT; }; - 30B133CA0CDC245A147F4689 /* controllers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = controllers.h; path = ../../Source/msfa/controllers.h; sourceTree = SOURCE_ROOT; }; - 30C8F9B8F2E0D9D572E43E7A /* juce_MixerAudioSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MixerAudioSource.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.h; sourceTree = SOURCE_ROOT; }; - 30DDED034404C826CAF112BB /* juce_AudioUnitPluginFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioUnitPluginFormat.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h; sourceTree = SOURCE_ROOT; }; - 310AF93FF6F5B6D606FB6ED3 /* juce_Point.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Point.h; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Point.h; sourceTree = SOURCE_ROOT; }; - 31AEFAC2A9E8C7C96ECB4B96 /* juce_audio_devices.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_audio_devices.mm; path = ../../JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.mm; sourceTree = SOURCE_ROOT; }; - 3223ECE0332620D3B03E301A /* juce_FileChooserDialogBox.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileChooserDialogBox.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp; sourceTree = SOURCE_ROOT; }; - 3254CAE4C282C4432214B016 /* juce_AAX_Wrapper.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_AAX_Wrapper.mm; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.mm; sourceTree = SOURCE_ROOT; }; - 32707C43C25AF3F79D120BCF /* juce_String.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_String.cpp; path = ../../JuceLibraryCode/modules/juce_core/text/juce_String.cpp; sourceTree = SOURCE_ROOT; }; - 32E16F662BD317BE07A69E58 /* juce_linux_Windowing.cpp */ = {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; }; - 32F091EF95BC75166AAE583A /* juce_CodeEditorComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_CodeEditorComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp; sourceTree = SOURCE_ROOT; }; - 32FC163D919C52263303EF7E /* juce_audio_formats.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_audio_formats.mm; path = ../../JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.mm; sourceTree = SOURCE_ROOT; }; - 3344EDF97EBFA052C631F473 /* juce_FileChooser.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileChooser.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp; sourceTree = SOURCE_ROOT; }; - 33D3EE89C713EBE01C1D268D /* juce_SubregionStream.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_SubregionStream.cpp; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.cpp; sourceTree = SOURCE_ROOT; }; - 33DDC7D3B0B83DF72DF167AC /* juce_MidiFile.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiFile.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.cpp; sourceTree = SOURCE_ROOT; }; - 33E4BED358B8566CCEE47B95 /* juce_ApplicationBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ApplicationBase.cpp; path = ../../JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.cpp; sourceTree = SOURCE_ROOT; }; - 34328035CBCDFA9F18BBA158 /* juce_linux_SystemTrayIcon.cpp */ = {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; }; - 3444F7C54161FEB1F844619E /* juce_IPAddress.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_IPAddress.h; path = ../../JuceLibraryCode/modules/juce_core/network/juce_IPAddress.h; sourceTree = SOURCE_ROOT; }; - 346937AF08405CC63D570161 /* juce_FileBasedDocument.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileBasedDocument.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/documents/juce_FileBasedDocument.h; sourceTree = SOURCE_ROOT; }; - 349B7AFA001B78E62A9AFABB /* juce_KeyListener.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_KeyListener.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.cpp; sourceTree = SOURCE_ROOT; }; - 35892C1EF9CEA7C1F1C9109F /* juce_TabbedComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TabbedComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.h; sourceTree = SOURCE_ROOT; }; - 3597896505C601CE1FFE1158 /* juce_ApplicationCommandManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ApplicationCommandManager.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h; sourceTree = SOURCE_ROOT; }; - 35F80132DF4DC3669B44BD4A /* juce_LowLevelGraphicsPostScriptRenderer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_LowLevelGraphicsPostScriptRenderer.h; path = ../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h; sourceTree = SOURCE_ROOT; }; - 36037C1183C5836D2EF64887 /* juce_ComponentListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComponentListener.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.h; sourceTree = SOURCE_ROOT; }; - 36E8717C91C6111A701379EB /* juce_JSON.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_JSON.h; path = ../../JuceLibraryCode/modules/juce_core/javascript/juce_JSON.h; sourceTree = SOURCE_ROOT; }; - 3715DFDD7A1B12083F051F5A /* freqlut.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = freqlut.cc; path = ../../Source/msfa/freqlut.cc; sourceTree = SOURCE_ROOT; }; - 37282A25BDD0EEC4AC5F5A8C /* juce_CallOutBox.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CallOutBox.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_CallOutBox.h; sourceTree = SOURCE_ROOT; }; - 37A3210291F1C2B3FF42BCDD /* juce_AudioPluginFormatManager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioPluginFormatManager.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp; sourceTree = SOURCE_ROOT; }; - 37FEC98938A31E7E6DE9D515 /* juce_ResamplingAudioSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ResamplingAudioSource.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h; sourceTree = SOURCE_ROOT; }; - 3927B1AD5EFA95FBE77C0DAB /* juce_win32_WebBrowserComponent.cpp */ = {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; }; - 39423D67EFB8E7CEEF5FFAA9 /* juce_File.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_File.cpp; path = ../../JuceLibraryCode/modules/juce_core/files/juce_File.cpp; sourceTree = SOURCE_ROOT; }; - 3A01DC4DEBE65C313C7C8A44 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; - 3A02DAB152A38D6A9EA9F5F5 /* juce_ios_UIViewComponentPeer.mm */ = {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; }; - 3A0F35877A9E2F5D5D6A0434 /* juce_IIRFilterAudioSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_IIRFilterAudioSource.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h; sourceTree = SOURCE_ROOT; }; - 3A2252FE59FEB529074751B8 /* juce_osx_ObjCHelpers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_osx_ObjCHelpers.h; path = ../../JuceLibraryCode/modules/juce_core/native/juce_osx_ObjCHelpers.h; sourceTree = SOURCE_ROOT; }; - 3A2DE2FA7B6D718AEF872F43 /* juce_ChannelRemappingAudioSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ChannelRemappingAudioSource.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h; sourceTree = SOURCE_ROOT; }; - 3A44529EBD28E325DAA12D80 /* CarbonEventHandler.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CarbonEventHandler.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/CarbonEventHandler.cpp; sourceTree = DEVELOPER_DIR; }; - 3BB7B60AE87F68C10DBEE118 /* juce_FileSearchPath.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileSearchPath.h; path = ../../JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.h; sourceTree = SOURCE_ROOT; }; - 3BE8F91A99E8F48CB9F10C1F /* sin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = sin.h; path = ../../Source/msfa/sin.h; sourceTree = SOURCE_ROOT; }; - 3C11994F7B26920BEB9DA52D /* juce_LookAndFeel_V3.h */ = {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; }; - 3CAC36F05E2A916F49F6DC42 /* juce_InputStream.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_InputStream.cpp; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_InputStream.cpp; sourceTree = SOURCE_ROOT; }; - 3D52BDFF32D151178ABE21D0 /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_gui_basics/juce_module_info; sourceTree = SOURCE_ROOT; }; - 3DC88C42A001EAAB6B959C6F /* juce_MidiKeyboardState.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiKeyboardState.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp; sourceTree = SOURCE_ROOT; }; - 3DF47857774F10344F12BE65 /* juce_audio_basics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_audio_basics.mm; path = ../../JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.mm; sourceTree = SOURCE_ROOT; }; - 3E301CD94F9029D7E3898EB2 /* AUMIDIEffectBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUMIDIEffectBase.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.cpp; sourceTree = DEVELOPER_DIR; }; - 3E312C7BB77E7FF22DF88B96 /* juce_RTAS_DigiCode_Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_RTAS_DigiCode_Header.h; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode_Header.h; sourceTree = SOURCE_ROOT; }; - 3E5A6D7508BF64D897DABC3A /* juce_DrawableText.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawableText.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.cpp; sourceTree = SOURCE_ROOT; }; - 3EBA7E3E2CFD54B3C786098E /* juce_ModalComponentManager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ModalComponentManager.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp; sourceTree = SOURCE_ROOT; }; - 3EBF429D4892591960A930F3 /* juce_ResizableBorderComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ResizableBorderComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h; sourceTree = SOURCE_ROOT; }; - 3F0F5E60F2077B05385D6122 /* juce_UndoableAction.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_UndoableAction.h; path = ../../JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoableAction.h; sourceTree = SOURCE_ROOT; }; - 3F15C4289E956EA0447392BD /* juce_VST3PluginFormat.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_VST3PluginFormat.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp; sourceTree = SOURCE_ROOT; }; - 3F948548BB22C3E546E5B0C6 /* juce_PropertySet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PropertySet.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.h; sourceTree = SOURCE_ROOT; }; - 3FEF83E9DA03570247528BE6 /* juce_AudioThumbnailCache.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioThumbnailCache.cpp; path = ../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp; sourceTree = SOURCE_ROOT; }; - 400C107C97F668916CF93FB2 /* juce_CharacterFunctions.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_CharacterFunctions.cpp; path = ../../JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.cpp; sourceTree = SOURCE_ROOT; }; - 4051235A3DA7534A8E1286F0 /* juce_ComponentDragger.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComponentDragger.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.h; sourceTree = SOURCE_ROOT; }; - 40ACF762CE264F32184C4F7D /* juce_HighResolutionTimer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_HighResolutionTimer.cpp; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.cpp; sourceTree = SOURCE_ROOT; }; - 40D83B00A8BBE334104EB694 /* juce_RectangleList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_RectangleList.h; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.h; sourceTree = SOURCE_ROOT; }; - 40DCD07DB4B1D9FBB9D47BE5 /* juce_ConnectedChildProcess.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ConnectedChildProcess.h; path = ../../JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.h; sourceTree = SOURCE_ROOT; }; - 413E92912A2C8CACB46AFD3B /* juce_SliderPropertyComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SliderPropertyComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h; sourceTree = SOURCE_ROOT; }; - 4166468539A5F6E92A7A153E /* juce_ReferenceCountedArray.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ReferenceCountedArray.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_ReferenceCountedArray.h; sourceTree = SOURCE_ROOT; }; - 41700CC92AEEF157D3B53BA2 /* juce_Drawable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Drawable.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.h; sourceTree = SOURCE_ROOT; }; - 418C5A909668054B5140BDA9 /* juce_FileInputStream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileInputStream.h; path = ../../JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.h; sourceTree = SOURCE_ROOT; }; - 42037D6AD47F7FEBAF6D4732 /* AUBuffer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUBuffer.h; path = Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUBuffer.h; sourceTree = DEVELOPER_DIR; }; - 420843F2827F7FB7A31A4C76 /* juce_TableListBox.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TableListBox.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableListBox.cpp; sourceTree = SOURCE_ROOT; }; - 4313B453E6E7735DFFD2609A /* juce_ApplicationCommandTarget.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ApplicationCommandTarget.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp; sourceTree = SOURCE_ROOT; }; - 431B6C9349785FFC83D695F5 /* juce_Toolbar.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Toolbar.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Toolbar.cpp; sourceTree = SOURCE_ROOT; }; - 431D8FA9D233B45295488AA7 /* juce_FileBrowserListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileBrowserListener.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h; sourceTree = SOURCE_ROOT; }; - 4342EA166DD20D383F6C9E50 /* juce_PlatformDefs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PlatformDefs.h; path = ../../JuceLibraryCode/modules/juce_core/system/juce_PlatformDefs.h; sourceTree = SOURCE_ROOT; }; - 4350188F5B6D76DC651BA40E /* juce_ScopedPointer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ScopedPointer.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_ScopedPointer.h; sourceTree = SOURCE_ROOT; }; - 4370F9713D43E71621F2AA2A /* juce_TemporaryFile.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TemporaryFile.cpp; path = ../../JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.cpp; sourceTree = SOURCE_ROOT; }; - 43E05BD9AADCBDA27B58F5A4 /* juce_CharPointer_UTF8.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CharPointer_UTF8.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF8.h; sourceTree = SOURCE_ROOT; }; - 4405EC65D1F518B70A5CF7B5 /* juce_TextLayout.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TextLayout.h; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.h; sourceTree = SOURCE_ROOT; }; - 443C4EE14F325512D74C6B0E /* juce_TextInputTarget.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TextInputTarget.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h; sourceTree = SOURCE_ROOT; }; - 4461D6D26F4163DDA5B77F72 /* juce_linux_FileChooser.cpp */ = {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; }; - 448630170E2B48A00FBBA757 /* juce_linux_Threads.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_linux_Threads.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_linux_Threads.cpp; sourceTree = SOURCE_ROOT; }; - 4497D4F58A495EF3F3DB7DD2 /* juce_ReadWriteLock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ReadWriteLock.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.h; sourceTree = SOURCE_ROOT; }; - 44E53EF6DC2C6F714A7863C0 /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_audio_basics/juce_module_info; sourceTree = SOURCE_ROOT; }; - 452C1184BD776249B33151E5 /* DiscRecording.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiscRecording.framework; path = System/Library/Frameworks/DiscRecording.framework; sourceTree = SDKROOT; }; - 4567FB06348FF519FDC6D698 /* DXComponents.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DXComponents.h; path = ../../Source/DXComponents.h; sourceTree = SOURCE_ROOT; }; - 4574217C2F5219DEDDDC9656 /* juce_RTAS_DigiCode3.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RTAS_DigiCode3.cpp; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode3.cpp; sourceTree = SOURCE_ROOT; }; - 45ADFD8885BE76C7F7D999AC /* PluginProcessor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PluginProcessor.cpp; path = ../../Source/PluginProcessor.cpp; sourceTree = SOURCE_ROOT; }; - 45CC11D2029BA2CEAE1B0F76 /* juce_CharPointer_UTF16.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CharPointer_UTF16.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF16.h; sourceTree = SOURCE_ROOT; }; - 45E8F3FB24A3579F1C1F3DF5 /* juce_Viewport.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Viewport.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.cpp; sourceTree = SOURCE_ROOT; }; - 45F6575A7BDB9134EAEA7633 /* juce_ActiveXControlComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ActiveXControlComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h; sourceTree = SOURCE_ROOT; }; - 462B768DFC2129F54233D51D /* juce_StretchableLayoutResizerBar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_StretchableLayoutResizerBar.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h; sourceTree = SOURCE_ROOT; }; - 46908987EEFC3623A53A95C2 /* juce_LagrangeInterpolator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_LagrangeInterpolator.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.cpp; sourceTree = SOURCE_ROOT; }; - 46969E6B78BC89383358DCDA /* juce_XMLCodeTokeniser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_XMLCodeTokeniser.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h; sourceTree = SOURCE_ROOT; }; - 4697BFC33D1A3C846B2DED19 /* AUSilentTimeout.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUSilentTimeout.h; path = Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUSilentTimeout.h; sourceTree = DEVELOPER_DIR; }; - 46C20298CCB469481F5C8D36 /* juce_MouseInactivityDetector.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MouseInactivityDetector.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h; sourceTree = SOURCE_ROOT; }; - 4710CA869326390AF0CE2A0B /* juce_ResizableEdgeComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ResizableEdgeComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h; sourceTree = SOURCE_ROOT; }; - 47168956BF1BAC3FCBD55BB8 /* juce_posix_NamedPipe.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_posix_NamedPipe.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_posix_NamedPipe.cpp; sourceTree = SOURCE_ROOT; }; - 475CE9A832328566544F457F /* juce_ZipFile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ZipFile.h; path = ../../JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.h; sourceTree = SOURCE_ROOT; }; - 4778838DB96C82580CBE10D0 /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_audio_utils/juce_module_info; sourceTree = SOURCE_ROOT; }; - 477946525F6F1BE9135A3101 /* juce_FakeMouseMoveGenerator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FakeMouseMoveGenerator.h; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_FakeMouseMoveGenerator.h; sourceTree = SOURCE_ROOT; }; - 478D907DACBE0CF918C6A0AD /* CarbonEventHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CarbonEventHandler.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/CarbonEventHandler.h; sourceTree = DEVELOPER_DIR; }; - 47EF393874A20700CD249091 /* juce_AffineTransform.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AffineTransform.h; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.h; sourceTree = SOURCE_ROOT; }; - 4836B8889A1100EA724CE7C2 /* juce_StretchableLayoutManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_StretchableLayoutManager.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h; sourceTree = SOURCE_ROOT; }; - 48BDF7DFA849127655B86873 /* juce_data_structures.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_data_structures.mm; path = ../../JuceLibraryCode/modules/juce_data_structures/juce_data_structures.mm; sourceTree = SOURCE_ROOT; }; - 48C71FEAED1B46E11F17040C /* juce_AnimatedPositionBehaviours.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AnimatedPositionBehaviours.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h; sourceTree = SOURCE_ROOT; }; - 490146B41BBBC0E550BD73F2 /* juce_MidiKeyboardComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MidiKeyboardComponent.h; path = ../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h; sourceTree = SOURCE_ROOT; }; - 494508266CB5367CB38B5805 /* juce_DirectoryContentsList.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DirectoryContentsList.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp; sourceTree = SOURCE_ROOT; }; - 496ADA4A8E3A7E4906EADC88 /* juce_UndoManager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_UndoManager.cpp; path = ../../JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.cpp; sourceTree = SOURCE_ROOT; }; - 49B29E84D07EAF1F08C30A4F /* juce_MidiMessageSequence.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiMessageSequence.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp; sourceTree = SOURCE_ROOT; }; - 49D8BE8809C3C20272870C06 /* juce_mac_Strings.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_Strings.mm; path = ../../JuceLibraryCode/modules/juce_core/native/juce_mac_Strings.mm; sourceTree = SOURCE_ROOT; }; - 49D8C9E638BCBA98114A0E94 /* juce_Colour.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Colour.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.cpp; sourceTree = SOURCE_ROOT; }; - 4A0A2B796676838D848432FF /* juce_Button.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Button.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.cpp; sourceTree = SOURCE_ROOT; }; - 4A463C15CF07B232605DC2F4 /* juce_Application.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Application.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.cpp; sourceTree = SOURCE_ROOT; }; - 4AF614890823731010E97943 /* juce_PluginDirectoryScanner.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PluginDirectoryScanner.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h; sourceTree = SOURCE_ROOT; }; - 4B70CBF4DB4E571EDF5D3114 /* GlobalEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GlobalEditor.h; path = ../../Source/GlobalEditor.h; sourceTree = SOURCE_ROOT; }; - 4B82A76027BA14576D476E62 /* juce_GenericAudioProcessorEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GenericAudioProcessorEditor.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp; sourceTree = SOURCE_ROOT; }; - 4C3F61A4672F57399AB751A0 /* juce_BufferedInputStream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_BufferedInputStream.h; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.h; sourceTree = SOURCE_ROOT; }; - 4C67D4B9902C1B0CC80E11D8 /* LFO_36_26.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = LFO_36_26.png; path = ../../Resources/ui/LFO_36_26.png; sourceTree = SOURCE_ROOT; }; - 4C6C14363344C87BDA4C1C71 /* juce_ComponentBoundsConstrainer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComponentBoundsConstrainer.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp; sourceTree = SOURCE_ROOT; }; - 4C9751F81C3C052C9A6390F4 /* juce_StretchableObjectResizer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_StretchableObjectResizer.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h; sourceTree = SOURCE_ROOT; }; - 4CB06EEFAA877AA4A28FE150 /* MusicDeviceBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MusicDeviceBase.h; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.h; sourceTree = DEVELOPER_DIR; }; - 4CD97CB51FE3AD5248285B0A /* juce_MouseCursor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MouseCursor.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp; sourceTree = SOURCE_ROOT; }; - 4D488219CE9D736D69F6EF59 /* juce_DirectoryIterator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DirectoryIterator.h; path = ../../JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.h; sourceTree = SOURCE_ROOT; }; - 4D8B2790A6E7552C64453A53 /* juce_StretchableLayoutManager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_StretchableLayoutManager.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp; sourceTree = SOURCE_ROOT; }; - 4DE54D4FA92B85E954BBDD0D /* juce_ImageButton.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ImageButton.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.cpp; sourceTree = SOURCE_ROOT; }; - 4E32AAF34A5EE096B8F3918E /* juce_RTAS_WinUtilities.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RTAS_WinUtilities.cpp; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinUtilities.cpp; sourceTree = SOURCE_ROOT; }; - 4E6FA435926EF660B86E1BFA /* juce_ToolbarItemFactory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ToolbarItemFactory.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h; sourceTree = SOURCE_ROOT; }; - 4F95F3371DCA260343D7D26A /* juce_ButtonPropertyComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ButtonPropertyComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp; sourceTree = SOURCE_ROOT; }; - 4F977F1C295B0D355391AAD3 /* juce_ColourSelector.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ColourSelector.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_ColourSelector.h; sourceTree = SOURCE_ROOT; }; - 4FD935EA5DAA0EAB4F266B2E /* juce_WindowsHooks.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_WindowsHooks.h; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_WindowsHooks.h; sourceTree = SOURCE_ROOT; }; - 4FDFC7D4EEEE8782C9FD9200 /* juce_PathStrokeType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PathStrokeType.h; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.h; sourceTree = SOURCE_ROOT; }; - 502D49C82606515A80907EB3 /* juce_AU_Wrapper.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_AU_Wrapper.mm; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm; sourceTree = SOURCE_ROOT; }; - 505852570B48EB3F18076B03 /* juce_AAX_Wrapper.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AAX_Wrapper.cpp; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp; sourceTree = SOURCE_ROOT; }; - 50EDB2B0543B5881029D3CCE /* juce_InterProcessLock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_InterProcessLock.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_InterProcessLock.h; sourceTree = SOURCE_ROOT; }; - 518104B0010D2466EB51D01A /* juce_IIRFilter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_IIRFilter.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.h; sourceTree = SOURCE_ROOT; }; - 5197B9D23C0D9B28F2FF7F93 /* juce_mac_SystemStats.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_SystemStats.mm; path = ../../JuceLibraryCode/modules/juce_core/native/juce_mac_SystemStats.mm; sourceTree = SOURCE_ROOT; }; - 51D460DE650B5F3701174605 /* juce_Uuid.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Uuid.h; path = ../../JuceLibraryCode/modules/juce_core/misc/juce_Uuid.h; sourceTree = SOURCE_ROOT; }; - 51E5757E2D48E638F9A4CB61 /* pitchenv.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = pitchenv.cc; path = ../../Source/msfa/pitchenv.cc; sourceTree = SOURCE_ROOT; }; - 51FA060C8445108FA58DF13D /* juce_ToolbarItemComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ToolbarItemComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp; sourceTree = SOURCE_ROOT; }; - 524D9B46D38DCF45CA2E8DD2 /* juce_MouseListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MouseListener.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.h; sourceTree = SOURCE_ROOT; }; - 528BBDB63A8BF7246C4DDBA1 /* juce_AudioSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioSource.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_AudioSource.h; sourceTree = SOURCE_ROOT; }; - 52E90BF34CEB39BB7DFA91DE /* juce_RelativeRectangle.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_RelativeRectangle.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.h; sourceTree = SOURCE_ROOT; }; - 53CD8A358FB75E4D10571218 /* juce_PluginListComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PluginListComponent.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.h; sourceTree = SOURCE_ROOT; }; - 53EA5EAEF8A9688559300B1C /* juce_MenuBarModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MenuBarModel.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.h; sourceTree = SOURCE_ROOT; }; - 543415735FAC3778D98C649B /* juce_Value.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Value.h; path = ../../JuceLibraryCode/modules/juce_data_structures/values/juce_Value.h; sourceTree = SOURCE_ROOT; }; - 54363D0B39B88D43447C0123 /* BinaryData.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BinaryData.cpp; path = ../../JuceLibraryCode/BinaryData.cpp; sourceTree = SOURCE_ROOT; }; - 5439A08FE11BD3D1EF760CF8 /* juce_DrawablePath.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawablePath.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp; sourceTree = SOURCE_ROOT; }; - 54A76CABA9E198F906FB01FC /* juce_TextEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TextEditor.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TextEditor.h; sourceTree = SOURCE_ROOT; }; - 55474A49BF29196733C89BBB /* juce_BigInteger.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_BigInteger.h; path = ../../JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.h; sourceTree = SOURCE_ROOT; }; - 5548DEE5ED071453F8AD8AB6 /* juce_ResamplingAudioSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ResamplingAudioSource.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp; sourceTree = SOURCE_ROOT; }; - 55E39FAA63BA8B9D40F40712 /* juce_RTAS_DigiCode1.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RTAS_DigiCode1.cpp; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode1.cpp; sourceTree = SOURCE_ROOT; }; - 561A9793AA73B7FDDED14476 /* ComponentBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ComponentBase.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.cpp; sourceTree = DEVELOPER_DIR; }; - 5721702823682EC883FCB870 /* juce_HyperlinkButton.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_HyperlinkButton.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp; sourceTree = SOURCE_ROOT; }; - 577D5E62E1CE48CEAD5855AE /* juce_ThreadWithProgressWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ThreadWithProgressWindow.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h; sourceTree = SOURCE_ROOT; }; - 57A533082FEF0CE002D69EDB /* juce_ChannelRemappingAudioSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ChannelRemappingAudioSource.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp; sourceTree = SOURCE_ROOT; }; - 587A3ADC691765F0227C4707 /* juce_Result.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Result.h; path = ../../JuceLibraryCode/modules/juce_core/misc/juce_Result.h; sourceTree = SOURCE_ROOT; }; - 588255FD68989F1A03FDF31C /* juce_CPlusPlusCodeTokeniserFunctions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CPlusPlusCodeTokeniserFunctions.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h; sourceTree = SOURCE_ROOT; }; - 59D15F780D468B587F9C7E78 /* PluginParam.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PluginParam.cpp; path = ../../Source/PluginParam.cpp; sourceTree = SOURCE_ROOT; }; - 5A1BD822F8CB7D42BB0EAF7A /* juce_PluginListComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PluginListComponent.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp; sourceTree = SOURCE_ROOT; }; - 5A366F36F3B4E50587A30351 /* NotoSans-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file.ttf; name = "NotoSans-Bold.ttf"; path = "../../Resources/ui/NotoSans-Bold.ttf"; sourceTree = SOURCE_ROOT; }; - 5AD3DDD0285C94CEB17BF03C /* AUEffectBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUEffectBase.h; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUEffectBase.h; sourceTree = DEVELOPER_DIR; }; - 5B12686E2808FCCB8BBE0E24 /* juce_android_GraphicsContext.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_GraphicsContext.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_android_GraphicsContext.cpp; sourceTree = SOURCE_ROOT; }; - 5BA236D62129EFE13A9EAB1B /* juce_MixerAudioSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MixerAudioSource.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp; sourceTree = SOURCE_ROOT; }; - 5BC311F801FE9D018A7B231C /* juce_ComponentDragger.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComponentDragger.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp; sourceTree = SOURCE_ROOT; }; - 5BFC8D75FFE4E8DEE50B3B1A /* juce_PreferencesPanel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PreferencesPanel.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp; sourceTree = SOURCE_ROOT; }; - 5C0A1B7E2BF8FCAF5A1E8616 /* PluginProcessor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PluginProcessor.h; path = ../../Source/PluginProcessor.h; sourceTree = SOURCE_ROOT; }; - 5C9576A21F7C608E767F2108 /* juce_ActionBroadcaster.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ActionBroadcaster.cpp; path = ../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp; sourceTree = SOURCE_ROOT; }; - 5D131F468F18FD82C14C3849 /* juce_mac_Files.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_Files.mm; path = ../../JuceLibraryCode/modules/juce_core/native/juce_mac_Files.mm; sourceTree = SOURCE_ROOT; }; - 5D2301F260F7793BD491A81E /* juce_ConcertinaPanel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ConcertinaPanel.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ConcertinaPanel.h; sourceTree = SOURCE_ROOT; }; - 5DE3DC6998A92F718C9683FA /* juce_CodeTokeniser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CodeTokeniser.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h; sourceTree = SOURCE_ROOT; }; - 5E2597BF6AD27698AA0E9A3D /* juce_RelativeCoordinate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_RelativeCoordinate.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h; sourceTree = SOURCE_ROOT; }; - 5E966C95FACF7B8D5A907FE3 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; - 5F7F52E503E2E2B59D055E6C /* juce_OutputStream.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_OutputStream.cpp; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.cpp; sourceTree = SOURCE_ROOT; }; - 5FA112054E39C5FF09F6928B /* juce_LowLevelGraphicsSoftwareRenderer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_LowLevelGraphicsSoftwareRenderer.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp; sourceTree = SOURCE_ROOT; }; - 5FE10203FC5AE23DBA573E3B /* juce_KnownPluginList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_KnownPluginList.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.h; sourceTree = SOURCE_ROOT; }; - 600DDC87EB44F5B6EFA1500F /* juce_ApplicationCommandTarget.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ApplicationCommandTarget.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h; sourceTree = SOURCE_ROOT; }; - 6050F8DB4EA5F9A4A27D7653 /* CADebugMacros.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CADebugMacros.h; path = Extras/CoreAudio/PublicUtility/CADebugMacros.h; sourceTree = DEVELOPER_DIR; }; - 60F23312570D43B7F7FC0D43 /* AUInputElement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUInputElement.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.h; sourceTree = DEVELOPER_DIR; }; - 61A517E758E2BF89FF445D7F /* juce_MemoryBlock.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MemoryBlock.cpp; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.cpp; sourceTree = SOURCE_ROOT; }; - 61E56039E1D2929463E58D62 /* juce_GlyphArrangement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_GlyphArrangement.h; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.h; sourceTree = SOURCE_ROOT; }; - 61F792AFE04C15F413A4F766 /* EngineOpl.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = EngineOpl.cpp; path = ../../Source/EngineOpl.cpp; sourceTree = SOURCE_ROOT; }; - 624B39364165E2F23A3D4540 /* GlobalEditor_864x144.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = GlobalEditor_864x144.png; path = ../../Resources/ui/GlobalEditor_864x144.png; sourceTree = SOURCE_ROOT; }; - 6273BD6D40C9A904273C592F /* juce_audio_utils.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_audio_utils.mm; path = ../../JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.mm; sourceTree = SOURCE_ROOT; }; - 63B73D99B066179BB9661D4E /* juce_ChoicePropertyComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ChoicePropertyComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp; sourceTree = SOURCE_ROOT; }; - 6475DF69D5BDC709E275BF4D /* juce_WeakReference.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_WeakReference.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_WeakReference.h; sourceTree = SOURCE_ROOT; }; - 64C579AFCDCEED8CAFEF9830 /* juce_ListBox.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ListBox.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ListBox.h; sourceTree = SOURCE_ROOT; }; - 64CC83E4D891EAEC65EE41C4 /* juce_AU_Resources.r */ = {isa = PBXFileReference; lastKnownFileType = file.r; name = juce_AU_Resources.r; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/AU/juce_AU_Resources.r; sourceTree = SOURCE_ROOT; }; - 64CF42AFC2E05AEF9D350CD2 /* env.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = env.h; path = ../../Source/msfa/env.h; sourceTree = SOURCE_ROOT; }; - 64E0EE125571D369100796D9 /* juce_ComponentPeer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComponentPeer.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ComponentPeer.h; sourceTree = SOURCE_ROOT; }; - 65BE679590BFE2466E16EA67 /* SysexComm.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SysexComm.cpp; path = ../../Source/SysexComm.cpp; sourceTree = SOURCE_ROOT; }; - 66E042C6FFE93F0E19B32F09 /* Scaling_36_26.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Scaling_36_26.png; path = ../../Resources/ui/Scaling_36_26.png; sourceTree = SOURCE_ROOT; }; - 6742794BECA5E223253EF810 /* juce_mac_Fonts.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_Fonts.mm; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_Fonts.mm; sourceTree = SOURCE_ROOT; }; - 6833DFDF33AA9A5F551EA79D /* juce_DrawableComposite.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawableComposite.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.h; sourceTree = SOURCE_ROOT; }; - 687A7EC567E4B00B663808F1 /* juce_audio_utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_audio_utils.h; path = ../../JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.h; sourceTree = SOURCE_ROOT; }; - 68CCE716313990E1412107A8 /* MusicDeviceBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MusicDeviceBase.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.cpp; sourceTree = DEVELOPER_DIR; }; - 68D35AFE11BAA35EAE497D47 /* synth.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = synth.h; path = ../../Source/msfa/synth.h; sourceTree = SOURCE_ROOT; }; - 68E9769CFD4CE3B4CA530DA3 /* juce_BooleanPropertyComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_BooleanPropertyComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp; sourceTree = SOURCE_ROOT; }; - 68EBBB35B7A5A57E4BA2F8E2 /* module.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = module.h; path = ../../Source/msfa/module.h; sourceTree = SOURCE_ROOT; }; - 69327BB424333BE9051A2C1D /* juce_win32_DragAndDrop.cpp */ = {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; }; - 69B3908CF6E97D2326117534 /* juce_PathIterator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PathIterator.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.cpp; sourceTree = SOURCE_ROOT; }; - 6A462A15DB909F68F4A9BECC /* AUInputElement.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUInputElement.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.cpp; sourceTree = DEVELOPER_DIR; }; - 6AFA3298C0E6EBF44DF90481 /* juce_PixelFormats.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PixelFormats.h; path = ../../JuceLibraryCode/modules/juce_graphics/colour/juce_PixelFormats.h; sourceTree = SOURCE_ROOT; }; - 6B3889626BDBB814F2387085 /* CartManager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CartManager.cpp; path = ../../Source/CartManager.cpp; sourceTree = SOURCE_ROOT; }; - 6B8B14C1AA3491F103E6A5F7 /* AUEffectBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUEffectBase.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUEffectBase.cpp; sourceTree = DEVELOPER_DIR; }; - 6C1EBFA6E5161BFC6E0A6686 /* juce_Expression.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Expression.cpp; path = ../../JuceLibraryCode/modules/juce_core/maths/juce_Expression.cpp; sourceTree = SOURCE_ROOT; }; - 6CAAD366E2D6A650900C75F0 /* juce_linux_Network.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_linux_Network.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_linux_Network.cpp; sourceTree = SOURCE_ROOT; }; - 6CBCD70FF1AE3E23D1598F84 /* juce_ContainerDeletePolicy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ContainerDeletePolicy.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_ContainerDeletePolicy.h; sourceTree = SOURCE_ROOT; }; - 6D256DC39965C982ADAAFA81 /* juce_FillType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FillType.h; path = ../../JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.h; sourceTree = SOURCE_ROOT; }; - 6D9DB37328ED695A9941A21C /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_data_structures/juce_module_info; sourceTree = SOURCE_ROOT; }; - 6DC26B61BA1638AFAF142A6C /* juce_gui_extra.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_gui_extra.mm; path = ../../JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.mm; sourceTree = SOURCE_ROOT; }; - 6DCB546B40A962FCA3C74DB9 /* juce_ColourGradient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ColourGradient.h; path = ../../JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.h; sourceTree = SOURCE_ROOT; }; - 6DEFC761C7F27A8ED88790B4 /* juce_XMLCodeTokeniser.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_XMLCodeTokeniser.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp; sourceTree = SOURCE_ROOT; }; - 6E1E415B080EA491A7D58D3A /* AUMIDIBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUMIDIBase.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.cpp; sourceTree = DEVELOPER_DIR; }; - 6E2A781F28B3F735F4FAB2A2 /* juce_KeyMappingEditorComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_KeyMappingEditorComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp; sourceTree = SOURCE_ROOT; }; - 6E84E300D2ECD62ED1ED3478 /* juce_FileInputSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileInputSource.h; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.h; sourceTree = SOURCE_ROOT; }; - 6E8FC799E88893F8CD15BB71 /* juce_LADSPAPluginFormat.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_LADSPAPluginFormat.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp; sourceTree = SOURCE_ROOT; }; - 6F0921F115160B435DC6D1D5 /* juce_NamedValueSet.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_NamedValueSet.cpp; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.cpp; sourceTree = SOURCE_ROOT; }; - 6F09FAB37276B4DA24BEBD41 /* juce_AudioThumbnailCache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioThumbnailCache.h; path = ../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h; sourceTree = SOURCE_ROOT; }; - 6F9852573AA442CFBAD9695F /* RecentFilesMenuTemplate.nib */ = {isa = PBXFileReference; lastKnownFileType = file.nib; path = RecentFilesMenuTemplate.nib; sourceTree = SOURCE_ROOT; }; - 6F98D6B8CAA0577CE576CD06 /* juce_MidiKeyboardState.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MidiKeyboardState.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h; sourceTree = SOURCE_ROOT; }; - 70BB114924D2EB3508565E8F /* juce_Identifier.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Identifier.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_Identifier.h; sourceTree = SOURCE_ROOT; }; - 7144CB121F03A13EC1A5383F /* juce_Identifier.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Identifier.cpp; path = ../../JuceLibraryCode/modules/juce_core/text/juce_Identifier.cpp; sourceTree = SOURCE_ROOT; }; - 717E18C7D784FE087436A768 /* juce_ios_UIViewComponent.mm */ = {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; }; - 71A60F40B7B20297A1A5CB18 /* juce_MidiBuffer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiBuffer.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp; sourceTree = SOURCE_ROOT; }; - 71AF0542AEBEDCA5238DFFAA /* juce_MarkerList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MarkerList.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.h; sourceTree = SOURCE_ROOT; }; - 71DFB6F3C44390C0FD109073 /* juce_CPlusPlusCodeTokeniser.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_CPlusPlusCodeTokeniser.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp; sourceTree = SOURCE_ROOT; }; - 71FDCC63A1963F976C7AC8EE /* juce_NamedValueSet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_NamedValueSet.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.h; sourceTree = SOURCE_ROOT; }; - 7202164C1666053D423871B0 /* juce_MidiMessage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MidiMessage.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.h; sourceTree = SOURCE_ROOT; }; - 7228D8E143CA465FB15BD546 /* BinaryData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BinaryData.h; path = ../../JuceLibraryCode/BinaryData.h; sourceTree = SOURCE_ROOT; }; - 72930EF8836E66B6E3A0711D /* juce_ButtonPropertyComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ButtonPropertyComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h; sourceTree = SOURCE_ROOT; }; - 72AC691AF255DD0B6D582EB3 /* juce_DragAndDropTarget.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DragAndDropTarget.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h; sourceTree = SOURCE_ROOT; }; - 72C174C879B2CA24DCE2B6EC /* juce_ChildProcess.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ChildProcess.cpp; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.cpp; sourceTree = SOURCE_ROOT; }; - 72F3014666D709C2DC843E32 /* juce_Atomic.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Atomic.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_Atomic.h; sourceTree = SOURCE_ROOT; }; - 72F342B2288D7D32917C66FF /* juce_RenderingHelpers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_RenderingHelpers.h; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_RenderingHelpers.h; sourceTree = SOURCE_ROOT; }; - 730BEAA59340DC3DF50E2127 /* juce_gui_extra.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_gui_extra.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.h; sourceTree = SOURCE_ROOT; }; - 734BB0B03974DF78B8CB4FD8 /* juce_AudioPluginFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioPluginFormat.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.h; sourceTree = SOURCE_ROOT; }; - 7353E96136FAD8E0F0FAF2F3 /* juce_AudioPlayHead.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioPlayHead.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPlayHead.h; sourceTree = SOURCE_ROOT; }; - 738B67C0D9862DF54EC53785 /* juce_WebBrowserComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_WebBrowserComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h; sourceTree = SOURCE_ROOT; }; - 73A5B8C82401A8D56F700A49 /* juce_ResizableWindow.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ResizableWindow.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp; sourceTree = SOURCE_ROOT; }; - 73BA60F5506ADDBEAF6243FC /* juce_LookAndFeel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_LookAndFeel.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp; sourceTree = SOURCE_ROOT; }; - 73E07C2D38F6ABA12AD6A458 /* juce_MidiMessageSequence.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MidiMessageSequence.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h; sourceTree = SOURCE_ROOT; }; - 742502F34E52826111A41605 /* juce_ToolbarItemPalette.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ToolbarItemPalette.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h; sourceTree = SOURCE_ROOT; }; - 743154234C82FDB5DACEA8C7 /* juce_FileBrowserComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileBrowserComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp; sourceTree = SOURCE_ROOT; }; - 749FDD4CF73F9C8E26D09A7B /* juce_AudioProcessorGraph.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioProcessorGraph.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp; sourceTree = SOURCE_ROOT; }; - 753358C232EE9B14F9CFE87C /* juce_FileDragAndDropTarget.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileDragAndDropTarget.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h; sourceTree = SOURCE_ROOT; }; - 75EB9A0BC0C7717F3DCE5BAE /* juce_DropShadower.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DropShadower.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.cpp; sourceTree = SOURCE_ROOT; }; - 7658FE299B81691CFC697431 /* juce_ScopedReadLock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ScopedReadLock.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_ScopedReadLock.h; sourceTree = SOURCE_ROOT; }; - 77207D1536974D96B7ED2B85 /* juce_TargetPlatform.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TargetPlatform.h; path = ../../JuceLibraryCode/modules/juce_core/system/juce_TargetPlatform.h; sourceTree = SOURCE_ROOT; }; - 775C9C8633BA573DA512EDD6 /* juce_TextLayout.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TextLayout.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.cpp; sourceTree = SOURCE_ROOT; }; - 778E69094A09D97D61E355B2 /* juce_ios_MessageManager.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_ios_MessageManager.mm; path = ../../JuceLibraryCode/modules/juce_events/native/juce_ios_MessageManager.mm; sourceTree = SOURCE_ROOT; }; - 786A98F29FAA91898BB705F4 /* juce_Desktop.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Desktop.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.cpp; sourceTree = SOURCE_ROOT; }; - 78934C6C88D2B35DEF15BAB8 /* juce_AudioUnitPluginFormat.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_AudioUnitPluginFormat.mm; path = ../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm; sourceTree = SOURCE_ROOT; }; - 78A82E89AC0283CC1329E84E /* juce_Timer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Timer.h; path = ../../JuceLibraryCode/modules/juce_events/timers/juce_Timer.h; sourceTree = SOURCE_ROOT; }; - 78CA76788217B98287D9E007 /* fm_op_kernel.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = fm_op_kernel.cc; path = ../../Source/msfa/fm_op_kernel.cc; sourceTree = SOURCE_ROOT; }; - 7936BBAA586387B2FAFB958B /* PluginData.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PluginData.cpp; path = ../../Source/PluginData.cpp; sourceTree = SOURCE_ROOT; }; - 7A0FB6545BA2E344A1F45EA5 /* juce_Decibels.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Decibels.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_Decibels.h; sourceTree = SOURCE_ROOT; }; - 7A26D67672786E0663369D49 /* juce_IIRFilterAudioSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_IIRFilterAudioSource.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp; sourceTree = SOURCE_ROOT; }; - 7A58027CF8C6967B02370E01 /* EngineOpl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EngineOpl.h; path = ../../Source/EngineOpl.h; sourceTree = SOURCE_ROOT; }; - 7A65F23E42CEFBDBA64EE2DA /* CAAudioChannelLayout.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAAudioChannelLayout.h; path = Extras/CoreAudio/PublicUtility/CAAudioChannelLayout.h; sourceTree = DEVELOPER_DIR; }; - 7A739B1B4B833A4668904CA6 /* juce_ReferenceCountedObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ReferenceCountedObject.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_ReferenceCountedObject.h; sourceTree = SOURCE_ROOT; }; - 7A854175B4E6D35ABB7D4E45 /* juce_URL.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_URL.h; path = ../../JuceLibraryCode/modules/juce_core/network/juce_URL.h; sourceTree = SOURCE_ROOT; }; - 7A905E3EE096DAA1D7BA7ABD /* juce_TabbedButtonBar.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TabbedButtonBar.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp; sourceTree = SOURCE_ROOT; }; - 7AB9FBAA49422497E050FFAC /* juce_ChildProcess.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ChildProcess.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.h; sourceTree = SOURCE_ROOT; }; - 7B2E31BD7292002DEBCC366B /* CAStreamBasicDescription.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CAStreamBasicDescription.cpp; path = Extras/CoreAudio/PublicUtility/CAStreamBasicDescription.cpp; sourceTree = DEVELOPER_DIR; }; - 7B6DC352755033E8436427CA /* AUMIDIBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUMIDIBase.h; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.h; sourceTree = DEVELOPER_DIR; }; - 7BE1A83B817F581F39B1F983 /* juce_TextEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TextEditor.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TextEditor.cpp; sourceTree = SOURCE_ROOT; }; - 7BF1EEFA4D36A91714D26060 /* juce_Time.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Time.cpp; path = ../../JuceLibraryCode/modules/juce_core/time/juce_Time.cpp; sourceTree = SOURCE_ROOT; }; - 7C2634F55C78A3822A661CE2 /* juce_XmlElement.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_XmlElement.cpp; path = ../../JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.cpp; sourceTree = SOURCE_ROOT; }; - 7CDDAFACA226D14742566EE3 /* juce_StringPairArray.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_StringPairArray.cpp; path = ../../JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.cpp; sourceTree = SOURCE_ROOT; }; - 7D5E3634F29C83FE1216E5EC /* juce_DragAndDropContainer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DragAndDropContainer.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp; sourceTree = SOURCE_ROOT; }; - 7DC83451FCA10947AC92EBBC /* juce_VST3Common.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_VST3Common.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Common.h; sourceTree = SOURCE_ROOT; }; - 7E68BB771E88E0A2A323D365 /* juce_CPlusPlusCodeTokeniser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CPlusPlusCodeTokeniser.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h; sourceTree = SOURCE_ROOT; }; - 7EC7AB8D0C164E19F70A4D8C /* juce_ModifierKeys.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ModifierKeys.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.h; sourceTree = SOURCE_ROOT; }; - 7ECA74A2FC82F26715446C70 /* juce_FileFilter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileFilter.cpp; path = ../../JuceLibraryCode/modules/juce_core/files/juce_FileFilter.cpp; sourceTree = SOURCE_ROOT; }; - 7F081876B753390FC305329F /* juce_Thread.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Thread.cpp; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_Thread.cpp; sourceTree = SOURCE_ROOT; }; - 7F0B06EA0B38D4555CFEBA61 /* juce_MemoryBlock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MemoryBlock.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.h; sourceTree = SOURCE_ROOT; }; - 7F1B3807BE4D056A05E18663 /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/juce_module_info; sourceTree = SOURCE_ROOT; }; - 7F63546442D6681E7AA27CB8 /* juce_KeyPress.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_KeyPress.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.h; sourceTree = SOURCE_ROOT; }; - 7FB4F731D177B36CE8616BAE /* juce_Javascript.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Javascript.cpp; path = ../../JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.cpp; sourceTree = SOURCE_ROOT; }; - 7FCE241BE34BC4D1E6988B1F /* juce_Result.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Result.cpp; path = ../../JuceLibraryCode/modules/juce_core/misc/juce_Result.cpp; sourceTree = SOURCE_ROOT; }; - 80149DC851E70B4D50DA03DB /* juce_SparseSet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SparseSet.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_SparseSet.h; sourceTree = SOURCE_ROOT; }; - 80153220EFB623D6F205FD1B /* juce_MenuBarComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MenuBarComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp; sourceTree = SOURCE_ROOT; }; - 801E57A03A710591F1B5FEC6 /* AUDispatch.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUDispatch.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.h; sourceTree = DEVELOPER_DIR; }; - 80B36B053E1EA2D1352BD0C9 /* juce_AudioProcessorParameter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioProcessorParameter.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h; sourceTree = SOURCE_ROOT; }; - 8141C52E88E3E82A0A226FAD /* juce_KeyPress.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_KeyPress.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp; sourceTree = SOURCE_ROOT; }; - 817CC81F50861DAEEFB2043A /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; - 81A949AE03BA033D5D762E9F /* AUOutputElement.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUOutputElement.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.cpp; sourceTree = DEVELOPER_DIR; }; - 81E389AD161BE88DA92A59AA /* juce_events.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_events.h; path = ../../JuceLibraryCode/modules/juce_events/juce_events.h; sourceTree = SOURCE_ROOT; }; - 829D2BFEB85DC3589FEBB868 /* juce_WildcardFileFilter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_WildcardFileFilter.cpp; path = ../../JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.cpp; sourceTree = SOURCE_ROOT; }; - 82D97C5FDE8A53DEBB075DC7 /* AUCarbonViewControl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUCarbonViewControl.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewControl.h; sourceTree = DEVELOPER_DIR; }; - 8312A52619B88D3763F6B493 /* juce_LookAndFeel_V3.cpp */ = {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; }; - 83281A9109419F0057EABD31 /* CAVectorUnitTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAVectorUnitTypes.h; path = Extras/CoreAudio/PublicUtility/CAVectorUnitTypes.h; sourceTree = DEVELOPER_DIR; }; - 834F3F9FC2FE9564FF95243D /* juce_win32_Fonts.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_Fonts.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_Fonts.cpp; sourceTree = SOURCE_ROOT; }; - 838A5E852BBD79A98CD9FDDD /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; }; - 838E63F5800CA577B92EF6AE /* OperatorEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = OperatorEditor.cpp; path = ../../Source/OperatorEditor.cpp; sourceTree = SOURCE_ROOT; }; - 8390BC6E8D8190A7C45C6A08 /* juce_win32_Messaging.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_Messaging.cpp; path = ../../JuceLibraryCode/modules/juce_events/native/juce_win32_Messaging.cpp; sourceTree = SOURCE_ROOT; }; - 83B3A12467C52CB13FB353C6 /* juce_mac_SystemTrayIcon.cpp */ = {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; }; - 83DC5A4F730ECA567FADFC3E /* juce_VSTMidiEventList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_VSTMidiEventList.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h; sourceTree = SOURCE_ROOT; }; - 83FAEF9BE29243FBED61B39F /* juce_Random.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Random.h; path = ../../JuceLibraryCode/modules/juce_core/maths/juce_Random.h; sourceTree = SOURCE_ROOT; }; - 84F48AAB7D37C193E401595F /* juce_DialogWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DialogWindow.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DialogWindow.h; sourceTree = SOURCE_ROOT; }; - 853996FFE0D8585AACC747C4 /* juce_MessageListener.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MessageListener.cpp; path = ../../JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.cpp; sourceTree = SOURCE_ROOT; }; - 86412A8C98A3287951990C1B /* lfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lfo.h; path = ../../Source/msfa/lfo.h; sourceTree = SOURCE_ROOT; }; - 8645DD1C8D096C9D7B4B67F2 /* juce_TooltipClient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TooltipClient.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_TooltipClient.h; sourceTree = SOURCE_ROOT; }; - 866BB30F214A58492E281430 /* juce_Initialisation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Initialisation.h; path = ../../JuceLibraryCode/modules/juce_events/messages/juce_Initialisation.h; sourceTree = SOURCE_ROOT; }; - 875B62ECA8BBCC7085FA5F9C /* juce_TreeView.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TreeView.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TreeView.cpp; sourceTree = SOURCE_ROOT; }; - 887686762AD249568D53FC85 /* juce_ColourGradient.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ColourGradient.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.cpp; sourceTree = SOURCE_ROOT; }; - 8890765D8A8E2769231452A3 /* juce_UnitTest.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_UnitTest.cpp; path = ../../JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.cpp; sourceTree = SOURCE_ROOT; }; - 88DEE0054A9328954E19EECA /* juce_InterprocessConnection.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_InterprocessConnection.cpp; path = ../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.cpp; sourceTree = SOURCE_ROOT; }; - 89003B5CB547C82F42EEB0A9 /* juce_mac_NSViewComponentPeer.mm */ = {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; }; - 8915FD41B7EB8AB0961F199A /* juce_ImageFileFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ImageFileFormat.h; path = ../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.h; sourceTree = SOURCE_ROOT; }; - 8921057E004FE1036191B888 /* AUOutputBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUOutputBase.h; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.h; sourceTree = DEVELOPER_DIR; }; - 89BBB19B9AFC6DAD43B9B512 /* juce_Random.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Random.cpp; path = ../../JuceLibraryCode/modules/juce_core/maths/juce_Random.cpp; sourceTree = SOURCE_ROOT; }; - 89CF359102665330C30E1F9A /* juce_NamedPipe.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_NamedPipe.h; path = ../../JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.h; sourceTree = SOURCE_ROOT; }; - 8A4EB298996C4C410C1B4CDC /* juce_PathStrokeType.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PathStrokeType.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.cpp; sourceTree = SOURCE_ROOT; }; - 8A566C440278C23B8FB3A9AB /* juce_Reverb.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Reverb.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_Reverb.h; sourceTree = SOURCE_ROOT; }; - 8A57C43210108CEEE8B61750 /* juce_PopupMenu.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PopupMenu.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.cpp; sourceTree = SOURCE_ROOT; }; - 8A58A60739C88C641626F590 /* juce_ScopedXLock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ScopedXLock.h; path = ../../JuceLibraryCode/modules/juce_events/native/juce_ScopedXLock.h; sourceTree = SOURCE_ROOT; }; - 8AF9F9504D8671A590689E28 /* exp2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = exp2.h; path = ../../Source/msfa/exp2.h; sourceTree = SOURCE_ROOT; }; - 8B160A62F6A6EF21379A8EA7 /* juce_win32_Direct2DGraphicsContext.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_Direct2DGraphicsContext.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp; sourceTree = SOURCE_ROOT; }; - 8B19E0BEAD29F2C0D46FA89C /* Knob_34x34.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Knob_34x34.png; path = ../../Resources/ui/Knob_34x34.png; sourceTree = SOURCE_ROOT; }; - 8B86ECF3351C9D029821C621 /* juce_ImageComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ImageComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ImageComponent.h; sourceTree = SOURCE_ROOT; }; - 8B87D00DA619D83BA6926E28 /* juce_ScopedLock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ScopedLock.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_ScopedLock.h; sourceTree = SOURCE_ROOT; }; - 8BADEB7BF1A65E83A7A1736D /* PluginFx.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PluginFx.cpp; path = ../../Source/PluginFx.cpp; sourceTree = SOURCE_ROOT; }; - 8BBE375590444CD57A311DD2 /* juce_Time.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Time.h; path = ../../JuceLibraryCode/modules/juce_core/time/juce_Time.h; sourceTree = SOURCE_ROOT; }; - 8BEBEDCAD409EE3A5D383B6D /* EngineMkI.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = EngineMkI.cpp; path = ../../Source/EngineMkI.cpp; sourceTree = SOURCE_ROOT; }; - 8C4A3CBB322357AF0CA3C2CD /* juce_FileListComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileListComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.h; sourceTree = SOURCE_ROOT; }; - 8CA96F07FD8390BD5EEC909B /* juce_DirectoryContentsDisplayComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DirectoryContentsDisplayComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h; sourceTree = SOURCE_ROOT; }; - 8CE45844BA3103D92458CFB5 /* juce_Singleton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Singleton.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_Singleton.h; sourceTree = SOURCE_ROOT; }; - 8D7D3383FF13817F3B277B02 /* juce_MessageManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MessageManager.h; path = ../../JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.h; sourceTree = SOURCE_ROOT; }; - 8DC0C64EE71D0AFDD76FEAD7 /* juce_Socket.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Socket.h; path = ../../JuceLibraryCode/modules/juce_core/network/juce_Socket.h; sourceTree = SOURCE_ROOT; }; - 8E04EF74113A0E9808FC4F09 /* juce_PluginDescription.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PluginDescription.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.h; sourceTree = SOURCE_ROOT; }; - 8E3B1087D0795F0D4E02DAF0 /* juce_DirectoryContentsList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DirectoryContentsList.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h; sourceTree = SOURCE_ROOT; }; - 8EC249E14405CAC614E7A4CF /* juce_AttributedString.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AttributedString.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.cpp; sourceTree = SOURCE_ROOT; }; - 8ED1068B85DCEFEFDD3C4F82 /* AUCarbonViewBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUCarbonViewBase.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewBase.cpp; sourceTree = DEVELOPER_DIR; }; - 8F32EF92B0A18751EC39A79B /* JuceHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = SOURCE_ROOT; }; - 8F395B738E7AB81A0333AF96 /* freqlut.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = freqlut.h; path = ../../Source/msfa/freqlut.h; sourceTree = SOURCE_ROOT; }; - 8F62A58CDAF0709EDE33F5E0 /* juce_ImageButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ImageButton.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.h; sourceTree = SOURCE_ROOT; }; - 8FB4C261F0F3760EEA4B7BBE /* juce_posix_SharedCode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_posix_SharedCode.h; path = ../../JuceLibraryCode/modules/juce_core/native/juce_posix_SharedCode.h; sourceTree = SOURCE_ROOT; }; - 900CA19F25F2140D0067345B /* juce_MouseEvent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MouseEvent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.h; sourceTree = SOURCE_ROOT; }; - 9098E2A57CB22B2D5F675D9C /* juce_CriticalSection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CriticalSection.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_CriticalSection.h; sourceTree = SOURCE_ROOT; }; - 911A3E44C161694FF7084464 /* juce_ToggleButton.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ToggleButton.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp; sourceTree = SOURCE_ROOT; }; - 91544DAFCDBE05708D10A24C /* juce_WaitableEvent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_WaitableEvent.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_WaitableEvent.h; sourceTree = SOURCE_ROOT; }; - 9196D1FCEC768D074AAAD581 /* juce_Variant.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Variant.cpp; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_Variant.cpp; sourceTree = SOURCE_ROOT; }; - 919DF1054C09D19EDA044BE8 /* CoreAudioKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; }; - 930D512FD24D7E21E43C7322 /* juce_data_structures.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_data_structures.h; path = ../../JuceLibraryCode/modules/juce_data_structures/juce_data_structures.h; sourceTree = SOURCE_ROOT; }; - 936D695F9C82434D08C181FC /* juce_BorderSize.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_BorderSize.h; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_BorderSize.h; sourceTree = SOURCE_ROOT; }; - 937CFA7E69529A634C1DCD5C /* juce_PropertyComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PropertyComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.h; sourceTree = SOURCE_ROOT; }; - 942BA246938908E24A47A05B /* juce_Font.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Font.h; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.h; sourceTree = SOURCE_ROOT; }; - 949B3D44B0EFFFE18578E44E /* juce_ImageComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ImageComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ImageComponent.cpp; sourceTree = SOURCE_ROOT; }; - 9514C57B8C2FC488E49FF841 /* juce_XmlElement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_XmlElement.h; path = ../../JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.h; sourceTree = SOURCE_ROOT; }; - 954708C705637A2F8F204F0A /* juce_MemoryInputStream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MemoryInputStream.h; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.h; sourceTree = SOURCE_ROOT; }; - 954D25A9D5C49DEB9D2FD167 /* juce_NSViewComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_NSViewComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/embedding/juce_NSViewComponent.h; sourceTree = SOURCE_ROOT; }; - 95812E339031893CDE82E8E5 /* juce_ModifierKeys.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ModifierKeys.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp; sourceTree = SOURCE_ROOT; }; - 95B7D6B36478C5A2977ADD4C /* juce_File.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_File.h; path = ../../JuceLibraryCode/modules/juce_core/files/juce_File.h; sourceTree = SOURCE_ROOT; }; - 95D4F595A6D807E681E1E2B5 /* juce_MemoryInputStream.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MemoryInputStream.cpp; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.cpp; sourceTree = SOURCE_ROOT; }; - 969250C57EF34E88AF1062BE /* juce_Label.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Label.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Label.cpp; sourceTree = SOURCE_ROOT; }; - 97187C062A4A90E3DE7B4B6F /* juce_win32_ActiveXComponent.cpp */ = {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; }; - 97DAB16E37783E73F1D039A3 /* juce_mac_MessageManager.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_MessageManager.mm; path = ../../JuceLibraryCode/modules/juce_events/native/juce_mac_MessageManager.mm; sourceTree = SOURCE_ROOT; }; - 980D53B155A6FE153BF4ECC4 /* juce_CharacterFunctions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CharacterFunctions.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.h; sourceTree = SOURCE_ROOT; }; - 9851B7F5090C1FA428169434 /* juce_AttributedString.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AttributedString.h; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.h; sourceTree = SOURCE_ROOT; }; - 99078823EE2D77389696F0E5 /* juce_core.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_core.mm; path = ../../JuceLibraryCode/modules/juce_core/juce_core.mm; sourceTree = SOURCE_ROOT; }; - 99B1A018081D90D801667296 /* juce_mac_Threads.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_Threads.mm; path = ../../JuceLibraryCode/modules/juce_core/native/juce_mac_Threads.mm; sourceTree = SOURCE_ROOT; }; - 99D8CB814600E509F918CFC5 /* juce_DrawableButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawableButton.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.h; sourceTree = SOURCE_ROOT; }; - 99FFA4AC86A982F68CE03ED3 /* juce_Uuid.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Uuid.cpp; path = ../../JuceLibraryCode/modules/juce_core/misc/juce_Uuid.cpp; sourceTree = SOURCE_ROOT; }; - 9A68431EDA5B8D2023A10A02 /* juce_Viewport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Viewport.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.h; sourceTree = SOURCE_ROOT; }; - 9AAC5E6C1A21F8FE2F66F0E0 /* ParamDialog.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ParamDialog.h; path = ../../Source/ParamDialog.h; sourceTree = SOURCE_ROOT; }; - 9B103127E2063BAFD4A4FD33 /* juce_Thread.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Thread.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_Thread.h; sourceTree = SOURCE_ROOT; }; - 9B36F7CC7A136C2AEB4E5E53 /* juce_WindowsRegistry.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_WindowsRegistry.h; path = ../../JuceLibraryCode/modules/juce_core/misc/juce_WindowsRegistry.h; sourceTree = SOURCE_ROOT; }; - 9BC0901018A3D55DCCA54301 /* juce_ComponentMovementWatcher.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComponentMovementWatcher.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h; sourceTree = SOURCE_ROOT; }; - 9D2ECC20D62F513E41A28337 /* juce_MouseInputSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MouseInputSource.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp; sourceTree = SOURCE_ROOT; }; - 9D542FAE4CA607E1F19C3EC9 /* juce_SystemClipboard.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SystemClipboard.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_SystemClipboard.h; sourceTree = SOURCE_ROOT; }; - 9D5B06B94AB34DBEC8BD262E /* juce_linux_Fonts.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_linux_Fonts.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_linux_Fonts.cpp; sourceTree = SOURCE_ROOT; }; - 9E0A95AA535CE6ABE66D9A30 /* juce_FilenameComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FilenameComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp; sourceTree = SOURCE_ROOT; }; - 9E3820CD63B47B5385AF2DB6 /* juce_graphics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_graphics.mm; path = ../../JuceLibraryCode/modules/juce_graphics/juce_graphics.mm; sourceTree = SOURCE_ROOT; }; - 9E38FC6135AC278A4704BE9D /* juce_GraphicsContext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_GraphicsContext.h; path = ../../JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.h; sourceTree = SOURCE_ROOT; }; - 9EA6B9182B39D4F9B416B14A /* juce_ScopedWriteLock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ScopedWriteLock.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_ScopedWriteLock.h; sourceTree = SOURCE_ROOT; }; - 9ED32BCD42EFF79D067525DF /* juce_ApplicationProperties.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ApplicationProperties.cpp; path = ../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp; sourceTree = SOURCE_ROOT; }; - 9F4CAD2C33179825F3080F1F /* juce_ToggleButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ToggleButton.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.h; sourceTree = SOURCE_ROOT; }; - 9F9EAFF1322AAE2B114A611B /* juce_ThreadPool.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ThreadPool.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.h; sourceTree = SOURCE_ROOT; }; - 9FA7591BA2EFB4349B6E02A9 /* juce_freetype_Fonts.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_freetype_Fonts.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_freetype_Fonts.cpp; sourceTree = SOURCE_ROOT; }; - 9FB43E65C5F68B31FB16D0F5 /* OperatorEditor_287x218.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = OperatorEditor_287x218.png; path = ../../Resources/ui/OperatorEditor_287x218.png; sourceTree = SOURCE_ROOT; }; - A00DC4E59356AF5F1D9C02D1 /* juce_KeyMappingEditorComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_KeyMappingEditorComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h; sourceTree = SOURCE_ROOT; }; - A013A93080FB0FB98C02C96B /* juce_RelativePointPath.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RelativePointPath.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp; sourceTree = SOURCE_ROOT; }; - A02775EA788AD4BF7DD1B1A1 /* DXLookNFeel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DXLookNFeel.cpp; path = ../../Source/DXLookNFeel.cpp; sourceTree = SOURCE_ROOT; }; - A03CA8621EA02C18B4117EC1 /* juce_AudioThumbnail.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioThumbnail.cpp; path = ../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp; sourceTree = SOURCE_ROOT; }; - A040ED3E3D914E80D6F56110 /* juce_LagrangeInterpolator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_LagrangeInterpolator.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.h; sourceTree = SOURCE_ROOT; }; - A0492880578DCB9152DE5EAD /* juce_ByteOrder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ByteOrder.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_ByteOrder.h; sourceTree = SOURCE_ROOT; }; - A062855D9DD17397012BC224 /* juce_PreferencesPanel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PreferencesPanel.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_PreferencesPanel.h; sourceTree = SOURCE_ROOT; }; - A0C5AA7F71F5C650FBBB83C9 /* juce_ToneGeneratorAudioSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ToneGeneratorAudioSource.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp; sourceTree = SOURCE_ROOT; }; - A0EDFAC99A72166065DDD1FE /* juce_CaretComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_CaretComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp; sourceTree = SOURCE_ROOT; }; - A11BA069921359F646E104A1 /* juce_StandardHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_StandardHeader.h; path = ../../JuceLibraryCode/modules/juce_core/system/juce_StandardHeader.h; sourceTree = SOURCE_ROOT; }; - A190462810A30005F66291F9 /* juce_String.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_String.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_String.h; sourceTree = SOURCE_ROOT; }; - A199934EF3E1D20FD472E51D /* juce_ios_Windowing.mm */ = {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; }; - A1CD23B489568CB51325DB98 /* juce_DeletedAtShutdown.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DeletedAtShutdown.cpp; path = ../../JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.cpp; sourceTree = SOURCE_ROOT; }; - A27B095F0D44EB7FFFC3951E /* juce_JSON.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_JSON.cpp; path = ../../JuceLibraryCode/modules/juce_core/javascript/juce_JSON.cpp; sourceTree = SOURCE_ROOT; }; - A2C4984859B7A2F3CB17C609 /* juce_MultiTimer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MultiTimer.h; path = ../../JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.h; sourceTree = SOURCE_ROOT; }; - A2D3A958C5D96910BEDE9283 /* juce_ListBox.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ListBox.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ListBox.cpp; sourceTree = SOURCE_ROOT; }; - A2DABCCF72397C2C7C69F441 /* juce_TreeView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TreeView.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TreeView.h; sourceTree = SOURCE_ROOT; }; - A31C49ABA24290126250F574 /* CAMutex.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CAMutex.cpp; path = Extras/CoreAudio/PublicUtility/CAMutex.cpp; sourceTree = DEVELOPER_DIR; }; - A348DAE6ECDEF51CAD6B5FE4 /* juce_ValueTree.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ValueTree.cpp; path = ../../JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.cpp; sourceTree = SOURCE_ROOT; }; - A354DF25FF89648B38DB63DC /* juce_gui_basics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_gui_basics.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.h; sourceTree = SOURCE_ROOT; }; - A3B840D8C76CA45D3096241C /* juce_OwnedArray.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_OwnedArray.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_OwnedArray.h; sourceTree = SOURCE_ROOT; }; - A3C98189E1FB70E082F1AC6B /* juce_MouseInputSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MouseInputSource.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.h; sourceTree = SOURCE_ROOT; }; - A3E39527888583E832999240 /* juce_android_JNIHelpers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_android_JNIHelpers.h; path = ../../JuceLibraryCode/modules/juce_core/native/juce_android_JNIHelpers.h; sourceTree = SOURCE_ROOT; }; - A4010716414361F5F304407A /* juce_IncludeSystemHeaders.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_IncludeSystemHeaders.h; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_IncludeSystemHeaders.h; sourceTree = SOURCE_ROOT; }; - A44D9BDAD9BE9AD2E519D241 /* juce_android_Fonts.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_Fonts.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_android_Fonts.cpp; sourceTree = SOURCE_ROOT; }; - A4732634AB48AFD0FB06D7FA /* AppConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = SOURCE_ROOT; }; - A4A391D50A9F61201CBC277D /* juce_win32_Windowing.cpp */ = {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; }; - A4BAD3C43AF0D19ECA1C2BB3 /* juce_MultiTimer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MultiTimer.cpp; path = ../../JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.cpp; sourceTree = SOURCE_ROOT; }; - A57ACCF886A902BBCB603D5B /* juce_ToneGeneratorAudioSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ToneGeneratorAudioSource.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h; sourceTree = SOURCE_ROOT; }; - A5C29A814EAFAD95B416C624 /* juce_Logger.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Logger.h; path = ../../JuceLibraryCode/modules/juce_core/logging/juce_Logger.h; sourceTree = SOURCE_ROOT; }; - A5E6E877E1151D8B3E480B76 /* juce_LookAndFeel_V1.h */ = {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; }; - A70082D71DB8B5D779944812 /* juce_FileOutputStream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileOutputStream.h; path = ../../JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.h; sourceTree = SOURCE_ROOT; }; - A700ACBCC4D648B60362B3D6 /* juce_FileLogger.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileLogger.h; path = ../../JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.h; sourceTree = SOURCE_ROOT; }; - A763DB1FF5441EFF39491530 /* juce_UndoManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_UndoManager.h; path = ../../JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.h; sourceTree = SOURCE_ROOT; }; - A7894AD5A242CD86ACE9455C /* AUResources.r */ = {isa = PBXFileReference; lastKnownFileType = file.r; name = AUResources.r; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUResources.r; sourceTree = DEVELOPER_DIR; }; - A7BE5CE9E0BA615BCC867CB8 /* juce_DrawableRectangle.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawableRectangle.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h; sourceTree = SOURCE_ROOT; }; - A7C3E1CAAA03F545AA4FCFAA /* juce_Path.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Path.h; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.h; sourceTree = SOURCE_ROOT; }; - A810A279E11A672B8F84AD72 /* juce_MidiBuffer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MidiBuffer.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.h; sourceTree = SOURCE_ROOT; }; - A81F4DC234E8D93BF9803529 /* CoreMIDI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; }; - A81FD2D7571ED030F7292079 /* juce_ChoicePropertyComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ChoicePropertyComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h; sourceTree = SOURCE_ROOT; }; - A83F026919CEDB80894F3798 /* juce_NotificationType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_NotificationType.h; path = ../../JuceLibraryCode/modules/juce_events/messages/juce_NotificationType.h; sourceTree = SOURCE_ROOT; }; - A95F8438AE6F3BA4CCD2A1EE /* juce_PositionableAudioSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PositionableAudioSource.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h; sourceTree = SOURCE_ROOT; }; - AA2F01B149F981C2997D583F /* juce_audio_processors.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_audio_processors.mm; path = ../../JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.mm; sourceTree = SOURCE_ROOT; }; - AA5AD3160392AC223285535C /* juce_GlowEffect.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GlowEffect.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.cpp; sourceTree = SOURCE_ROOT; }; - AA600E8588CD8DE76CB9C361 /* juce_MultiDocumentPanel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MultiDocumentPanel.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp; sourceTree = SOURCE_ROOT; }; - AA6BE14C6DF4E89F72919216 /* juce_AsyncUpdater.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AsyncUpdater.h; path = ../../JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.h; sourceTree = SOURCE_ROOT; }; - AA84602D83F8E270AC0281AE /* juce_ProgressBar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ProgressBar.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ProgressBar.h; sourceTree = SOURCE_ROOT; }; - AAA6221960332B921DDF42A4 /* juce_DrawableImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawableImage.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.h; sourceTree = SOURCE_ROOT; }; - AAD65774913834A6443A3B82 /* juce_UnitTest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_UnitTest.h; path = ../../JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.h; sourceTree = SOURCE_ROOT; }; - AB6186E32E92664DEFA0C0A1 /* juce_events.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_events.mm; path = ../../JuceLibraryCode/modules/juce_events/juce_events.mm; sourceTree = SOURCE_ROOT; }; - AB7EBBEDA6F3984B295E123F /* juce_android_Messaging.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_Messaging.cpp; path = ../../JuceLibraryCode/modules/juce_events/native/juce_android_Messaging.cpp; sourceTree = SOURCE_ROOT; }; - AB91CD7D677DF03475CA2090 /* juce_android_Windowing.cpp */ = {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; }; - AC0E5E706FA5E8597F943065 /* juce_LocalisedStrings.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_LocalisedStrings.cpp; path = ../../JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.cpp; sourceTree = SOURCE_ROOT; }; - AC49A363BFC6B7631E1CD39B /* juce_LowLevelGraphicsSoftwareRenderer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_LowLevelGraphicsSoftwareRenderer.h; path = ../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h; sourceTree = SOURCE_ROOT; }; - AC6693856E8A4626E5571CBC /* juce_AudioDeviceSelectorComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioDeviceSelectorComponent.h; path = ../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h; sourceTree = SOURCE_ROOT; }; - AC7FD56AB45D297F1D62676C /* juce_DirectoryContentsDisplayComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DirectoryContentsDisplayComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp; sourceTree = SOURCE_ROOT; }; - ACDB4542A6B2FE5186631197 /* juce_BubbleMessageComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_BubbleMessageComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp; sourceTree = SOURCE_ROOT; }; - ACDE74B253321268CA9AB8C4 /* juce_TextButton.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TextButton.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.cpp; sourceTree = SOURCE_ROOT; }; - ACE30A4CDB9C2F2C13B8ADFA /* juce_ChangeBroadcaster.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ChangeBroadcaster.cpp; path = ../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp; sourceTree = SOURCE_ROOT; }; - ACEA0E1D856960307276B8B8 /* juce_graphics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_graphics.h; path = ../../JuceLibraryCode/modules/juce_graphics/juce_graphics.h; sourceTree = SOURCE_ROOT; }; - AD6C159D76B2BFAF579383F8 /* juce_CachedComponentImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CachedComponentImage.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/components/juce_CachedComponentImage.h; sourceTree = SOURCE_ROOT; }; - ADC81E4F771BD99A4C3C822A /* juce_win32_DirectWriteTypeface.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_DirectWriteTypeface.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp; sourceTree = SOURCE_ROOT; }; - ADF4E92197B00B0EB10384BA /* juce_CaretComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CaretComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.h; sourceTree = SOURCE_ROOT; }; - AE09B4C2A4BDE8FDA01A8A13 /* dx7note.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = dx7note.cc; path = ../../Source/msfa/dx7note.cc; sourceTree = SOURCE_ROOT; }; - AE4B8002F4435BEADA3AE966 /* juce_PropertySet.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PropertySet.cpp; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.cpp; sourceTree = SOURCE_ROOT; }; - AE4DF6AF917F1A8DDF5376E3 /* juce_ModalComponentManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ModalComponentManager.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.h; sourceTree = SOURCE_ROOT; }; - AE8321756C03700EB12FF98A /* juce_RecentlyOpenedFilesList.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RecentlyOpenedFilesList.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp; sourceTree = SOURCE_ROOT; }; - AE84ADD347C9AB73ECFCBED7 /* AUTimestampGenerator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUTimestampGenerator.h; path = Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUTimestampGenerator.h; sourceTree = DEVELOPER_DIR; }; - AED57A3601CE4B9FF8007855 /* juce_HeapBlock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_HeapBlock.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_HeapBlock.h; sourceTree = SOURCE_ROOT; }; - AEFD0A7D65FEC1D23A87FB1C /* juce_PropertyPanel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PropertyPanel.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.h; sourceTree = SOURCE_ROOT; }; - AF1DFD842A36E967DF140D5C /* aligned_buf.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = aligned_buf.h; path = ../../Source/msfa/aligned_buf.h; sourceTree = SOURCE_ROOT; }; - AF298423A147823848DFBC30 /* juce_ReadWriteLock.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ReadWriteLock.cpp; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.cpp; sourceTree = SOURCE_ROOT; }; - AF9A3BEBEC95195644691CA1 /* juce_mac_AppleRemote.mm */ = {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; }; - AFB323F45D65FBC8B472B825 /* juce_GZIPDecompressorInputStream.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GZIPDecompressorInputStream.cpp; path = ../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp; sourceTree = SOURCE_ROOT; }; - B0230FCCA099E6430411DFC9 /* sin.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = sin.cc; path = ../../Source/msfa/sin.cc; sourceTree = SOURCE_ROOT; }; - B06A13CEF4F653521D640041 /* juce_win32_SystemTrayIcon.cpp */ = {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; }; - B0A8FCF2D607B95C740D17C9 /* juce_Rectangle.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Rectangle.h; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Rectangle.h; sourceTree = SOURCE_ROOT; }; - B11EC67DFA21869511B3041E /* juce_ArrowButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ArrowButton.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.h; sourceTree = SOURCE_ROOT; }; - B1D9F99AC498364816DAC219 /* juce_android_Files.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_Files.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_android_Files.cpp; sourceTree = SOURCE_ROOT; }; - B1E71D410154F9F7964A8F5F /* juce_MouseCursor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MouseCursor.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.h; sourceTree = SOURCE_ROOT; }; - B22154A68283179A2059275F /* juce_MouseEvent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MouseEvent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.cpp; sourceTree = SOURCE_ROOT; }; - B240D74DFFCFE7CC095CEF59 /* juce_win32_Registry.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_Registry.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_win32_Registry.cpp; sourceTree = SOURCE_ROOT; }; - B29C1AA0C72B3F9D34F7FEE4 /* juce_CompilerSupport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CompilerSupport.h; path = ../../JuceLibraryCode/modules/juce_core/system/juce_CompilerSupport.h; sourceTree = SOURCE_ROOT; }; - B446CB8C1ED8823EA2F33E30 /* juce_FileOutputStream.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileOutputStream.cpp; path = ../../JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.cpp; sourceTree = SOURCE_ROOT; }; - B4821C5DCA629694CE0A29FB /* juce_AudioThumbnail.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioThumbnail.h; path = ../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.h; sourceTree = SOURCE_ROOT; }; - B4AA6DED570BD1D3E701BA49 /* juce_LADSPAPluginFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_LADSPAPluginFormat.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h; sourceTree = SOURCE_ROOT; }; - B4C62338187DC6B1B1F0CF54 /* juce_Synthesiser.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Synthesiser.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp; sourceTree = SOURCE_ROOT; }; - B4CCE3F32C6854405890C6BC /* juce_NamedPipe.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_NamedPipe.cpp; path = ../../JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.cpp; sourceTree = SOURCE_ROOT; }; - B55F33C584CCF617C5C71EE6 /* juce_MidiFile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MidiFile.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.h; sourceTree = SOURCE_ROOT; }; - B57E1987459E64275B4652B2 /* juce_GlyphArrangement.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GlyphArrangement.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp; sourceTree = SOURCE_ROOT; }; - B58C5191B1F0F0863167A322 /* juce_mac_MouseCursor.mm */ = {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; }; - B5D800CC11CBD506E9A6F4FB /* juce_AudioProcessor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioProcessor.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp; sourceTree = SOURCE_ROOT; }; - B633E97B2CB9548F0AF0164A /* juce_ResizableBorderComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ResizableBorderComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp; sourceTree = SOURCE_ROOT; }; - B63E7FBEF314AA2B6A8083F4 /* juce_PluginUtilities.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PluginUtilities.cpp; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp; sourceTree = SOURCE_ROOT; }; - B6A004CD5808CFA5481EFA02 /* juce_ScopedValueSetter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ScopedValueSetter.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_ScopedValueSetter.h; sourceTree = SOURCE_ROOT; }; - B773C79C475482598391DF35 /* juce_AudioPluginFormat.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioPluginFormat.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp; sourceTree = SOURCE_ROOT; }; - B779A3FF92AF0ED28B97C03A /* juce_ValueTree.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ValueTree.h; path = ../../JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.h; sourceTree = SOURCE_ROOT; }; - B7ABA3D144D21935200C8386 /* juce_RelativePoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RelativePoint.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.cpp; sourceTree = SOURCE_ROOT; }; - B8007B51F9FA8B2F52EF4CCD /* juce_Socket.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Socket.cpp; path = ../../JuceLibraryCode/modules/juce_core/network/juce_Socket.cpp; sourceTree = SOURCE_ROOT; }; - B84CE707CF89EA0002595BCA /* juce_win32_DirectWriteTypeLayout.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_DirectWriteTypeLayout.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp; sourceTree = SOURCE_ROOT; }; - B8F528366A0422FC84469E80 /* juce_TextDiff.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TextDiff.cpp; path = ../../JuceLibraryCode/modules/juce_core/text/juce_TextDiff.cpp; sourceTree = SOURCE_ROOT; }; - B92920A799E0A58E3B4AF75D /* juce_ShapeButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ShapeButton.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.h; sourceTree = SOURCE_ROOT; }; - B9D163D4B1C34DFAF84F81E0 /* juce_ResizableCornerComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ResizableCornerComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h; sourceTree = SOURCE_ROOT; }; - BA4FF1F73CF544CF671433D0 /* juce_ComboBox.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComboBox.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.h; sourceTree = SOURCE_ROOT; }; - BA52D32B1E0324546C26ACCA /* juce_Application.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Application.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.h; sourceTree = SOURCE_ROOT; }; - BA9FFDC7BCC2D364014E1280 /* juce_FileTreeComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileTreeComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp; sourceTree = SOURCE_ROOT; }; - BAA40A78E81F4FF0F0E075A6 /* juce_linux_Clipboard.cpp */ = {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; }; - BAA44451865610A98B3A69AE /* juce_FileBasedDocument.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileBasedDocument.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp; sourceTree = SOURCE_ROOT; }; - BAADD431AF7666E435C6C4B3 /* AUScopeElement.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUScopeElement.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.cpp; sourceTree = DEVELOPER_DIR; }; - BAE2BAF1F5DC75A6E72FC56A /* juce_TableListBox.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TableListBox.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableListBox.h; sourceTree = SOURCE_ROOT; }; - BAEAEDCE17A81C84439E984A /* CAAUParameter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAAUParameter.h; path = Extras/CoreAudio/PublicUtility/CAAUParameter.h; sourceTree = DEVELOPER_DIR; }; - BB08970C0517BF01D80D49B3 /* juce_ComponentAnimator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComponentAnimator.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.h; sourceTree = SOURCE_ROOT; }; - BB7808FBEB84DD9C60978532 /* juce_audio_plugin_client.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_audio_plugin_client.h; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/juce_audio_plugin_client.h; sourceTree = SOURCE_ROOT; }; - BC383B9F2F352E373DE6C4A6 /* juce_CharPointer_UTF32.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CharPointer_UTF32.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF32.h; sourceTree = SOURCE_ROOT; }; - BD25F7AC4728A7875B6AE9D5 /* PluginEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PluginEditor.h; path = ../../Source/PluginEditor.h; sourceTree = SOURCE_ROOT; }; - BDC553DA1A51C45837101B7B /* juce_Typeface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Typeface.h; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.h; sourceTree = SOURCE_ROOT; }; - BE0C6895B768F38281CCC0BC /* juce_StringPairArray.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_StringPairArray.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.h; sourceTree = SOURCE_ROOT; }; - BE353EDDEEF8601A3A817617 /* juce_GraphicsContext.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GraphicsContext.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.cpp; sourceTree = SOURCE_ROOT; }; - BE574127E239EB558B051D34 /* juce_RelativeParallelogram.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_RelativeParallelogram.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h; sourceTree = SOURCE_ROOT; }; - BEA2BC710D949E126E974D78 /* juce_AudioProcessor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioProcessor.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.h; sourceTree = SOURCE_ROOT; }; - BEAE9210BD434DD07FD67CBF /* juce_VSTPluginFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_VSTPluginFormat.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h; sourceTree = SOURCE_ROOT; }; - BEEB5F341047830F06857DD9 /* juce_win32_Threads.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_Threads.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_win32_Threads.cpp; sourceTree = SOURCE_ROOT; }; - BF47505F73A4CD4D0EB3F430 /* juce_Range.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Range.h; path = ../../JuceLibraryCode/modules/juce_core/maths/juce_Range.h; sourceTree = SOURCE_ROOT; }; - BF4E95E2F725801F38CFCA77 /* juce_FileBrowserComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileBrowserComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h; sourceTree = SOURCE_ROOT; }; - BF536BFBEDDD9802B9516022 /* juce_AudioThumbnailBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioThumbnailBase.h; path = ../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h; sourceTree = SOURCE_ROOT; }; - BF7A1720DADC7983F61E895C /* ProgramListBox.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ProgramListBox.cpp; path = ../../Source/ProgramListBox.cpp; sourceTree = SOURCE_ROOT; }; - BF9449063F547456209F21FE /* juce_win32_Network.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_Network.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_win32_Network.cpp; sourceTree = SOURCE_ROOT; }; - BFE7C6795569A2BC4EEF91FB /* juce_BufferingAudioSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_BufferingAudioSource.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp; sourceTree = SOURCE_ROOT; }; - BFF8708E6D65F4E2B84983F9 /* juce_ComponentBuilder.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComponentBuilder.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp; sourceTree = SOURCE_ROOT; }; - C01EE75D859C1F942DA3AE61 /* fm_core.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = fm_core.cc; path = ../../Source/msfa/fm_core.cc; sourceTree = SOURCE_ROOT; }; - C16DEC12DA7B1444AF0FD5BB /* juce_CustomTypeface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CustomTypeface.h; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.h; sourceTree = SOURCE_ROOT; }; - C1CB32E507C8F16FFF6014F6 /* juce_ApplicationBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ApplicationBase.h; path = ../../JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.h; sourceTree = SOURCE_ROOT; }; - C1E13F0AFFDADDB080D11B74 /* juce_Drawable.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Drawable.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.cpp; sourceTree = SOURCE_ROOT; }; - C1F03CEB2804747AF4C6BF4D /* ComponentBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ComponentBase.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.h; sourceTree = DEVELOPER_DIR; }; - C1FFEA64DED8E45D6A8F17F2 /* juce_ImageFileFormat.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ImageFileFormat.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.cpp; sourceTree = SOURCE_ROOT; }; - C222D35AC4FC5C2A3BB0F8B6 /* EngineMkI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EngineMkI.h; path = ../../Source/EngineMkI.h; sourceTree = SOURCE_ROOT; }; - C28D3CC3B868C4F092E68D45 /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_graphics/juce_module_info; sourceTree = SOURCE_ROOT; }; - C294314DFA3B047D1F745A23 /* juce_StringRef.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_StringRef.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_StringRef.h; sourceTree = SOURCE_ROOT; }; - C29DCEB09280116E3F4E87C3 /* juce_AudioProcessorListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioProcessorListener.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h; sourceTree = SOURCE_ROOT; }; - C2AA393651CBC37DCD7718BD /* OperatorEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OperatorEditor.h; path = ../../Source/OperatorEditor.h; sourceTree = SOURCE_ROOT; }; - C33C134DA87CD13FAF7BC5A1 /* juce_CheckSettingMacros.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CheckSettingMacros.h; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h; sourceTree = SOURCE_ROOT; }; - C4282ED857CAA664F85D5C4D /* juce_android_SystemStats.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_SystemStats.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_android_SystemStats.cpp; sourceTree = SOURCE_ROOT; }; - C48DAE373124C258F3414CDB /* juce_GIFLoader.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GIFLoader.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/image_formats/juce_GIFLoader.cpp; sourceTree = SOURCE_ROOT; }; - C49F636E4677A7C8C62A9859 /* juce_Synthesiser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Synthesiser.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h; sourceTree = SOURCE_ROOT; }; - C4A2C1FDE57CCF33BE778B39 /* juce_AppleRemote.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AppleRemote.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_AppleRemote.h; sourceTree = SOURCE_ROOT; }; - C4DE747B720C310D6BC65936 /* AUBuffer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUBuffer.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUBuffer.cpp; sourceTree = DEVELOPER_DIR; }; - C56E401381FF968837F82364 /* PluginData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PluginData.h; path = ../../Source/PluginData.h; sourceTree = SOURCE_ROOT; }; - C5E92613992AB74C2E715271 /* juce_ApplicationCommandManager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ApplicationCommandManager.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp; sourceTree = SOURCE_ROOT; }; - C6559A509BD759234BFFCA5D /* juce_TooltipWindow.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TooltipWindow.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp; sourceTree = SOURCE_ROOT; }; - C6928FE8579AE1980061CA43 /* dx7note.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = dx7note.h; path = ../../Source/msfa/dx7note.h; sourceTree = SOURCE_ROOT; }; - C74F0F7CA3A1A201C0EC4772 /* juce_LookAndFeel_V2.h */ = {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; }; - C7577AF98915C39EDCEC259A /* Slider_26x26.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Slider_26x26.png; path = ../../Resources/ui/Slider_26x26.png; sourceTree = SOURCE_ROOT; }; - C78890910E4BE9A24F562397 /* juce_BufferedInputStream.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_BufferedInputStream.cpp; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.cpp; sourceTree = SOURCE_ROOT; }; - C7C6039A52C3EE370CA9E73A /* juce_RTAS_MacUtilities.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_RTAS_MacUtilities.mm; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacUtilities.mm; sourceTree = SOURCE_ROOT; }; - C7EFC098CAC8AAB04A9D5183 /* juce_win32_ComSmartPtr.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_win32_ComSmartPtr.h; path = ../../JuceLibraryCode/modules/juce_core/native/juce_win32_ComSmartPtr.h; sourceTree = SOURCE_ROOT; }; - C89190A10B698C7B1E42C76D /* AUMIDIEffectBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUMIDIEffectBase.h; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.h; sourceTree = DEVELOPER_DIR; }; - C8DE1F3E1A1871ABB88A5B2D /* juce_SelectedItemSet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SelectedItemSet.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_SelectedItemSet.h; sourceTree = SOURCE_ROOT; }; - C92DFD53D297FAD265D1DB8D /* juce_InputSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_InputSource.h; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_InputSource.h; sourceTree = SOURCE_ROOT; }; - CA8B960E006E1C65A6A2E8AA /* juce_InputStream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_InputStream.h; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_InputStream.h; sourceTree = SOURCE_ROOT; }; - CAF913DD133AC8882640F266 /* juce_AlertWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AlertWindow.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_AlertWindow.h; sourceTree = SOURCE_ROOT; }; - CB38F1D4BB78766DBD50FEB9 /* juce_URL.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_URL.cpp; path = ../../JuceLibraryCode/modules/juce_core/network/juce_URL.cpp; sourceTree = SOURCE_ROOT; }; - CB7C9535E3F994DBA41FC649 /* juce_PropertiesFile.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PropertiesFile.cpp; path = ../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp; sourceTree = SOURCE_ROOT; }; - CBEE3341DEFF854B1D114C0B /* Meter_140x8.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Meter_140x8.png; path = ../../Resources/ui/Meter_140x8.png; sourceTree = SOURCE_ROOT; }; - CC04B8DF2C8AAFD8DB02A142 /* juce_GlowEffect.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_GlowEffect.h; path = ../../JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.h; sourceTree = SOURCE_ROOT; }; - CC1B6A4F3E42E9DE4C619D00 /* juce_DeletedAtShutdown.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DeletedAtShutdown.h; path = ../../JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.h; sourceTree = SOURCE_ROOT; }; - CCBC05EAC1621CB1519FA5A4 /* juce_TabbedComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TabbedComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.cpp; sourceTree = SOURCE_ROOT; }; - CCBC46262A82145F2206872E /* juce_AudioDeviceSelectorComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioDeviceSelectorComponent.cpp; path = ../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp; sourceTree = SOURCE_ROOT; }; - CE30C698B8FC1E23D6A8BB35 /* juce_DrawablePath.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawablePath.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.h; sourceTree = SOURCE_ROOT; }; - CE8542A4C8BB33C6A0EA36A4 /* juce_mac_CarbonViewWrapperComponent.h */ = {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; }; - CECC7AEC966A1651289B4701 /* juce_InterprocessConnectionServer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_InterprocessConnectionServer.h; path = ../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h; sourceTree = SOURCE_ROOT; }; - CEFACF205D94175B714846DB /* juce_SystemTrayIconComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SystemTrayIconComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h; sourceTree = SOURCE_ROOT; }; - CFFA7532FAFF5655253878FE /* juce_android_Threads.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_Threads.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_android_Threads.cpp; sourceTree = SOURCE_ROOT; }; - D0096F2804DF0875565D0051 /* juce_AudioDataConverters.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioDataConverters.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h; sourceTree = SOURCE_ROOT; }; - D0178A36F6E46F92111E4883 /* juce_VST3_Wrapper.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_VST3_Wrapper.cpp; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp; sourceTree = SOURCE_ROOT; }; - D0A92955B64EB66E9334F51F /* AUOutputElement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUOutputElement.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.h; sourceTree = DEVELOPER_DIR; }; - D1353A684AD92A6A9FAFBB1B /* juce_DynamicObject.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DynamicObject.cpp; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.cpp; sourceTree = SOURCE_ROOT; }; - D154251B66BF13E992D3D06A /* juce_SystemTrayIconComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_SystemTrayIconComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp; sourceTree = SOURCE_ROOT; }; - D17049595AD1C1353337817D /* juce_ImageConvolutionKernel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ImageConvolutionKernel.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp; sourceTree = SOURCE_ROOT; }; - D1BEED433BFC4AA10346BE1C /* juce_FileSearchPath.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileSearchPath.cpp; path = ../../JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.cpp; sourceTree = SOURCE_ROOT; }; - D251BD558FBD32ECA221D81C /* AUScopeElement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUScopeElement.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.h; sourceTree = DEVELOPER_DIR; }; - D25566BCBFE5CCA4E425E6A7 /* juce_Variant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Variant.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_Variant.h; sourceTree = SOURCE_ROOT; }; - D2E57CCA4E6F6DBE2953744C /* juce_ComponentBoundsConstrainer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComponentBoundsConstrainer.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h; sourceTree = SOURCE_ROOT; }; - D33DD8892334E06135451054 /* juce_FileSearchPathListComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileSearchPathListComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp; sourceTree = SOURCE_ROOT; }; - D35E45B2269C44FCCAD7B1C4 /* juce_Typeface.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Typeface.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.cpp; sourceTree = SOURCE_ROOT; }; - D378EA436E4D111ECE7099C6 /* AUViewLocalizedStringKeys.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUViewLocalizedStringKeys.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUViewBase/AUViewLocalizedStringKeys.h; sourceTree = DEVELOPER_DIR; }; - D409BECBAD7CDC3DE48EFA2F /* juce_FileInputStream.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileInputStream.cpp; path = ../../JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.cpp; sourceTree = SOURCE_ROOT; }; - D4811402C8922A6D8EB4C660 /* juce_AudioProcessorPlayer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioProcessorPlayer.cpp; path = ../../JuceLibraryCode/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp; sourceTree = SOURCE_ROOT; }; - D4B060A58438D21EE6CC8F76 /* juce_TimeSliceThread.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TimeSliceThread.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.h; sourceTree = SOURCE_ROOT; }; - D4FC04482169FDDCEB7A3BB5 /* juce_win32_FileChooser.cpp */ = {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; }; - D564C8B4087316C3A47936B0 /* juce_RelativeCoordinate.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RelativeCoordinate.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp; sourceTree = SOURCE_ROOT; }; - D5E430C641A42BA4693AC4AF /* juce_ColourSelector.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ColourSelector.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_ColourSelector.cpp; sourceTree = SOURCE_ROOT; }; - D5E8818F417B8FBF0F9FECBD /* Light_14x14.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Light_14x14.png; path = ../../Resources/ui/Light_14x14.png; sourceTree = SOURCE_ROOT; }; - D63FBBC40FA8CF0773BA9099 /* juce_FloatVectorOperations.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FloatVectorOperations.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp; sourceTree = SOURCE_ROOT; }; - D66793B7DB6B5CFC22A1BD9D /* AlgoDisplay.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AlgoDisplay.h; path = ../../Source/AlgoDisplay.h; sourceTree = SOURCE_ROOT; }; - D6C62054C5A49E8BB8902DF8 /* juce_LocalisedStrings.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_LocalisedStrings.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.h; sourceTree = SOURCE_ROOT; }; - D6C6FCBA5ECA257959BFE674 /* juce_VST_Wrapper.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_VST_Wrapper.cpp; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp; sourceTree = SOURCE_ROOT; }; - D6DF0265148E2542CF8184CB /* juce_KeyPressMappingSet.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_KeyPressMappingSet.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp; sourceTree = SOURCE_ROOT; }; - D6F2BF4E3C3BE264123B3BB5 /* juce_Javascript.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Javascript.h; path = ../../JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.h; sourceTree = SOURCE_ROOT; }; - D70670809153CBEA5AB4E359 /* juce_BigInteger.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_BigInteger.cpp; path = ../../JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.cpp; sourceTree = SOURCE_ROOT; }; - D74AFAA3C82432B7113CF705 /* juce_DrawableButton.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawableButton.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp; sourceTree = SOURCE_ROOT; }; - D77B73AB3166A76FCA536E3C /* juce_NativeMessageBox.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_NativeMessageBox.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_NativeMessageBox.h; sourceTree = SOURCE_ROOT; }; - D7E27005916D044FD96919B8 /* juce_ReverbAudioSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ReverbAudioSource.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h; sourceTree = SOURCE_ROOT; }; - D8038990994C30BDD631733E /* juce_RTAS_DigiCode2.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RTAS_DigiCode2.cpp; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode2.cpp; sourceTree = SOURCE_ROOT; }; - D8498304CBB374B2800442D4 /* juce_LassoComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_LassoComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_LassoComponent.h; sourceTree = SOURCE_ROOT; }; - D8F138F48E933ECCF2DB2321 /* AUCarbonViewControl.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUCarbonViewControl.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewControl.cpp; sourceTree = DEVELOPER_DIR; }; - D90A42D47F3DD9C505D8A925 /* juce_SystemStats.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SystemStats.h; path = ../../JuceLibraryCode/modules/juce_core/system/juce_SystemStats.h; sourceTree = SOURCE_ROOT; }; - D921C8001631F2FC4D7EFF9D /* juce_KeyboardFocusTraverser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_KeyboardFocusTraverser.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h; sourceTree = SOURCE_ROOT; }; - D984CE634945077E682B48F3 /* DXComponents.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DXComponents.cpp; path = ../../Source/DXComponents.cpp; sourceTree = SOURCE_ROOT; }; - DA27D90A90F1795DCD9DA064 /* juce_Value.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Value.cpp; path = ../../JuceLibraryCode/modules/juce_data_structures/values/juce_Value.cpp; sourceTree = SOURCE_ROOT; }; - DA4359972E065615EEF392EB /* juce_ProgressBar.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ProgressBar.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ProgressBar.cpp; sourceTree = SOURCE_ROOT; }; - DAEFEE4711393EBF6BC1EB3A /* juce_DropShadowEffect.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DropShadowEffect.h; path = ../../JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.h; sourceTree = SOURCE_ROOT; }; - DB3B5F6FE49267EE53089A05 /* juce_linux_WebBrowserComponent.cpp */ = {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; }; - DB9F89D1872247982F4D0913 /* juce_TableHeaderComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TableHeaderComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h; sourceTree = SOURCE_ROOT; }; - DBEA78ADC148399D593D22A9 /* juce_AudioProcessorEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioProcessorEditor.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h; sourceTree = SOURCE_ROOT; }; - DC75DFCDFCDB425927B11EC0 /* PluginFx.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PluginFx.h; path = ../../Source/PluginFx.h; sourceTree = SOURCE_ROOT; }; - DD1BF932ABF0CEC81A8B8A3A /* juce_DynamicObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DynamicObject.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.h; sourceTree = SOURCE_ROOT; }; - DD683E5793B347EEB07FB199 /* juce_ArrayAllocationBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ArrayAllocationBase.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_ArrayAllocationBase.h; sourceTree = SOURCE_ROOT; }; - DD9B0DAF1119ECB6FDC0A3AE /* juce_Path.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Path.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.cpp; sourceTree = SOURCE_ROOT; }; - DDEEAB98F5FD8C74E02FA413 /* juce_CallbackMessage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CallbackMessage.h; path = ../../JuceLibraryCode/modules/juce_events/messages/juce_CallbackMessage.h; sourceTree = SOURCE_ROOT; }; - DE594C0E9F4887C1B92F41E7 /* juce_LowLevelGraphicsContext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_LowLevelGraphicsContext.h; path = ../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h; sourceTree = SOURCE_ROOT; }; - DE8C3DD36C117E355C7EB9FE /* juce_RelativeParallelogram.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RelativeParallelogram.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp; sourceTree = SOURCE_ROOT; }; - DF8DE64F9BD944A64F90B0EC /* juce_BooleanPropertyComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_BooleanPropertyComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h; sourceTree = SOURCE_ROOT; }; - E02D54F56C0EA9C94494CFF7 /* juce_KeyListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_KeyListener.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.h; sourceTree = SOURCE_ROOT; }; - E0DB95731A18E8D551F378BF /* juce_DrawableComposite.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawableComposite.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp; sourceTree = SOURCE_ROOT; }; - E18590F0257AB3D1F7F7CE8F /* juce_LeakedObjectDetector.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_LeakedObjectDetector.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_LeakedObjectDetector.h; sourceTree = SOURCE_ROOT; }; - E1E5A0164A129C5DA1FA8DB7 /* juce_AffineTransform.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AffineTransform.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.cpp; sourceTree = SOURCE_ROOT; }; - E2E2DC879339A8A8F83349D8 /* juce_MidiMessage.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiMessage.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.cpp; sourceTree = SOURCE_ROOT; }; - E2E7F9942FA653428A583920 /* juce_Colour.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Colour.h; path = ../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.h; sourceTree = SOURCE_ROOT; }; - E2FAE3B77A936D9AF0E8DEEC /* juce_HyperlinkButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_HyperlinkButton.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h; sourceTree = SOURCE_ROOT; }; - E32283AE8CC5A022E1A6B30B /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; - E44EB5B165F16ABE2DFB809D /* juce_FileChooserDialogBox.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileChooserDialogBox.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h; sourceTree = SOURCE_ROOT; }; - E4644D1ECB4F5A7D7062E2CB /* juce_mac_NSViewComponent.mm */ = {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; }; - E4C0D5FE28A85EDD44727BE3 /* juce_GZIPCompressorOutputStream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_GZIPCompressorOutputStream.h; path = ../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h; sourceTree = SOURCE_ROOT; }; - E5241F77EBB47E4DF15750FA /* juce_BubbleMessageComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_BubbleMessageComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h; sourceTree = SOURCE_ROOT; }; - E56A4090F6CE76FD8C98FA76 /* juce_PropertiesFile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PropertiesFile.h; path = ../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.h; sourceTree = SOURCE_ROOT; }; - E59D9D6522A13C689785C032 /* juce_AsyncUpdater.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AsyncUpdater.cpp; path = ../../JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp; sourceTree = SOURCE_ROOT; }; - E5ABDC305FF03E23A34302F1 /* juce_MACAddress.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MACAddress.h; path = ../../JuceLibraryCode/modules/juce_core/network/juce_MACAddress.h; sourceTree = SOURCE_ROOT; }; - E5B0F6E8B90970181A8F8A5D /* juce_TextPropertyComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TextPropertyComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp; sourceTree = SOURCE_ROOT; }; - E5CD39DEA3BE8EC9959F8CFE /* juce_mac_WebBrowserComponent.mm */ = {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; }; - E5D86302F07C5564E71BDD33 /* juce_MultiTouchMapper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MultiTouchMapper.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/native/juce_MultiTouchMapper.h; sourceTree = SOURCE_ROOT; }; - E60515FDC5AD0779F615C43E /* juce_ZipFile.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ZipFile.cpp; path = ../../JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.cpp; sourceTree = SOURCE_ROOT; }; - E60A33E021C4CA870FFE07CF /* juce_Image.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Image.h; path = ../../JuceLibraryCode/modules/juce_graphics/images/juce_Image.h; sourceTree = SOURCE_ROOT; }; - E65D3A0B86F5E8834CE77DB5 /* juce_PNGLoader.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PNGLoader.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/image_formats/juce_PNGLoader.cpp; sourceTree = SOURCE_ROOT; }; - E6F65C031FCBB192F3927D4C /* ButtonUnlabeled_50x30.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ButtonUnlabeled_50x30.png; path = ../../Resources/ui/ButtonUnlabeled_50x30.png; sourceTree = SOURCE_ROOT; }; - E74E1F2048368E816394FA74 /* juce_LowLevelGraphicsPostScriptRenderer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_LowLevelGraphicsPostScriptRenderer.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp; sourceTree = SOURCE_ROOT; }; - E7E5B7A78A2D1C47285B79FC /* juce_ArrowButton.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ArrowButton.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp; sourceTree = SOURCE_ROOT; }; - E7EF16D6D50A17A5672075F0 /* juce_ImageCache.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ImageCache.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.cpp; sourceTree = SOURCE_ROOT; }; - E7F00CEE06961C2D9EDDA697 /* juce_IIRFilter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_IIRFilter.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.cpp; sourceTree = SOURCE_ROOT; }; - E84D9D5463240034FD814D49 /* juce_FileInputSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileInputSource.cpp; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.cpp; sourceTree = SOURCE_ROOT; }; - E8A01F45441E170E6190FADD /* juce_Button.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Button.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.h; sourceTree = SOURCE_ROOT; }; - E8A7578ED10948AB49EE2997 /* juce_FileTreeComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileTreeComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h; sourceTree = SOURCE_ROOT; }; - E90C9A775597228F1F127252 /* juce_EdgeTable.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_EdgeTable.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.cpp; sourceTree = SOURCE_ROOT; }; - E912092604DBF571BDC08D60 /* juce_DrawableRectangle.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawableRectangle.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp; sourceTree = SOURCE_ROOT; }; - E99DD30E1F2706D62695EB8C /* juce_Colours.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Colours.h; path = ../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.h; sourceTree = SOURCE_ROOT; }; - E9BA26E4F993EBFB0E36B18C /* juce_RelativePointPath.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_RelativePointPath.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.h; sourceTree = SOURCE_ROOT; }; - E9E4792648C00B4A23C1A39D /* juce_DrawableShape.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawableShape.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.h; sourceTree = SOURCE_ROOT; }; - EA15BEB063E386B16E2CA557 /* juce_AudioProcessorEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioProcessorEditor.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp; sourceTree = SOURCE_ROOT; }; - EA6FC4F1F0D6EAE661569905 /* PluginParam.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PluginParam.h; path = ../../Source/PluginParam.h; sourceTree = SOURCE_ROOT; }; - EA765AB65F269CFAD6CA3BFE /* juce_MenuBarModel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MenuBarModel.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.cpp; sourceTree = SOURCE_ROOT; }; - EAA5D8078BCC042BDF94C77A /* juce_RTAS_Wrapper.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RTAS_Wrapper.cpp; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp; sourceTree = SOURCE_ROOT; }; - EACE6ED62F30C9222D91ACB2 /* juce_InterprocessConnectionServer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_InterprocessConnectionServer.cpp; path = ../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp; sourceTree = SOURCE_ROOT; }; - EB7592B101CFEDF629993E39 /* juce_BasicNativeHeaders.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_BasicNativeHeaders.h; path = ../../JuceLibraryCode/modules/juce_core/native/juce_BasicNativeHeaders.h; sourceTree = SOURCE_ROOT; }; - EB82AEC0B78709874C1749EC /* juce_CodeEditorComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CodeEditorComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h; sourceTree = SOURCE_ROOT; }; - EBC1D498822B210B1B578763 /* juce_Colours.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Colours.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.cpp; sourceTree = SOURCE_ROOT; }; - EBFE4F00A24A7C0304DEFA1A /* juce_ActionBroadcaster.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ActionBroadcaster.h; path = ../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.h; sourceTree = SOURCE_ROOT; }; - ECB0C2120DE11AE690DB987B /* juce_ListenerList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ListenerList.h; path = ../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ListenerList.h; sourceTree = SOURCE_ROOT; }; - ECD18CF97A794402B04570DB /* juce_ToolbarItemPalette.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ToolbarItemPalette.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp; sourceTree = SOURCE_ROOT; }; - ED07CA90BA1A84256E31290F /* juce_MouseListener.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MouseListener.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.cpp; sourceTree = SOURCE_ROOT; }; - EE05AF7337689377BBF4A40B /* juce_BubbleComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_BubbleComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.h; sourceTree = SOURCE_ROOT; }; - EE40D10A94911C19595F860D /* juce_MultiDocumentPanel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MultiDocumentPanel.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h; sourceTree = SOURCE_ROOT; }; - EE692C17A4DC2AC9A4C52173 /* juce_ActionListener.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ActionListener.h; path = ../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionListener.h; sourceTree = SOURCE_ROOT; }; - EE6F7ABA79C5D3A9FFCEC493 /* juce_GZIPDecompressorInputStream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_GZIPDecompressorInputStream.h; path = ../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h; sourceTree = SOURCE_ROOT; }; - EEC5BFDA3C3B23D08E4528B7 /* juce_linux_Files.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_linux_Files.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_linux_Files.cpp; sourceTree = SOURCE_ROOT; }; - EF0D818197F7203D3DEF156E /* juce_Toolbar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Toolbar.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Toolbar.h; sourceTree = SOURCE_ROOT; }; - EF58FBB6E8FD659CC0939B06 /* juce_ResizableWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ResizableWindow.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ResizableWindow.h; sourceTree = SOURCE_ROOT; }; - EF5B2974D235161C6A1536A4 /* juce_win32_SystemStats.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_SystemStats.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_win32_SystemStats.cpp; sourceTree = SOURCE_ROOT; }; - EFABD729C0DFDF17DC9AAD80 /* juce_SharedResourcePointer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SharedResourcePointer.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_SharedResourcePointer.h; sourceTree = SOURCE_ROOT; }; - F0A4AF9F51C7A271A41DB640 /* juce_ChangeBroadcaster.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ChangeBroadcaster.h; path = ../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h; sourceTree = SOURCE_ROOT; }; - F0E8BE4931D56987065FE1C1 /* juce_TemporaryFile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TemporaryFile.h; path = ../../JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.h; sourceTree = SOURCE_ROOT; }; - F1406998FD7313F016AB99BA /* juce_RelativeCoordinatePositioner.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_RelativeCoordinatePositioner.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h; sourceTree = SOURCE_ROOT; }; - F1B87A9524CB1BFD0A3CDC47 /* juce_Justification.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Justification.h; path = ../../JuceLibraryCode/modules/juce_graphics/placement/juce_Justification.h; sourceTree = SOURCE_ROOT; }; - F1D186A91AC8D4E99EA16650 /* juce_MemoryOutputStream.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MemoryOutputStream.cpp; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.cpp; sourceTree = SOURCE_ROOT; }; - F213F6D6186ABA1FD60ADC42 /* juce_PathIterator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PathIterator.h; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.h; sourceTree = SOURCE_ROOT; }; - F221CF21582EE0B8FE774583 /* ParamDialog.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ParamDialog.cpp; path = ../../Source/ParamDialog.cpp; sourceTree = SOURCE_ROOT; }; - F258C148A5FB04C70976E92A /* SysexComm.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SysexComm.h; path = ../../Source/SysexComm.h; sourceTree = SOURCE_ROOT; }; - F273ED17232368EBFAFC820B /* juce_DropShadowEffect.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DropShadowEffect.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.cpp; sourceTree = SOURCE_ROOT; }; - F27DB431B9ECEE07B84281E8 /* juce_TextButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TextButton.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.h; sourceTree = SOURCE_ROOT; }; - F2A26292713BB459A7AE5780 /* juce_ImageCache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ImageCache.h; path = ../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.h; sourceTree = SOURCE_ROOT; }; - F2C763A217C6D0704C6FB4F2 /* AUCarbonViewBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUCarbonViewBase.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewBase.h; sourceTree = DEVELOPER_DIR; }; - F3171B20C2BBF12A5786B1F5 /* CAAudioChannelLayout.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CAAudioChannelLayout.cpp; path = Extras/CoreAudio/PublicUtility/CAAudioChannelLayout.cpp; sourceTree = DEVELOPER_DIR; }; - F32BA2ADBCF84519105AB974 /* juce_TextDiff.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TextDiff.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_TextDiff.h; sourceTree = SOURCE_ROOT; }; - F3718D9D288A2760B6126585 /* juce_mac_CoreGraphicsContext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_mac_CoreGraphicsContext.h; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h; sourceTree = SOURCE_ROOT; }; - F38E4F0A432CAB98BA8F4F8A /* fm_op_kernel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = fm_op_kernel.h; path = ../../Source/msfa/fm_op_kernel.h; sourceTree = SOURCE_ROOT; }; - F39BD87913AB2F91817C50EF /* juce_DrawableImage.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawableImage.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp; sourceTree = SOURCE_ROOT; }; - F3EADB9BD1C520ABD153B785 /* juce_AudioPluginInstance.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioPluginInstance.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h; sourceTree = SOURCE_ROOT; }; - F4050C3BAC97B06A7ED35103 /* CAStreamBasicDescription.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAStreamBasicDescription.h; path = Extras/CoreAudio/PublicUtility/CAStreamBasicDescription.h; sourceTree = DEVELOPER_DIR; }; - F426F0185DB4E97E1E59A807 /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_events/juce_module_info; sourceTree = SOURCE_ROOT; }; - F47FA981083705D4B545339F /* pitchenv.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = pitchenv.h; path = ../../Source/msfa/pitchenv.h; sourceTree = SOURCE_ROOT; }; - F4EA09FAC67FDDA4D2E1D151 /* juce_InterprocessConnection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_InterprocessConnection.h; path = ../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.h; sourceTree = SOURCE_ROOT; }; - F598F4A108550EDBF7504E7B /* juce_ThreadPool.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ThreadPool.cpp; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.cpp; sourceTree = SOURCE_ROOT; }; - F5E56D366A88F772BE998AED /* juce_MemoryMappedFile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MemoryMappedFile.h; path = ../../JuceLibraryCode/modules/juce_core/files/juce_MemoryMappedFile.h; sourceTree = SOURCE_ROOT; }; - F63CE53483AF125DCFB024F1 /* exp2.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = exp2.cc; path = ../../Source/msfa/exp2.cc; sourceTree = SOURCE_ROOT; }; - F68AA879901D4E695CBC3FAF /* juce_VSTPluginFormat.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_VSTPluginFormat.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp; sourceTree = SOURCE_ROOT; }; - F6F950B6ABB40B62AE4C0B78 /* juce_VST_Wrapper.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_VST_Wrapper.mm; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm; sourceTree = SOURCE_ROOT; }; - F74CAAECFC16D1E87041E5A7 /* juce_DropShadower.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DropShadower.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.h; sourceTree = SOURCE_ROOT; }; - F7826D43ACD985679DEACFD0 /* juce_PluginDescription.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PluginDescription.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.cpp; sourceTree = SOURCE_ROOT; }; - F7B762EB74B4145099C06C5A /* AUBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUBase.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.h; sourceTree = DEVELOPER_DIR; }; - F805C241B3074BB357475216 /* juce_ToolbarButton.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ToolbarButton.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp; sourceTree = SOURCE_ROOT; }; - F83AF328F15F82C722B45598 /* juce_ImageEffectFilter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ImageEffectFilter.h; path = ../../JuceLibraryCode/modules/juce_graphics/effects/juce_ImageEffectFilter.h; sourceTree = SOURCE_ROOT; }; - F8A589597222065EA52C4F9C /* juce_linux_CommonFile.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_linux_CommonFile.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_linux_CommonFile.cpp; sourceTree = SOURCE_ROOT; }; - F919F7358EF25E87A7BCC01D /* juce_AlertWindow.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AlertWindow.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_AlertWindow.cpp; sourceTree = SOURCE_ROOT; }; - F93F29D9762799B24457617D /* juce_DialogWindow.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DialogWindow.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DialogWindow.cpp; sourceTree = SOURCE_ROOT; }; - F957420DFF4D2354671B4116 /* juce_RectanglePlacement.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RectanglePlacement.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.cpp; sourceTree = SOURCE_ROOT; }; - F9B29C9F01195D5A979AB5C9 /* juce_SVGParser.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_SVGParser.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_SVGParser.cpp; sourceTree = SOURCE_ROOT; }; - F9FA29A5FF9C9921D785A1C0 /* juce_LookAndFeel_V1.cpp */ = {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; }; - FA0406B777C1CB9C71F86BC1 /* juce_LuaCodeTokeniser.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_LuaCodeTokeniser.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp; sourceTree = SOURCE_ROOT; }; - FA726CE9275EF0E84BBEA666 /* juce_LinkedListPointer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_LinkedListPointer.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_LinkedListPointer.h; sourceTree = SOURCE_ROOT; }; - FA98BC06299525310A31107B /* juce_Label.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Label.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Label.h; sourceTree = SOURCE_ROOT; }; - FAC5045BEAA6C0B1AC904BED /* juce_TextDragAndDropTarget.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TextDragAndDropTarget.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h; sourceTree = SOURCE_ROOT; }; - FB135AE48DBB6E5CF88A30F1 /* juce_DocumentWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DocumentWindow.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DocumentWindow.h; sourceTree = SOURCE_ROOT; }; - FB35DC2702275D1038B7B960 /* juce_OptionalScopedPointer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_OptionalScopedPointer.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_OptionalScopedPointer.h; sourceTree = SOURCE_ROOT; }; - FB48147A1424E6D0A320DA6B /* juce_HighResolutionTimer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_HighResolutionTimer.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.h; sourceTree = SOURCE_ROOT; }; - FC452B781AEE181BEF7F948E /* juce_ComponentPeer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComponentPeer.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp; sourceTree = SOURCE_ROOT; }; - FC856709502EE15E8D3F448B /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; - FCABD85F0480D4972896F379 /* juce_ReverbAudioSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ReverbAudioSource.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp; sourceTree = SOURCE_ROOT; }; - FCBA692E842A80D9618CA467 /* juce_LiveConstantEditor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_LiveConstantEditor.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_LiveConstantEditor.h; sourceTree = SOURCE_ROOT; }; - FD2285710D78FDBC856ADF13 /* juce_AudioProcessorPlayer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioProcessorPlayer.h; path = ../../JuceLibraryCode/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h; sourceTree = SOURCE_ROOT; }; - FD333147C1339A81B846EC52 /* juce_RecentlyOpenedFilesList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_RecentlyOpenedFilesList.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h; sourceTree = SOURCE_ROOT; }; - FD799268DEA0EC4CDFD4DA10 /* juce_NewLine.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_NewLine.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_NewLine.h; sourceTree = SOURCE_ROOT; }; - FDA8E9094D7495F5116F7742 /* juce_PluginHostType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PluginHostType.h; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_PluginHostType.h; sourceTree = SOURCE_ROOT; }; - FDDB0277D2D036AEFA3EBD2D /* juce_Font.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Font.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.cpp; sourceTree = SOURCE_ROOT; }; - FE39DD2B654DF778D919D554 /* juce_RTAS_MacResources.r */ = {isa = PBXFileReference; lastKnownFileType = file.r; name = juce_RTAS_MacResources.r; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacResources.r; sourceTree = SOURCE_ROOT; }; - FE42B80DEA2E49C07E9E1C0A /* juce_RelativeRectangle.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RelativeRectangle.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp; sourceTree = SOURCE_ROOT; }; - FF01650D69FB076FD8FCCE32 /* juce_PropertyComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PropertyComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.cpp; sourceTree = SOURCE_ROOT; }; - FF46344F53B1AE5119D163D5 /* juce_CarbonVisibility.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CarbonVisibility.h; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_CarbonVisibility.h; sourceTree = SOURCE_ROOT; }; - FF5B77AA3517B4637F862BD3 /* juce_RelativeCoordinatePositioner.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RelativeCoordinatePositioner.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp; sourceTree = SOURCE_ROOT; }; - FF6607118B29435E76806DFA /* Dexed.component */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Dexed.component; sourceTree = BUILT_PRODUCTS_DIR; }; - FF973BD60572C077A148D3AB /* juce_WildcardFileFilter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_WildcardFileFilter.h; path = ../../JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.h; sourceTree = SOURCE_ROOT; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 06D721A024B3596A28AB8EC1 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 6443699C06267ECC22CF9D12 /* Accelerate.framework in Frameworks */, - 60686C2C30A9F2777CEF01BD /* AudioToolbox.framework in Frameworks */, - 77C3EA8D0A12986429BA466D /* AudioUnit.framework in Frameworks */, - E8BEA8ABF5E288C5D5FCD620 /* Carbon.framework in Frameworks */, - F329522961F1313091764113 /* Cocoa.framework in Frameworks */, - B0A4786A252B14B604101175 /* CoreAudio.framework in Frameworks */, - 82253A3BBFF29FC56A08C972 /* CoreAudioKit.framework in Frameworks */, - FA2AF2015CFD98299593EA30 /* CoreMIDI.framework in Frameworks */, - 7116DC8487DC8321F36CD3D8 /* DiscRecording.framework in Frameworks */, - 68878920F603FF1473994736 /* IOKit.framework in Frameworks */, - A7D45B047CA84D7EF7018CDC /* QuartzCore.framework in Frameworks */, - 7E444608AFB10ED54DB5C9AB /* WebKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 01533246E329E35CCD6F8580 /* Products */ = { - isa = PBXGroup; - children = ( - FF6607118B29435E76806DFA /* Dexed.component */, - ); - name = Products; - sourceTree = ""; - }; - 0652CE27AE4971C99654E3BF /* dsp */ = { - isa = PBXGroup; - children = ( - 8BADEB7BF1A65E83A7A1736D /* PluginFx.cpp */, - DC75DFCDFCDB425927B11EC0 /* PluginFx.h */, - 8BEBEDCAD409EE3A5D383B6D /* EngineMkI.cpp */, - C222D35AC4FC5C2A3BB0F8B6 /* EngineMkI.h */, - 61F792AFE04C15F413A4F766 /* EngineOpl.cpp */, - 7A58027CF8C6967B02370E01 /* EngineOpl.h */, - ); - name = dsp; - sourceTree = ""; - }; - 0A1CD2C6C377E596E2BB643C /* maths */ = { - isa = PBXGroup; - children = ( - D70670809153CBEA5AB4E359 /* juce_BigInteger.cpp */, - 55474A49BF29196733C89BBB /* juce_BigInteger.h */, - 6C1EBFA6E5161BFC6E0A6686 /* juce_Expression.cpp */, - 2BAC9F6B6869D1E85C51540B /* juce_Expression.h */, - 0707C87B401DC983E3FF4263 /* juce_MathsFunctions.h */, - 1629C7407F033B97102CEF6B /* juce_NormalisableRange.h */, - 89BBB19B9AFC6DAD43B9B512 /* juce_Random.cpp */, - 83FAEF9BE29243FBED61B39F /* juce_Random.h */, - BF47505F73A4CD4D0EB3F430 /* juce_Range.h */, - ); - name = maths; - sourceTree = ""; - }; - 0FB9E2767E5705CC99B13E68 /* utility */ = { - isa = PBXGroup; - children = ( - FF46344F53B1AE5119D163D5 /* juce_CarbonVisibility.h */, - C33C134DA87CD13FAF7BC5A1 /* juce_CheckSettingMacros.h */, - 477946525F6F1BE9135A3101 /* juce_FakeMouseMoveGenerator.h */, - 1358A353CB770ABF4DF73417 /* juce_IncludeModuleHeaders.h */, - A4010716414361F5F304407A /* juce_IncludeSystemHeaders.h */, - FDA8E9094D7495F5116F7742 /* juce_PluginHostType.h */, - B63E7FBEF314AA2B6A8083F4 /* juce_PluginUtilities.cpp */, - 4FD935EA5DAA0EAB4F266B2E /* juce_WindowsHooks.h */, - ); - name = utility; - sourceTree = ""; - }; - 102590FC92E1B5107F83576A /* juce_gui_basics */ = { - isa = PBXGroup; - children = ( - FE9550EAB790E5DA3F2D29FF /* components */, - 2B22A7966C00D4C9740DBC50 /* mouse */, - 5648974C3A509CF7BCB564A2 /* keyboard */, - F70E2701A89603A4BE984FF6 /* widgets */, - 2B9B650A5C371167F1E95054 /* windows */, - 78B7B5349F52AFB72E0AB8C6 /* menus */, - AF25CB689CF9F18AB7F18B70 /* layout */, - 3DE9AC051C508BB978AF0DB2 /* buttons */, - CAF6EDA5961A5335899392C7 /* positioning */, - 6FDE421EF91F6A2ECE24F648 /* drawables */, - D478C042D92EB811C777A864 /* properties */, - E6BDE757CFD28DF7846CD1ED /* lookandfeel */, - 64777E3332749BC9BC58A9C9 /* filebrowser */, - D20A63B1C4DF64E9DA6C9CE8 /* commands */, - 9335318EC700B990C16F4739 /* misc */, - E12CE38F88D50562CD35E502 /* application */, - 76ACF3D24BC1E838C60D1C40 /* native */, - 3D52BDFF32D151178ABE21D0 /* juce_module_info */, - A354DF25FF89648B38DB63DC /* juce_gui_basics.h */, - ); - name = juce_gui_basics; - sourceTree = ""; - }; - 119C8C138453E1EDB43BB203 /* sources */ = { - isa = PBXGroup; - children = ( - 528BBDB63A8BF7246C4DDBA1 /* juce_AudioSource.h */, - BFE7C6795569A2BC4EEF91FB /* juce_BufferingAudioSource.cpp */, - 20D22F9CE83DD70583C68940 /* juce_BufferingAudioSource.h */, - 57A533082FEF0CE002D69EDB /* juce_ChannelRemappingAudioSource.cpp */, - 3A2DE2FA7B6D718AEF872F43 /* juce_ChannelRemappingAudioSource.h */, - 7A26D67672786E0663369D49 /* juce_IIRFilterAudioSource.cpp */, - 3A0F35877A9E2F5D5D6A0434 /* juce_IIRFilterAudioSource.h */, - 5BA236D62129EFE13A9EAB1B /* juce_MixerAudioSource.cpp */, - 30C8F9B8F2E0D9D572E43E7A /* juce_MixerAudioSource.h */, - A95F8438AE6F3BA4CCD2A1EE /* juce_PositionableAudioSource.h */, - 5548DEE5ED071453F8AD8AB6 /* juce_ResamplingAudioSource.cpp */, - 37FEC98938A31E7E6DE9D515 /* juce_ResamplingAudioSource.h */, - FCABD85F0480D4972896F379 /* juce_ReverbAudioSource.cpp */, - D7E27005916D044FD96919B8 /* juce_ReverbAudioSource.h */, - A0C5AA7F71F5C650FBBB83C9 /* juce_ToneGeneratorAudioSource.cpp */, - A57ACCF886A902BBCB603D5B /* juce_ToneGeneratorAudioSource.h */, - ); - name = sources; - sourceTree = ""; - }; - 128F041FBAC450E8521EE891 /* undomanager */ = { - isa = PBXGroup; - children = ( - 3F0F5E60F2077B05385D6122 /* juce_UndoableAction.h */, - 496ADA4A8E3A7E4906EADC88 /* juce_UndoManager.cpp */, - A763DB1FF5441EFF39491530 /* juce_UndoManager.h */, - ); - name = undomanager; - sourceTree = ""; - }; - 16EFEE06D414EBB4E08A3DCA /* misc */ = { - isa = PBXGroup; - children = ( - 7FCE241BE34BC4D1E6988B1F /* juce_Result.cpp */, - 587A3ADC691765F0227C4707 /* juce_Result.h */, - 99FFA4AC86A982F68CE03ED3 /* juce_Uuid.cpp */, - 51D460DE650B5F3701174605 /* juce_Uuid.h */, - 9B36F7CC7A136C2AEB4E5E53 /* juce_WindowsRegistry.h */, - ); - name = misc; - sourceTree = ""; - }; - 22B86A69849E8A8394A7512D /* effects */ = { - isa = PBXGroup; - children = ( - 7A0FB6545BA2E344A1F45EA5 /* juce_Decibels.h */, - E7F00CEE06961C2D9EDDA697 /* juce_IIRFilter.cpp */, - 518104B0010D2466EB51D01A /* juce_IIRFilter.h */, - 46908987EEFC3623A53A95C2 /* juce_LagrangeInterpolator.cpp */, - A040ED3E3D914E80D6F56110 /* juce_LagrangeInterpolator.h */, - 8A566C440278C23B8FB3A9AB /* juce_Reverb.h */, - ); - name = effects; - sourceTree = ""; - }; - 24E56C122BA7B936EB30D9EE /* messages */ = { - isa = PBXGroup; - children = ( - 33E4BED358B8566CCEE47B95 /* juce_ApplicationBase.cpp */, - C1CB32E507C8F16FFF6014F6 /* juce_ApplicationBase.h */, - DDEEAB98F5FD8C74E02FA413 /* juce_CallbackMessage.h */, - A1CD23B489568CB51325DB98 /* juce_DeletedAtShutdown.cpp */, - CC1B6A4F3E42E9DE4C619D00 /* juce_DeletedAtShutdown.h */, - 866BB30F214A58492E281430 /* juce_Initialisation.h */, - 2DF03B864D4F23315F18CC24 /* juce_Message.h */, - 853996FFE0D8585AACC747C4 /* juce_MessageListener.cpp */, - 2752A284F49F193F36688FAA /* juce_MessageListener.h */, - 006FC3A3740D97EE2F4A78B3 /* juce_MessageManager.cpp */, - 8D7D3383FF13817F3B277B02 /* juce_MessageManager.h */, - 0FB6B4A8DC064694A4A3B271 /* juce_MountedVolumeListChangeDetector.h */, - A83F026919CEDB80894F3798 /* juce_NotificationType.h */, - ); - name = messages; - sourceTree = ""; - }; - 24EAA5A95BB6182CEC97A78A /* juce_gui_extra */ = { - isa = PBXGroup; - children = ( - 997D1EDFF8867D6F34493768 /* code_editor */, - 3BAE6D34CB0FFE32A18C6008 /* documents */, - 8E4E901883E6B9C038471176 /* embedding */, - B199AE84B656EEB377B44DAE /* misc */, - E71EF502364BDEA76FE5A4E9 /* native */, - 113019177161C70BFD9E655E /* juce_module_info */, - 730BEAA59340DC3DF50E2127 /* juce_gui_extra.h */, - ); - name = juce_gui_extra; - sourceTree = ""; - }; - 29B923E6EB12F97B68585AFC /* Source */ = { - isa = PBXGroup; - children = ( - 0652CE27AE4971C99654E3BF /* dsp */, - 427DD4218ED26D69B0149A90 /* ui */, - BDC5059F1563FD8DD69AD324 /* msfa */, - 0BD21CA621B7350EBED18C0A /* Dexed.h */, - 45ADFD8885BE76C7F7D999AC /* PluginProcessor.cpp */, - 5C0A1B7E2BF8FCAF5A1E8616 /* PluginProcessor.h */, - 59D15F780D468B587F9C7E78 /* PluginParam.cpp */, - EA6FC4F1F0D6EAE661569905 /* PluginParam.h */, - 7936BBAA586387B2FAFB958B /* PluginData.cpp */, - C56E401381FF968837F82364 /* PluginData.h */, - 65BE679590BFE2466E16EA67 /* SysexComm.cpp */, - F258C148A5FB04C70976E92A /* SysexComm.h */, - ); - name = Source; - sourceTree = ""; - }; - 2B22A7966C00D4C9740DBC50 /* mouse */ = { - isa = PBXGroup; - children = ( - 5BC311F801FE9D018A7B231C /* juce_ComponentDragger.cpp */, - 4051235A3DA7534A8E1286F0 /* juce_ComponentDragger.h */, - 7D5E3634F29C83FE1216E5EC /* juce_DragAndDropContainer.cpp */, - 015FE0A32C2B3FDA879FAB57 /* juce_DragAndDropContainer.h */, - 72AC691AF255DD0B6D582EB3 /* juce_DragAndDropTarget.h */, - 753358C232EE9B14F9CFE87C /* juce_FileDragAndDropTarget.h */, - D8498304CBB374B2800442D4 /* juce_LassoComponent.h */, - 4CD97CB51FE3AD5248285B0A /* juce_MouseCursor.cpp */, - B1E71D410154F9F7964A8F5F /* juce_MouseCursor.h */, - B22154A68283179A2059275F /* juce_MouseEvent.cpp */, - 900CA19F25F2140D0067345B /* juce_MouseEvent.h */, - 0EF8098DE092ED5C25105241 /* juce_MouseInactivityDetector.cpp */, - 46C20298CCB469481F5C8D36 /* juce_MouseInactivityDetector.h */, - 9D2ECC20D62F513E41A28337 /* juce_MouseInputSource.cpp */, - A3C98189E1FB70E082F1AC6B /* juce_MouseInputSource.h */, - ED07CA90BA1A84256E31290F /* juce_MouseListener.cpp */, - 524D9B46D38DCF45CA2E8DD2 /* juce_MouseListener.h */, - C8DE1F3E1A1871ABB88A5B2D /* juce_SelectedItemSet.h */, - FAC5045BEAA6C0B1AC904BED /* juce_TextDragAndDropTarget.h */, - 8645DD1C8D096C9D7B4B67F2 /* juce_TooltipClient.h */, - ); - name = mouse; - sourceTree = ""; - }; - 2B9B650A5C371167F1E95054 /* windows */ = { - isa = PBXGroup; - children = ( - F919F7358EF25E87A7BCC01D /* juce_AlertWindow.cpp */, - CAF913DD133AC8882640F266 /* juce_AlertWindow.h */, - 2860C307AFC727F3591D9FBB /* juce_CallOutBox.cpp */, - 37282A25BDD0EEC4AC5F5A8C /* juce_CallOutBox.h */, - FC452B781AEE181BEF7F948E /* juce_ComponentPeer.cpp */, - 64E0EE125571D369100796D9 /* juce_ComponentPeer.h */, - F93F29D9762799B24457617D /* juce_DialogWindow.cpp */, - 84F48AAB7D37C193E401595F /* juce_DialogWindow.h */, - 040A33439B5E80CE3717319E /* juce_DocumentWindow.cpp */, - FB135AE48DBB6E5CF88A30F1 /* juce_DocumentWindow.h */, - D77B73AB3166A76FCA536E3C /* juce_NativeMessageBox.h */, - 73A5B8C82401A8D56F700A49 /* juce_ResizableWindow.cpp */, - EF58FBB6E8FD659CC0939B06 /* juce_ResizableWindow.h */, - 1585F30843449EA6EA078288 /* juce_ThreadWithProgressWindow.cpp */, - 577D5E62E1CE48CEAD5855AE /* juce_ThreadWithProgressWindow.h */, - C6559A509BD759234BFFCA5D /* juce_TooltipWindow.cpp */, - 116D0566C94C0FF5C3B68DF3 /* juce_TooltipWindow.h */, - 18AD1662D33E576F96C30A6A /* juce_TopLevelWindow.cpp */, - 1754400A2E372510CB25043F /* juce_TopLevelWindow.h */, - ); - name = windows; - sourceTree = ""; - }; - 2BB71E1725728DD1B293B270 /* processors */ = { - isa = PBXGroup; - children = ( - 7353E96136FAD8E0F0FAF2F3 /* juce_AudioPlayHead.h */, - F3EADB9BD1C520ABD153B785 /* juce_AudioPluginInstance.h */, - B5D800CC11CBD506E9A6F4FB /* juce_AudioProcessor.cpp */, - BEA2BC710D949E126E974D78 /* juce_AudioProcessor.h */, - EA15BEB063E386B16E2CA557 /* juce_AudioProcessorEditor.cpp */, - DBEA78ADC148399D593D22A9 /* juce_AudioProcessorEditor.h */, - 749FDD4CF73F9C8E26D09A7B /* juce_AudioProcessorGraph.cpp */, - 21E609C00045B8F41BA21DFE /* juce_AudioProcessorGraph.h */, - C29DCEB09280116E3F4E87C3 /* juce_AudioProcessorListener.h */, - 80B36B053E1EA2D1352BD0C9 /* juce_AudioProcessorParameter.h */, - 4B82A76027BA14576D476E62 /* juce_GenericAudioProcessorEditor.cpp */, - 306D1B033E8EBB80F1E9A24A /* juce_GenericAudioProcessorEditor.h */, - F7826D43ACD985679DEACFD0 /* juce_PluginDescription.cpp */, - 8E04EF74113A0E9808FC4F09 /* juce_PluginDescription.h */, - ); - name = processors; - sourceTree = ""; - }; - 2D679CDB5DE0ECF6326A67CD /* app_properties */ = { - isa = PBXGroup; - children = ( - 9ED32BCD42EFF79D067525DF /* juce_ApplicationProperties.cpp */, - 306255E12C87DF0405A5D9EE /* juce_ApplicationProperties.h */, - CB7C9535E3F994DBA41FC649 /* juce_PropertiesFile.cpp */, - E56A4090F6CE76FD8C98FA76 /* juce_PropertiesFile.h */, - ); - name = app_properties; - sourceTree = ""; - }; - 2FD23E53C45A9929EED4ACB9 /* contexts */ = { - isa = PBXGroup; - children = ( - BE353EDDEEF8601A3A817617 /* juce_GraphicsContext.cpp */, - 9E38FC6135AC278A4704BE9D /* juce_GraphicsContext.h */, - DE594C0E9F4887C1B92F41E7 /* juce_LowLevelGraphicsContext.h */, - E74E1F2048368E816394FA74 /* juce_LowLevelGraphicsPostScriptRenderer.cpp */, - 35F80132DF4DC3669B44BD4A /* juce_LowLevelGraphicsPostScriptRenderer.h */, - 5FA112054E39C5FF09F6928B /* juce_LowLevelGraphicsSoftwareRenderer.cpp */, - AC49A363BFC6B7631E1CD39B /* juce_LowLevelGraphicsSoftwareRenderer.h */, - ); - name = contexts; - sourceTree = ""; - }; - 32FC8884626A89F0A805D4C0 /* synthesisers */ = { - isa = PBXGroup; - children = ( - B4C62338187DC6B1B1F0CF54 /* juce_Synthesiser.cpp */, - C49F636E4677A7C8C62A9859 /* juce_Synthesiser.h */, - ); - name = synthesisers; - sourceTree = ""; - }; - 33D3E9073E0658530664DCA5 /* broadcasters */ = { - isa = PBXGroup; - children = ( - 5C9576A21F7C608E767F2108 /* juce_ActionBroadcaster.cpp */, - EBFE4F00A24A7C0304DEFA1A /* juce_ActionBroadcaster.h */, - EE692C17A4DC2AC9A4C52173 /* juce_ActionListener.h */, - E59D9D6522A13C689785C032 /* juce_AsyncUpdater.cpp */, - AA6BE14C6DF4E89F72919216 /* juce_AsyncUpdater.h */, - ACE30A4CDB9C2F2C13B8ADFA /* juce_ChangeBroadcaster.cpp */, - F0A4AF9F51C7A271A41DB640 /* juce_ChangeBroadcaster.h */, - 29FCF15A6F116C0A823A186D /* juce_ChangeListener.h */, - ECB0C2120DE11AE690DB987B /* juce_ListenerList.h */, - ); - name = broadcasters; - sourceTree = ""; - }; - 37BC5C48642EECA7AE662C02 /* Frameworks */ = { - isa = PBXGroup; - children = ( - E32283AE8CC5A022E1A6B30B /* Accelerate.framework */, - 0A56796E1B84D05D8DD1100D /* AudioToolbox.framework */, - 838A5E852BBD79A98CD9FDDD /* AudioUnit.framework */, - 817CC81F50861DAEEFB2043A /* Carbon.framework */, - 2FDF76165C655B2E77BE4CFD /* Cocoa.framework */, - 3A01DC4DEBE65C313C7C8A44 /* CoreAudio.framework */, - 919DF1054C09D19EDA044BE8 /* CoreAudioKit.framework */, - A81F4DC234E8D93BF9803529 /* CoreMIDI.framework */, - 452C1184BD776249B33151E5 /* DiscRecording.framework */, - FC856709502EE15E8D3F448B /* IOKit.framework */, - 2F55D83145737DE69999DB92 /* QuartzCore.framework */, - 5E966C95FACF7B8D5A907FE3 /* WebKit.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 3BAE6D34CB0FFE32A18C6008 /* documents */ = { - isa = PBXGroup; - children = ( - BAA44451865610A98B3A69AE /* juce_FileBasedDocument.cpp */, - 346937AF08405CC63D570161 /* juce_FileBasedDocument.h */, - ); - name = documents; - sourceTree = ""; - }; - 3DE9AC051C508BB978AF0DB2 /* buttons */ = { - isa = PBXGroup; - children = ( - E7E5B7A78A2D1C47285B79FC /* juce_ArrowButton.cpp */, - B11EC67DFA21869511B3041E /* juce_ArrowButton.h */, - 4A0A2B796676838D848432FF /* juce_Button.cpp */, - E8A01F45441E170E6190FADD /* juce_Button.h */, - D74AFAA3C82432B7113CF705 /* juce_DrawableButton.cpp */, - 99D8CB814600E509F918CFC5 /* juce_DrawableButton.h */, - 5721702823682EC883FCB870 /* juce_HyperlinkButton.cpp */, - E2FAE3B77A936D9AF0E8DEEC /* juce_HyperlinkButton.h */, - 4DE54D4FA92B85E954BBDD0D /* juce_ImageButton.cpp */, - 8F62A58CDAF0709EDE33F5E0 /* juce_ImageButton.h */, - 227001AE4630FAA6E65DD252 /* juce_ShapeButton.cpp */, - B92920A799E0A58E3B4AF75D /* juce_ShapeButton.h */, - ACDE74B253321268CA9AB8C4 /* juce_TextButton.cpp */, - F27DB431B9ECEE07B84281E8 /* juce_TextButton.h */, - 911A3E44C161694FF7084464 /* juce_ToggleButton.cpp */, - 9F4CAD2C33179825F3080F1F /* juce_ToggleButton.h */, - F805C241B3074BB357475216 /* juce_ToolbarButton.cpp */, - 0DCC7A5AD5AC5D3637FFAAFB /* juce_ToolbarButton.h */, - ); - name = buttons; - sourceTree = ""; - }; - 3E0C3A2E8ED7ED09FA4E1CF0 /* Juce Library Code */ = { - isa = PBXGroup; - children = ( - C2089BDCA7170FE59577FA72 /* Juce AU Wrapper */, - A4732634AB48AFD0FB06D7FA /* AppConfig.h */, - 54363D0B39B88D43447C0123 /* BinaryData.cpp */, - 7228D8E143CA465FB15BD546 /* BinaryData.h */, - 505852570B48EB3F18076B03 /* juce_AAX_Wrapper.cpp */, - 3254CAE4C282C4432214B016 /* juce_AAX_Wrapper.mm */, - 64CC83E4D891EAEC65EE41C4 /* juce_AU_Resources.r */, - 502D49C82606515A80907EB3 /* juce_AU_Wrapper.mm */, - 3DF47857774F10344F12BE65 /* juce_audio_basics.mm */, - 31AEFAC2A9E8C7C96ECB4B96 /* juce_audio_devices.mm */, - 32FC163D919C52263303EF7E /* juce_audio_formats.mm */, - AA2F01B149F981C2997D583F /* juce_audio_processors.mm */, - 6273BD6D40C9A904273C592F /* juce_audio_utils.mm */, - 99078823EE2D77389696F0E5 /* juce_core.mm */, - 48BDF7DFA849127655B86873 /* juce_data_structures.mm */, - AB6186E32E92664DEFA0C0A1 /* juce_events.mm */, - 9E3820CD63B47B5385AF2DB6 /* juce_graphics.mm */, - 19B56FF22ED0090A8D7A3E04 /* juce_gui_basics.mm */, - 6DC26B61BA1638AFAF142A6C /* juce_gui_extra.mm */, - B63E7FBEF314AA2B6A8083F4 /* juce_PluginUtilities.cpp */, - 55E39FAA63BA8B9D40F40712 /* juce_RTAS_DigiCode1.cpp */, - D8038990994C30BDD631733E /* juce_RTAS_DigiCode2.cpp */, - 4574217C2F5219DEDDDC9656 /* juce_RTAS_DigiCode3.cpp */, - FE39DD2B654DF778D919D554 /* juce_RTAS_MacResources.r */, - C7C6039A52C3EE370CA9E73A /* juce_RTAS_MacUtilities.mm */, - EAA5D8078BCC042BDF94C77A /* juce_RTAS_Wrapper.cpp */, - D6C6FCBA5ECA257959BFE674 /* juce_VST_Wrapper.cpp */, - F6F950B6ABB40B62AE4C0B78 /* juce_VST_Wrapper.mm */, - D0178A36F6E46F92111E4883 /* juce_VST3_Wrapper.cpp */, - 01EF232D8B427B8CE38127C2 /* juce_VST3_Wrapper.mm */, - 8F32EF92B0A18751EC39A79B /* JuceHeader.h */, - ); - name = "Juce Library Code"; - sourceTree = ""; - }; - 3F504387EAE40781EC731BB7 /* values */ = { - isa = PBXGroup; - children = ( - DA27D90A90F1795DCD9DA064 /* juce_Value.cpp */, - 543415735FAC3778D98C649B /* juce_Value.h */, - A348DAE6ECDEF51CAD6B5FE4 /* juce_ValueTree.cpp */, - B779A3FF92AF0ED28B97C03A /* juce_ValueTree.h */, - ); - name = values; - sourceTree = ""; - }; - 427DD4218ED26D69B0149A90 /* ui */ = { - isa = PBXGroup; - children = ( - 018D0FB9E97B68D2EB3E3F72 /* PluginEditor.cpp */, - BD25F7AC4728A7875B6AE9D5 /* PluginEditor.h */, - 6B3889626BDBB814F2387085 /* CartManager.cpp */, - 1C3A85D115878AA5A495199E /* CartManager.h */, - BF7A1720DADC7983F61E895C /* ProgramListBox.cpp */, - 0831514ABD7A268115E6FD43 /* ProgramListBox.h */, - F221CF21582EE0B8FE774583 /* ParamDialog.cpp */, - 9AAC5E6C1A21F8FE2F66F0E0 /* ParamDialog.h */, - 03813BF0D93D100F6F0393C9 /* AlgoDisplay.cpp */, - D66793B7DB6B5CFC22A1BD9D /* AlgoDisplay.h */, - A02775EA788AD4BF7DD1B1A1 /* DXLookNFeel.cpp */, - 29D6A187B80D22EB609C256D /* DXLookNFeel.h */, - D984CE634945077E682B48F3 /* DXComponents.cpp */, - 4567FB06348FF519FDC6D698 /* DXComponents.h */, - 838E63F5800CA577B92EF6AE /* OperatorEditor.cpp */, - C2AA393651CBC37DCD7718BD /* OperatorEditor.h */, - 19CEF599CB23958AC63D427E /* GlobalEditor.cpp */, - 4B70CBF4DB4E571EDF5D3114 /* GlobalEditor.h */, - ); - name = ui; - sourceTree = ""; - }; - 47F1FC7D160024027C543D04 /* Resources */ = { - isa = PBXGroup; - children = ( - 2EFC0DDB732834CABE62C36E /* Info.plist */, - 6F9852573AA442CFBAD9695F /* RecentFilesMenuTemplate.nib */, - ); - name = Resources; - sourceTree = ""; - }; - 48B3AA9536D8F0B4104D3591 /* scanning */ = { - isa = PBXGroup; - children = ( - 29AE4D440A28441D61C76EF4 /* juce_KnownPluginList.cpp */, - 5FE10203FC5AE23DBA573E3B /* juce_KnownPluginList.h */, - 2754940A96851188581A2218 /* juce_PluginDirectoryScanner.cpp */, - 4AF614890823731010E97943 /* juce_PluginDirectoryScanner.h */, - 5A1BD822F8CB7D42BB0EAF7A /* juce_PluginListComponent.cpp */, - 53CD8A358FB75E4D10571218 /* juce_PluginListComponent.h */, - ); - name = scanning; - sourceTree = ""; - }; - 4A2152604F8F0C4007090ED3 /* threads */ = { - isa = PBXGroup; - children = ( - 72C174C879B2CA24DCE2B6EC /* juce_ChildProcess.cpp */, - 7AB9FBAA49422497E050FFAC /* juce_ChildProcess.h */, - 9098E2A57CB22B2D5F675D9C /* juce_CriticalSection.h */, - 0C0B6B8DAD62A3F5C926825F /* juce_DynamicLibrary.h */, - 40ACF762CE264F32184C4F7D /* juce_HighResolutionTimer.cpp */, - FB48147A1424E6D0A320DA6B /* juce_HighResolutionTimer.h */, - 50EDB2B0543B5881029D3CCE /* juce_InterProcessLock.h */, - 214092134C5925973C210C26 /* juce_Process.h */, - AF298423A147823848DFBC30 /* juce_ReadWriteLock.cpp */, - 4497D4F58A495EF3F3DB7DD2 /* juce_ReadWriteLock.h */, - 8B87D00DA619D83BA6926E28 /* juce_ScopedLock.h */, - 7658FE299B81691CFC697431 /* juce_ScopedReadLock.h */, - 9EA6B9182B39D4F9B416B14A /* juce_ScopedWriteLock.h */, - 2B455841042E415B99DEE263 /* juce_SpinLock.h */, - 7F081876B753390FC305329F /* juce_Thread.cpp */, - 9B103127E2063BAFD4A4FD33 /* juce_Thread.h */, - 11842D3DF751D5951BD039D4 /* juce_ThreadLocalValue.h */, - F598F4A108550EDBF7504E7B /* juce_ThreadPool.cpp */, - 9F9EAFF1322AAE2B114A611B /* juce_ThreadPool.h */, - 11AEAEFECC79A2800B56DDF9 /* juce_TimeSliceThread.cpp */, - D4B060A58438D21EE6CC8F76 /* juce_TimeSliceThread.h */, - 91544DAFCDBE05708D10A24C /* juce_WaitableEvent.h */, - ); - name = threads; - sourceTree = ""; - }; - 51D3ACB3B8EB13CB9843F7F8 /* juce_audio_processors */ = { - isa = PBXGroup; - children = ( - 2BB71E1725728DD1B293B270 /* processors */, - C89C5C051357DB3B9CD08C20 /* format */, - 90142123059D93BCEAB712F8 /* format_types */, - 48B3AA9536D8F0B4104D3591 /* scanning */, - 217D5E7DC9D4006AA1994A96 /* juce_module_info */, - 226462AF67A3DAA0A74B5BF0 /* juce_audio_processors.h */, - ); - name = juce_audio_processors; - sourceTree = ""; - }; - 5648974C3A509CF7BCB564A2 /* keyboard */ = { - isa = PBXGroup; - children = ( - A0EDFAC99A72166065DDD1FE /* juce_CaretComponent.cpp */, - ADF4E92197B00B0EB10384BA /* juce_CaretComponent.h */, - 0E989C4BC7933A41E9B0019E /* juce_KeyboardFocusTraverser.cpp */, - D921C8001631F2FC4D7EFF9D /* juce_KeyboardFocusTraverser.h */, - 349B7AFA001B78E62A9AFABB /* juce_KeyListener.cpp */, - E02D54F56C0EA9C94494CFF7 /* juce_KeyListener.h */, - 8141C52E88E3E82A0A226FAD /* juce_KeyPress.cpp */, - 7F63546442D6681E7AA27CB8 /* juce_KeyPress.h */, - 95812E339031893CDE82E8E5 /* juce_ModifierKeys.cpp */, - 7EC7AB8D0C164E19F70A4D8C /* juce_ModifierKeys.h */, - 9D542FAE4CA607E1F19C3EC9 /* juce_SystemClipboard.h */, - 1EB6398B6F537A4302092240 /* juce_TextEditorKeyMapper.h */, - 443C4EE14F325512D74C6B0E /* juce_TextInputTarget.h */, - ); - name = keyboard; - sourceTree = ""; - }; - 5A49F3FE7F309CCDF2AA6D13 /* logging */ = { - isa = PBXGroup; - children = ( - 2A28E0E1ED91E3E66DD795C0 /* juce_FileLogger.cpp */, - A700ACBCC4D648B60362B3D6 /* juce_FileLogger.h */, - 212A0795619AC3D8387EB085 /* juce_Logger.cpp */, - A5C29A814EAFAD95B416C624 /* juce_Logger.h */, - ); - name = logging; - sourceTree = ""; - }; - 5C634103A260BF82A0E31C45 /* juce_graphics */ = { - isa = PBXGroup; - children = ( - 6EFCA9BE2EA840377C657645 /* colour */, - 2FD23E53C45A9929EED4ACB9 /* contexts */, - 600B27C610B79902DCA4A031 /* images */, - F12369158044F272BDDEC2FD /* image_formats */, - 7D12CD4DE3E2BE74F35105D5 /* geometry */, - C28DB48D8EFA1D5455B2F7F9 /* placement */, - 81324F847F78D2803D339D51 /* fonts */, - 81228A7D287F23AC681C0DBC /* effects */, - F079B9DA6D228299D276CFD1 /* native */, - C28D3CC3B868C4F092E68D45 /* juce_module_info */, - ACEA0E1D856960307276B8B8 /* juce_graphics.h */, - ); - name = juce_graphics; - sourceTree = ""; - }; - 600B27C610B79902DCA4A031 /* images */ = { - isa = PBXGroup; - children = ( - 1C30357241D1DC9CF46D556B /* juce_Image.cpp */, - E60A33E021C4CA870FFE07CF /* juce_Image.h */, - E7EF16D6D50A17A5672075F0 /* juce_ImageCache.cpp */, - F2A26292713BB459A7AE5780 /* juce_ImageCache.h */, - D17049595AD1C1353337817D /* juce_ImageConvolutionKernel.cpp */, - 0236A082C107280C1505021A /* juce_ImageConvolutionKernel.h */, - C1FFEA64DED8E45D6A8F17F2 /* juce_ImageFileFormat.cpp */, - 8915FD41B7EB8AB0961F199A /* juce_ImageFileFormat.h */, - ); - name = images; - sourceTree = ""; - }; - 64272C7AB634CC1683F965CD /* juce_core */ = { - isa = PBXGroup; - children = ( - C563903C95875B98E023EB42 /* text */, - 0A1CD2C6C377E596E2BB643C /* maths */, - 82CBE4344E05C198564C7023 /* memory */, - 7F5AB44BFB3A934F692FA931 /* containers */, - 4A2152604F8F0C4007090ED3 /* threads */, - 97627FB0974924D059AC681B /* time */, - 894A275601B3879388492127 /* files */, - F71D9B3CC8688C2E11360EA4 /* network */, - 74D3D6965B4466AA78078555 /* streams */, - 5A49F3FE7F309CCDF2AA6D13 /* logging */, - B8C13B5C9FC988D111F5E51C /* system */, - 714343436E30203E40079511 /* xml */, - DC210A66C6446D4F9D7B158B /* javascript */, - 96D22057687FB227E2CD4C2C /* zip */, - E82FE59C6CD1F7A9DFD0A3DC /* unit_tests */, - 16EFEE06D414EBB4E08A3DCA /* misc */, - ABA32CBE72FAA2F9AD8357E4 /* native */, - 2B905EB5C391A1F8D80EA4EE /* juce_module_info */, - 153DD72C28F1B2C131090DEE /* juce_core.h */, - ); - name = juce_core; - sourceTree = ""; - }; - 64777E3332749BC9BC58A9C9 /* filebrowser */ = { - isa = PBXGroup; - children = ( - AC7FD56AB45D297F1D62676C /* juce_DirectoryContentsDisplayComponent.cpp */, - 8CA96F07FD8390BD5EEC909B /* juce_DirectoryContentsDisplayComponent.h */, - 494508266CB5367CB38B5805 /* juce_DirectoryContentsList.cpp */, - 8E3B1087D0795F0D4E02DAF0 /* juce_DirectoryContentsList.h */, - 743154234C82FDB5DACEA8C7 /* juce_FileBrowserComponent.cpp */, - BF4E95E2F725801F38CFCA77 /* juce_FileBrowserComponent.h */, - 431D8FA9D233B45295488AA7 /* juce_FileBrowserListener.h */, - 3344EDF97EBFA052C631F473 /* juce_FileChooser.cpp */, - 001A2BCC899370ADC99A8F3A /* juce_FileChooser.h */, - 3223ECE0332620D3B03E301A /* juce_FileChooserDialogBox.cpp */, - E44EB5B165F16ABE2DFB809D /* juce_FileChooserDialogBox.h */, - 25F88A5C788D9CF7301569EB /* juce_FileListComponent.cpp */, - 8C4A3CBB322357AF0CA3C2CD /* juce_FileListComponent.h */, - 9E0A95AA535CE6ABE66D9A30 /* juce_FilenameComponent.cpp */, - 0A3CCDBDD4238A7F9CB559BD /* juce_FilenameComponent.h */, - 24C467D96909731EB0D68B4A /* juce_FilePreviewComponent.h */, - D33DD8892334E06135451054 /* juce_FileSearchPathListComponent.cpp */, - 1635BBF869518BAA7A88A6A0 /* juce_FileSearchPathListComponent.h */, - BA9FFDC7BCC2D364014E1280 /* juce_FileTreeComponent.cpp */, - E8A7578ED10948AB49EE2997 /* juce_FileTreeComponent.h */, - 2CA19470CA427333F8CAC0A5 /* juce_ImagePreviewComponent.cpp */, - 27077B2F6AA5ED05FAF0B5D8 /* juce_ImagePreviewComponent.h */, - ); - name = filebrowser; - sourceTree = ""; - }; - 69C415E16F27D7D969B1F5D4 /* buffers */ = { - isa = PBXGroup; - children = ( - 1407F2665A3CA985C142273B /* juce_AudioDataConverters.cpp */, - D0096F2804DF0875565D0051 /* juce_AudioDataConverters.h */, - 2A61EE6E849869617187D67A /* juce_AudioSampleBuffer.cpp */, - 1D95A78059DCCC7B58782F07 /* juce_AudioSampleBuffer.h */, - D63FBBC40FA8CF0773BA9099 /* juce_FloatVectorOperations.cpp */, - 105DA88FCA60BE6C92A7249B /* juce_FloatVectorOperations.h */, - ); - name = buffers; - sourceTree = ""; - }; - 6EFCA9BE2EA840377C657645 /* colour */ = { - isa = PBXGroup; - children = ( - 49D8C9E638BCBA98114A0E94 /* juce_Colour.cpp */, - E2E7F9942FA653428A583920 /* juce_Colour.h */, - 887686762AD249568D53FC85 /* juce_ColourGradient.cpp */, - 6DCB546B40A962FCA3C74DB9 /* juce_ColourGradient.h */, - EBC1D498822B210B1B578763 /* juce_Colours.cpp */, - E99DD30E1F2706D62695EB8C /* juce_Colours.h */, - 29A10DF10817FC573A384056 /* juce_FillType.cpp */, - 6D256DC39965C982ADAAFA81 /* juce_FillType.h */, - 6AFA3298C0E6EBF44DF90481 /* juce_PixelFormats.h */, - ); - name = colour; - sourceTree = ""; - }; - 6FDE421EF91F6A2ECE24F648 /* drawables */ = { - isa = PBXGroup; - children = ( - C1E13F0AFFDADDB080D11B74 /* juce_Drawable.cpp */, - 41700CC92AEEF157D3B53BA2 /* juce_Drawable.h */, - E0DB95731A18E8D551F378BF /* juce_DrawableComposite.cpp */, - 6833DFDF33AA9A5F551EA79D /* juce_DrawableComposite.h */, - F39BD87913AB2F91817C50EF /* juce_DrawableImage.cpp */, - AAA6221960332B921DDF42A4 /* juce_DrawableImage.h */, - 5439A08FE11BD3D1EF760CF8 /* juce_DrawablePath.cpp */, - CE30C698B8FC1E23D6A8BB35 /* juce_DrawablePath.h */, - E912092604DBF571BDC08D60 /* juce_DrawableRectangle.cpp */, - A7BE5CE9E0BA615BCC867CB8 /* juce_DrawableRectangle.h */, - 1A0415BC113C5E901B668D45 /* juce_DrawableShape.cpp */, - E9E4792648C00B4A23C1A39D /* juce_DrawableShape.h */, - 3E5A6D7508BF64D897DABC3A /* juce_DrawableText.cpp */, - 2599ADA2E34E536F438F1B76 /* juce_DrawableText.h */, - F9B29C9F01195D5A979AB5C9 /* juce_SVGParser.cpp */, - ); - name = drawables; - sourceTree = ""; - }; - 714343436E30203E40079511 /* xml */ = { - isa = PBXGroup; - children = ( - 03F0A9F328C7E73E37F70774 /* juce_XmlDocument.cpp */, - 06387FD4ED709086E8E0152E /* juce_XmlDocument.h */, - 7C2634F55C78A3822A661CE2 /* juce_XmlElement.cpp */, - 9514C57B8C2FC488E49FF841 /* juce_XmlElement.h */, - ); - name = xml; - sourceTree = ""; - }; - 74D3D6965B4466AA78078555 /* streams */ = { - isa = PBXGroup; - children = ( - C78890910E4BE9A24F562397 /* juce_BufferedInputStream.cpp */, - 4C3F61A4672F57399AB751A0 /* juce_BufferedInputStream.h */, - E84D9D5463240034FD814D49 /* juce_FileInputSource.cpp */, - 6E84E300D2ECD62ED1ED3478 /* juce_FileInputSource.h */, - C92DFD53D297FAD265D1DB8D /* juce_InputSource.h */, - 3CAC36F05E2A916F49F6DC42 /* juce_InputStream.cpp */, - CA8B960E006E1C65A6A2E8AA /* juce_InputStream.h */, - 95D4F595A6D807E681E1E2B5 /* juce_MemoryInputStream.cpp */, - 954708C705637A2F8F204F0A /* juce_MemoryInputStream.h */, - F1D186A91AC8D4E99EA16650 /* juce_MemoryOutputStream.cpp */, - 2D9932D322EDA14CC872D08B /* juce_MemoryOutputStream.h */, - 5F7F52E503E2E2B59D055E6C /* juce_OutputStream.cpp */, - 2898384503D98B9CDE677C8F /* juce_OutputStream.h */, - 33D3EE89C713EBE01C1D268D /* juce_SubregionStream.cpp */, - 22520CCBD52F680200524E87 /* juce_SubregionStream.h */, - ); - name = streams; - sourceTree = ""; - }; - 76ACF3D24BC1E838C60D1C40 /* native */ = { - isa = PBXGroup; - children = ( - 1A5F53E93F3C800344F307DF /* juce_android_FileChooser.cpp */, - AB91CD7D677DF03475CA2090 /* juce_android_Windowing.cpp */, - 3A02DAB152A38D6A9EA9F5F5 /* juce_ios_UIViewComponentPeer.mm */, - A199934EF3E1D20FD472E51D /* juce_ios_Windowing.mm */, - BAA40A78E81F4FF0F0E075A6 /* juce_linux_Clipboard.cpp */, - 4461D6D26F4163DDA5B77F72 /* juce_linux_FileChooser.cpp */, - 32E16F662BD317BE07A69E58 /* juce_linux_Windowing.cpp */, - 127F5C75CA1140A229F5C5FD /* juce_mac_FileChooser.mm */, - 2CB4C73C121FCDEF65CBAC79 /* juce_mac_MainMenu.mm */, - B58C5191B1F0F0863167A322 /* juce_mac_MouseCursor.mm */, - 89003B5CB547C82F42EEB0A9 /* juce_mac_NSViewComponentPeer.mm */, - 17C3024C2A1EE03BC0ED9C96 /* juce_mac_Windowing.mm */, - E5D86302F07C5564E71BDD33 /* juce_MultiTouchMapper.h */, - 69327BB424333BE9051A2C1D /* juce_win32_DragAndDrop.cpp */, - D4FC04482169FDDCEB7A3BB5 /* juce_win32_FileChooser.cpp */, - A4A391D50A9F61201CBC277D /* juce_win32_Windowing.cpp */, - ); - name = native; - sourceTree = ""; - }; - 78B7B5349F52AFB72E0AB8C6 /* menus */ = { - isa = PBXGroup; - children = ( - 80153220EFB623D6F205FD1B /* juce_MenuBarComponent.cpp */, - 2A1C3333AE8043F0588BBBDF /* juce_MenuBarComponent.h */, - EA765AB65F269CFAD6CA3BFE /* juce_MenuBarModel.cpp */, - 53EA5EAEF8A9688559300B1C /* juce_MenuBarModel.h */, - 8A57C43210108CEEE8B61750 /* juce_PopupMenu.cpp */, - 2DF4E9322A4790812A9E9273 /* juce_PopupMenu.h */, - ); - name = menus; - sourceTree = ""; - }; - 79A8B90680DBB403FBF0FEB3 /* players */ = { - isa = PBXGroup; - children = ( - D4811402C8922A6D8EB4C660 /* juce_AudioProcessorPlayer.cpp */, - FD2285710D78FDBC856ADF13 /* juce_AudioProcessorPlayer.h */, - ); - name = players; - sourceTree = ""; - }; - 7D12CD4DE3E2BE74F35105D5 /* geometry */ = { - isa = PBXGroup; - children = ( - E1E5A0164A129C5DA1FA8DB7 /* juce_AffineTransform.cpp */, - 47EF393874A20700CD249091 /* juce_AffineTransform.h */, - 936D695F9C82434D08C181FC /* juce_BorderSize.h */, - E90C9A775597228F1F127252 /* juce_EdgeTable.cpp */, - 1FDE28E257271B411780600C /* juce_EdgeTable.h */, - 244636A4B3E48A7B6CC8E996 /* juce_Line.h */, - DD9B0DAF1119ECB6FDC0A3AE /* juce_Path.cpp */, - A7C3E1CAAA03F545AA4FCFAA /* juce_Path.h */, - 69B3908CF6E97D2326117534 /* juce_PathIterator.cpp */, - F213F6D6186ABA1FD60ADC42 /* juce_PathIterator.h */, - 8A4EB298996C4C410C1B4CDC /* juce_PathStrokeType.cpp */, - 4FDFC7D4EEEE8782C9FD9200 /* juce_PathStrokeType.h */, - 310AF93FF6F5B6D606FB6ED3 /* juce_Point.h */, - B0A8FCF2D607B95C740D17C9 /* juce_Rectangle.h */, - 40D83B00A8BBE334104EB694 /* juce_RectangleList.h */, - ); - name = geometry; - sourceTree = ""; - }; - 7D34EB83085FA61FCC15CB33 /* juce_events */ = { - isa = PBXGroup; - children = ( - 24E56C122BA7B936EB30D9EE /* messages */, - 824BDCF231EC6398C13EF6B4 /* timers */, - 33D3E9073E0658530664DCA5 /* broadcasters */, - 9ACE3BB033DC986A0A577EE8 /* interprocess */, - D4EE30FE8A31CD1DD0DCD093 /* native */, - F426F0185DB4E97E1E59A807 /* juce_module_info */, - 81E389AD161BE88DA92A59AA /* juce_events.h */, - ); - name = juce_events; - sourceTree = ""; - }; - 7F5AB44BFB3A934F692FA931 /* containers */ = { - isa = PBXGroup; - children = ( - 21B76774F02A7242990E433C /* juce_AbstractFifo.cpp */, - 07CB27E064E2A82C2B1D3832 /* juce_AbstractFifo.h */, - 0B2C1056583363B66704DB9C /* juce_Array.h */, - DD683E5793B347EEB07FB199 /* juce_ArrayAllocationBase.h */, - D1353A684AD92A6A9FAFBB1B /* juce_DynamicObject.cpp */, - DD1BF932ABF0CEC81A8B8A3A /* juce_DynamicObject.h */, - 0DE1759C594D2719742E928A /* juce_ElementComparator.h */, - 2D8A5B5929909ADD898D7E00 /* juce_HashMap.h */, - FA726CE9275EF0E84BBEA666 /* juce_LinkedListPointer.h */, - 6F0921F115160B435DC6D1D5 /* juce_NamedValueSet.cpp */, - 71FDCC63A1963F976C7AC8EE /* juce_NamedValueSet.h */, - A3B840D8C76CA45D3096241C /* juce_OwnedArray.h */, - AE4B8002F4435BEADA3AE966 /* juce_PropertySet.cpp */, - 3F948548BB22C3E546E5B0C6 /* juce_PropertySet.h */, - 4166468539A5F6E92A7A153E /* juce_ReferenceCountedArray.h */, - B6A004CD5808CFA5481EFA02 /* juce_ScopedValueSetter.h */, - 05F4DA9558D39B50DA5DEF79 /* juce_SortedSet.h */, - 80149DC851E70B4D50DA03DB /* juce_SparseSet.h */, - 9196D1FCEC768D074AAAD581 /* juce_Variant.cpp */, - D25566BCBFE5CCA4E425E6A7 /* juce_Variant.h */, - ); - name = containers; - sourceTree = ""; - }; - 81228A7D287F23AC681C0DBC /* effects */ = { - isa = PBXGroup; - children = ( - F273ED17232368EBFAFC820B /* juce_DropShadowEffect.cpp */, - DAEFEE4711393EBF6BC1EB3A /* juce_DropShadowEffect.h */, - AA5AD3160392AC223285535C /* juce_GlowEffect.cpp */, - CC04B8DF2C8AAFD8DB02A142 /* juce_GlowEffect.h */, - F83AF328F15F82C722B45598 /* juce_ImageEffectFilter.h */, - ); - name = effects; - sourceTree = ""; - }; - 81324F847F78D2803D339D51 /* fonts */ = { - isa = PBXGroup; - children = ( - 8EC249E14405CAC614E7A4CF /* juce_AttributedString.cpp */, - 9851B7F5090C1FA428169434 /* juce_AttributedString.h */, - 27F84193A8E46E113C520776 /* juce_CustomTypeface.cpp */, - C16DEC12DA7B1444AF0FD5BB /* juce_CustomTypeface.h */, - FDDB0277D2D036AEFA3EBD2D /* juce_Font.cpp */, - 942BA246938908E24A47A05B /* juce_Font.h */, - B57E1987459E64275B4652B2 /* juce_GlyphArrangement.cpp */, - 61E56039E1D2929463E58D62 /* juce_GlyphArrangement.h */, - 775C9C8633BA573DA512EDD6 /* juce_TextLayout.cpp */, - 4405EC65D1F518B70A5CF7B5 /* juce_TextLayout.h */, - D35E45B2269C44FCCAD7B1C4 /* juce_Typeface.cpp */, - BDC553DA1A51C45837101B7B /* juce_Typeface.h */, - ); - name = fonts; - sourceTree = ""; - }; - 824BDCF231EC6398C13EF6B4 /* timers */ = { - isa = PBXGroup; - children = ( - A4BAD3C43AF0D19ECA1C2BB3 /* juce_MultiTimer.cpp */, - A2C4984859B7A2F3CB17C609 /* juce_MultiTimer.h */, - 288C1D78EC7B90B96377863A /* juce_Timer.cpp */, - 78A82E89AC0283CC1329E84E /* juce_Timer.h */, - ); - name = timers; - sourceTree = ""; - }; - 82CBE4344E05C198564C7023 /* memory */ = { - isa = PBXGroup; - children = ( - 72F3014666D709C2DC843E32 /* juce_Atomic.h */, - A0492880578DCB9152DE5EAD /* juce_ByteOrder.h */, - 6CBCD70FF1AE3E23D1598F84 /* juce_ContainerDeletePolicy.h */, - AED57A3601CE4B9FF8007855 /* juce_HeapBlock.h */, - E18590F0257AB3D1F7F7CE8F /* juce_LeakedObjectDetector.h */, - 21BB88DADCF2268F24A63357 /* juce_Memory.h */, - 61A517E758E2BF89FF445D7F /* juce_MemoryBlock.cpp */, - 7F0B06EA0B38D4555CFEBA61 /* juce_MemoryBlock.h */, - FB35DC2702275D1038B7B960 /* juce_OptionalScopedPointer.h */, - 7A739B1B4B833A4668904CA6 /* juce_ReferenceCountedObject.h */, - 4350188F5B6D76DC651BA40E /* juce_ScopedPointer.h */, - EFABD729C0DFDF17DC9AAD80 /* juce_SharedResourcePointer.h */, - 8CE45844BA3103D92458CFB5 /* juce_Singleton.h */, - 6475DF69D5BDC709E275BF4D /* juce_WeakReference.h */, - ); - name = memory; - sourceTree = ""; - }; - 8505FC6FFB5A4A907383795E /* midi */ = { - isa = PBXGroup; - children = ( - 71A60F40B7B20297A1A5CB18 /* juce_MidiBuffer.cpp */, - A810A279E11A672B8F84AD72 /* juce_MidiBuffer.h */, - 33DDC7D3B0B83DF72DF167AC /* juce_MidiFile.cpp */, - B55F33C584CCF617C5C71EE6 /* juce_MidiFile.h */, - 3DC88C42A001EAAB6B959C6F /* juce_MidiKeyboardState.cpp */, - 6F98D6B8CAA0577CE576CD06 /* juce_MidiKeyboardState.h */, - E2E2DC879339A8A8F83349D8 /* juce_MidiMessage.cpp */, - 7202164C1666053D423871B0 /* juce_MidiMessage.h */, - 49B29E84D07EAF1F08C30A4F /* juce_MidiMessageSequence.cpp */, - 73E07C2D38F6ABA12AD6A458 /* juce_MidiMessageSequence.h */, - ); - name = midi; - sourceTree = ""; - }; - 894A275601B3879388492127 /* files */ = { - isa = PBXGroup; - children = ( - 247E415D0635F05B4067C255 /* juce_DirectoryIterator.cpp */, - 4D488219CE9D736D69F6EF59 /* juce_DirectoryIterator.h */, - 39423D67EFB8E7CEEF5FFAA9 /* juce_File.cpp */, - 95B7D6B36478C5A2977ADD4C /* juce_File.h */, - 7ECA74A2FC82F26715446C70 /* juce_FileFilter.cpp */, - 2C65FDA74486C92DF5EA5C87 /* juce_FileFilter.h */, - D409BECBAD7CDC3DE48EFA2F /* juce_FileInputStream.cpp */, - 418C5A909668054B5140BDA9 /* juce_FileInputStream.h */, - B446CB8C1ED8823EA2F33E30 /* juce_FileOutputStream.cpp */, - A70082D71DB8B5D779944812 /* juce_FileOutputStream.h */, - D1BEED433BFC4AA10346BE1C /* juce_FileSearchPath.cpp */, - 3BB7B60AE87F68C10DBEE118 /* juce_FileSearchPath.h */, - F5E56D366A88F772BE998AED /* juce_MemoryMappedFile.h */, - 4370F9713D43E71621F2AA2A /* juce_TemporaryFile.cpp */, - F0E8BE4931D56987065FE1C1 /* juce_TemporaryFile.h */, - 829D2BFEB85DC3589FEBB868 /* juce_WildcardFileFilter.cpp */, - FF973BD60572C077A148D3AB /* juce_WildcardFileFilter.h */, - ); - name = files; - sourceTree = ""; - }; - 8E4E901883E6B9C038471176 /* embedding */ = { - isa = PBXGroup; - children = ( - 45F6575A7BDB9134EAEA7633 /* juce_ActiveXControlComponent.h */, - 954D25A9D5C49DEB9D2FD167 /* juce_NSViewComponent.h */, - 24CFBAD49341D774EFA46056 /* juce_UIViewComponent.h */, - ); - name = embedding; - sourceTree = ""; - }; - 8FF698E2E4B3B82B8C64B444 /* Source */ = { - isa = PBXGroup; - children = ( - C21CEF3B473FDC99270B7623 /* Dexed */, - D62CAA66658707456DEC1897 /* Juce Modules */, - 3E0C3A2E8ED7ED09FA4E1CF0 /* Juce Library Code */, - 47F1FC7D160024027C543D04 /* Resources */, - 37BC5C48642EECA7AE662C02 /* Frameworks */, - 01533246E329E35CCD6F8580 /* Products */, - ); - name = Source; - sourceTree = ""; - }; - 90142123059D93BCEAB712F8 /* format_types */ = { - isa = PBXGroup; - children = ( - 30DDED034404C826CAF112BB /* juce_AudioUnitPluginFormat.h */, - 78934C6C88D2B35DEF15BAB8 /* juce_AudioUnitPluginFormat.mm */, - 6E8FC799E88893F8CD15BB71 /* juce_LADSPAPluginFormat.cpp */, - B4AA6DED570BD1D3E701BA49 /* juce_LADSPAPluginFormat.h */, - 7DC83451FCA10947AC92EBBC /* juce_VST3Common.h */, - 07333A7932C6B7538F4DF21F /* juce_VST3Headers.h */, - 3F15C4289E956EA0447392BD /* juce_VST3PluginFormat.cpp */, - 153D4DE95D01307F844AA15B /* juce_VST3PluginFormat.h */, - 83DC5A4F730ECA567FADFC3E /* juce_VSTMidiEventList.h */, - F68AA879901D4E695CBC3FAF /* juce_VSTPluginFormat.cpp */, - BEAE9210BD434DD07FD67CBF /* juce_VSTPluginFormat.h */, - ); - name = format_types; - sourceTree = ""; - }; - 9302146DD804F9CBF819DE20 /* RTAS */ = { - isa = PBXGroup; - children = ( - 55E39FAA63BA8B9D40F40712 /* juce_RTAS_DigiCode1.cpp */, - D8038990994C30BDD631733E /* juce_RTAS_DigiCode2.cpp */, - 4574217C2F5219DEDDDC9656 /* juce_RTAS_DigiCode3.cpp */, - 4E32AAF34A5EE096B8F3918E /* juce_RTAS_WinUtilities.cpp */, - EAA5D8078BCC042BDF94C77A /* juce_RTAS_Wrapper.cpp */, - C7C6039A52C3EE370CA9E73A /* juce_RTAS_MacUtilities.mm */, - 3E312C7BB77E7FF22DF88B96 /* juce_RTAS_DigiCode_Header.h */, - ); - name = RTAS; - sourceTree = ""; - }; - 9335318EC700B990C16F4739 /* misc */ = { - isa = PBXGroup; - children = ( - 1BDDF13246E8EC9483F6826B /* juce_BubbleComponent.cpp */, - EE05AF7337689377BBF4A40B /* juce_BubbleComponent.h */, - 75EB9A0BC0C7717F3DCE5BAE /* juce_DropShadower.cpp */, - F74CAAECFC16D1E87041E5A7 /* juce_DropShadower.h */, - ); - name = misc; - sourceTree = ""; - }; - 93DBDE35F9396CE4E89673FB /* juce_audio_utils */ = { - isa = PBXGroup; - children = ( - FA1B75BBFC7775827EA55903 /* gui */, - 79A8B90680DBB403FBF0FEB3 /* players */, - 4778838DB96C82580CBE10D0 /* juce_module_info */, - 687A7EC567E4B00B663808F1 /* juce_audio_utils.h */, - ); - name = juce_audio_utils; - sourceTree = ""; - }; - 96D22057687FB227E2CD4C2C /* zip */ = { - isa = PBXGroup; - children = ( - 1F5C171B3E8790746AD764E6 /* juce_GZIPCompressorOutputStream.cpp */, - E4C0D5FE28A85EDD44727BE3 /* juce_GZIPCompressorOutputStream.h */, - AFB323F45D65FBC8B472B825 /* juce_GZIPDecompressorInputStream.cpp */, - EE6F7ABA79C5D3A9FFCEC493 /* juce_GZIPDecompressorInputStream.h */, - E60515FDC5AD0779F615C43E /* juce_ZipFile.cpp */, - 475CE9A832328566544F457F /* juce_ZipFile.h */, - ); - name = zip; - sourceTree = ""; - }; - 97627FB0974924D059AC681B /* time */ = { - isa = PBXGroup; - children = ( - 02E962E65624D43B0906B0C6 /* juce_PerformanceCounter.cpp */, - 13BE37C7C7C4904EE42B9CEA /* juce_PerformanceCounter.h */, - 1D31136D1C9D959792023095 /* juce_RelativeTime.cpp */, - 03BC5E395E7CFFE130B7E5DE /* juce_RelativeTime.h */, - 7BF1EEFA4D36A91714D26060 /* juce_Time.cpp */, - 8BBE375590444CD57A311DD2 /* juce_Time.h */, - ); - name = time; - sourceTree = ""; - }; - 997D1EDFF8867D6F34493768 /* code_editor */ = { - isa = PBXGroup; - children = ( - 1AB4868A9AC3151DB805E2ED /* juce_CodeDocument.cpp */, - 13785F78EFA77576147267E3 /* juce_CodeDocument.h */, - 32F091EF95BC75166AAE583A /* juce_CodeEditorComponent.cpp */, - EB82AEC0B78709874C1749EC /* juce_CodeEditorComponent.h */, - 5DE3DC6998A92F718C9683FA /* juce_CodeTokeniser.h */, - 71DFB6F3C44390C0FD109073 /* juce_CPlusPlusCodeTokeniser.cpp */, - 7E68BB771E88E0A2A323D365 /* juce_CPlusPlusCodeTokeniser.h */, - 588255FD68989F1A03FDF31C /* juce_CPlusPlusCodeTokeniserFunctions.h */, - FA0406B777C1CB9C71F86BC1 /* juce_LuaCodeTokeniser.cpp */, - 076C4F22CCC47AFEAC2D0C68 /* juce_LuaCodeTokeniser.h */, - 6DEFC761C7F27A8ED88790B4 /* juce_XMLCodeTokeniser.cpp */, - 46969E6B78BC89383358DCDA /* juce_XMLCodeTokeniser.h */, - ); - name = code_editor; - sourceTree = ""; - }; - 9ACE3BB033DC986A0A577EE8 /* interprocess */ = { - isa = PBXGroup; - children = ( - 17A328AD02B5D7DA362E1D5D /* juce_ConnectedChildProcess.cpp */, - 40DCD07DB4B1D9FBB9D47BE5 /* juce_ConnectedChildProcess.h */, - 88DEE0054A9328954E19EECA /* juce_InterprocessConnection.cpp */, - F4EA09FAC67FDDA4D2E1D151 /* juce_InterprocessConnection.h */, - EACE6ED62F30C9222D91ACB2 /* juce_InterprocessConnectionServer.cpp */, - CECC7AEC966A1651289B4701 /* juce_InterprocessConnectionServer.h */, - ); - name = interprocess; - sourceTree = ""; - }; - A6591E1C9596C9585841C280 /* juce_audio_basics */ = { - isa = PBXGroup; - children = ( - 69C415E16F27D7D969B1F5D4 /* buffers */, - 8505FC6FFB5A4A907383795E /* midi */, - 22B86A69849E8A8394A7512D /* effects */, - 119C8C138453E1EDB43BB203 /* sources */, - 32FC8884626A89F0A805D4C0 /* synthesisers */, - 44E53EF6DC2C6F714A7863C0 /* juce_module_info */, - 15F31F8C2BAC231631AC3156 /* juce_audio_basics.h */, - ); - name = juce_audio_basics; - sourceTree = ""; - }; - ABA32CBE72FAA2F9AD8357E4 /* native */ = { - isa = PBXGroup; - children = ( - B1D9F99AC498364816DAC219 /* juce_android_Files.cpp */, - A3E39527888583E832999240 /* juce_android_JNIHelpers.h */, - 268719C746B8E5EA06DDCF01 /* juce_android_Misc.cpp */, - 2068B2F409A743F7AA6005B8 /* juce_android_Network.cpp */, - C4282ED857CAA664F85D5C4D /* juce_android_SystemStats.cpp */, - CFFA7532FAFF5655253878FE /* juce_android_Threads.cpp */, - EB7592B101CFEDF629993E39 /* juce_BasicNativeHeaders.h */, - F8A589597222065EA52C4F9C /* juce_linux_CommonFile.cpp */, - EEC5BFDA3C3B23D08E4528B7 /* juce_linux_Files.cpp */, - 6CAAD366E2D6A650900C75F0 /* juce_linux_Network.cpp */, - 2010DBBC52928BD3BA2E0704 /* juce_linux_SystemStats.cpp */, - 448630170E2B48A00FBBA757 /* juce_linux_Threads.cpp */, - 5D131F468F18FD82C14C3849 /* juce_mac_Files.mm */, - 30956FDD9C1C2D706020AB84 /* juce_mac_Network.mm */, - 49D8BE8809C3C20272870C06 /* juce_mac_Strings.mm */, - 5197B9D23C0D9B28F2FF7F93 /* juce_mac_SystemStats.mm */, - 99B1A018081D90D801667296 /* juce_mac_Threads.mm */, - 3A2252FE59FEB529074751B8 /* juce_osx_ObjCHelpers.h */, - 47168956BF1BAC3FCBD55BB8 /* juce_posix_NamedPipe.cpp */, - 8FB4C261F0F3760EEA4B7BBE /* juce_posix_SharedCode.h */, - C7EFC098CAC8AAB04A9D5183 /* juce_win32_ComSmartPtr.h */, - 0353CE3273A1063693BC5D55 /* juce_win32_Files.cpp */, - BF9449063F547456209F21FE /* juce_win32_Network.cpp */, - B240D74DFFCFE7CC095CEF59 /* juce_win32_Registry.cpp */, - EF5B2974D235161C6A1536A4 /* juce_win32_SystemStats.cpp */, - BEEB5F341047830F06857DD9 /* juce_win32_Threads.cpp */, - ); - name = native; - sourceTree = ""; - }; - AF25CB689CF9F18AB7F18B70 /* layout */ = { - isa = PBXGroup; - children = ( - 03C1DC01A1B211F7FCA5043C /* juce_AnimatedPosition.h */, - 48C71FEAED1B46E11F17040C /* juce_AnimatedPositionBehaviours.h */, - 135C6D9174F6937E278E86FB /* juce_ComponentAnimator.cpp */, - BB08970C0517BF01D80D49B3 /* juce_ComponentAnimator.h */, - 4C6C14363344C87BDA4C1C71 /* juce_ComponentBoundsConstrainer.cpp */, - D2E57CCA4E6F6DBE2953744C /* juce_ComponentBoundsConstrainer.h */, - BFF8708E6D65F4E2B84983F9 /* juce_ComponentBuilder.cpp */, - 238202B3EA9976135C833C3A /* juce_ComponentBuilder.h */, - 1756BAFDC82F5E69704BEAFE /* juce_ComponentMovementWatcher.cpp */, - 9BC0901018A3D55DCCA54301 /* juce_ComponentMovementWatcher.h */, - 1FDD2E98D27BD53D39C3AEB0 /* juce_ConcertinaPanel.cpp */, - 5D2301F260F7793BD491A81E /* juce_ConcertinaPanel.h */, - 1F982064915D0D00759C6B17 /* juce_GroupComponent.cpp */, - 0FC4F5F1B7E65CC1C9FA915F /* juce_GroupComponent.h */, - AA600E8588CD8DE76CB9C361 /* juce_MultiDocumentPanel.cpp */, - EE40D10A94911C19595F860D /* juce_MultiDocumentPanel.h */, - B633E97B2CB9548F0AF0164A /* juce_ResizableBorderComponent.cpp */, - 3EBF429D4892591960A930F3 /* juce_ResizableBorderComponent.h */, - 0CB234755B75E0DBC2FFB58E /* juce_ResizableCornerComponent.cpp */, - B9D163D4B1C34DFAF84F81E0 /* juce_ResizableCornerComponent.h */, - 11329C73799FA61B7BC76418 /* juce_ResizableEdgeComponent.cpp */, - 4710CA869326390AF0CE2A0B /* juce_ResizableEdgeComponent.h */, - 108462DA6B96E6F49DBD521E /* juce_ScrollBar.cpp */, - 309E703B70110A64AABCC674 /* juce_ScrollBar.h */, - 4D8B2790A6E7552C64453A53 /* juce_StretchableLayoutManager.cpp */, - 4836B8889A1100EA724CE7C2 /* juce_StretchableLayoutManager.h */, - 2FD26019A4D247FA8F38FE29 /* juce_StretchableLayoutResizerBar.cpp */, - 462B768DFC2129F54233D51D /* juce_StretchableLayoutResizerBar.h */, - 07037505B34930CDA76B04A5 /* juce_StretchableObjectResizer.cpp */, - 4C9751F81C3C052C9A6390F4 /* juce_StretchableObjectResizer.h */, - 7A905E3EE096DAA1D7BA7ABD /* juce_TabbedButtonBar.cpp */, - 163C2312B370BA53F482B84B /* juce_TabbedButtonBar.h */, - CCBC05EAC1621CB1519FA5A4 /* juce_TabbedComponent.cpp */, - 35892C1EF9CEA7C1F1C9109F /* juce_TabbedComponent.h */, - 45E8F3FB24A3579F1C1F3DF5 /* juce_Viewport.cpp */, - 9A68431EDA5B8D2023A10A02 /* juce_Viewport.h */, - ); - name = layout; - sourceTree = ""; - }; - B199AE84B656EEB377B44DAE /* misc */ = { - isa = PBXGroup; - children = ( - C4A2C1FDE57CCF33BE778B39 /* juce_AppleRemote.h */, - ACDB4542A6B2FE5186631197 /* juce_BubbleMessageComponent.cpp */, - E5241F77EBB47E4DF15750FA /* juce_BubbleMessageComponent.h */, - D5E430C641A42BA4693AC4AF /* juce_ColourSelector.cpp */, - 4F977F1C295B0D355391AAD3 /* juce_ColourSelector.h */, - 6E2A781F28B3F735F4FAB2A2 /* juce_KeyMappingEditorComponent.cpp */, - A00DC4E59356AF5F1D9C02D1 /* juce_KeyMappingEditorComponent.h */, - 18D52C793029AFCC92C77A75 /* juce_LiveConstantEditor.cpp */, - FCBA692E842A80D9618CA467 /* juce_LiveConstantEditor.h */, - 5BFC8D75FFE4E8DEE50B3B1A /* juce_PreferencesPanel.cpp */, - A062855D9DD17397012BC224 /* juce_PreferencesPanel.h */, - AE8321756C03700EB12FF98A /* juce_RecentlyOpenedFilesList.cpp */, - FD333147C1339A81B846EC52 /* juce_RecentlyOpenedFilesList.h */, - 0FDAC75611540A0DE7FE3E22 /* juce_SplashScreen.cpp */, - 271BCF94F884F0354E1EBCC7 /* juce_SplashScreen.h */, - D154251B66BF13E992D3D06A /* juce_SystemTrayIconComponent.cpp */, - CEFACF205D94175B714846DB /* juce_SystemTrayIconComponent.h */, - 738B67C0D9862DF54EC53785 /* juce_WebBrowserComponent.h */, - ); - name = misc; - sourceTree = ""; - }; - B794B15ADD462305846C5903 /* VST */ = { - isa = PBXGroup; - children = ( - D6C6FCBA5ECA257959BFE674 /* juce_VST_Wrapper.cpp */, - F6F950B6ABB40B62AE4C0B78 /* juce_VST_Wrapper.mm */, - ); - name = VST; - sourceTree = ""; - }; - B8C13B5C9FC988D111F5E51C /* system */ = { - isa = PBXGroup; - children = ( - B29C1AA0C72B3F9D34F7FEE4 /* juce_CompilerSupport.h */, - 4342EA166DD20D383F6C9E50 /* juce_PlatformDefs.h */, - A11BA069921359F646E104A1 /* juce_StandardHeader.h */, - 037F8EB68705A98C29AEE6B0 /* juce_SystemStats.cpp */, - D90A42D47F3DD9C505D8A925 /* juce_SystemStats.h */, - 77207D1536974D96B7ED2B85 /* juce_TargetPlatform.h */, - ); - name = system; - sourceTree = ""; - }; - BDC5059F1563FD8DD69AD324 /* msfa */ = { - isa = PBXGroup; - children = ( - 3715DFDD7A1B12083F051F5A /* freqlut.cc */, - 8F395B738E7AB81A0333AF96 /* freqlut.h */, - 2D26E2304C0F6FC633936014 /* lfo.cc */, - 86412A8C98A3287951990C1B /* lfo.h */, - AF1DFD842A36E967DF140D5C /* aligned_buf.h */, - 30B133CA0CDC245A147F4689 /* controllers.h */, - AE09B4C2A4BDE8FDA01A8A13 /* dx7note.cc */, - C6928FE8579AE1980061CA43 /* dx7note.h */, - 00FDFD1ABE59B4CEF74BF5A3 /* env.cc */, - 64CF42AFC2E05AEF9D350CD2 /* env.h */, - F63CE53483AF125DCFB024F1 /* exp2.cc */, - 8AF9F9504D8671A590689E28 /* exp2.h */, - C01EE75D859C1F942DA3AE61 /* fm_core.cc */, - 1B06A67DF2B4FD2969A9781A /* fm_core.h */, - 78CA76788217B98287D9E007 /* fm_op_kernel.cc */, - F38E4F0A432CAB98BA8F4F8A /* fm_op_kernel.h */, - 68EBBB35B7A5A57E4BA2F8E2 /* module.h */, - 51E5757E2D48E638F9A4CB61 /* pitchenv.cc */, - F47FA981083705D4B545339F /* pitchenv.h */, - B0230FCCA099E6430411DFC9 /* sin.cc */, - 3BE8F91A99E8F48CB9F10C1F /* sin.h */, - 68D35AFE11BAA35EAE497D47 /* synth.h */, - ); - name = msfa; - sourceTree = ""; - }; - C1286EFB30F4A6B5049A6E42 /* juce_audio_plugin_client */ = { - isa = PBXGroup; - children = ( - D53856B782944C7AA8FC0B1E /* AU */, - 9302146DD804F9CBF819DE20 /* RTAS */, - B794B15ADD462305846C5903 /* VST */, - FA8A91020A6EDA9A5DDF8D4A /* VST3 */, - C6FD96042B8BCA45D8185D2F /* AAX */, - 0FB9E2767E5705CC99B13E68 /* utility */, - 7F1B3807BE4D056A05E18663 /* juce_module_info */, - BB7808FBEB84DD9C60978532 /* juce_audio_plugin_client.h */, - ); - name = juce_audio_plugin_client; - sourceTree = ""; - }; - C2089BDCA7170FE59577FA72 /* Juce AU Wrapper */ = { - isa = PBXGroup; - children = ( - 0598D37F24E489C12F43EF93 /* AUBase.cpp */, - F7B762EB74B4145099C06C5A /* AUBase.h */, - C4DE747B720C310D6BC65936 /* AUBuffer.cpp */, - 42037D6AD47F7FEBAF6D4732 /* AUBuffer.h */, - 8ED1068B85DCEFEFDD3C4F82 /* AUCarbonViewBase.cpp */, - F2C763A217C6D0704C6FB4F2 /* AUCarbonViewBase.h */, - D8F138F48E933ECCF2DB2321 /* AUCarbonViewControl.cpp */, - 82D97C5FDE8A53DEBB075DC7 /* AUCarbonViewControl.h */, - 173994FFD45CE7CB6D2CCAD7 /* AUCarbonViewDispatch.cpp */, - 02802D92B7CF0D835254B6C1 /* AUDispatch.cpp */, - 801E57A03A710591F1B5FEC6 /* AUDispatch.h */, - 6B8B14C1AA3491F103E6A5F7 /* AUEffectBase.cpp */, - 5AD3DDD0285C94CEB17BF03C /* AUEffectBase.h */, - 6A462A15DB909F68F4A9BECC /* AUInputElement.cpp */, - 60F23312570D43B7F7FC0D43 /* AUInputElement.h */, - 10E7F81B8369A5A923D5EE9A /* AUInputFormatConverter.h */, - 6E1E415B080EA491A7D58D3A /* AUMIDIBase.cpp */, - 7B6DC352755033E8436427CA /* AUMIDIBase.h */, - 3E301CD94F9029D7E3898EB2 /* AUMIDIEffectBase.cpp */, - C89190A10B698C7B1E42C76D /* AUMIDIEffectBase.h */, - 16D7D354B7CBC971E8B0CFA5 /* AUOutputBase.cpp */, - 8921057E004FE1036191B888 /* AUOutputBase.h */, - 81A949AE03BA033D5D762E9F /* AUOutputElement.cpp */, - D0A92955B64EB66E9334F51F /* AUOutputElement.h */, - A7894AD5A242CD86ACE9455C /* AUResources.r */, - BAADD431AF7666E435C6C4B3 /* AUScopeElement.cpp */, - D251BD558FBD32ECA221D81C /* AUScopeElement.h */, - 4697BFC33D1A3C846B2DED19 /* AUSilentTimeout.h */, - AE84ADD347C9AB73ECFCBED7 /* AUTimestampGenerator.h */, - D378EA436E4D111ECE7099C6 /* AUViewLocalizedStringKeys.h */, - F3171B20C2BBF12A5786B1F5 /* CAAudioChannelLayout.cpp */, - 7A65F23E42CEFBDBA64EE2DA /* CAAudioChannelLayout.h */, - 0DB84FE1DF027D2AB0952F18 /* CAAUParameter.cpp */, - BAEAEDCE17A81C84439E984A /* CAAUParameter.h */, - 6050F8DB4EA5F9A4A27D7653 /* CADebugMacros.h */, - A31C49ABA24290126250F574 /* CAMutex.cpp */, - 0337F4D67CD2D5C29939E940 /* CAMutex.h */, - 3A44529EBD28E325DAA12D80 /* CarbonEventHandler.cpp */, - 478D907DACBE0CF918C6A0AD /* CarbonEventHandler.h */, - 7B2E31BD7292002DEBCC366B /* CAStreamBasicDescription.cpp */, - F4050C3BAC97B06A7ED35103 /* CAStreamBasicDescription.h */, - 2CA60524355CF872ADB42EA4 /* CAVectorUnit.cpp */, - 210364718D006CC26958D583 /* CAVectorUnit.h */, - 83281A9109419F0057EABD31 /* CAVectorUnitTypes.h */, - 561A9793AA73B7FDDED14476 /* ComponentBase.cpp */, - C1F03CEB2804747AF4C6BF4D /* ComponentBase.h */, - 68CCE716313990E1412107A8 /* MusicDeviceBase.cpp */, - 4CB06EEFAA877AA4A28FE150 /* MusicDeviceBase.h */, - ); - name = "Juce AU Wrapper"; - sourceTree = ""; - }; - C21CEF3B473FDC99270B7623 /* Dexed */ = { - isa = PBXGroup; - children = ( - F472964B0FFEE5615B72CE3D /* Resources */, - 29B923E6EB12F97B68585AFC /* Source */, - ); - name = Dexed; - sourceTree = ""; - }; - C28DB48D8EFA1D5455B2F7F9 /* placement */ = { - isa = PBXGroup; - children = ( - F1B87A9524CB1BFD0A3CDC47 /* juce_Justification.h */, - F957420DFF4D2354671B4116 /* juce_RectanglePlacement.cpp */, - 1BC34A19A42AE647894C4D57 /* juce_RectanglePlacement.h */, - ); - name = placement; - sourceTree = ""; - }; - C563903C95875B98E023EB42 /* text */ = { - isa = PBXGroup; - children = ( - 400C107C97F668916CF93FB2 /* juce_CharacterFunctions.cpp */, - 980D53B155A6FE153BF4ECC4 /* juce_CharacterFunctions.h */, - 23E9F8B6075CCB7BA9FE4782 /* juce_CharPointer_ASCII.h */, - 43E05BD9AADCBDA27B58F5A4 /* juce_CharPointer_UTF8.h */, - 45CC11D2029BA2CEAE1B0F76 /* juce_CharPointer_UTF16.h */, - BC383B9F2F352E373DE6C4A6 /* juce_CharPointer_UTF32.h */, - 7144CB121F03A13EC1A5383F /* juce_Identifier.cpp */, - 70BB114924D2EB3508565E8F /* juce_Identifier.h */, - AC0E5E706FA5E8597F943065 /* juce_LocalisedStrings.cpp */, - D6C62054C5A49E8BB8902DF8 /* juce_LocalisedStrings.h */, - FD799268DEA0EC4CDFD4DA10 /* juce_NewLine.h */, - 32707C43C25AF3F79D120BCF /* juce_String.cpp */, - A190462810A30005F66291F9 /* juce_String.h */, - 0733471B6DA02299D2C9590A /* juce_StringArray.cpp */, - 112C97A7D8CEC06ED2E1B1BE /* juce_StringArray.h */, - 7CDDAFACA226D14742566EE3 /* juce_StringPairArray.cpp */, - BE0C6895B768F38281CCC0BC /* juce_StringPairArray.h */, - 1600EDBEE9B363CBAB68CD43 /* juce_StringPool.cpp */, - 2BEBDED2BACDEEEE975583F3 /* juce_StringPool.h */, - C294314DFA3B047D1F745A23 /* juce_StringRef.h */, - B8F528366A0422FC84469E80 /* juce_TextDiff.cpp */, - F32BA2ADBCF84519105AB974 /* juce_TextDiff.h */, - ); - name = text; - sourceTree = ""; - }; - C6FD96042B8BCA45D8185D2F /* AAX */ = { - isa = PBXGroup; - children = ( - 505852570B48EB3F18076B03 /* juce_AAX_Wrapper.cpp */, - 3254CAE4C282C4432214B016 /* juce_AAX_Wrapper.mm */, - ); - name = AAX; - sourceTree = ""; - }; - C89C5C051357DB3B9CD08C20 /* format */ = { - isa = PBXGroup; - children = ( - B773C79C475482598391DF35 /* juce_AudioPluginFormat.cpp */, - 734BB0B03974DF78B8CB4FD8 /* juce_AudioPluginFormat.h */, - 37A3210291F1C2B3FF42BCDD /* juce_AudioPluginFormatManager.cpp */, - 1914E45DEAEBD1592581F1FD /* juce_AudioPluginFormatManager.h */, - ); - name = format; - sourceTree = ""; - }; - CAF6EDA5961A5335899392C7 /* positioning */ = { - isa = PBXGroup; - children = ( - 0B7725520356AED2C80FC943 /* juce_MarkerList.cpp */, - 71AF0542AEBEDCA5238DFFAA /* juce_MarkerList.h */, - D564C8B4087316C3A47936B0 /* juce_RelativeCoordinate.cpp */, - 5E2597BF6AD27698AA0E9A3D /* juce_RelativeCoordinate.h */, - FF5B77AA3517B4637F862BD3 /* juce_RelativeCoordinatePositioner.cpp */, - F1406998FD7313F016AB99BA /* juce_RelativeCoordinatePositioner.h */, - DE8C3DD36C117E355C7EB9FE /* juce_RelativeParallelogram.cpp */, - BE574127E239EB558B051D34 /* juce_RelativeParallelogram.h */, - B7ABA3D144D21935200C8386 /* juce_RelativePoint.cpp */, - 2DF16794D7C916F177B31322 /* juce_RelativePoint.h */, - A013A93080FB0FB98C02C96B /* juce_RelativePointPath.cpp */, - E9BA26E4F993EBFB0E36B18C /* juce_RelativePointPath.h */, - FE42B80DEA2E49C07E9E1C0A /* juce_RelativeRectangle.cpp */, - 52E90BF34CEB39BB7DFA91DE /* juce_RelativeRectangle.h */, - ); - name = positioning; - sourceTree = ""; - }; - D20A63B1C4DF64E9DA6C9CE8 /* commands */ = { - isa = PBXGroup; - children = ( - 041EA7D542B0EBF7213B9BA2 /* juce_ApplicationCommandID.h */, - 17ED00953353016B7E7492B0 /* juce_ApplicationCommandInfo.cpp */, - 06625FB929EB46E8D09E77F8 /* juce_ApplicationCommandInfo.h */, - C5E92613992AB74C2E715271 /* juce_ApplicationCommandManager.cpp */, - 3597896505C601CE1FFE1158 /* juce_ApplicationCommandManager.h */, - 4313B453E6E7735DFFD2609A /* juce_ApplicationCommandTarget.cpp */, - 600DDC87EB44F5B6EFA1500F /* juce_ApplicationCommandTarget.h */, - D6DF0265148E2542CF8184CB /* juce_KeyPressMappingSet.cpp */, - 195B617C1FF754108A97F645 /* juce_KeyPressMappingSet.h */, - ); - name = commands; - sourceTree = ""; - }; - D478C042D92EB811C777A864 /* properties */ = { - isa = PBXGroup; - children = ( - 68E9769CFD4CE3B4CA530DA3 /* juce_BooleanPropertyComponent.cpp */, - DF8DE64F9BD944A64F90B0EC /* juce_BooleanPropertyComponent.h */, - 4F95F3371DCA260343D7D26A /* juce_ButtonPropertyComponent.cpp */, - 72930EF8836E66B6E3A0711D /* juce_ButtonPropertyComponent.h */, - 63B73D99B066179BB9661D4E /* juce_ChoicePropertyComponent.cpp */, - A81FD2D7571ED030F7292079 /* juce_ChoicePropertyComponent.h */, - FF01650D69FB076FD8FCCE32 /* juce_PropertyComponent.cpp */, - 937CFA7E69529A634C1DCD5C /* juce_PropertyComponent.h */, - 2494BCA24C9E3AB3D20372F2 /* juce_PropertyPanel.cpp */, - AEFD0A7D65FEC1D23A87FB1C /* juce_PropertyPanel.h */, - 075BB641199B15A84856DE6E /* juce_SliderPropertyComponent.cpp */, - 413E92912A2C8CACB46AFD3B /* juce_SliderPropertyComponent.h */, - E5B0F6E8B90970181A8F8A5D /* juce_TextPropertyComponent.cpp */, - 170F06D00B2197E66300D558 /* juce_TextPropertyComponent.h */, - ); - name = properties; - sourceTree = ""; - }; - D4EE30FE8A31CD1DD0DCD093 /* native */ = { - isa = PBXGroup; - children = ( - AB7EBBEDA6F3984B295E123F /* juce_android_Messaging.cpp */, - 778E69094A09D97D61E355B2 /* juce_ios_MessageManager.mm */, - 11593E224B032FD1CD5AD0A2 /* juce_linux_Messaging.cpp */, - 97DAB16E37783E73F1D039A3 /* juce_mac_MessageManager.mm */, - 1A468C18B5B893C90F31EF6C /* juce_osx_MessageQueue.h */, - 8A58A60739C88C641626F590 /* juce_ScopedXLock.h */, - 04E04837EB4F3E03908835C9 /* juce_win32_HiddenMessageWindow.h */, - 8390BC6E8D8190A7C45C6A08 /* juce_win32_Messaging.cpp */, - ); - name = native; - sourceTree = ""; - }; - D53856B782944C7AA8FC0B1E /* AU */ = { - isa = PBXGroup; - children = ( - 502D49C82606515A80907EB3 /* juce_AU_Wrapper.mm */, - ); - name = AU; - sourceTree = ""; - }; - D617988BED63CC4252FDB0A6 /* juce_data_structures */ = { - isa = PBXGroup; - children = ( - 3F504387EAE40781EC731BB7 /* values */, - 128F041FBAC450E8521EE891 /* undomanager */, - 2D679CDB5DE0ECF6326A67CD /* app_properties */, - 6D9DB37328ED695A9941A21C /* juce_module_info */, - 930D512FD24D7E21E43C7322 /* juce_data_structures.h */, - ); - name = juce_data_structures; - sourceTree = ""; - }; - D62CAA66658707456DEC1897 /* Juce Modules */ = { - isa = PBXGroup; - children = ( - A6591E1C9596C9585841C280 /* juce_audio_basics */, - C1286EFB30F4A6B5049A6E42 /* juce_audio_plugin_client */, - 51D3ACB3B8EB13CB9843F7F8 /* juce_audio_processors */, - 93DBDE35F9396CE4E89673FB /* juce_audio_utils */, - 64272C7AB634CC1683F965CD /* juce_core */, - D617988BED63CC4252FDB0A6 /* juce_data_structures */, - 7D34EB83085FA61FCC15CB33 /* juce_events */, - 5C634103A260BF82A0E31C45 /* juce_graphics */, - 102590FC92E1B5107F83576A /* juce_gui_basics */, - 24EAA5A95BB6182CEC97A78A /* juce_gui_extra */, - ); - name = "Juce Modules"; - sourceTree = ""; - }; - DC210A66C6446D4F9D7B158B /* javascript */ = { - isa = PBXGroup; - children = ( - 7FB4F731D177B36CE8616BAE /* juce_Javascript.cpp */, - D6F2BF4E3C3BE264123B3BB5 /* juce_Javascript.h */, - A27B095F0D44EB7FFFC3951E /* juce_JSON.cpp */, - 36E8717C91C6111A701379EB /* juce_JSON.h */, - ); - name = javascript; - sourceTree = ""; - }; - E12CE38F88D50562CD35E502 /* application */ = { - isa = PBXGroup; - children = ( - 4A463C15CF07B232605DC2F4 /* juce_Application.cpp */, - BA52D32B1E0324546C26ACCA /* juce_Application.h */, - ); - name = application; - sourceTree = ""; - }; - E6BDE757CFD28DF7846CD1ED /* lookandfeel */ = { - isa = PBXGroup; - children = ( - 73BA60F5506ADDBEAF6243FC /* juce_LookAndFeel.cpp */, - 1E1A0627C2977D5FCB8440CC /* juce_LookAndFeel.h */, - F9FA29A5FF9C9921D785A1C0 /* juce_LookAndFeel_V1.cpp */, - A5E6E877E1151D8B3E480B76 /* juce_LookAndFeel_V1.h */, - 1B08D87085D8D577F6CBB008 /* juce_LookAndFeel_V2.cpp */, - C74F0F7CA3A1A201C0EC4772 /* juce_LookAndFeel_V2.h */, - 8312A52619B88D3763F6B493 /* juce_LookAndFeel_V3.cpp */, - 3C11994F7B26920BEB9DA52D /* juce_LookAndFeel_V3.h */, - ); - name = lookandfeel; - sourceTree = ""; - }; - E71EF502364BDEA76FE5A4E9 /* native */ = { - isa = PBXGroup; - children = ( - 29C1872028A449607E80B677 /* juce_android_WebBrowserComponent.cpp */, - 717E18C7D784FE087436A768 /* juce_ios_UIViewComponent.mm */, - 34328035CBCDFA9F18BBA158 /* juce_linux_SystemTrayIcon.cpp */, - DB3B5F6FE49267EE53089A05 /* juce_linux_WebBrowserComponent.cpp */, - AF9A3BEBEC95195644691CA1 /* juce_mac_AppleRemote.mm */, - CE8542A4C8BB33C6A0EA36A4 /* juce_mac_CarbonViewWrapperComponent.h */, - E4644D1ECB4F5A7D7062E2CB /* juce_mac_NSViewComponent.mm */, - 83B3A12467C52CB13FB353C6 /* juce_mac_SystemTrayIcon.cpp */, - E5CD39DEA3BE8EC9959F8CFE /* juce_mac_WebBrowserComponent.mm */, - 97187C062A4A90E3DE7B4B6F /* juce_win32_ActiveXComponent.cpp */, - B06A13CEF4F653521D640041 /* juce_win32_SystemTrayIcon.cpp */, - 3927B1AD5EFA95FBE77C0DAB /* juce_win32_WebBrowserComponent.cpp */, - ); - name = native; - sourceTree = ""; - }; - E82FE59C6CD1F7A9DFD0A3DC /* unit_tests */ = { - isa = PBXGroup; - children = ( - 8890765D8A8E2769231452A3 /* juce_UnitTest.cpp */, - AAD65774913834A6443A3B82 /* juce_UnitTest.h */, - ); - name = unit_tests; - sourceTree = ""; - }; - F079B9DA6D228299D276CFD1 /* native */ = { - isa = PBXGroup; - children = ( - A44D9BDAD9BE9AD2E519D241 /* juce_android_Fonts.cpp */, - 5B12686E2808FCCB8BBE0E24 /* juce_android_GraphicsContext.cpp */, - 9FA7591BA2EFB4349B6E02A9 /* juce_freetype_Fonts.cpp */, - 9D5B06B94AB34DBEC8BD262E /* juce_linux_Fonts.cpp */, - F3718D9D288A2760B6126585 /* juce_mac_CoreGraphicsContext.h */, - 0EA1F582E4E45EB90F02223A /* juce_mac_CoreGraphicsContext.mm */, - 06A207E085A240F774C4140D /* juce_mac_CoreGraphicsHelpers.h */, - 6742794BECA5E223253EF810 /* juce_mac_Fonts.mm */, - 72F342B2288D7D32917C66FF /* juce_RenderingHelpers.h */, - 8B160A62F6A6EF21379A8EA7 /* juce_win32_Direct2DGraphicsContext.cpp */, - ADC81E4F771BD99A4C3C822A /* juce_win32_DirectWriteTypeface.cpp */, - B84CE707CF89EA0002595BCA /* juce_win32_DirectWriteTypeLayout.cpp */, - 834F3F9FC2FE9564FF95243D /* juce_win32_Fonts.cpp */, - ); - name = native; - sourceTree = ""; - }; - F12369158044F272BDDEC2FD /* image_formats */ = { - isa = PBXGroup; - children = ( - C48DAE373124C258F3414CDB /* juce_GIFLoader.cpp */, - 1B9C8840393D305F594C613B /* juce_JPEGLoader.cpp */, - E65D3A0B86F5E8834CE77DB5 /* juce_PNGLoader.cpp */, - ); - name = image_formats; - sourceTree = ""; - }; - F472964B0FFEE5615B72CE3D /* Resources */ = { - isa = PBXGroup; - children = ( - 0D5761BE1D2DEA319B57D740 /* Switch_48x26.png */, - E6F65C031FCBB192F3927D4C /* ButtonUnlabeled_50x30.png */, - 8B19E0BEAD29F2C0D46FA89C /* Knob_34x34.png */, - 4C67D4B9902C1B0CC80E11D8 /* LFO_36_26.png */, - D5E8818F417B8FBF0F9FECBD /* Light_14x14.png */, - CBEE3341DEFF854B1D114C0B /* Meter_140x8.png */, - 66E042C6FFE93F0E19B32F09 /* Scaling_36_26.png */, - C7577AF98915C39EDCEC259A /* Slider_26x26.png */, - 1D72CD485011A4EA3E6B0FD5 /* NotoSans-Regular.ttf */, - 5A366F36F3B4E50587A30351 /* NotoSans-Bold.ttf */, - 15B75D829C40872D542A38B8 /* builtin_pgm.zip */, - 0E3FA3D7B11FC7D19CC634BE /* about.png */, - 624B39364165E2F23A3D4540 /* GlobalEditor_864x144.png */, - 9FB43E65C5F68B31FB16D0F5 /* OperatorEditor_287x218.png */, - ); - name = Resources; - sourceTree = ""; - }; - F70E2701A89603A4BE984FF6 /* widgets */ = { - isa = PBXGroup; - children = ( - 0A55490419140DC6D2FBB1DA /* juce_ComboBox.cpp */, - BA4FF1F73CF544CF671433D0 /* juce_ComboBox.h */, - 949B3D44B0EFFFE18578E44E /* juce_ImageComponent.cpp */, - 8B86ECF3351C9D029821C621 /* juce_ImageComponent.h */, - 969250C57EF34E88AF1062BE /* juce_Label.cpp */, - FA98BC06299525310A31107B /* juce_Label.h */, - A2D3A958C5D96910BEDE9283 /* juce_ListBox.cpp */, - 64C579AFCDCEED8CAFEF9830 /* juce_ListBox.h */, - DA4359972E065615EEF392EB /* juce_ProgressBar.cpp */, - AA84602D83F8E270AC0281AE /* juce_ProgressBar.h */, - 2FB4EFE77128A64F13B97946 /* juce_Slider.cpp */, - 14AF9F1F28D50F8E47606660 /* juce_Slider.h */, - 02139A14E2732DE36631414F /* juce_TableHeaderComponent.cpp */, - DB9F89D1872247982F4D0913 /* juce_TableHeaderComponent.h */, - 420843F2827F7FB7A31A4C76 /* juce_TableListBox.cpp */, - BAE2BAF1F5DC75A6E72FC56A /* juce_TableListBox.h */, - 7BE1A83B817F581F39B1F983 /* juce_TextEditor.cpp */, - 54A76CABA9E198F906FB01FC /* juce_TextEditor.h */, - 431B6C9349785FFC83D695F5 /* juce_Toolbar.cpp */, - EF0D818197F7203D3DEF156E /* juce_Toolbar.h */, - 51FA060C8445108FA58DF13D /* juce_ToolbarItemComponent.cpp */, - 20D4AE86B061E4D7F2F1F1BF /* juce_ToolbarItemComponent.h */, - 4E6FA435926EF660B86E1BFA /* juce_ToolbarItemFactory.h */, - ECD18CF97A794402B04570DB /* juce_ToolbarItemPalette.cpp */, - 742502F34E52826111A41605 /* juce_ToolbarItemPalette.h */, - 875B62ECA8BBCC7085FA5F9C /* juce_TreeView.cpp */, - A2DABCCF72397C2C7C69F441 /* juce_TreeView.h */, - ); - name = widgets; - sourceTree = ""; - }; - F71D9B3CC8688C2E11360EA4 /* network */ = { - isa = PBXGroup; - children = ( - 06C4DD7797E7526DB1B47AE5 /* juce_IPAddress.cpp */, - 3444F7C54161FEB1F844619E /* juce_IPAddress.h */, - 1F51658DEF590741920719FF /* juce_MACAddress.cpp */, - E5ABDC305FF03E23A34302F1 /* juce_MACAddress.h */, - B4CCE3F32C6854405890C6BC /* juce_NamedPipe.cpp */, - 89CF359102665330C30E1F9A /* juce_NamedPipe.h */, - B8007B51F9FA8B2F52EF4CCD /* juce_Socket.cpp */, - 8DC0C64EE71D0AFDD76FEAD7 /* juce_Socket.h */, - CB38F1D4BB78766DBD50FEB9 /* juce_URL.cpp */, - 7A854175B4E6D35ABB7D4E45 /* juce_URL.h */, - ); - name = network; - sourceTree = ""; - }; - FA1B75BBFC7775827EA55903 /* gui */ = { - isa = PBXGroup; - children = ( - CCBC46262A82145F2206872E /* juce_AudioDeviceSelectorComponent.cpp */, - AC6693856E8A4626E5571CBC /* juce_AudioDeviceSelectorComponent.h */, - A03CA8621EA02C18B4117EC1 /* juce_AudioThumbnail.cpp */, - B4821C5DCA629694CE0A29FB /* juce_AudioThumbnail.h */, - BF536BFBEDDD9802B9516022 /* juce_AudioThumbnailBase.h */, - 3FEF83E9DA03570247528BE6 /* juce_AudioThumbnailCache.cpp */, - 6F09FAB37276B4DA24BEBD41 /* juce_AudioThumbnailCache.h */, - 2480150B544761DFA3DFF509 /* juce_MidiKeyboardComponent.cpp */, - 490146B41BBBC0E550BD73F2 /* juce_MidiKeyboardComponent.h */, - ); - name = gui; - sourceTree = ""; - }; - FA8A91020A6EDA9A5DDF8D4A /* VST3 */ = { - isa = PBXGroup; - children = ( - D0178A36F6E46F92111E4883 /* juce_VST3_Wrapper.cpp */, - 01EF232D8B427B8CE38127C2 /* juce_VST3_Wrapper.mm */, - ); - name = VST3; - sourceTree = ""; - }; - FE9550EAB790E5DA3F2D29FF /* components */ = { - isa = PBXGroup; - children = ( - AD6C159D76B2BFAF579383F8 /* juce_CachedComponentImage.h */, - 2DC82CD2D824B8A3A7059E73 /* juce_Component.cpp */, - 041F12CAFA1CD7215AEC5098 /* juce_Component.h */, - 1D798858682A27299589F4E5 /* juce_ComponentListener.cpp */, - 36037C1183C5836D2EF64887 /* juce_ComponentListener.h */, - 786A98F29FAA91898BB705F4 /* juce_Desktop.cpp */, - 0B338B58E9C37E83F0FD865D /* juce_Desktop.h */, - 3EBA7E3E2CFD54B3C786098E /* juce_ModalComponentManager.cpp */, - AE4DF6AF917F1A8DDF5376E3 /* juce_ModalComponentManager.h */, - ); - name = components; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - CC364D6AF074DD367C3061CC /* Dexed */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5900493D34C3F35BEFC2B3D6 /* Build configuration list for PBXNativeTarget "Dexed" */; - buildPhases = ( - F33A1146DD22EEF53DEB0728 /* Resources */, - D7ECE35BCBD5C64A95ACCFC6 /* Rez */, - 9DB7317ADCFFCEAB747A09AF /* Sources */, - 06D721A024B3596A28AB8EC1 /* Frameworks */, - 3272AB811807EDC647D52F52 /* Post-build script */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Dexed; - productInstallPath = "$(HOME)/Library/Audio/Plug-Ins/Components/"; - productName = Dexed; - productReference = FF6607118B29435E76806DFA /* Dexed.component */; - productType = "com.apple.product-type.bundle"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0DA61024CABBA334F84603C0 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0440; - }; - buildConfigurationList = 79EC971C74D382E87C0F443D /* Build configuration list for PBXProject "Dexed" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 8FF698E2E4B3B82B8C64B444 /* Source */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - CC364D6AF074DD367C3061CC /* Dexed */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - F33A1146DD22EEF53DEB0728 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 813B2285513D65DDA30AA6E3 /* RecentFilesMenuTemplate.nib in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXRezBuildPhase section */ - D7ECE35BCBD5C64A95ACCFC6 /* Rez */ = { - isa = PBXRezBuildPhase; - buildActionMask = 2147483647; - files = ( - 9D042F9D005532F763A72C26 /* juce_AU_Resources.r in Rez */, - E293B9570C97E4BAD129D4A2 /* juce_RTAS_MacResources.r in Rez */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXRezBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3272AB811807EDC647D52F52 /* Post-build script */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - name = "Post-build script"; - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\n# This script takes the build product and copies it to the AU, VST, and RTAS folders, depending on \n# which plugin types you've built\n\noriginal=$CONFIGURATION_BUILD_DIR/$FULL_PRODUCT_NAME\n\n# this looks inside the binary to detect which platforms are needed.. \ncopyAU=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'AudioUnit' | wc -l`\ncopyVST=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'VSTPlugin' | wc -l`\ncopyRTAS=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'CProcess' | wc -l`\ncopyAAX=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'ACFStartup' | wc -l`\n\nif [ $copyAU -gt 0 ]; then\n echo \"Copying to AudioUnit folder...\"\n AU=~/Library/Audio/Plug-Ins/Components/$PRODUCT_NAME.component\n if [ -d \"$AU\" ]; then \n rm -r \"$AU\"\n fi\n\n cp -r \"$original\" \"$AU\"\n sed -i \"\" -e 's/TDMwPTul/BNDLPTul/g' \"$AU/Contents/PkgInfo\"\n sed -i \"\" -e 's/TDMw/BNDL/g' \"$AU/Contents/$INFOPLIST_FILE\"\n\n # Fix info.plist for AUs built with Xcode 3\n if [ -f \"$DEVELOPER_DIR/Library/Developer/CoreAudio/AudioUnits/AUPublic/AUBase/AUPlugInDispatch.cpp\" ]; then\n echo\n else\n echo \"Removing AudioComponents entry from Info.plist because this is not a new-format AU\"\n /usr/libexec/PlistBuddy -c \"Delete AudioComponents\" \"$AU/Contents/Info.plist\"\n fi\nfi\n\nif [ $copyVST -gt 0 ]; then\n echo \"Copying to VST folder...\"\n VST=~/Library/Audio/Plug-Ins/VST/$PRODUCT_NAME.vst\n if [ -d \"$VST\" ]; then \n rm -r \"$VST\"\n fi\n\n cp -r \"$original\" \"$VST\"\n sed -i \"\" -e 's/TDMwPTul/BNDLPTul/g' \"$VST/Contents/PkgInfo\"\n sed -i \"\" -e 's/TDMw/BNDL/g' \"$VST/Contents/$INFOPLIST_FILE\"\nfi\n\nif [ $copyRTAS -gt 0 ]; then\n echo \"Copying to RTAS folder...\"\n RTAS=/Library/Application\\ Support/Digidesign/Plug-Ins/$PRODUCT_NAME.dpm\n if [ -d \"$RTAS\" ]; then\n rm -r \"$RTAS\"\n fi\n\n cp -r \"$original\" \"$RTAS\"\nfi\n\nif [ $copyAAX -gt 0 ]; then\n echo \"Copying to AAX folder...\"\n\n if [ -d \"/Applications/ProTools_3PDev/Plug-Ins\" ]; then\n AAX1=\"/Applications/ProTools_3PDev/Plug-Ins/$PRODUCT_NAME.aaxplugin\"\n\n if [ -d \"$AAX1\" ]; then\n rm -r \"$AAX1\"\n fi\n\n cp -r \"$original\" \"$AAX1\"\n fi\n\n if [ -d \"/Library/Application Support/Avid/Audio/Plug-Ins\" ]; then\n AAX2=\"/Library/Application Support/Avid/Audio/Plug-Ins/$PRODUCT_NAME.aaxplugin\"\n\n if [ -d \"$AAX2\" ]; then\n rm -r \"$AAX2\"\n fi\n\n cp -r \"$original\" \"$AAX2\"\n fi\nfi\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 9DB7317ADCFFCEAB747A09AF /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - B18C192606DF6079E7B9AEB9 /* PluginFx.cpp in Sources */, - 697C52FD23363CB2EB9075C6 /* EngineMkI.cpp in Sources */, - 4B27ACC5993C8C74FFCDD3BB /* EngineOpl.cpp in Sources */, - 478699B4EF80A1A1C0D34C10 /* PluginEditor.cpp in Sources */, - 6252C45CDFF75E05CCDBF737 /* CartManager.cpp in Sources */, - 69A60891A52C61989A205791 /* ProgramListBox.cpp in Sources */, - CD1CF0C6B4AB9F4C8175FE08 /* ParamDialog.cpp in Sources */, - 8F3B0996452972F266C749E0 /* AlgoDisplay.cpp in Sources */, - D5A4D43A16EA4C71D53E96CD /* DXLookNFeel.cpp in Sources */, - 8121E10419E2D99645EA254E /* DXComponents.cpp in Sources */, - 082D6FF34EFF195C3A3B0CFB /* OperatorEditor.cpp in Sources */, - C510246D7D5E162C9DE63DDE /* GlobalEditor.cpp in Sources */, - 3AB728E101D7B85DD39C5CC8 /* freqlut.cc in Sources */, - FAC9C3E771D11FDA4DFAF17E /* lfo.cc in Sources */, - 47C317B0F77A29ECA0400B2B /* dx7note.cc in Sources */, - 9EC12165834B1341938E951D /* env.cc in Sources */, - F9A9CC03BA0B3030E92675AD /* exp2.cc in Sources */, - 7B82F1D5F8DED01AA8988D33 /* fm_core.cc in Sources */, - 434647C21C803FA8A4D44A70 /* fm_op_kernel.cc in Sources */, - 95105DC8536836A06FD5C7BB /* pitchenv.cc in Sources */, - 0D3132A8B412AE9E63024927 /* sin.cc in Sources */, - 1CBFE444B43C89E749602B7F /* PluginProcessor.cpp in Sources */, - 623AFA9E78826CA0136251DF /* PluginParam.cpp in Sources */, - 8BE2A084394DA3E45DDB5646 /* PluginData.cpp in Sources */, - EC23F9F2EE10A2DE3CB6D406 /* SysexComm.cpp in Sources */, - 2360F3C87933B5A51B0D4839 /* AUBase.cpp in Sources */, - 26E1D92384FB66ED8FCF5101 /* AUBuffer.cpp in Sources */, - 02B7485A3DD3F44C6058AB0E /* AUCarbonViewBase.cpp in Sources */, - 09E5F88C9C879073B1B103F1 /* AUCarbonViewControl.cpp in Sources */, - EE173D0BBBF66A8977FE3A7E /* AUCarbonViewDispatch.cpp in Sources */, - EB464CA0288DD69ABBAE73B3 /* AUDispatch.cpp in Sources */, - 3FC0533D8E67D63666A51C64 /* AUEffectBase.cpp in Sources */, - 0E0B0D39FCB31A57F5298C7A /* AUInputElement.cpp in Sources */, - AE7F0435D9C8D94FFDA16DCA /* AUMIDIBase.cpp in Sources */, - 3D8568887BBA0D81340FF64D /* AUMIDIEffectBase.cpp in Sources */, - 95D4EF9899B0D0D3FC729312 /* AUOutputBase.cpp in Sources */, - C19B69B5974FA50D116A4F52 /* AUOutputElement.cpp in Sources */, - ED19C7C3EF2026BC9386CAA3 /* AUScopeElement.cpp in Sources */, - B96C21AF3AD25C7950EA6CE5 /* CAAudioChannelLayout.cpp in Sources */, - DFA8CE3B7D7FE269254C9BDD /* CAAUParameter.cpp in Sources */, - DAC2F8A317486D36C0E0F81F /* CAMutex.cpp in Sources */, - 556863C97636A308001CFD21 /* CarbonEventHandler.cpp in Sources */, - 6970EC0E1FEDCF3793098929 /* CAStreamBasicDescription.cpp in Sources */, - 62798B841D9D5E0B71064A73 /* CAVectorUnit.cpp in Sources */, - CCC498943EDC85558AF6D8B8 /* ComponentBase.cpp in Sources */, - F1106DF1AB7F08D4FC6B6BBB /* MusicDeviceBase.cpp in Sources */, - 1C87DA0B69D67481FC6CF4FD /* BinaryData.cpp in Sources */, - E3FA856CA4DB2009BB0F13E7 /* juce_AAX_Wrapper.cpp in Sources */, - 7E6DF76EEA834AC1E96470CE /* juce_AAX_Wrapper.mm in Sources */, - 93279A1D631E5F4103EAB17E /* juce_AU_Wrapper.mm in Sources */, - 87B95D41180EF626460B2EA3 /* juce_audio_basics.mm in Sources */, - ED2B6C710BC0474617D147B7 /* juce_audio_devices.mm in Sources */, - A451AE788A4BD5AA72174D4C /* juce_audio_formats.mm in Sources */, - 927401C89B9B4F84AC1FE42F /* juce_audio_processors.mm in Sources */, - FFA0B77789034ACCB5203F40 /* juce_audio_utils.mm in Sources */, - 823ECA6DD062A4D0CC056CF0 /* juce_core.mm in Sources */, - 52770E3D32989EC50834582A /* juce_data_structures.mm in Sources */, - 6CE74A36A215C0D39041710F /* juce_events.mm in Sources */, - E52CB89B4C49057C5A54CFFE /* juce_graphics.mm in Sources */, - 069530C6CF2796C568DD3E90 /* juce_gui_basics.mm in Sources */, - 5B3A6A14A3951CF8E37608FF /* juce_gui_extra.mm in Sources */, - C2090920CAE913A6C56E0ACE /* juce_PluginUtilities.cpp in Sources */, - 5F4FB65ABC71FAAD6EDD822E /* juce_RTAS_DigiCode1.cpp in Sources */, - 1E2E719F9E93AD97BC37565F /* juce_RTAS_DigiCode2.cpp in Sources */, - DDD1E74DE1AC7E6493AF04CA /* juce_RTAS_DigiCode3.cpp in Sources */, - A6E2908774D7F669F21B1874 /* juce_RTAS_MacUtilities.mm in Sources */, - B82FDEB3E53C9455BC6A5DAE /* juce_RTAS_Wrapper.cpp in Sources */, - 00C044DBB8BA1AF35CBC42E6 /* juce_VST_Wrapper.cpp in Sources */, - E8D9A2B640A87FE92D2DA887 /* juce_VST_Wrapper.mm in Sources */, - 52C0C94470D90310AF2F8433 /* juce_VST3_Wrapper.cpp in Sources */, - 13F8BF7C26D50908163425CF /* juce_VST3_Wrapper.mm in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 164731727DFE228515FE9A35 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; - 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; - MACOSX_DEPLOYMENT_TARGET = 10.6; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = Dexed; - SDKROOT = macosx10.7; - WARNING_CFLAGS = "-Wreorder"; - ZERO_LINK = NO; - }; - name = Debug; - }; - 1F51A4544E7E3E72CAFCC59B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; - 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; - MACOSX_DEPLOYMENT_TARGET = 10.6; - PRODUCT_NAME = Dexed; - SDKROOT = macosx10.7; - WARNING_CFLAGS = "-Wreorder"; - ZERO_LINK = NO; - }; - name = Release; - }; - 4AA859F8A477DEBA3D568766 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { + 6443699C06267ECC22CF9D12 = {isa = PBXBuildFile; fileRef = E32283AE8CC5A022E1A6B30B; }; + 60686C2C30A9F2777CEF01BD = {isa = PBXBuildFile; fileRef = 0A56796E1B84D05D8DD1100D; }; + 77C3EA8D0A12986429BA466D = {isa = PBXBuildFile; fileRef = 838A5E852BBD79A98CD9FDDD; }; + E8BEA8ABF5E288C5D5FCD620 = {isa = PBXBuildFile; fileRef = 817CC81F50861DAEEFB2043A; }; + F329522961F1313091764113 = {isa = PBXBuildFile; fileRef = 2FDF76165C655B2E77BE4CFD; }; + B0A4786A252B14B604101175 = {isa = PBXBuildFile; fileRef = 3A01DC4DEBE65C313C7C8A44; }; + 82253A3BBFF29FC56A08C972 = {isa = PBXBuildFile; fileRef = 919DF1054C09D19EDA044BE8; }; + FA2AF2015CFD98299593EA30 = {isa = PBXBuildFile; fileRef = A81F4DC234E8D93BF9803529; }; + 7116DC8487DC8321F36CD3D8 = {isa = PBXBuildFile; fileRef = 452C1184BD776249B33151E5; }; + 68878920F603FF1473994736 = {isa = PBXBuildFile; fileRef = FC856709502EE15E8D3F448B; }; + A7D45B047CA84D7EF7018CDC = {isa = PBXBuildFile; fileRef = 2F55D83145737DE69999DB92; }; + 7E444608AFB10ED54DB5C9AB = {isa = PBXBuildFile; fileRef = 5E966C95FACF7B8D5A907FE3; }; + 813B2285513D65DDA30AA6E3 = {isa = PBXBuildFile; fileRef = 6F9852573AA442CFBAD9695F; }; + B18C192606DF6079E7B9AEB9 = {isa = PBXBuildFile; fileRef = 8BADEB7BF1A65E83A7A1736D; }; + 697C52FD23363CB2EB9075C6 = {isa = PBXBuildFile; fileRef = 8BEBEDCAD409EE3A5D383B6D; }; + 4B27ACC5993C8C74FFCDD3BB = {isa = PBXBuildFile; fileRef = 61F792AFE04C15F413A4F766; }; + 478699B4EF80A1A1C0D34C10 = {isa = PBXBuildFile; fileRef = 018D0FB9E97B68D2EB3E3F72; }; + 6252C45CDFF75E05CCDBF737 = {isa = PBXBuildFile; fileRef = 6B3889626BDBB814F2387085; }; + 69A60891A52C61989A205791 = {isa = PBXBuildFile; fileRef = BF7A1720DADC7983F61E895C; }; + CD1CF0C6B4AB9F4C8175FE08 = {isa = PBXBuildFile; fileRef = F221CF21582EE0B8FE774583; }; + 8F3B0996452972F266C749E0 = {isa = PBXBuildFile; fileRef = 03813BF0D93D100F6F0393C9; }; + D5A4D43A16EA4C71D53E96CD = {isa = PBXBuildFile; fileRef = A02775EA788AD4BF7DD1B1A1; }; + 8121E10419E2D99645EA254E = {isa = PBXBuildFile; fileRef = D984CE634945077E682B48F3; }; + 082D6FF34EFF195C3A3B0CFB = {isa = PBXBuildFile; fileRef = 838E63F5800CA577B92EF6AE; }; + C510246D7D5E162C9DE63DDE = {isa = PBXBuildFile; fileRef = 19CEF599CB23958AC63D427E; }; + 3AB728E101D7B85DD39C5CC8 = {isa = PBXBuildFile; fileRef = 3715DFDD7A1B12083F051F5A; }; + FAC9C3E771D11FDA4DFAF17E = {isa = PBXBuildFile; fileRef = 2D26E2304C0F6FC633936014; }; + 47C317B0F77A29ECA0400B2B = {isa = PBXBuildFile; fileRef = AE09B4C2A4BDE8FDA01A8A13; }; + 9EC12165834B1341938E951D = {isa = PBXBuildFile; fileRef = 00FDFD1ABE59B4CEF74BF5A3; }; + F9A9CC03BA0B3030E92675AD = {isa = PBXBuildFile; fileRef = F63CE53483AF125DCFB024F1; }; + 7B82F1D5F8DED01AA8988D33 = {isa = PBXBuildFile; fileRef = C01EE75D859C1F942DA3AE61; }; + 434647C21C803FA8A4D44A70 = {isa = PBXBuildFile; fileRef = 78CA76788217B98287D9E007; }; + 95105DC8536836A06FD5C7BB = {isa = PBXBuildFile; fileRef = 51E5757E2D48E638F9A4CB61; }; + 0D3132A8B412AE9E63024927 = {isa = PBXBuildFile; fileRef = B0230FCCA099E6430411DFC9; }; + 1CBFE444B43C89E749602B7F = {isa = PBXBuildFile; fileRef = 45ADFD8885BE76C7F7D999AC; }; + 623AFA9E78826CA0136251DF = {isa = PBXBuildFile; fileRef = 59D15F780D468B587F9C7E78; }; + 8BE2A084394DA3E45DDB5646 = {isa = PBXBuildFile; fileRef = 7936BBAA586387B2FAFB958B; }; + EC23F9F2EE10A2DE3CB6D406 = {isa = PBXBuildFile; fileRef = 65BE679590BFE2466E16EA67; }; + 2360F3C87933B5A51B0D4839 = {isa = PBXBuildFile; fileRef = 0598D37F24E489C12F43EF93; settings = {COMPILER_FLAGS = "-w"; }; }; + 26E1D92384FB66ED8FCF5101 = {isa = PBXBuildFile; fileRef = C4DE747B720C310D6BC65936; settings = {COMPILER_FLAGS = "-w"; }; }; + 02B7485A3DD3F44C6058AB0E = {isa = PBXBuildFile; fileRef = 8ED1068B85DCEFEFDD3C4F82; settings = {COMPILER_FLAGS = "-w"; }; }; + 09E5F88C9C879073B1B103F1 = {isa = PBXBuildFile; fileRef = D8F138F48E933ECCF2DB2321; settings = {COMPILER_FLAGS = "-w"; }; }; + EE173D0BBBF66A8977FE3A7E = {isa = PBXBuildFile; fileRef = 173994FFD45CE7CB6D2CCAD7; settings = {COMPILER_FLAGS = "-w"; }; }; + EB464CA0288DD69ABBAE73B3 = {isa = PBXBuildFile; fileRef = 02802D92B7CF0D835254B6C1; settings = {COMPILER_FLAGS = "-w"; }; }; + 3FC0533D8E67D63666A51C64 = {isa = PBXBuildFile; fileRef = 6B8B14C1AA3491F103E6A5F7; settings = {COMPILER_FLAGS = "-w"; }; }; + 0E0B0D39FCB31A57F5298C7A = {isa = PBXBuildFile; fileRef = 6A462A15DB909F68F4A9BECC; settings = {COMPILER_FLAGS = "-w"; }; }; + AE7F0435D9C8D94FFDA16DCA = {isa = PBXBuildFile; fileRef = 6E1E415B080EA491A7D58D3A; settings = {COMPILER_FLAGS = "-w"; }; }; + 3D8568887BBA0D81340FF64D = {isa = PBXBuildFile; fileRef = 3E301CD94F9029D7E3898EB2; settings = {COMPILER_FLAGS = "-w"; }; }; + 95D4EF9899B0D0D3FC729312 = {isa = PBXBuildFile; fileRef = 16D7D354B7CBC971E8B0CFA5; settings = {COMPILER_FLAGS = "-w"; }; }; + C19B69B5974FA50D116A4F52 = {isa = PBXBuildFile; fileRef = 81A949AE03BA033D5D762E9F; settings = {COMPILER_FLAGS = "-w"; }; }; + ED19C7C3EF2026BC9386CAA3 = {isa = PBXBuildFile; fileRef = BAADD431AF7666E435C6C4B3; settings = {COMPILER_FLAGS = "-w"; }; }; + B96C21AF3AD25C7950EA6CE5 = {isa = PBXBuildFile; fileRef = F3171B20C2BBF12A5786B1F5; settings = {COMPILER_FLAGS = "-w"; }; }; + DFA8CE3B7D7FE269254C9BDD = {isa = PBXBuildFile; fileRef = 0DB84FE1DF027D2AB0952F18; settings = {COMPILER_FLAGS = "-w"; }; }; + DAC2F8A317486D36C0E0F81F = {isa = PBXBuildFile; fileRef = A31C49ABA24290126250F574; settings = {COMPILER_FLAGS = "-w"; }; }; + 556863C97636A308001CFD21 = {isa = PBXBuildFile; fileRef = 3A44529EBD28E325DAA12D80; settings = {COMPILER_FLAGS = "-w"; }; }; + 6970EC0E1FEDCF3793098929 = {isa = PBXBuildFile; fileRef = 7B2E31BD7292002DEBCC366B; settings = {COMPILER_FLAGS = "-w"; }; }; + 62798B841D9D5E0B71064A73 = {isa = PBXBuildFile; fileRef = 2CA60524355CF872ADB42EA4; settings = {COMPILER_FLAGS = "-w"; }; }; + CCC498943EDC85558AF6D8B8 = {isa = PBXBuildFile; fileRef = 561A9793AA73B7FDDED14476; settings = {COMPILER_FLAGS = "-w"; }; }; + F1106DF1AB7F08D4FC6B6BBB = {isa = PBXBuildFile; fileRef = 68CCE716313990E1412107A8; settings = {COMPILER_FLAGS = "-w"; }; }; + 1C87DA0B69D67481FC6CF4FD = {isa = PBXBuildFile; fileRef = 54363D0B39B88D43447C0123; }; + E3FA856CA4DB2009BB0F13E7 = {isa = PBXBuildFile; fileRef = 505852570B48EB3F18076B03; }; + 7E6DF76EEA834AC1E96470CE = {isa = PBXBuildFile; fileRef = 3254CAE4C282C4432214B016; }; + 9D042F9D005532F763A72C26 = {isa = PBXBuildFile; fileRef = 64CC83E4D891EAEC65EE41C4; }; + 93279A1D631E5F4103EAB17E = {isa = PBXBuildFile; fileRef = 502D49C82606515A80907EB3; }; + 87B95D41180EF626460B2EA3 = {isa = PBXBuildFile; fileRef = 3DF47857774F10344F12BE65; }; + ED2B6C710BC0474617D147B7 = {isa = PBXBuildFile; fileRef = 31AEFAC2A9E8C7C96ECB4B96; }; + A451AE788A4BD5AA72174D4C = {isa = PBXBuildFile; fileRef = 32FC163D919C52263303EF7E; }; + 927401C89B9B4F84AC1FE42F = {isa = PBXBuildFile; fileRef = AA2F01B149F981C2997D583F; }; + FFA0B77789034ACCB5203F40 = {isa = PBXBuildFile; fileRef = 6273BD6D40C9A904273C592F; }; + 823ECA6DD062A4D0CC056CF0 = {isa = PBXBuildFile; fileRef = 99078823EE2D77389696F0E5; }; + 52770E3D32989EC50834582A = {isa = PBXBuildFile; fileRef = 48BDF7DFA849127655B86873; }; + 6CE74A36A215C0D39041710F = {isa = PBXBuildFile; fileRef = AB6186E32E92664DEFA0C0A1; }; + E52CB89B4C49057C5A54CFFE = {isa = PBXBuildFile; fileRef = 9E3820CD63B47B5385AF2DB6; }; + 069530C6CF2796C568DD3E90 = {isa = PBXBuildFile; fileRef = 19B56FF22ED0090A8D7A3E04; }; + 5B3A6A14A3951CF8E37608FF = {isa = PBXBuildFile; fileRef = 6DC26B61BA1638AFAF142A6C; }; + C2090920CAE913A6C56E0ACE = {isa = PBXBuildFile; fileRef = B63E7FBEF314AA2B6A8083F4; }; + 5F4FB65ABC71FAAD6EDD822E = {isa = PBXBuildFile; fileRef = 55E39FAA63BA8B9D40F40712; settings = {COMPILER_FLAGS = "-w"; }; }; + 1E2E719F9E93AD97BC37565F = {isa = PBXBuildFile; fileRef = D8038990994C30BDD631733E; settings = {COMPILER_FLAGS = "-w"; }; }; + DDD1E74DE1AC7E6493AF04CA = {isa = PBXBuildFile; fileRef = 4574217C2F5219DEDDDC9656; settings = {COMPILER_FLAGS = "-w"; }; }; + A6E2908774D7F669F21B1874 = {isa = PBXBuildFile; fileRef = C7C6039A52C3EE370CA9E73A; }; + B82FDEB3E53C9455BC6A5DAE = {isa = PBXBuildFile; fileRef = EAA5D8078BCC042BDF94C77A; settings = {COMPILER_FLAGS = "-w"; }; }; + 00C044DBB8BA1AF35CBC42E6 = {isa = PBXBuildFile; fileRef = D6C6FCBA5ECA257959BFE674; }; + E8D9A2B640A87FE92D2DA887 = {isa = PBXBuildFile; fileRef = F6F950B6ABB40B62AE4C0B78; }; + 52C0C94470D90310AF2F8433 = {isa = PBXBuildFile; fileRef = D0178A36F6E46F92111E4883; }; + 13F8BF7C26D50908163425CF = {isa = PBXBuildFile; fileRef = 01EF232D8B427B8CE38127C2; }; + 001A2BCC899370ADC99A8F3A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileChooser.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.h"; sourceTree = "SOURCE_ROOT"; }; + 006FC3A3740D97EE2F4A78B3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MessageManager.cpp"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + 00FDFD1ABE59B4CEF74BF5A3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = env.cc; path = ../../Source/msfa/env.cc; sourceTree = "SOURCE_ROOT"; }; + 015FE0A32C2B3FDA879FAB57 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DragAndDropContainer.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h"; sourceTree = "SOURCE_ROOT"; }; + 018D0FB9E97B68D2EB3E3F72 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PluginEditor.cpp; path = ../../Source/PluginEditor.cpp; sourceTree = "SOURCE_ROOT"; }; + 01EF232D8B427B8CE38127C2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_VST3_Wrapper.mm"; path = "../../JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.mm"; sourceTree = "SOURCE_ROOT"; }; + 02139A14E2732DE36631414F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TableHeaderComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0236A082C107280C1505021A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageConvolutionKernel.h"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.h"; sourceTree = "SOURCE_ROOT"; }; + 02802D92B7CF0D835254B6C1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUDispatch.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.cpp; sourceTree = "DEVELOPER_DIR"; }; + 02E962E65624D43B0906B0C6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PerformanceCounter.cpp"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0337F4D67CD2D5C29939E940 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAMutex.h; path = Extras/CoreAudio/PublicUtility/CAMutex.h; sourceTree = "DEVELOPER_DIR"; }; + 0353CE3273A1063693BC5D55 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Files.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_Files.cpp"; sourceTree = "SOURCE_ROOT"; }; + 037F8EB68705A98C29AEE6B0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SystemStats.cpp"; path = "../../JuceLibraryCode/modules/juce_core/system/juce_SystemStats.cpp"; sourceTree = "SOURCE_ROOT"; }; + 03813BF0D93D100F6F0393C9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AlgoDisplay.cpp; path = ../../Source/AlgoDisplay.cpp; sourceTree = "SOURCE_ROOT"; }; + 03BC5E395E7CFFE130B7E5DE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeTime.h"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.h"; sourceTree = "SOURCE_ROOT"; }; + 03C1DC01A1B211F7FCA5043C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AnimatedPosition.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_AnimatedPosition.h"; sourceTree = "SOURCE_ROOT"; }; + 03F0A9F328C7E73E37F70774 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_XmlDocument.cpp"; path = "../../JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.cpp"; sourceTree = "SOURCE_ROOT"; }; + 040A33439B5E80CE3717319E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DocumentWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DocumentWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + 041EA7D542B0EBF7213B9BA2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationCommandID.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h"; sourceTree = "SOURCE_ROOT"; }; + 041F12CAFA1CD7215AEC5098 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Component.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h"; sourceTree = "SOURCE_ROOT"; }; + 04E04837EB4F3E03908835C9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_win32_HiddenMessageWindow.h"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_win32_HiddenMessageWindow.h"; sourceTree = "SOURCE_ROOT"; }; + 0598D37F24E489C12F43EF93 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUBase.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.cpp; sourceTree = "DEVELOPER_DIR"; }; + 05F4DA9558D39B50DA5DEF79 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SortedSet.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_SortedSet.h"; sourceTree = "SOURCE_ROOT"; }; + 06387FD4ED709086E8E0152E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_XmlDocument.h"; path = "../../JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.h"; sourceTree = "SOURCE_ROOT"; }; + 06625FB929EB46E8D09E77F8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationCommandInfo.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h"; sourceTree = "SOURCE_ROOT"; }; + 06A207E085A240F774C4140D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_mac_CoreGraphicsHelpers.h"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h"; sourceTree = "SOURCE_ROOT"; }; + 06C4DD7797E7526DB1B47AE5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_IPAddress.cpp"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_IPAddress.cpp"; sourceTree = "SOURCE_ROOT"; }; + 07037505B34930CDA76B04A5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StretchableObjectResizer.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0707C87B401DC983E3FF4263 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MathsFunctions.h"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_MathsFunctions.h"; sourceTree = "SOURCE_ROOT"; }; + 07333A7932C6B7538F4DF21F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VST3Headers.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Headers.h"; sourceTree = "SOURCE_ROOT"; }; + 0733471B6DA02299D2C9590A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StringArray.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringArray.cpp"; sourceTree = "SOURCE_ROOT"; }; + 075BB641199B15A84856DE6E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SliderPropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 076C4F22CCC47AFEAC2D0C68 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LuaCodeTokeniser.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h"; sourceTree = "SOURCE_ROOT"; }; + 07CB27E064E2A82C2B1D3832 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AbstractFifo.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.h"; sourceTree = "SOURCE_ROOT"; }; + 0831514ABD7A268115E6FD43 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ProgramListBox.h; path = ../../Source/ProgramListBox.h; sourceTree = "SOURCE_ROOT"; }; + 0A3CCDBDD4238A7F9CB559BD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FilenameComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 0A55490419140DC6D2FBB1DA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComboBox.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0A56796E1B84D05D8DD1100D = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; + 0B2C1056583363B66704DB9C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Array.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_Array.h"; sourceTree = "SOURCE_ROOT"; }; + 0B338B58E9C37E83F0FD865D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Desktop.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.h"; sourceTree = "SOURCE_ROOT"; }; + 0B7725520356AED2C80FC943 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MarkerList.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0BD21CA621B7350EBED18C0A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Dexed.h; path = ../../Source/Dexed.h; sourceTree = "SOURCE_ROOT"; }; + 0C0B6B8DAD62A3F5C926825F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DynamicLibrary.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_DynamicLibrary.h"; sourceTree = "SOURCE_ROOT"; }; + 0CB234755B75E0DBC2FFB58E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableCornerComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0D5761BE1D2DEA319B57D740 = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Switch_48x26.png"; path = "../../Resources/ui/Switch_48x26.png"; sourceTree = "SOURCE_ROOT"; }; + 0DB84FE1DF027D2AB0952F18 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CAAUParameter.cpp; path = Extras/CoreAudio/PublicUtility/CAAUParameter.cpp; sourceTree = "DEVELOPER_DIR"; }; + 0DCC7A5AD5AC5D3637FFAAFB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.h"; sourceTree = "SOURCE_ROOT"; }; + 0DE1759C594D2719742E928A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ElementComparator.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_ElementComparator.h"; sourceTree = "SOURCE_ROOT"; }; + 0E3FA3D7B11FC7D19CC634BE = {isa = PBXFileReference; lastKnownFileType = image.png; name = about.png; path = ../../Resources/about.png; sourceTree = "SOURCE_ROOT"; }; + 0E989C4BC7933A41E9B0019E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyboardFocusTraverser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0EA1F582E4E45EB90F02223A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_CoreGraphicsContext.mm"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm"; sourceTree = "SOURCE_ROOT"; }; + 0EF8098DE092ED5C25105241 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MouseInactivityDetector.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0FB6B4A8DC064694A4A3B271 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MountedVolumeListChangeDetector.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h"; sourceTree = "SOURCE_ROOT"; }; + 0FC4F5F1B7E65CC1C9FA915F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GroupComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 0FC9BC24CE770EF8AFFE871C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AnimatedAppComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 0FDAC75611540A0DE7FE3E22 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SplashScreen.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SplashScreen.cpp"; sourceTree = "SOURCE_ROOT"; }; + 105DA88FCA60BE6C92A7249B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FloatVectorOperations.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h"; sourceTree = "SOURCE_ROOT"; }; + 108462DA6B96E6F49DBD521E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ScrollBar.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.cpp"; sourceTree = "SOURCE_ROOT"; }; + 10E7F81B8369A5A923D5EE9A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUInputFormatConverter.h; path = Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUInputFormatConverter.h; sourceTree = "DEVELOPER_DIR"; }; + 112C97A7D8CEC06ED2E1B1BE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringArray.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringArray.h"; sourceTree = "SOURCE_ROOT"; }; + 113019177161C70BFD9E655E = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_gui_extra/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 11329C73799FA61B7BC76418 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableEdgeComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 11593E224B032FD1CD5AD0A2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Messaging.cpp"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_linux_Messaging.cpp"; sourceTree = "SOURCE_ROOT"; }; + 116D0566C94C0FF5C3B68DF3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TooltipWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TooltipWindow.h"; sourceTree = "SOURCE_ROOT"; }; + 11842D3DF751D5951BD039D4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ThreadLocalValue.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ThreadLocalValue.h"; sourceTree = "SOURCE_ROOT"; }; + 11AEAEFECC79A2800B56DDF9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TimeSliceThread.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.cpp"; sourceTree = "SOURCE_ROOT"; }; + 127F5C75CA1140A229F5C5FD = {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"; }; + 1358A353CB770ABF4DF73417 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_IncludeModuleHeaders.h"; path = "../../JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_IncludeModuleHeaders.h"; sourceTree = "SOURCE_ROOT"; }; + 135C6D9174F6937E278E86FB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentAnimator.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp"; sourceTree = "SOURCE_ROOT"; }; + 13785F78EFA77576147267E3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CodeDocument.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeDocument.h"; sourceTree = "SOURCE_ROOT"; }; + 13BE37C7C7C4904EE42B9CEA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PerformanceCounter.h"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.h"; sourceTree = "SOURCE_ROOT"; }; + 1407F2665A3CA985C142273B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioDataConverters.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp"; sourceTree = "SOURCE_ROOT"; }; + 14AF9F1F28D50F8E47606660 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Slider.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Slider.h"; sourceTree = "SOURCE_ROOT"; }; + 153D4DE95D01307F844AA15B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VST3PluginFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 153DD72C28F1B2C131090DEE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_core.h"; path = "../../JuceLibraryCode/modules/juce_core/juce_core.h"; sourceTree = "SOURCE_ROOT"; }; + 1585F30843449EA6EA078288 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ThreadWithProgressWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + 15B75D829C40872D542A38B8 = {isa = PBXFileReference; lastKnownFileType = file.zip; name = "builtin_pgm.zip"; path = "../../Resources/builtin_pgm.zip"; sourceTree = "SOURCE_ROOT"; }; + 15F31F8C2BAC231631AC3156 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_audio_basics.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.h"; sourceTree = "SOURCE_ROOT"; }; + 1600EDBEE9B363CBAB68CD43 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StringPool.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringPool.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1629C7407F033B97102CEF6B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NormalisableRange.h"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_NormalisableRange.h"; sourceTree = "SOURCE_ROOT"; }; + 1635BBF869518BAA7A88A6A0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileSearchPathListComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 163C2312B370BA53F482B84B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TabbedButtonBar.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h"; sourceTree = "SOURCE_ROOT"; }; + 16D7D354B7CBC971E8B0CFA5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUOutputBase.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.cpp; sourceTree = "DEVELOPER_DIR"; }; + 170F06D00B2197E66300D558 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextPropertyComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 173994FFD45CE7CB6D2CCAD7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUCarbonViewDispatch.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewDispatch.cpp; sourceTree = "DEVELOPER_DIR"; }; + 1754400A2E372510CB25043F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TopLevelWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TopLevelWindow.h"; sourceTree = "SOURCE_ROOT"; }; + 1756BAFDC82F5E69704BEAFE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentMovementWatcher.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp"; sourceTree = "SOURCE_ROOT"; }; + 17A328AD02B5D7DA362E1D5D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ConnectedChildProcess.cpp"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp"; sourceTree = "SOURCE_ROOT"; }; + 17C3024C2A1EE03BC0ED9C96 = {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"; }; + 17ED00953353016B7E7492B0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationCommandInfo.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp"; sourceTree = "SOURCE_ROOT"; }; + 18AD1662D33E576F96C30A6A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TopLevelWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + 18D52C793029AFCC92C77A75 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LiveConstantEditor.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1914E45DEAEBD1592581F1FD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioPluginFormatManager.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h"; sourceTree = "SOURCE_ROOT"; }; + 195B617C1FF754108A97F645 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyPressMappingSet.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h"; sourceTree = "SOURCE_ROOT"; }; + 19B56FF22ED0090A8D7A3E04 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_gui_basics.mm"; path = "../../JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; }; + 19CEF599CB23958AC63D427E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = GlobalEditor.cpp; path = ../../Source/GlobalEditor.cpp; sourceTree = "SOURCE_ROOT"; }; + 1A0415BC113C5E901B668D45 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableShape.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1A468C18B5B893C90F31EF6C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_osx_MessageQueue.h"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_osx_MessageQueue.h"; sourceTree = "SOURCE_ROOT"; }; + 1A5F53E93F3C800344F307DF = {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"; }; + 1AB4868A9AC3151DB805E2ED = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CodeDocument.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1B06A67DF2B4FD2969A9781A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "fm_core.h"; path = "../../Source/msfa/fm_core.h"; sourceTree = "SOURCE_ROOT"; }; + 1B08D87085D8D577F6CBB008 = {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"; }; + 1B9C8840393D305F594C613B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_JPEGLoader.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1BC34A19A42AE647894C4D57 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RectanglePlacement.h"; path = "../../JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.h"; sourceTree = "SOURCE_ROOT"; }; + 1BDDF13246E8EC9483F6826B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BubbleComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1C30357241D1DC9CF46D556B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Image.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_Image.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1C3A85D115878AA5A495199E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CartManager.h; path = ../../Source/CartManager.h; sourceTree = "SOURCE_ROOT"; }; + 1D31136D1C9D959792023095 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeTime.cpp"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1D72CD485011A4EA3E6B0FD5 = {isa = PBXFileReference; lastKnownFileType = file.ttf; name = "NotoSans-Regular.ttf"; path = "../../Resources/ui/NotoSans-Regular.ttf"; sourceTree = "SOURCE_ROOT"; }; + 1D798858682A27299589F4E5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentListener.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1D95A78059DCCC7B58782F07 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioSampleBuffer.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h"; sourceTree = "SOURCE_ROOT"; }; + 1E1A0627C2977D5FCB8440CC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LookAndFeel.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h"; sourceTree = "SOURCE_ROOT"; }; + 1EB6398B6F537A4302092240 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextEditorKeyMapper.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h"; sourceTree = "SOURCE_ROOT"; }; + 1F51658DEF590741920719FF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MACAddress.cpp"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_MACAddress.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1F5C171B3E8790746AD764E6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GZIPCompressorOutputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1F982064915D0D00759C6B17 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GroupComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1FDD2E98D27BD53D39C3AEB0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ConcertinaPanel.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp"; sourceTree = "SOURCE_ROOT"; }; + 1FDE28E257271B411780600C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_EdgeTable.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.h"; sourceTree = "SOURCE_ROOT"; }; + 2010DBBC52928BD3BA2E0704 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_SystemStats.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_linux_SystemStats.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2068B2F409A743F7AA6005B8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Network.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_Network.cpp"; sourceTree = "SOURCE_ROOT"; }; + 20D22F9CE83DD70583C68940 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BufferingAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + 20D4AE86B061E4D7F2F1F1BF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarItemComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 210364718D006CC26958D583 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAVectorUnit.h; path = Extras/CoreAudio/PublicUtility/CAVectorUnit.h; sourceTree = "DEVELOPER_DIR"; }; + 212A0795619AC3D8387EB085 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Logger.cpp"; path = "../../JuceLibraryCode/modules/juce_core/logging/juce_Logger.cpp"; sourceTree = "SOURCE_ROOT"; }; + 214092134C5925973C210C26 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Process.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_Process.h"; sourceTree = "SOURCE_ROOT"; }; + 217D5E7DC9D4006AA1994A96 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_audio_processors/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 21B76774F02A7242990E433C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AbstractFifo.cpp"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.cpp"; sourceTree = "SOURCE_ROOT"; }; + 21BB88DADCF2268F24A63357 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Memory.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_Memory.h"; sourceTree = "SOURCE_ROOT"; }; + 21E609C00045B8F41BA21DFE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorGraph.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h"; sourceTree = "SOURCE_ROOT"; }; + 22520CCBD52F680200524E87 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SubregionStream.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.h"; sourceTree = "SOURCE_ROOT"; }; + 226462AF67A3DAA0A74B5BF0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_audio_processors.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h"; sourceTree = "SOURCE_ROOT"; }; + 227001AE4630FAA6E65DD252 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ShapeButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + 238202B3EA9976135C833C3A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentBuilder.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.h"; sourceTree = "SOURCE_ROOT"; }; + 23E9F8B6075CCB7BA9FE4782 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CharPointer_ASCII.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_CharPointer_ASCII.h"; sourceTree = "SOURCE_ROOT"; }; + 244636A4B3E48A7B6CC8E996 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Line.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Line.h"; sourceTree = "SOURCE_ROOT"; }; + 247E415D0635F05B4067C255 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DirectoryIterator.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2480150B544761DFA3DFF509 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiKeyboardComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2494BCA24C9E3AB3D20372F2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PropertyPanel.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.cpp"; sourceTree = "SOURCE_ROOT"; }; + 24C467D96909731EB0D68B4A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FilePreviewComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 24CFBAD49341D774EFA46056 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_UIViewComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/embedding/juce_UIViewComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 2599ADA2E34E536F438F1B76 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableText.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.h"; sourceTree = "SOURCE_ROOT"; }; + 25F88A5C788D9CF7301569EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileListComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 268719C746B8E5EA06DDCF01 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Misc.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_Misc.cpp"; sourceTree = "SOURCE_ROOT"; }; + 27077B2F6AA5ED05FAF0B5D8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImagePreviewComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 271BCF94F884F0354E1EBCC7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SplashScreen.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SplashScreen.h"; sourceTree = "SOURCE_ROOT"; }; + 2752A284F49F193F36688FAA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MessageListener.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.h"; sourceTree = "SOURCE_ROOT"; }; + 2754940A96851188581A2218 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PluginDirectoryScanner.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp"; sourceTree = "SOURCE_ROOT"; }; + 27F84193A8E46E113C520776 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CustomTypeface.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2860C307AFC727F3591D9FBB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CallOutBox.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_CallOutBox.cpp"; sourceTree = "SOURCE_ROOT"; }; + 288C1D78EC7B90B96377863A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Timer.cpp"; path = "../../JuceLibraryCode/modules/juce_events/timers/juce_Timer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2898384503D98B9CDE677C8F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OutputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.h"; sourceTree = "SOURCE_ROOT"; }; + 29A10DF10817FC573A384056 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FillType.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.cpp"; sourceTree = "SOURCE_ROOT"; }; + 29AE4D440A28441D61C76EF4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KnownPluginList.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp"; sourceTree = "SOURCE_ROOT"; }; + 29C1872028A449607E80B677 = {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"; }; + 29D6A187B80D22EB609C256D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DXLookNFeel.h; path = ../../Source/DXLookNFeel.h; sourceTree = "SOURCE_ROOT"; }; + 29FCF15A6F116C0A823A186D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChangeListener.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeListener.h"; sourceTree = "SOURCE_ROOT"; }; + 2A1C3333AE8043F0588BBBDF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MenuBarComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 2A28E0E1ED91E3E66DD795C0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileLogger.cpp"; path = "../../JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2A61EE6E849869617187D67A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioSampleBuffer.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2B455841042E415B99DEE263 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SpinLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_SpinLock.h"; sourceTree = "SOURCE_ROOT"; }; + 2B905EB5C391A1F8D80EA4EE = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_core/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 2BAC9F6B6869D1E85C51540B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Expression.h"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_Expression.h"; sourceTree = "SOURCE_ROOT"; }; + 2BEBDED2BACDEEEE975583F3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringPool.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringPool.h"; sourceTree = "SOURCE_ROOT"; }; + 2C65FDA74486C92DF5EA5C87 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileFilter.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileFilter.h"; sourceTree = "SOURCE_ROOT"; }; + 2CA19470CA427333F8CAC0A5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImagePreviewComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2CA60524355CF872ADB42EA4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CAVectorUnit.cpp; path = Extras/CoreAudio/PublicUtility/CAVectorUnit.cpp; sourceTree = "DEVELOPER_DIR"; }; + 2CB4C73C121FCDEF65CBAC79 = {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"; }; + 2D26E2304C0F6FC633936014 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = lfo.cc; path = ../../Source/msfa/lfo.cc; sourceTree = "SOURCE_ROOT"; }; + 2D8A5B5929909ADD898D7E00 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_HashMap.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_HashMap.h"; sourceTree = "SOURCE_ROOT"; }; + 2D9932D322EDA14CC872D08B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryOutputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.h"; sourceTree = "SOURCE_ROOT"; }; + 2DC82CD2D824B8A3A7059E73 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Component.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2DF03B864D4F23315F18CC24 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Message.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_Message.h"; sourceTree = "SOURCE_ROOT"; }; + 2DF16794D7C916F177B31322 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativePoint.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.h"; sourceTree = "SOURCE_ROOT"; }; + 2DF4E9322A4790812A9E9273 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PopupMenu.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.h"; sourceTree = "SOURCE_ROOT"; }; + 2EFC0DDB732834CABE62C36E = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Info.plist; sourceTree = "SOURCE_ROOT"; }; + 2F55D83145737DE69999DB92 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + 2FB4EFE77128A64F13B97946 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Slider.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Slider.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2FD26019A4D247FA8F38FE29 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StretchableLayoutResizerBar.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp"; sourceTree = "SOURCE_ROOT"; }; + 2FDF76165C655B2E77BE4CFD = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + 306255E12C87DF0405A5D9EE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationProperties.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h"; sourceTree = "SOURCE_ROOT"; }; + 306D1B033E8EBB80F1E9A24A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GenericAudioProcessorEditor.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h"; sourceTree = "SOURCE_ROOT"; }; + 30956FDD9C1C2D706020AB84 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Network.mm"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_mac_Network.mm"; sourceTree = "SOURCE_ROOT"; }; + 309E703B70110A64AABCC674 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScrollBar.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.h"; sourceTree = "SOURCE_ROOT"; }; + 30B133CA0CDC245A147F4689 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = controllers.h; path = ../../Source/msfa/controllers.h; sourceTree = "SOURCE_ROOT"; }; + 30C8F9B8F2E0D9D572E43E7A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MixerAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + 30DDED034404C826CAF112BB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioUnitPluginFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 310AF93FF6F5B6D606FB6ED3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Point.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Point.h"; sourceTree = "SOURCE_ROOT"; }; + 31AEFAC2A9E8C7C96ECB4B96 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_devices.mm"; path = "../../JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.mm"; sourceTree = "SOURCE_ROOT"; }; + 3223ECE0332620D3B03E301A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileChooserDialogBox.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3254CAE4C282C4432214B016 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_AAX_Wrapper.mm"; path = "../../JuceLibraryCode/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.mm"; sourceTree = "SOURCE_ROOT"; }; + 32707C43C25AF3F79D120BCF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_String.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_String.cpp"; sourceTree = "SOURCE_ROOT"; }; + 32E16F662BD317BE07A69E58 = {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"; }; + 32F091EF95BC75166AAE583A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CodeEditorComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 32FC163D919C52263303EF7E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_formats.mm"; path = "../../JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.mm"; sourceTree = "SOURCE_ROOT"; }; + 3344EDF97EBFA052C631F473 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileChooser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp"; sourceTree = "SOURCE_ROOT"; }; + 33D3EE89C713EBE01C1D268D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SubregionStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + 33DDC7D3B0B83DF72DF167AC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiFile.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.cpp"; sourceTree = "SOURCE_ROOT"; }; + 33E4BED358B8566CCEE47B95 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationBase.cpp"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.cpp"; sourceTree = "SOURCE_ROOT"; }; + 34328035CBCDFA9F18BBA158 = {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"; }; + 3444F7C54161FEB1F844619E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_IPAddress.h"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_IPAddress.h"; sourceTree = "SOURCE_ROOT"; }; + 346937AF08405CC63D570161 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileBasedDocument.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/documents/juce_FileBasedDocument.h"; sourceTree = "SOURCE_ROOT"; }; + 349B7AFA001B78E62A9AFABB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyListener.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.cpp"; sourceTree = "SOURCE_ROOT"; }; + 35892C1EF9CEA7C1F1C9109F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TabbedComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 3597896505C601CE1FFE1158 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationCommandManager.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h"; sourceTree = "SOURCE_ROOT"; }; + 35F80132DF4DC3669B44BD4A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LowLevelGraphicsPostScriptRenderer.h"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h"; sourceTree = "SOURCE_ROOT"; }; + 36037C1183C5836D2EF64887 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentListener.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.h"; sourceTree = "SOURCE_ROOT"; }; + 36E8717C91C6111A701379EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_JSON.h"; path = "../../JuceLibraryCode/modules/juce_core/javascript/juce_JSON.h"; sourceTree = "SOURCE_ROOT"; }; + 3715DFDD7A1B12083F051F5A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = freqlut.cc; path = ../../Source/msfa/freqlut.cc; sourceTree = "SOURCE_ROOT"; }; + 37282A25BDD0EEC4AC5F5A8C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CallOutBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_CallOutBox.h"; sourceTree = "SOURCE_ROOT"; }; + 37A3210291F1C2B3FF42BCDD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioPluginFormatManager.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + 37FEC98938A31E7E6DE9D515 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ResamplingAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + 3927B1AD5EFA95FBE77C0DAB = {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"; }; + 39423D67EFB8E7CEEF5FFAA9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_File.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_File.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3A01DC4DEBE65C313C7C8A44 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; + 3A02DAB152A38D6A9EA9F5F5 = {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"; }; + 3A0F35877A9E2F5D5D6A0434 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_IIRFilterAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + 3A2252FE59FEB529074751B8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_osx_ObjCHelpers.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_osx_ObjCHelpers.h"; sourceTree = "SOURCE_ROOT"; }; + 3A2DE2FA7B6D718AEF872F43 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChannelRemappingAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + 3A44529EBD28E325DAA12D80 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CarbonEventHandler.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/CarbonEventHandler.cpp; sourceTree = "DEVELOPER_DIR"; }; + 3BB7B60AE87F68C10DBEE118 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileSearchPath.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.h"; sourceTree = "SOURCE_ROOT"; }; + 3BE8F91A99E8F48CB9F10C1F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = sin.h; path = ../../Source/msfa/sin.h; sourceTree = "SOURCE_ROOT"; }; + 3C11994F7B26920BEB9DA52D = {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"; }; + 3CAC36F05E2A916F49F6DC42 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_InputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3D52BDFF32D151178ABE21D0 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_gui_basics/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 3DC88C42A001EAAB6B959C6F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiKeyboardState.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3DF47857774F10344F12BE65 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_basics.mm"; path = "../../JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.mm"; sourceTree = "SOURCE_ROOT"; }; + 3E301CD94F9029D7E3898EB2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUMIDIEffectBase.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.cpp; sourceTree = "DEVELOPER_DIR"; }; + 3E312C7BB77E7FF22DF88B96 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RTAS_DigiCode_Header.h"; path = "../../JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode_Header.h"; sourceTree = "SOURCE_ROOT"; }; + 3E5A6D7508BF64D897DABC3A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableText.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3EBA7E3E2CFD54B3C786098E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ModalComponentManager.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3EBF429D4892591960A930F3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ResizableBorderComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 3F0F5E60F2077B05385D6122 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_UndoableAction.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoableAction.h"; sourceTree = "SOURCE_ROOT"; }; + 3F15C4289E956EA0447392BD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_VST3PluginFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 3F948548BB22C3E546E5B0C6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PropertySet.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.h"; sourceTree = "SOURCE_ROOT"; }; + 3FEF83E9DA03570247528BE6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioThumbnailCache.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp"; sourceTree = "SOURCE_ROOT"; }; + 400C107C97F668916CF93FB2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CharacterFunctions.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4051235A3DA7534A8E1286F0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentDragger.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.h"; sourceTree = "SOURCE_ROOT"; }; + 40ACF762CE264F32184C4F7D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_HighResolutionTimer.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 40D83B00A8BBE334104EB694 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RectangleList.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.h"; sourceTree = "SOURCE_ROOT"; }; + 40DCD07DB4B1D9FBB9D47BE5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ConnectedChildProcess.h"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.h"; sourceTree = "SOURCE_ROOT"; }; + 413E92912A2C8CACB46AFD3B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SliderPropertyComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 4166468539A5F6E92A7A153E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReferenceCountedArray.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_ReferenceCountedArray.h"; sourceTree = "SOURCE_ROOT"; }; + 41700CC92AEEF157D3B53BA2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Drawable.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.h"; sourceTree = "SOURCE_ROOT"; }; + 418C5A909668054B5140BDA9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileInputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.h"; sourceTree = "SOURCE_ROOT"; }; + 42037D6AD47F7FEBAF6D4732 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUBuffer.h; path = Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUBuffer.h; sourceTree = "DEVELOPER_DIR"; }; + 420843F2827F7FB7A31A4C76 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TableListBox.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableListBox.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4313B453E6E7735DFFD2609A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationCommandTarget.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp"; sourceTree = "SOURCE_ROOT"; }; + 431B6C9349785FFC83D695F5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Toolbar.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Toolbar.cpp"; sourceTree = "SOURCE_ROOT"; }; + 431D8FA9D233B45295488AA7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileBrowserListener.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h"; sourceTree = "SOURCE_ROOT"; }; + 4342EA166DD20D383F6C9E50 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PlatformDefs.h"; path = "../../JuceLibraryCode/modules/juce_core/system/juce_PlatformDefs.h"; sourceTree = "SOURCE_ROOT"; }; + 4350188F5B6D76DC651BA40E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedPointer.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_ScopedPointer.h"; sourceTree = "SOURCE_ROOT"; }; + 4370F9713D43E71621F2AA2A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TemporaryFile.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.cpp"; sourceTree = "SOURCE_ROOT"; }; + 43E05BD9AADCBDA27B58F5A4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CharPointer_UTF8.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF8.h"; sourceTree = "SOURCE_ROOT"; }; + 4405EC65D1F518B70A5CF7B5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextLayout.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.h"; sourceTree = "SOURCE_ROOT"; }; + 443C4EE14F325512D74C6B0E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextInputTarget.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h"; sourceTree = "SOURCE_ROOT"; }; + 4461D6D26F4163DDA5B77F72 = {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"; }; + 448630170E2B48A00FBBA757 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Threads.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_linux_Threads.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4497D4F58A495EF3F3DB7DD2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReadWriteLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.h"; sourceTree = "SOURCE_ROOT"; }; + 44E53EF6DC2C6F714A7863C0 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_audio_basics/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 452C1184BD776249B33151E5 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiscRecording.framework; path = System/Library/Frameworks/DiscRecording.framework; sourceTree = SDKROOT; }; + 4567FB06348FF519FDC6D698 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DXComponents.h; path = ../../Source/DXComponents.h; sourceTree = "SOURCE_ROOT"; }; + 4574217C2F5219DEDDDC9656 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RTAS_DigiCode3.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode3.cpp"; sourceTree = "SOURCE_ROOT"; }; + 45ADFD8885BE76C7F7D999AC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PluginProcessor.cpp; path = ../../Source/PluginProcessor.cpp; sourceTree = "SOURCE_ROOT"; }; + 45CC11D2029BA2CEAE1B0F76 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CharPointer_UTF16.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF16.h"; sourceTree = "SOURCE_ROOT"; }; + 45E8F3FB24A3579F1C1F3DF5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Viewport.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.cpp"; sourceTree = "SOURCE_ROOT"; }; + 45F6575A7BDB9134EAEA7633 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ActiveXControlComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 462B768DFC2129F54233D51D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StretchableLayoutResizerBar.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h"; sourceTree = "SOURCE_ROOT"; }; + 46908987EEFC3623A53A95C2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LagrangeInterpolator.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.cpp"; sourceTree = "SOURCE_ROOT"; }; + 46969E6B78BC89383358DCDA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_XMLCodeTokeniser.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h"; sourceTree = "SOURCE_ROOT"; }; + 4697BFC33D1A3C846B2DED19 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUSilentTimeout.h; path = Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUSilentTimeout.h; sourceTree = "DEVELOPER_DIR"; }; + 46C20298CCB469481F5C8D36 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseInactivityDetector.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h"; sourceTree = "SOURCE_ROOT"; }; + 4710CA869326390AF0CE2A0B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ResizableEdgeComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 47168956BF1BAC3FCBD55BB8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_posix_NamedPipe.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_posix_NamedPipe.cpp"; sourceTree = "SOURCE_ROOT"; }; + 475CE9A832328566544F457F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ZipFile.h"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.h"; sourceTree = "SOURCE_ROOT"; }; + 4778838DB96C82580CBE10D0 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_audio_utils/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 477946525F6F1BE9135A3101 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FakeMouseMoveGenerator.h"; path = "../../JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_FakeMouseMoveGenerator.h"; sourceTree = "SOURCE_ROOT"; }; + 478D907DACBE0CF918C6A0AD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CarbonEventHandler.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/CarbonEventHandler.h; sourceTree = "DEVELOPER_DIR"; }; + 47EF393874A20700CD249091 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AffineTransform.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.h"; sourceTree = "SOURCE_ROOT"; }; + 4836B8889A1100EA724CE7C2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StretchableLayoutManager.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h"; sourceTree = "SOURCE_ROOT"; }; + 48BDF7DFA849127655B86873 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_data_structures.mm"; path = "../../JuceLibraryCode/modules/juce_data_structures/juce_data_structures.mm"; sourceTree = "SOURCE_ROOT"; }; + 48C71FEAED1B46E11F17040C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AnimatedPositionBehaviours.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h"; sourceTree = "SOURCE_ROOT"; }; + 490146B41BBBC0E550BD73F2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiKeyboardComponent.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 494508266CB5367CB38B5805 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DirectoryContentsList.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp"; sourceTree = "SOURCE_ROOT"; }; + 496ADA4A8E3A7E4906EADC88 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_UndoManager.cpp"; path = "../../JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + 49B29E84D07EAF1F08C30A4F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiMessageSequence.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp"; sourceTree = "SOURCE_ROOT"; }; + 49D8BE8809C3C20272870C06 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Strings.mm"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_mac_Strings.mm"; sourceTree = "SOURCE_ROOT"; }; + 49D8C9E638BCBA98114A0E94 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Colour.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4A0A2B796676838D848432FF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Button.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4A463C15CF07B232605DC2F4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Application.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4AF614890823731010E97943 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PluginDirectoryScanner.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h"; sourceTree = "SOURCE_ROOT"; }; + 4B70CBF4DB4E571EDF5D3114 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GlobalEditor.h; path = ../../Source/GlobalEditor.h; sourceTree = "SOURCE_ROOT"; }; + 4B82A76027BA14576D476E62 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GenericAudioProcessorEditor.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4BC3C087DB2E037A932E3C57 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioAppComponent.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioAppComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 4C3F61A4672F57399AB751A0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BufferedInputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.h"; sourceTree = "SOURCE_ROOT"; }; + 4C67D4B9902C1B0CC80E11D8 = {isa = PBXFileReference; lastKnownFileType = image.png; name = "LFO_36_26.png"; path = "../../Resources/ui/LFO_36_26.png"; sourceTree = "SOURCE_ROOT"; }; + 4C6C14363344C87BDA4C1C71 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentBoundsConstrainer.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4C9751F81C3C052C9A6390F4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StretchableObjectResizer.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h"; sourceTree = "SOURCE_ROOT"; }; + 4CB06EEFAA877AA4A28FE150 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MusicDeviceBase.h; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.h; sourceTree = "DEVELOPER_DIR"; }; + 4CD97CB51FE3AD5248285B0A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MouseCursor.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4D488219CE9D736D69F6EF59 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DirectoryIterator.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.h"; sourceTree = "SOURCE_ROOT"; }; + 4D8B2790A6E7552C64453A53 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StretchableLayoutManager.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4DE54D4FA92B85E954BBDD0D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4E32AAF34A5EE096B8F3918E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RTAS_WinUtilities.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinUtilities.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4E6FA435926EF660B86E1BFA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarItemFactory.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h"; sourceTree = "SOURCE_ROOT"; }; + 4F95F3371DCA260343D7D26A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ButtonPropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 4F977F1C295B0D355391AAD3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ColourSelector.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_ColourSelector.h"; sourceTree = "SOURCE_ROOT"; }; + 4FD935EA5DAA0EAB4F266B2E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WindowsHooks.h"; path = "../../JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_WindowsHooks.h"; sourceTree = "SOURCE_ROOT"; }; + 4FDFC7D4EEEE8782C9FD9200 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PathStrokeType.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.h"; sourceTree = "SOURCE_ROOT"; }; + 502D49C82606515A80907EB3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_AU_Wrapper.mm"; path = "../../JuceLibraryCode/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm"; sourceTree = "SOURCE_ROOT"; }; + 505852570B48EB3F18076B03 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AAX_Wrapper.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp"; sourceTree = "SOURCE_ROOT"; }; + 50EDB2B0543B5881029D3CCE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InterProcessLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_InterProcessLock.h"; sourceTree = "SOURCE_ROOT"; }; + 518104B0010D2466EB51D01A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_IIRFilter.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.h"; sourceTree = "SOURCE_ROOT"; }; + 5197B9D23C0D9B28F2FF7F93 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_SystemStats.mm"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_mac_SystemStats.mm"; sourceTree = "SOURCE_ROOT"; }; + 51D460DE650B5F3701174605 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Uuid.h"; path = "../../JuceLibraryCode/modules/juce_core/misc/juce_Uuid.h"; sourceTree = "SOURCE_ROOT"; }; + 51E5757E2D48E638F9A4CB61 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = pitchenv.cc; path = ../../Source/msfa/pitchenv.cc; sourceTree = "SOURCE_ROOT"; }; + 51FA060C8445108FA58DF13D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToolbarItemComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 524D9B46D38DCF45CA2E8DD2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseListener.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.h"; sourceTree = "SOURCE_ROOT"; }; + 528BBDB63A8BF7246C4DDBA1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_AudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + 52E90BF34CEB39BB7DFA91DE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeRectangle.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.h"; sourceTree = "SOURCE_ROOT"; }; + 53CD8A358FB75E4D10571218 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PluginListComponent.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 53EA5EAEF8A9688559300B1C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MenuBarModel.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.h"; sourceTree = "SOURCE_ROOT"; }; + 540CB571BDB23FFECCE0CD1B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ValueTreeSynchroniser.cpp"; path = "../../JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp"; sourceTree = "SOURCE_ROOT"; }; + 543415735FAC3778D98C649B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Value.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/values/juce_Value.h"; sourceTree = "SOURCE_ROOT"; }; + 54363D0B39B88D43447C0123 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = BinaryData.cpp; path = ../../JuceLibraryCode/BinaryData.cpp; sourceTree = "SOURCE_ROOT"; }; + 5439A08FE11BD3D1EF760CF8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawablePath.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp"; sourceTree = "SOURCE_ROOT"; }; + 54A76CABA9E198F906FB01FC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextEditor.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TextEditor.h"; sourceTree = "SOURCE_ROOT"; }; + 55474A49BF29196733C89BBB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BigInteger.h"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.h"; sourceTree = "SOURCE_ROOT"; }; + 5548DEE5ED071453F8AD8AB6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResamplingAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 55E39FAA63BA8B9D40F40712 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RTAS_DigiCode1.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode1.cpp"; sourceTree = "SOURCE_ROOT"; }; + 561A9793AA73B7FDDED14476 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ComponentBase.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.cpp; sourceTree = "DEVELOPER_DIR"; }; + 5721702823682EC883FCB870 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_HyperlinkButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + 577D5E62E1CE48CEAD5855AE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ThreadWithProgressWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h"; sourceTree = "SOURCE_ROOT"; }; + 57A533082FEF0CE002D69EDB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ChannelRemappingAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 587A3ADC691765F0227C4707 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Result.h"; path = "../../JuceLibraryCode/modules/juce_core/misc/juce_Result.h"; sourceTree = "SOURCE_ROOT"; }; + 588255FD68989F1A03FDF31C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CPlusPlusCodeTokeniserFunctions.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h"; sourceTree = "SOURCE_ROOT"; }; + 59D15F780D468B587F9C7E78 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PluginParam.cpp; path = ../../Source/PluginParam.cpp; sourceTree = "SOURCE_ROOT"; }; + 5A1BD822F8CB7D42BB0EAF7A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PluginListComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5A366F36F3B4E50587A30351 = {isa = PBXFileReference; lastKnownFileType = file.ttf; name = "NotoSans-Bold.ttf"; path = "../../Resources/ui/NotoSans-Bold.ttf"; sourceTree = "SOURCE_ROOT"; }; + 5AD3DDD0285C94CEB17BF03C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUEffectBase.h; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUEffectBase.h; sourceTree = "DEVELOPER_DIR"; }; + 5B12686E2808FCCB8BBE0E24 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_GraphicsContext.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_android_GraphicsContext.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5BA236D62129EFE13A9EAB1B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MixerAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5BC311F801FE9D018A7B231C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentDragger.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5BFC8D75FFE4E8DEE50B3B1A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PreferencesPanel.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5C0A1B7E2BF8FCAF5A1E8616 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PluginProcessor.h; path = ../../Source/PluginProcessor.h; sourceTree = "SOURCE_ROOT"; }; + 5C9576A21F7C608E767F2108 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ActionBroadcaster.cpp"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5D131F468F18FD82C14C3849 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Files.mm"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_mac_Files.mm"; sourceTree = "SOURCE_ROOT"; }; + 5D2301F260F7793BD491A81E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ConcertinaPanel.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ConcertinaPanel.h"; sourceTree = "SOURCE_ROOT"; }; + 5DE3DC6998A92F718C9683FA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CodeTokeniser.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h"; sourceTree = "SOURCE_ROOT"; }; + 5E2597BF6AD27698AA0E9A3D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeCoordinate.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h"; sourceTree = "SOURCE_ROOT"; }; + 5E966C95FACF7B8D5A907FE3 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; + 5F7F52E503E2E2B59D055E6C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OutputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5FA112054E39C5FF09F6928B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LowLevelGraphicsSoftwareRenderer.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 5FE10203FC5AE23DBA573E3B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KnownPluginList.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.h"; sourceTree = "SOURCE_ROOT"; }; + 600DDC87EB44F5B6EFA1500F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationCommandTarget.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h"; sourceTree = "SOURCE_ROOT"; }; + 6050F8DB4EA5F9A4A27D7653 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CADebugMacros.h; path = Extras/CoreAudio/PublicUtility/CADebugMacros.h; sourceTree = "DEVELOPER_DIR"; }; + 60F23312570D43B7F7FC0D43 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUInputElement.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.h; sourceTree = "DEVELOPER_DIR"; }; + 61A517E758E2BF89FF445D7F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MemoryBlock.cpp"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.cpp"; sourceTree = "SOURCE_ROOT"; }; + 61E56039E1D2929463E58D62 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GlyphArrangement.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.h"; sourceTree = "SOURCE_ROOT"; }; + 61F792AFE04C15F413A4F766 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = EngineOpl.cpp; path = ../../Source/EngineOpl.cpp; sourceTree = "SOURCE_ROOT"; }; + 624B39364165E2F23A3D4540 = {isa = PBXFileReference; lastKnownFileType = image.png; name = "GlobalEditor_864x144.png"; path = "../../Resources/ui/GlobalEditor_864x144.png"; sourceTree = "SOURCE_ROOT"; }; + 6273BD6D40C9A904273C592F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_utils.mm"; path = "../../JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.mm"; sourceTree = "SOURCE_ROOT"; }; + 63B73D99B066179BB9661D4E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ChoicePropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6475DF69D5BDC709E275BF4D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WeakReference.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_WeakReference.h"; sourceTree = "SOURCE_ROOT"; }; + 64C579AFCDCEED8CAFEF9830 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ListBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ListBox.h"; sourceTree = "SOURCE_ROOT"; }; + 64CC83E4D891EAEC65EE41C4 = {isa = PBXFileReference; lastKnownFileType = file.r; name = "juce_AU_Resources.r"; path = "../../JuceLibraryCode/modules/juce_audio_plugin_client/AU/juce_AU_Resources.r"; sourceTree = "SOURCE_ROOT"; }; + 64CF42AFC2E05AEF9D350CD2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = env.h; path = ../../Source/msfa/env.h; sourceTree = "SOURCE_ROOT"; }; + 64E0EE125571D369100796D9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentPeer.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ComponentPeer.h"; sourceTree = "SOURCE_ROOT"; }; + 65BE679590BFE2466E16EA67 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SysexComm.cpp; path = ../../Source/SysexComm.cpp; sourceTree = "SOURCE_ROOT"; }; + 66E042C6FFE93F0E19B32F09 = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Scaling_36_26.png"; path = "../../Resources/ui/Scaling_36_26.png"; sourceTree = "SOURCE_ROOT"; }; + 6742794BECA5E223253EF810 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Fonts.mm"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_Fonts.mm"; sourceTree = "SOURCE_ROOT"; }; + 6833DFDF33AA9A5F551EA79D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableComposite.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.h"; sourceTree = "SOURCE_ROOT"; }; + 687A7EC567E4B00B663808F1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_audio_utils.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.h"; sourceTree = "SOURCE_ROOT"; }; + 68CCE716313990E1412107A8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MusicDeviceBase.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.cpp; sourceTree = "DEVELOPER_DIR"; }; + 68D35AFE11BAA35EAE497D47 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = synth.h; path = ../../Source/msfa/synth.h; sourceTree = "SOURCE_ROOT"; }; + 68E9769CFD4CE3B4CA530DA3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BooleanPropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 68EBBB35B7A5A57E4BA2F8E2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = module.h; path = ../../Source/msfa/module.h; sourceTree = "SOURCE_ROOT"; }; + 69327BB424333BE9051A2C1D = {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"; }; + 69B3908CF6E97D2326117534 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PathIterator.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6A33E3588893DFC8E8370460 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FFT.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_FFT.h"; sourceTree = "SOURCE_ROOT"; }; + 6A462A15DB909F68F4A9BECC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUInputElement.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.cpp; sourceTree = "DEVELOPER_DIR"; }; + 6AFA3298C0E6EBF44DF90481 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PixelFormats.h"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_PixelFormats.h"; sourceTree = "SOURCE_ROOT"; }; + 6B3889626BDBB814F2387085 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CartManager.cpp; path = ../../Source/CartManager.cpp; sourceTree = "SOURCE_ROOT"; }; + 6B8B14C1AA3491F103E6A5F7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUEffectBase.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUEffectBase.cpp; sourceTree = "DEVELOPER_DIR"; }; + 6C1EBFA6E5161BFC6E0A6686 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Expression.cpp"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_Expression.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6CAAD366E2D6A650900C75F0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Network.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_linux_Network.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6CBCD70FF1AE3E23D1598F84 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ContainerDeletePolicy.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_ContainerDeletePolicy.h"; sourceTree = "SOURCE_ROOT"; }; + 6D256DC39965C982ADAAFA81 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FillType.h"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.h"; sourceTree = "SOURCE_ROOT"; }; + 6D9DB37328ED695A9941A21C = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_data_structures/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 6DC26B61BA1638AFAF142A6C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_gui_extra.mm"; path = "../../JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; }; + 6DCB546B40A962FCA3C74DB9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ColourGradient.h"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.h"; sourceTree = "SOURCE_ROOT"; }; + 6DEFC761C7F27A8ED88790B4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_XMLCodeTokeniser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6E1E415B080EA491A7D58D3A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUMIDIBase.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.cpp; sourceTree = "DEVELOPER_DIR"; }; + 6E2A781F28B3F735F4FAB2A2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyMappingEditorComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6E84E300D2ECD62ED1ED3478 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileInputSource.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.h"; sourceTree = "SOURCE_ROOT"; }; + 6E8FC799E88893F8CD15BB71 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LADSPAPluginFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6F0921F115160B435DC6D1D5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_NamedValueSet.cpp"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.cpp"; sourceTree = "SOURCE_ROOT"; }; + 6F09FAB37276B4DA24BEBD41 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioThumbnailCache.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h"; sourceTree = "SOURCE_ROOT"; }; + 6F9852573AA442CFBAD9695F = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = RecentFilesMenuTemplate.nib; sourceTree = "SOURCE_ROOT"; }; + 6F98D6B8CAA0577CE576CD06 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiKeyboardState.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h"; sourceTree = "SOURCE_ROOT"; }; + 70BB114924D2EB3508565E8F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Identifier.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_Identifier.h"; sourceTree = "SOURCE_ROOT"; }; + 7144CB121F03A13EC1A5383F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Identifier.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_Identifier.cpp"; sourceTree = "SOURCE_ROOT"; }; + 717E18C7D784FE087436A768 = {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"; }; + 71A60F40B7B20297A1A5CB18 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiBuffer.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 71AF0542AEBEDCA5238DFFAA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MarkerList.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.h"; sourceTree = "SOURCE_ROOT"; }; + 71DFB6F3C44390C0FD109073 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CPlusPlusCodeTokeniser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp"; sourceTree = "SOURCE_ROOT"; }; + 71FDCC63A1963F976C7AC8EE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NamedValueSet.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.h"; sourceTree = "SOURCE_ROOT"; }; + 7202164C1666053D423871B0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiMessage.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.h"; sourceTree = "SOURCE_ROOT"; }; + 7228D8E143CA465FB15BD546 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BinaryData.h; path = ../../JuceLibraryCode/BinaryData.h; sourceTree = "SOURCE_ROOT"; }; + 72930EF8836E66B6E3A0711D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ButtonPropertyComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 72AC691AF255DD0B6D582EB3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DragAndDropTarget.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h"; sourceTree = "SOURCE_ROOT"; }; + 72C174C879B2CA24DCE2B6EC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ChildProcess.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.cpp"; sourceTree = "SOURCE_ROOT"; }; + 72F3014666D709C2DC843E32 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Atomic.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_Atomic.h"; sourceTree = "SOURCE_ROOT"; }; + 72F342B2288D7D32917C66FF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RenderingHelpers.h"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_RenderingHelpers.h"; sourceTree = "SOURCE_ROOT"; }; + 730BEAA59340DC3DF50E2127 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_gui_extra.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.h"; sourceTree = "SOURCE_ROOT"; }; + 734BB0B03974DF78B8CB4FD8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioPluginFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 7353E96136FAD8E0F0FAF2F3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioPlayHead.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPlayHead.h"; sourceTree = "SOURCE_ROOT"; }; + 738B67C0D9862DF54EC53785 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WebBrowserComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 73A5B8C82401A8D56F700A49 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + 73BA60F5506ADDBEAF6243FC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LookAndFeel.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp"; sourceTree = "SOURCE_ROOT"; }; + 73E07C2D38F6ABA12AD6A458 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiMessageSequence.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h"; sourceTree = "SOURCE_ROOT"; }; + 742502F34E52826111A41605 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarItemPalette.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h"; sourceTree = "SOURCE_ROOT"; }; + 743154234C82FDB5DACEA8C7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileBrowserComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 749FDD4CF73F9C8E26D09A7B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioProcessorGraph.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp"; sourceTree = "SOURCE_ROOT"; }; + 753358C232EE9B14F9CFE87C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileDragAndDropTarget.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h"; sourceTree = "SOURCE_ROOT"; }; + 75EB9A0BC0C7717F3DCE5BAE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DropShadower.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7658FE299B81691CFC697431 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedReadLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ScopedReadLock.h"; sourceTree = "SOURCE_ROOT"; }; + 77207D1536974D96B7ED2B85 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TargetPlatform.h"; path = "../../JuceLibraryCode/modules/juce_core/system/juce_TargetPlatform.h"; sourceTree = "SOURCE_ROOT"; }; + 775C9C8633BA573DA512EDD6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextLayout.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.cpp"; sourceTree = "SOURCE_ROOT"; }; + 778E69094A09D97D61E355B2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_MessageManager.mm"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_ios_MessageManager.mm"; sourceTree = "SOURCE_ROOT"; }; + 786A98F29FAA91898BB705F4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Desktop.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.cpp"; sourceTree = "SOURCE_ROOT"; }; + 78934C6C88D2B35DEF15BAB8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_AudioUnitPluginFormat.mm"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm"; sourceTree = "SOURCE_ROOT"; }; + 78A82E89AC0283CC1329E84E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Timer.h"; path = "../../JuceLibraryCode/modules/juce_events/timers/juce_Timer.h"; sourceTree = "SOURCE_ROOT"; }; + 78CA76788217B98287D9E007 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "fm_op_kernel.cc"; path = "../../Source/msfa/fm_op_kernel.cc"; sourceTree = "SOURCE_ROOT"; }; + 7936BBAA586387B2FAFB958B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PluginData.cpp; path = ../../Source/PluginData.cpp; sourceTree = "SOURCE_ROOT"; }; + 7A0FB6545BA2E344A1F45EA5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Decibels.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_Decibels.h"; sourceTree = "SOURCE_ROOT"; }; + 7A26D67672786E0663369D49 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_IIRFilterAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7A58027CF8C6967B02370E01 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EngineOpl.h; path = ../../Source/EngineOpl.h; sourceTree = "SOURCE_ROOT"; }; + 7A65F23E42CEFBDBA64EE2DA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAAudioChannelLayout.h; path = Extras/CoreAudio/PublicUtility/CAAudioChannelLayout.h; sourceTree = "DEVELOPER_DIR"; }; + 7A739B1B4B833A4668904CA6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReferenceCountedObject.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_ReferenceCountedObject.h"; sourceTree = "SOURCE_ROOT"; }; + 7A854175B4E6D35ABB7D4E45 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_URL.h"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_URL.h"; sourceTree = "SOURCE_ROOT"; }; + 7A905E3EE096DAA1D7BA7ABD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TabbedButtonBar.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7AB9FBAA49422497E050FFAC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChildProcess.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.h"; sourceTree = "SOURCE_ROOT"; }; + 7B2E31BD7292002DEBCC366B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CAStreamBasicDescription.cpp; path = Extras/CoreAudio/PublicUtility/CAStreamBasicDescription.cpp; sourceTree = "DEVELOPER_DIR"; }; + 7B6DC352755033E8436427CA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUMIDIBase.h; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.h; sourceTree = "DEVELOPER_DIR"; }; + 7BE1A83B817F581F39B1F983 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextEditor.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TextEditor.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7BF1EEFA4D36A91714D26060 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Time.cpp"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_Time.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7C2634F55C78A3822A661CE2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_XmlElement.cpp"; path = "../../JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7CDDAFACA226D14742566EE3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StringPairArray.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7D5E3634F29C83FE1216E5EC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DragAndDropContainer.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7DC83451FCA10947AC92EBBC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VST3Common.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Common.h"; sourceTree = "SOURCE_ROOT"; }; + 7E68BB771E88E0A2A323D365 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CPlusPlusCodeTokeniser.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h"; sourceTree = "SOURCE_ROOT"; }; + 7EC7AB8D0C164E19F70A4D8C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ModifierKeys.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.h"; sourceTree = "SOURCE_ROOT"; }; + 7ECA74A2FC82F26715446C70 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileFilter.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileFilter.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7F081876B753390FC305329F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Thread.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_Thread.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7F0B06EA0B38D4555CFEBA61 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryBlock.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.h"; sourceTree = "SOURCE_ROOT"; }; + 7F1B3807BE4D056A05E18663 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_audio_plugin_client/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + 7F63546442D6681E7AA27CB8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyPress.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.h"; sourceTree = "SOURCE_ROOT"; }; + 7FB4F731D177B36CE8616BAE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Javascript.cpp"; path = "../../JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.cpp"; sourceTree = "SOURCE_ROOT"; }; + 7FCE241BE34BC4D1E6988B1F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Result.cpp"; path = "../../JuceLibraryCode/modules/juce_core/misc/juce_Result.cpp"; sourceTree = "SOURCE_ROOT"; }; + 80149DC851E70B4D50DA03DB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SparseSet.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_SparseSet.h"; sourceTree = "SOURCE_ROOT"; }; + 80153220EFB623D6F205FD1B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MenuBarComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 801E57A03A710591F1B5FEC6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUDispatch.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.h; sourceTree = "DEVELOPER_DIR"; }; + 80B36B053E1EA2D1352BD0C9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorParameter.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"; sourceTree = "SOURCE_ROOT"; }; + 8141C52E88E3E82A0A226FAD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyPress.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp"; sourceTree = "SOURCE_ROOT"; }; + 817CC81F50861DAEEFB2043A = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; + 81A949AE03BA033D5D762E9F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUOutputElement.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.cpp; sourceTree = "DEVELOPER_DIR"; }; + 81E389AD161BE88DA92A59AA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_events.h"; path = "../../JuceLibraryCode/modules/juce_events/juce_events.h"; sourceTree = "SOURCE_ROOT"; }; + 829D2BFEB85DC3589FEBB868 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_WildcardFileFilter.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.cpp"; sourceTree = "SOURCE_ROOT"; }; + 82D97C5FDE8A53DEBB075DC7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUCarbonViewControl.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewControl.h; sourceTree = "DEVELOPER_DIR"; }; + 8312A52619B88D3763F6B493 = {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"; }; + 83281A9109419F0057EABD31 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAVectorUnitTypes.h; path = Extras/CoreAudio/PublicUtility/CAVectorUnitTypes.h; sourceTree = "DEVELOPER_DIR"; }; + 834F3F9FC2FE9564FF95243D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Fonts.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_Fonts.cpp"; sourceTree = "SOURCE_ROOT"; }; + 838A5E852BBD79A98CD9FDDD = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; }; + 838E63F5800CA577B92EF6AE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = OperatorEditor.cpp; path = ../../Source/OperatorEditor.cpp; sourceTree = "SOURCE_ROOT"; }; + 8390BC6E8D8190A7C45C6A08 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Messaging.cpp"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_win32_Messaging.cpp"; sourceTree = "SOURCE_ROOT"; }; + 83B3A12467C52CB13FB353C6 = {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"; }; + 83DC5A4F730ECA567FADFC3E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VSTMidiEventList.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h"; sourceTree = "SOURCE_ROOT"; }; + 83FAEF9BE29243FBED61B39F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Random.h"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_Random.h"; sourceTree = "SOURCE_ROOT"; }; + 84F48AAB7D37C193E401595F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DialogWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DialogWindow.h"; sourceTree = "SOURCE_ROOT"; }; + 853996FFE0D8585AACC747C4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MessageListener.cpp"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.cpp"; sourceTree = "SOURCE_ROOT"; }; + 86412A8C98A3287951990C1B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lfo.h; path = ../../Source/msfa/lfo.h; sourceTree = "SOURCE_ROOT"; }; + 8645DD1C8D096C9D7B4B67F2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TooltipClient.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_TooltipClient.h"; sourceTree = "SOURCE_ROOT"; }; + 866BB30F214A58492E281430 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Initialisation.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_Initialisation.h"; sourceTree = "SOURCE_ROOT"; }; + 875B62ECA8BBCC7085FA5F9C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TreeView.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TreeView.cpp"; sourceTree = "SOURCE_ROOT"; }; + 887686762AD249568D53FC85 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ColourGradient.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8890765D8A8E2769231452A3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_UnitTest.cpp"; path = "../../JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.cpp"; sourceTree = "SOURCE_ROOT"; }; + 88DEE0054A9328954E19EECA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InterprocessConnection.cpp"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.cpp"; sourceTree = "SOURCE_ROOT"; }; + 89003B5CB547C82F42EEB0A9 = {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"; }; + 8915FD41B7EB8AB0961F199A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageFileFormat.h"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.h"; sourceTree = "SOURCE_ROOT"; }; + 8921057E004FE1036191B888 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUOutputBase.h; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.h; sourceTree = "DEVELOPER_DIR"; }; + 89BBB19B9AFC6DAD43B9B512 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Random.cpp"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_Random.cpp"; sourceTree = "SOURCE_ROOT"; }; + 89CF359102665330C30E1F9A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NamedPipe.h"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.h"; sourceTree = "SOURCE_ROOT"; }; + 8A4EB298996C4C410C1B4CDC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PathStrokeType.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8A566C440278C23B8FB3A9AB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Reverb.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_Reverb.h"; sourceTree = "SOURCE_ROOT"; }; + 8A57C43210108CEEE8B61750 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PopupMenu.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8A58A60739C88C641626F590 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedXLock.h"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_ScopedXLock.h"; sourceTree = "SOURCE_ROOT"; }; + 8AF9F9504D8671A590689E28 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = exp2.h; path = ../../Source/msfa/exp2.h; sourceTree = "SOURCE_ROOT"; }; + 8B160A62F6A6EF21379A8EA7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Direct2DGraphicsContext.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8B19E0BEAD29F2C0D46FA89C = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Knob_34x34.png"; path = "../../Resources/ui/Knob_34x34.png"; sourceTree = "SOURCE_ROOT"; }; + 8B86ECF3351C9D029821C621 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ImageComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 8B87D00DA619D83BA6926E28 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ScopedLock.h"; sourceTree = "SOURCE_ROOT"; }; + 8BADEB7BF1A65E83A7A1736D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PluginFx.cpp; path = ../../Source/PluginFx.cpp; sourceTree = "SOURCE_ROOT"; }; + 8BBE375590444CD57A311DD2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Time.h"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_Time.h"; sourceTree = "SOURCE_ROOT"; }; + 8BEBEDCAD409EE3A5D383B6D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = EngineMkI.cpp; path = ../../Source/EngineMkI.cpp; sourceTree = "SOURCE_ROOT"; }; + 8C4A3CBB322357AF0CA3C2CD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileListComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 8CA96F07FD8390BD5EEC909B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DirectoryContentsDisplayComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 8CE45844BA3103D92458CFB5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Singleton.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_Singleton.h"; sourceTree = "SOURCE_ROOT"; }; + 8D7D3383FF13817F3B277B02 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MessageManager.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.h"; sourceTree = "SOURCE_ROOT"; }; + 8DC0C64EE71D0AFDD76FEAD7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Socket.h"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_Socket.h"; sourceTree = "SOURCE_ROOT"; }; + 8E04EF74113A0E9808FC4F09 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PluginDescription.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.h"; sourceTree = "SOURCE_ROOT"; }; + 8E3B1087D0795F0D4E02DAF0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DirectoryContentsList.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h"; sourceTree = "SOURCE_ROOT"; }; + 8EC249E14405CAC614E7A4CF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AttributedString.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.cpp"; sourceTree = "SOURCE_ROOT"; }; + 8ED1068B85DCEFEFDD3C4F82 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUCarbonViewBase.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewBase.cpp; sourceTree = "DEVELOPER_DIR"; }; + 8F32EF92B0A18751EC39A79B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = "SOURCE_ROOT"; }; + 8F395B738E7AB81A0333AF96 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = freqlut.h; path = ../../Source/msfa/freqlut.h; sourceTree = "SOURCE_ROOT"; }; + 8F62A58CDAF0709EDE33F5E0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.h"; sourceTree = "SOURCE_ROOT"; }; + 8F8AA2BF15AB1270EA6A853A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AnimatedAppComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 8FB4C261F0F3760EEA4B7BBE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_posix_SharedCode.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_posix_SharedCode.h"; sourceTree = "SOURCE_ROOT"; }; + 900CA19F25F2140D0067345B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseEvent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.h"; sourceTree = "SOURCE_ROOT"; }; + 9098E2A57CB22B2D5F675D9C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CriticalSection.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_CriticalSection.h"; sourceTree = "SOURCE_ROOT"; }; + 911A3E44C161694FF7084464 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToggleButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + 91544DAFCDBE05708D10A24C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WaitableEvent.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_WaitableEvent.h"; sourceTree = "SOURCE_ROOT"; }; + 9196D1FCEC768D074AAAD581 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Variant.cpp"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_Variant.cpp"; sourceTree = "SOURCE_ROOT"; }; + 919DF1054C09D19EDA044BE8 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; }; + 930D512FD24D7E21E43C7322 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_data_structures.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/juce_data_structures.h"; sourceTree = "SOURCE_ROOT"; }; + 936D695F9C82434D08C181FC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BorderSize.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_BorderSize.h"; sourceTree = "SOURCE_ROOT"; }; + 937CFA7E69529A634C1DCD5C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PropertyComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 942BA246938908E24A47A05B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Font.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.h"; sourceTree = "SOURCE_ROOT"; }; + 949B3D44B0EFFFE18578E44E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ImageComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9514C57B8C2FC488E49FF841 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_XmlElement.h"; path = "../../JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.h"; sourceTree = "SOURCE_ROOT"; }; + 954708C705637A2F8F204F0A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryInputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.h"; sourceTree = "SOURCE_ROOT"; }; + 954D25A9D5C49DEB9D2FD167 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NSViewComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/embedding/juce_NSViewComponent.h"; sourceTree = "SOURCE_ROOT"; }; + 95812E339031893CDE82E8E5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ModifierKeys.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp"; sourceTree = "SOURCE_ROOT"; }; + 95B7D6B36478C5A2977ADD4C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_File.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_File.h"; sourceTree = "SOURCE_ROOT"; }; + 95D4F595A6D807E681E1E2B5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MemoryInputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + 969250C57EF34E88AF1062BE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Label.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Label.cpp"; sourceTree = "SOURCE_ROOT"; }; + 97187C062A4A90E3DE7B4B6F = {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"; }; + 97DAB16E37783E73F1D039A3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_MessageManager.mm"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_mac_MessageManager.mm"; sourceTree = "SOURCE_ROOT"; }; + 980D53B155A6FE153BF4ECC4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CharacterFunctions.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.h"; sourceTree = "SOURCE_ROOT"; }; + 9851B7F5090C1FA428169434 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AttributedString.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.h"; sourceTree = "SOURCE_ROOT"; }; + 99078823EE2D77389696F0E5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_core.mm"; path = "../../JuceLibraryCode/modules/juce_core/juce_core.mm"; sourceTree = "SOURCE_ROOT"; }; + 99B1A018081D90D801667296 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Threads.mm"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_mac_Threads.mm"; sourceTree = "SOURCE_ROOT"; }; + 99D8CB814600E509F918CFC5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.h"; sourceTree = "SOURCE_ROOT"; }; + 99FFA4AC86A982F68CE03ED3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Uuid.cpp"; path = "../../JuceLibraryCode/modules/juce_core/misc/juce_Uuid.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9A68431EDA5B8D2023A10A02 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Viewport.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.h"; sourceTree = "SOURCE_ROOT"; }; + 9AAC5E6C1A21F8FE2F66F0E0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ParamDialog.h; path = ../../Source/ParamDialog.h; sourceTree = "SOURCE_ROOT"; }; + 9B103127E2063BAFD4A4FD33 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Thread.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_Thread.h"; sourceTree = "SOURCE_ROOT"; }; + 9B36F7CC7A136C2AEB4E5E53 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WindowsRegistry.h"; path = "../../JuceLibraryCode/modules/juce_core/misc/juce_WindowsRegistry.h"; sourceTree = "SOURCE_ROOT"; }; + 9BC0901018A3D55DCCA54301 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentMovementWatcher.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h"; sourceTree = "SOURCE_ROOT"; }; + 9D2ECC20D62F513E41A28337 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MouseInputSource.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9D542FAE4CA607E1F19C3EC9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SystemClipboard.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_SystemClipboard.h"; sourceTree = "SOURCE_ROOT"; }; + 9D5B06B94AB34DBEC8BD262E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Fonts.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_linux_Fonts.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9E0A95AA535CE6ABE66D9A30 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FilenameComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9E3820CD63B47B5385AF2DB6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_graphics.mm"; path = "../../JuceLibraryCode/modules/juce_graphics/juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; }; + 9E38FC6135AC278A4704BE9D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GraphicsContext.h"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.h"; sourceTree = "SOURCE_ROOT"; }; + 9EA6B9182B39D4F9B416B14A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedWriteLock.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ScopedWriteLock.h"; sourceTree = "SOURCE_ROOT"; }; + 9ED32BCD42EFF79D067525DF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationProperties.cpp"; path = "../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9F4CAD2C33179825F3080F1F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToggleButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.h"; sourceTree = "SOURCE_ROOT"; }; + 9F9EAFF1322AAE2B114A611B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ThreadPool.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.h"; sourceTree = "SOURCE_ROOT"; }; + 9FA7591BA2EFB4349B6E02A9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_freetype_Fonts.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_freetype_Fonts.cpp"; sourceTree = "SOURCE_ROOT"; }; + 9FB43E65C5F68B31FB16D0F5 = {isa = PBXFileReference; lastKnownFileType = image.png; name = "OperatorEditor_287x218.png"; path = "../../Resources/ui/OperatorEditor_287x218.png"; sourceTree = "SOURCE_ROOT"; }; + A00DC4E59356AF5F1D9C02D1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyMappingEditorComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h"; sourceTree = "SOURCE_ROOT"; }; + A013A93080FB0FB98C02C96B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativePointPath.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp"; sourceTree = "SOURCE_ROOT"; }; + A02775EA788AD4BF7DD1B1A1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DXLookNFeel.cpp; path = ../../Source/DXLookNFeel.cpp; sourceTree = "SOURCE_ROOT"; }; + A03CA8621EA02C18B4117EC1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioThumbnail.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp"; sourceTree = "SOURCE_ROOT"; }; + A040ED3E3D914E80D6F56110 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LagrangeInterpolator.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.h"; sourceTree = "SOURCE_ROOT"; }; + A0492880578DCB9152DE5EAD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ByteOrder.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_ByteOrder.h"; sourceTree = "SOURCE_ROOT"; }; + A062855D9DD17397012BC224 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PreferencesPanel.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_PreferencesPanel.h"; sourceTree = "SOURCE_ROOT"; }; + A0C5AA7F71F5C650FBBB83C9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToneGeneratorAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + A0EDFAC99A72166065DDD1FE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CaretComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + A11BA069921359F646E104A1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StandardHeader.h"; path = "../../JuceLibraryCode/modules/juce_core/system/juce_StandardHeader.h"; sourceTree = "SOURCE_ROOT"; }; + A190462810A30005F66291F9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_String.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_String.h"; sourceTree = "SOURCE_ROOT"; }; + A199934EF3E1D20FD472E51D = {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"; }; + A1CD23B489568CB51325DB98 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DeletedAtShutdown.cpp"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.cpp"; sourceTree = "SOURCE_ROOT"; }; + A27B095F0D44EB7FFFC3951E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_JSON.cpp"; path = "../../JuceLibraryCode/modules/juce_core/javascript/juce_JSON.cpp"; sourceTree = "SOURCE_ROOT"; }; + A2C4984859B7A2F3CB17C609 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MultiTimer.h"; path = "../../JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.h"; sourceTree = "SOURCE_ROOT"; }; + A2D3A958C5D96910BEDE9283 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ListBox.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ListBox.cpp"; sourceTree = "SOURCE_ROOT"; }; + A2DABCCF72397C2C7C69F441 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TreeView.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TreeView.h"; sourceTree = "SOURCE_ROOT"; }; + A31C49ABA24290126250F574 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CAMutex.cpp; path = Extras/CoreAudio/PublicUtility/CAMutex.cpp; sourceTree = "DEVELOPER_DIR"; }; + A348DAE6ECDEF51CAD6B5FE4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ValueTree.cpp"; path = "../../JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.cpp"; sourceTree = "SOURCE_ROOT"; }; + A354DF25FF89648B38DB63DC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_gui_basics.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.h"; sourceTree = "SOURCE_ROOT"; }; + A3B840D8C76CA45D3096241C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OwnedArray.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_OwnedArray.h"; sourceTree = "SOURCE_ROOT"; }; + A3C98189E1FB70E082F1AC6B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseInputSource.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.h"; sourceTree = "SOURCE_ROOT"; }; + A3E39527888583E832999240 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_android_JNIHelpers.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_JNIHelpers.h"; sourceTree = "SOURCE_ROOT"; }; + A4010716414361F5F304407A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_IncludeSystemHeaders.h"; path = "../../JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_IncludeSystemHeaders.h"; sourceTree = "SOURCE_ROOT"; }; + A44D9BDAD9BE9AD2E519D241 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Fonts.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_android_Fonts.cpp"; sourceTree = "SOURCE_ROOT"; }; + A4732634AB48AFD0FB06D7FA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; }; + A4A391D50A9F61201CBC277D = {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"; }; + A4BAD3C43AF0D19ECA1C2BB3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MultiTimer.cpp"; path = "../../JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.cpp"; sourceTree = "SOURCE_ROOT"; }; + A57ACCF886A902BBCB603D5B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToneGeneratorAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + A5C29A814EAFAD95B416C624 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Logger.h"; path = "../../JuceLibraryCode/modules/juce_core/logging/juce_Logger.h"; sourceTree = "SOURCE_ROOT"; }; + A5E6E877E1151D8B3E480B76 = {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"; }; + A70082D71DB8B5D779944812 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileOutputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.h"; sourceTree = "SOURCE_ROOT"; }; + A700ACBCC4D648B60362B3D6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileLogger.h"; path = "../../JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.h"; sourceTree = "SOURCE_ROOT"; }; + A763DB1FF5441EFF39491530 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_UndoManager.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.h"; sourceTree = "SOURCE_ROOT"; }; + A7894AD5A242CD86ACE9455C = {isa = PBXFileReference; lastKnownFileType = file.r; name = AUResources.r; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUResources.r; sourceTree = "DEVELOPER_DIR"; }; + A7BE5CE9E0BA615BCC867CB8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableRectangle.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h"; sourceTree = "SOURCE_ROOT"; }; + A7C3E1CAAA03F545AA4FCFAA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Path.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.h"; sourceTree = "SOURCE_ROOT"; }; + A810A279E11A672B8F84AD72 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiBuffer.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.h"; sourceTree = "SOURCE_ROOT"; }; + A81F4DC234E8D93BF9803529 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; }; + A81FD2D7571ED030F7292079 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChoicePropertyComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; + A83F026919CEDB80894F3798 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NotificationType.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_NotificationType.h"; sourceTree = "SOURCE_ROOT"; }; + A95F8438AE6F3BA4CCD2A1EE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PositionableAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + AA2F01B149F981C2997D583F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_processors.mm"; path = "../../JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; }; + AA5AD3160392AC223285535C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GlowEffect.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.cpp"; sourceTree = "SOURCE_ROOT"; }; + AA600E8588CD8DE76CB9C361 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MultiDocumentPanel.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp"; sourceTree = "SOURCE_ROOT"; }; + AA6BE14C6DF4E89F72919216 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AsyncUpdater.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.h"; sourceTree = "SOURCE_ROOT"; }; + AA84602D83F8E270AC0281AE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ProgressBar.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ProgressBar.h"; sourceTree = "SOURCE_ROOT"; }; + AAA6221960332B921DDF42A4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableImage.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.h"; sourceTree = "SOURCE_ROOT"; }; + AAD65774913834A6443A3B82 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_UnitTest.h"; path = "../../JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.h"; sourceTree = "SOURCE_ROOT"; }; + AB6186E32E92664DEFA0C0A1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_events.mm"; path = "../../JuceLibraryCode/modules/juce_events/juce_events.mm"; sourceTree = "SOURCE_ROOT"; }; + AB7EBBEDA6F3984B295E123F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Messaging.cpp"; path = "../../JuceLibraryCode/modules/juce_events/native/juce_android_Messaging.cpp"; sourceTree = "SOURCE_ROOT"; }; + AB91CD7D677DF03475CA2090 = {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"; }; + AC0E5E706FA5E8597F943065 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LocalisedStrings.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.cpp"; sourceTree = "SOURCE_ROOT"; }; + AC49A363BFC6B7631E1CD39B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LowLevelGraphicsSoftwareRenderer.h"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h"; sourceTree = "SOURCE_ROOT"; }; + AC613C24CC21A18FCD6CD50B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioAppComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + AC6693856E8A4626E5571CBC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioDeviceSelectorComponent.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h"; sourceTree = "SOURCE_ROOT"; }; + AC7FD56AB45D297F1D62676C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DirectoryContentsDisplayComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + ACDB4542A6B2FE5186631197 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BubbleMessageComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + ACDE74B253321268CA9AB8C4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + ACE30A4CDB9C2F2C13B8ADFA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ChangeBroadcaster.cpp"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp"; sourceTree = "SOURCE_ROOT"; }; + ACEA0E1D856960307276B8B8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_graphics.h"; path = "../../JuceLibraryCode/modules/juce_graphics/juce_graphics.h"; sourceTree = "SOURCE_ROOT"; }; + AD6C159D76B2BFAF579383F8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CachedComponentImage.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_CachedComponentImage.h"; sourceTree = "SOURCE_ROOT"; }; + ADC81E4F771BD99A4C3C822A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DirectWriteTypeface.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp"; sourceTree = "SOURCE_ROOT"; }; + ADF4E92197B00B0EB10384BA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CaretComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.h"; sourceTree = "SOURCE_ROOT"; }; + AE09B4C2A4BDE8FDA01A8A13 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = dx7note.cc; path = ../../Source/msfa/dx7note.cc; sourceTree = "SOURCE_ROOT"; }; + AE4B8002F4435BEADA3AE966 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PropertySet.cpp"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.cpp"; sourceTree = "SOURCE_ROOT"; }; + AE4DF6AF917F1A8DDF5376E3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ModalComponentManager.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.h"; sourceTree = "SOURCE_ROOT"; }; + AE8321756C03700EB12FF98A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RecentlyOpenedFilesList.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp"; sourceTree = "SOURCE_ROOT"; }; + AE84ADD347C9AB73ECFCBED7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUTimestampGenerator.h; path = Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUTimestampGenerator.h; sourceTree = "DEVELOPER_DIR"; }; + AED57A3601CE4B9FF8007855 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_HeapBlock.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_HeapBlock.h"; sourceTree = "SOURCE_ROOT"; }; + AEFD0A7D65FEC1D23A87FB1C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PropertyPanel.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.h"; sourceTree = "SOURCE_ROOT"; }; + AF1DFD842A36E967DF140D5C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "aligned_buf.h"; path = "../../Source/msfa/aligned_buf.h"; sourceTree = "SOURCE_ROOT"; }; + AF298423A147823848DFBC30 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ReadWriteLock.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.cpp"; sourceTree = "SOURCE_ROOT"; }; + AF9A3BEBEC95195644691CA1 = {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"; }; + AFB323F45D65FBC8B472B825 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GZIPDecompressorInputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + B0230FCCA099E6430411DFC9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = sin.cc; path = ../../Source/msfa/sin.cc; sourceTree = "SOURCE_ROOT"; }; + B06A13CEF4F653521D640041 = {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"; }; + B0A8FCF2D607B95C740D17C9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Rectangle.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Rectangle.h"; sourceTree = "SOURCE_ROOT"; }; + B11EC67DFA21869511B3041E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ArrowButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.h"; sourceTree = "SOURCE_ROOT"; }; + B1D9F99AC498364816DAC219 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Files.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_Files.cpp"; sourceTree = "SOURCE_ROOT"; }; + B1E71D410154F9F7964A8F5F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MouseCursor.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.h"; sourceTree = "SOURCE_ROOT"; }; + B22154A68283179A2059275F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MouseEvent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.cpp"; sourceTree = "SOURCE_ROOT"; }; + B240D74DFFCFE7CC095CEF59 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Registry.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_Registry.cpp"; sourceTree = "SOURCE_ROOT"; }; + B29C1AA0C72B3F9D34F7FEE4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CompilerSupport.h"; path = "../../JuceLibraryCode/modules/juce_core/system/juce_CompilerSupport.h"; sourceTree = "SOURCE_ROOT"; }; + B446CB8C1ED8823EA2F33E30 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileOutputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + B4821C5DCA629694CE0A29FB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioThumbnail.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.h"; sourceTree = "SOURCE_ROOT"; }; + B4AA6DED570BD1D3E701BA49 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LADSPAPluginFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h"; sourceTree = "SOURCE_ROOT"; }; + B4C62338187DC6B1B1F0CF54 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Synthesiser.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp"; sourceTree = "SOURCE_ROOT"; }; + B4CCE3F32C6854405890C6BC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_NamedPipe.cpp"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.cpp"; sourceTree = "SOURCE_ROOT"; }; + B55F33C584CCF617C5C71EE6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiFile.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.h"; sourceTree = "SOURCE_ROOT"; }; + B57E1987459E64275B4652B2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GlyphArrangement.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp"; sourceTree = "SOURCE_ROOT"; }; + B58C5191B1F0F0863167A322 = {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"; }; + B5D800CC11CBD506E9A6F4FB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioProcessor.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp"; sourceTree = "SOURCE_ROOT"; }; + B633E97B2CB9548F0AF0164A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableBorderComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + B63E7FBEF314AA2B6A8083F4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PluginUtilities.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp"; sourceTree = "SOURCE_ROOT"; }; + B6A004CD5808CFA5481EFA02 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedValueSetter.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_ScopedValueSetter.h"; sourceTree = "SOURCE_ROOT"; }; + B773C79C475482598391DF35 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioPluginFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + B779A3FF92AF0ED28B97C03A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ValueTree.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.h"; sourceTree = "SOURCE_ROOT"; }; + B7ABA3D144D21935200C8386 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativePoint.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.cpp"; sourceTree = "SOURCE_ROOT"; }; + B8007B51F9FA8B2F52EF4CCD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Socket.cpp"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_Socket.cpp"; sourceTree = "SOURCE_ROOT"; }; + B84CE707CF89EA0002595BCA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DirectWriteTypeLayout.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp"; sourceTree = "SOURCE_ROOT"; }; + B8F528366A0422FC84469E80 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextDiff.cpp"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_TextDiff.cpp"; sourceTree = "SOURCE_ROOT"; }; + B92920A799E0A58E3B4AF75D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ShapeButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.h"; sourceTree = "SOURCE_ROOT"; }; + B9D163D4B1C34DFAF84F81E0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ResizableCornerComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h"; sourceTree = "SOURCE_ROOT"; }; + BA4FF1F73CF544CF671433D0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComboBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.h"; sourceTree = "SOURCE_ROOT"; }; + BA52D32B1E0324546C26ACCA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Application.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.h"; sourceTree = "SOURCE_ROOT"; }; + BA9FFDC7BCC2D364014E1280 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileTreeComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + BAA40A78E81F4FF0F0E075A6 = {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"; }; + BAA44451865610A98B3A69AE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileBasedDocument.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp"; sourceTree = "SOURCE_ROOT"; }; + BAADD431AF7666E435C6C4B3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUScopeElement.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.cpp; sourceTree = "DEVELOPER_DIR"; }; + BAE2BAF1F5DC75A6E72FC56A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TableListBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableListBox.h"; sourceTree = "SOURCE_ROOT"; }; + BAEAEDCE17A81C84439E984A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAAUParameter.h; path = Extras/CoreAudio/PublicUtility/CAAUParameter.h; sourceTree = "DEVELOPER_DIR"; }; + BB08970C0517BF01D80D49B3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentAnimator.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.h"; sourceTree = "SOURCE_ROOT"; }; + BB7808FBEB84DD9C60978532 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_audio_plugin_client.h"; path = "../../JuceLibraryCode/modules/juce_audio_plugin_client/juce_audio_plugin_client.h"; sourceTree = "SOURCE_ROOT"; }; + BC383B9F2F352E373DE6C4A6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CharPointer_UTF32.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF32.h"; sourceTree = "SOURCE_ROOT"; }; + BD25F7AC4728A7875B6AE9D5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PluginEditor.h; path = ../../Source/PluginEditor.h; sourceTree = "SOURCE_ROOT"; }; + BDC553DA1A51C45837101B7B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Typeface.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.h"; sourceTree = "SOURCE_ROOT"; }; + BE0C6895B768F38281CCC0BC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringPairArray.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.h"; sourceTree = "SOURCE_ROOT"; }; + BE353EDDEEF8601A3A817617 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GraphicsContext.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.cpp"; sourceTree = "SOURCE_ROOT"; }; + BE574127E239EB558B051D34 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeParallelogram.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h"; sourceTree = "SOURCE_ROOT"; }; + BEA2BC710D949E126E974D78 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessor.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.h"; sourceTree = "SOURCE_ROOT"; }; + BEAE9210BD434DD07FD67CBF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VSTPluginFormat.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h"; sourceTree = "SOURCE_ROOT"; }; + BEEB5F341047830F06857DD9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Threads.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_Threads.cpp"; sourceTree = "SOURCE_ROOT"; }; + BF47505F73A4CD4D0EB3F430 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Range.h"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_Range.h"; sourceTree = "SOURCE_ROOT"; }; + BF4E95E2F725801F38CFCA77 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileBrowserComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h"; sourceTree = "SOURCE_ROOT"; }; + BF536BFBEDDD9802B9516022 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioThumbnailBase.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h"; sourceTree = "SOURCE_ROOT"; }; + BF7A1720DADC7983F61E895C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ProgramListBox.cpp; path = ../../Source/ProgramListBox.cpp; sourceTree = "SOURCE_ROOT"; }; + BF9449063F547456209F21FE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Network.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_Network.cpp"; sourceTree = "SOURCE_ROOT"; }; + BFD53B08DAEB98B6DD5D77B7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FFT.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_FFT.cpp"; sourceTree = "SOURCE_ROOT"; }; + BFE7C6795569A2BC4EEF91FB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BufferingAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + BFF8708E6D65F4E2B84983F9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentBuilder.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp"; sourceTree = "SOURCE_ROOT"; }; + C01EE75D859C1F942DA3AE61 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "fm_core.cc"; path = "../../Source/msfa/fm_core.cc"; sourceTree = "SOURCE_ROOT"; }; + C16DEC12DA7B1444AF0FD5BB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CustomTypeface.h"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.h"; sourceTree = "SOURCE_ROOT"; }; + C1CB32E507C8F16FFF6014F6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationBase.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.h"; sourceTree = "SOURCE_ROOT"; }; + C1E13F0AFFDADDB080D11B74 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Drawable.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.cpp"; sourceTree = "SOURCE_ROOT"; }; + C1F03CEB2804747AF4C6BF4D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ComponentBase.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.h; sourceTree = "DEVELOPER_DIR"; }; + C1FFEA64DED8E45D6A8F17F2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageFileFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + C222D35AC4FC5C2A3BB0F8B6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EngineMkI.h; path = ../../Source/EngineMkI.h; sourceTree = "SOURCE_ROOT"; }; + C28D3CC3B868C4F092E68D45 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_graphics/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + C294314DFA3B047D1F745A23 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringRef.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_StringRef.h"; sourceTree = "SOURCE_ROOT"; }; + C29DCEB09280116E3F4E87C3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorListener.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"; sourceTree = "SOURCE_ROOT"; }; + C2AA393651CBC37DCD7718BD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OperatorEditor.h; path = ../../Source/OperatorEditor.h; sourceTree = "SOURCE_ROOT"; }; + C33C134DA87CD13FAF7BC5A1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CheckSettingMacros.h"; path = "../../JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h"; sourceTree = "SOURCE_ROOT"; }; + C4282ED857CAA664F85D5C4D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_SystemStats.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_SystemStats.cpp"; sourceTree = "SOURCE_ROOT"; }; + C48DAE373124C258F3414CDB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GIFLoader.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/image_formats/juce_GIFLoader.cpp"; sourceTree = "SOURCE_ROOT"; }; + C49F636E4677A7C8C62A9859 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Synthesiser.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h"; sourceTree = "SOURCE_ROOT"; }; + C4A2C1FDE57CCF33BE778B39 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AppleRemote.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_AppleRemote.h"; sourceTree = "SOURCE_ROOT"; }; + C4DE747B720C310D6BC65936 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUBuffer.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUBuffer.cpp; sourceTree = "DEVELOPER_DIR"; }; + C56E401381FF968837F82364 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PluginData.h; path = ../../Source/PluginData.h; sourceTree = "SOURCE_ROOT"; }; + C5E92613992AB74C2E715271 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationCommandManager.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp"; sourceTree = "SOURCE_ROOT"; }; + C6559A509BD759234BFFCA5D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TooltipWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + C6928FE8579AE1980061CA43 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = dx7note.h; path = ../../Source/msfa/dx7note.h; sourceTree = "SOURCE_ROOT"; }; + C74F0F7CA3A1A201C0EC4772 = {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"; }; + C7577AF98915C39EDCEC259A = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Slider_26x26.png"; path = "../../Resources/ui/Slider_26x26.png"; sourceTree = "SOURCE_ROOT"; }; + C78890910E4BE9A24F562397 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BufferedInputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + C7C6039A52C3EE370CA9E73A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_RTAS_MacUtilities.mm"; path = "../../JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacUtilities.mm"; sourceTree = "SOURCE_ROOT"; }; + C7EFC098CAC8AAB04A9D5183 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_win32_ComSmartPtr.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_ComSmartPtr.h"; sourceTree = "SOURCE_ROOT"; }; + C89190A10B698C7B1E42C76D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUMIDIEffectBase.h; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.h; sourceTree = "DEVELOPER_DIR"; }; + C8DE1F3E1A1871ABB88A5B2D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SelectedItemSet.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_SelectedItemSet.h"; sourceTree = "SOURCE_ROOT"; }; + C92DFD53D297FAD265D1DB8D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InputSource.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_InputSource.h"; sourceTree = "SOURCE_ROOT"; }; + C9BA4E2199E2302799EFB744 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ValueTreeSynchroniser.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h"; sourceTree = "SOURCE_ROOT"; }; + CA8B960E006E1C65A6A2E8AA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_InputStream.h"; sourceTree = "SOURCE_ROOT"; }; + CAF913DD133AC8882640F266 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AlertWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_AlertWindow.h"; sourceTree = "SOURCE_ROOT"; }; + CB38F1D4BB78766DBD50FEB9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_URL.cpp"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_URL.cpp"; sourceTree = "SOURCE_ROOT"; }; + CB7C9535E3F994DBA41FC649 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PropertiesFile.cpp"; path = "../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp"; sourceTree = "SOURCE_ROOT"; }; + CBEE3341DEFF854B1D114C0B = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Meter_140x8.png"; path = "../../Resources/ui/Meter_140x8.png"; sourceTree = "SOURCE_ROOT"; }; + CC04B8DF2C8AAFD8DB02A142 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GlowEffect.h"; path = "../../JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.h"; sourceTree = "SOURCE_ROOT"; }; + CC1B6A4F3E42E9DE4C619D00 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DeletedAtShutdown.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.h"; sourceTree = "SOURCE_ROOT"; }; + CCBC05EAC1621CB1519FA5A4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TabbedComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + CCBC46262A82145F2206872E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioDeviceSelectorComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + CE30C698B8FC1E23D6A8BB35 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawablePath.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.h"; sourceTree = "SOURCE_ROOT"; }; + CE8542A4C8BB33C6A0EA36A4 = {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"; }; + CECC7AEC966A1651289B4701 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InterprocessConnectionServer.h"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h"; sourceTree = "SOURCE_ROOT"; }; + CEFACF205D94175B714846DB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SystemTrayIconComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h"; sourceTree = "SOURCE_ROOT"; }; + CFFA7532FAFF5655253878FE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Threads.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_android_Threads.cpp"; sourceTree = "SOURCE_ROOT"; }; + D0096F2804DF0875565D0051 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioDataConverters.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h"; sourceTree = "SOURCE_ROOT"; }; + D0178A36F6E46F92111E4883 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_VST3_Wrapper.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp"; sourceTree = "SOURCE_ROOT"; }; + D0A92955B64EB66E9334F51F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUOutputElement.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.h; sourceTree = "DEVELOPER_DIR"; }; + D1353A684AD92A6A9FAFBB1B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DynamicObject.cpp"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.cpp"; sourceTree = "SOURCE_ROOT"; }; + D154251B66BF13E992D3D06A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SystemTrayIconComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + D17049595AD1C1353337817D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageConvolutionKernel.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp"; sourceTree = "SOURCE_ROOT"; }; + D1BEED433BFC4AA10346BE1C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileSearchPath.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.cpp"; sourceTree = "SOURCE_ROOT"; }; + D251BD558FBD32ECA221D81C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUScopeElement.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.h; sourceTree = "DEVELOPER_DIR"; }; + D25566BCBFE5CCA4E425E6A7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Variant.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_Variant.h"; sourceTree = "SOURCE_ROOT"; }; + D2E57CCA4E6F6DBE2953744C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentBoundsConstrainer.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h"; sourceTree = "SOURCE_ROOT"; }; + D33DD8892334E06135451054 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileSearchPathListComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + D35E45B2269C44FCCAD7B1C4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Typeface.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.cpp"; sourceTree = "SOURCE_ROOT"; }; + D378EA436E4D111ECE7099C6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUViewLocalizedStringKeys.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUViewBase/AUViewLocalizedStringKeys.h; sourceTree = "DEVELOPER_DIR"; }; + D409BECBAD7CDC3DE48EFA2F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileInputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + D4811402C8922A6D8EB4C660 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioProcessorPlayer.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp"; sourceTree = "SOURCE_ROOT"; }; + D4B060A58438D21EE6CC8F76 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TimeSliceThread.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.h"; sourceTree = "SOURCE_ROOT"; }; + D4FC04482169FDDCEB7A3BB5 = {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"; }; + D564C8B4087316C3A47936B0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeCoordinate.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp"; sourceTree = "SOURCE_ROOT"; }; + D5E430C641A42BA4693AC4AF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ColourSelector.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_ColourSelector.cpp"; sourceTree = "SOURCE_ROOT"; }; + D5E8818F417B8FBF0F9FECBD = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Light_14x14.png"; path = "../../Resources/ui/Light_14x14.png"; sourceTree = "SOURCE_ROOT"; }; + D63FBBC40FA8CF0773BA9099 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FloatVectorOperations.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp"; sourceTree = "SOURCE_ROOT"; }; + D66793B7DB6B5CFC22A1BD9D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AlgoDisplay.h; path = ../../Source/AlgoDisplay.h; sourceTree = "SOURCE_ROOT"; }; + D6C62054C5A49E8BB8902DF8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LocalisedStrings.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.h"; sourceTree = "SOURCE_ROOT"; }; + D6C6FCBA5ECA257959BFE674 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_VST_Wrapper.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp"; sourceTree = "SOURCE_ROOT"; }; + D6DF0265148E2542CF8184CB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyPressMappingSet.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp"; sourceTree = "SOURCE_ROOT"; }; + D6F2BF4E3C3BE264123B3BB5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Javascript.h"; path = "../../JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.h"; sourceTree = "SOURCE_ROOT"; }; + D70670809153CBEA5AB4E359 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BigInteger.cpp"; path = "../../JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.cpp"; sourceTree = "SOURCE_ROOT"; }; + D74AFAA3C82432B7113CF705 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + D77B73AB3166A76FCA536E3C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NativeMessageBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_NativeMessageBox.h"; sourceTree = "SOURCE_ROOT"; }; + D7E27005916D044FD96919B8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReverbAudioSource.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; + D8038990994C30BDD631733E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RTAS_DigiCode2.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode2.cpp"; sourceTree = "SOURCE_ROOT"; }; + D8498304CBB374B2800442D4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LassoComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_LassoComponent.h"; sourceTree = "SOURCE_ROOT"; }; + D8F138F48E933ECCF2DB2321 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUCarbonViewControl.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewControl.cpp; sourceTree = "DEVELOPER_DIR"; }; + D90A42D47F3DD9C505D8A925 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SystemStats.h"; path = "../../JuceLibraryCode/modules/juce_core/system/juce_SystemStats.h"; sourceTree = "SOURCE_ROOT"; }; + D921C8001631F2FC4D7EFF9D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyboardFocusTraverser.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h"; sourceTree = "SOURCE_ROOT"; }; + D984CE634945077E682B48F3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DXComponents.cpp; path = ../../Source/DXComponents.cpp; sourceTree = "SOURCE_ROOT"; }; + DA27D90A90F1795DCD9DA064 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Value.cpp"; path = "../../JuceLibraryCode/modules/juce_data_structures/values/juce_Value.cpp"; sourceTree = "SOURCE_ROOT"; }; + DA4359972E065615EEF392EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ProgressBar.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ProgressBar.cpp"; sourceTree = "SOURCE_ROOT"; }; + DAEFEE4711393EBF6BC1EB3A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DropShadowEffect.h"; path = "../../JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.h"; sourceTree = "SOURCE_ROOT"; }; + DB3B5F6FE49267EE53089A05 = {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"; }; + DB9F89D1872247982F4D0913 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TableHeaderComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h"; sourceTree = "SOURCE_ROOT"; }; + DBCAF79038544A7B358D6549 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_curl_Network.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_curl_Network.cpp"; sourceTree = "SOURCE_ROOT"; }; + DBEA78ADC148399D593D22A9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorEditor.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h"; sourceTree = "SOURCE_ROOT"; }; + DC75DFCDFCDB425927B11EC0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PluginFx.h; path = ../../Source/PluginFx.h; sourceTree = "SOURCE_ROOT"; }; + DD1BF932ABF0CEC81A8B8A3A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DynamicObject.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.h"; sourceTree = "SOURCE_ROOT"; }; + DD683E5793B347EEB07FB199 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ArrayAllocationBase.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_ArrayAllocationBase.h"; sourceTree = "SOURCE_ROOT"; }; + DD9B0DAF1119ECB6FDC0A3AE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Path.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.cpp"; sourceTree = "SOURCE_ROOT"; }; + DDEEAB98F5FD8C74E02FA413 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CallbackMessage.h"; path = "../../JuceLibraryCode/modules/juce_events/messages/juce_CallbackMessage.h"; sourceTree = "SOURCE_ROOT"; }; + DE594C0E9F4887C1B92F41E7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LowLevelGraphicsContext.h"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h"; sourceTree = "SOURCE_ROOT"; }; + DE8C3DD36C117E355C7EB9FE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeParallelogram.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp"; sourceTree = "SOURCE_ROOT"; }; + DF8DE64F9BD944A64F90B0EC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BooleanPropertyComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; + E02D54F56C0EA9C94494CFF7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_KeyListener.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.h"; sourceTree = "SOURCE_ROOT"; }; + E0DB95731A18E8D551F378BF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableComposite.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp"; sourceTree = "SOURCE_ROOT"; }; + E18590F0257AB3D1F7F7CE8F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LeakedObjectDetector.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_LeakedObjectDetector.h"; sourceTree = "SOURCE_ROOT"; }; + E1E5A0164A129C5DA1FA8DB7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AffineTransform.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.cpp"; sourceTree = "SOURCE_ROOT"; }; + E2E2DC879339A8A8F83349D8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiMessage.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.cpp"; sourceTree = "SOURCE_ROOT"; }; + E2E7F9942FA653428A583920 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Colour.h"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.h"; sourceTree = "SOURCE_ROOT"; }; + E2FAE3B77A936D9AF0E8DEEC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_HyperlinkButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h"; sourceTree = "SOURCE_ROOT"; }; + E32283AE8CC5A022E1A6B30B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; + E44EB5B165F16ABE2DFB809D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileChooserDialogBox.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h"; sourceTree = "SOURCE_ROOT"; }; + E4644D1ECB4F5A7D7062E2CB = {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"; }; + E4C0D5FE28A85EDD44727BE3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GZIPCompressorOutputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h"; sourceTree = "SOURCE_ROOT"; }; + E5241F77EBB47E4DF15750FA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BubbleMessageComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h"; sourceTree = "SOURCE_ROOT"; }; + E56A4090F6CE76FD8C98FA76 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PropertiesFile.h"; path = "../../JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.h"; sourceTree = "SOURCE_ROOT"; }; + E59D9D6522A13C689785C032 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AsyncUpdater.cpp"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp"; sourceTree = "SOURCE_ROOT"; }; + E5ABDC305FF03E23A34302F1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MACAddress.h"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_MACAddress.h"; sourceTree = "SOURCE_ROOT"; }; + E5B0F6E8B90970181A8F8A5D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TextPropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + E5CD39DEA3BE8EC9959F8CFE = {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"; }; + E5D86302F07C5564E71BDD33 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MultiTouchMapper.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/native/juce_MultiTouchMapper.h"; sourceTree = "SOURCE_ROOT"; }; + E60515FDC5AD0779F615C43E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ZipFile.cpp"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.cpp"; sourceTree = "SOURCE_ROOT"; }; + E60A33E021C4CA870FFE07CF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Image.h"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_Image.h"; sourceTree = "SOURCE_ROOT"; }; + E65D3A0B86F5E8834CE77DB5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PNGLoader.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/image_formats/juce_PNGLoader.cpp"; sourceTree = "SOURCE_ROOT"; }; + E6F65C031FCBB192F3927D4C = {isa = PBXFileReference; lastKnownFileType = image.png; name = "ButtonUnlabeled_50x30.png"; path = "../../Resources/ui/ButtonUnlabeled_50x30.png"; sourceTree = "SOURCE_ROOT"; }; + E74E1F2048368E816394FA74 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LowLevelGraphicsPostScriptRenderer.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp"; sourceTree = "SOURCE_ROOT"; }; + E7E5B7A78A2D1C47285B79FC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ArrowButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + E7EF16D6D50A17A5672075F0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageCache.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.cpp"; sourceTree = "SOURCE_ROOT"; }; + E7F00CEE06961C2D9EDDA697 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_IIRFilter.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.cpp"; sourceTree = "SOURCE_ROOT"; }; + E84D9D5463240034FD814D49 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileInputSource.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + E8A01F45441E170E6190FADD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Button.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.h"; sourceTree = "SOURCE_ROOT"; }; + E8A7578ED10948AB49EE2997 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileTreeComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h"; sourceTree = "SOURCE_ROOT"; }; + E90C9A775597228F1F127252 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_EdgeTable.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.cpp"; sourceTree = "SOURCE_ROOT"; }; + E912092604DBF571BDC08D60 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableRectangle.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp"; sourceTree = "SOURCE_ROOT"; }; + E99DD30E1F2706D62695EB8C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Colours.h"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.h"; sourceTree = "SOURCE_ROOT"; }; + E9BA26E4F993EBFB0E36B18C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativePointPath.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.h"; sourceTree = "SOURCE_ROOT"; }; + E9E4792648C00B4A23C1A39D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableShape.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.h"; sourceTree = "SOURCE_ROOT"; }; + EA15BEB063E386B16E2CA557 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioProcessorEditor.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp"; sourceTree = "SOURCE_ROOT"; }; + EA6FC4F1F0D6EAE661569905 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PluginParam.h; path = ../../Source/PluginParam.h; sourceTree = "SOURCE_ROOT"; }; + EA765AB65F269CFAD6CA3BFE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MenuBarModel.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.cpp"; sourceTree = "SOURCE_ROOT"; }; + EAA5D8078BCC042BDF94C77A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RTAS_Wrapper.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp"; sourceTree = "SOURCE_ROOT"; }; + EACE6ED62F30C9222D91ACB2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InterprocessConnectionServer.cpp"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp"; sourceTree = "SOURCE_ROOT"; }; + EB7592B101CFEDF629993E39 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BasicNativeHeaders.h"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_BasicNativeHeaders.h"; sourceTree = "SOURCE_ROOT"; }; + EB82AEC0B78709874C1749EC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CodeEditorComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h"; sourceTree = "SOURCE_ROOT"; }; + EBC1D498822B210B1B578763 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Colours.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.cpp"; sourceTree = "SOURCE_ROOT"; }; + EBFE4F00A24A7C0304DEFA1A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ActionBroadcaster.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.h"; sourceTree = "SOURCE_ROOT"; }; + ECB0C2120DE11AE690DB987B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ListenerList.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ListenerList.h"; sourceTree = "SOURCE_ROOT"; }; + ECD18CF97A794402B04570DB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToolbarItemPalette.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp"; sourceTree = "SOURCE_ROOT"; }; + ED07CA90BA1A84256E31290F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MouseListener.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.cpp"; sourceTree = "SOURCE_ROOT"; }; + EE05AF7337689377BBF4A40B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BubbleComponent.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.h"; sourceTree = "SOURCE_ROOT"; }; + EE40D10A94911C19595F860D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MultiDocumentPanel.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h"; sourceTree = "SOURCE_ROOT"; }; + EE692C17A4DC2AC9A4C52173 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ActionListener.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionListener.h"; sourceTree = "SOURCE_ROOT"; }; + EE6F7ABA79C5D3A9FFCEC493 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GZIPDecompressorInputStream.h"; path = "../../JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h"; sourceTree = "SOURCE_ROOT"; }; + EEC5BFDA3C3B23D08E4528B7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Files.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_linux_Files.cpp"; sourceTree = "SOURCE_ROOT"; }; + EF0D818197F7203D3DEF156E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Toolbar.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Toolbar.h"; sourceTree = "SOURCE_ROOT"; }; + EF58FBB6E8FD659CC0939B06 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ResizableWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ResizableWindow.h"; sourceTree = "SOURCE_ROOT"; }; + EF5B2974D235161C6A1536A4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_SystemStats.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_win32_SystemStats.cpp"; sourceTree = "SOURCE_ROOT"; }; + EFABD729C0DFDF17DC9AAD80 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SharedResourcePointer.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_SharedResourcePointer.h"; sourceTree = "SOURCE_ROOT"; }; + F0A4AF9F51C7A271A41DB640 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChangeBroadcaster.h"; path = "../../JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h"; sourceTree = "SOURCE_ROOT"; }; + F0E8BE4931D56987065FE1C1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TemporaryFile.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.h"; sourceTree = "SOURCE_ROOT"; }; + F1406998FD7313F016AB99BA = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeCoordinatePositioner.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h"; sourceTree = "SOURCE_ROOT"; }; + F1B87A9524CB1BFD0A3CDC47 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Justification.h"; path = "../../JuceLibraryCode/modules/juce_graphics/placement/juce_Justification.h"; sourceTree = "SOURCE_ROOT"; }; + F1D186A91AC8D4E99EA16650 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MemoryOutputStream.cpp"; path = "../../JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.cpp"; sourceTree = "SOURCE_ROOT"; }; + F213F6D6186ABA1FD60ADC42 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PathIterator.h"; path = "../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.h"; sourceTree = "SOURCE_ROOT"; }; + F221CF21582EE0B8FE774583 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ParamDialog.cpp; path = ../../Source/ParamDialog.cpp; sourceTree = "SOURCE_ROOT"; }; + F258C148A5FB04C70976E92A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SysexComm.h; path = ../../Source/SysexComm.h; sourceTree = "SOURCE_ROOT"; }; + F273ED17232368EBFAFC820B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DropShadowEffect.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.cpp"; sourceTree = "SOURCE_ROOT"; }; + F27DB431B9ECEE07B84281E8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextButton.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.h"; sourceTree = "SOURCE_ROOT"; }; + F2A26292713BB459A7AE5780 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageCache.h"; path = "../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.h"; sourceTree = "SOURCE_ROOT"; }; + F2C763A217C6D0704C6FB4F2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUCarbonViewBase.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewBase.h; sourceTree = "DEVELOPER_DIR"; }; + F3171B20C2BBF12A5786B1F5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CAAudioChannelLayout.cpp; path = Extras/CoreAudio/PublicUtility/CAAudioChannelLayout.cpp; sourceTree = "DEVELOPER_DIR"; }; + F32BA2ADBCF84519105AB974 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextDiff.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_TextDiff.h"; sourceTree = "SOURCE_ROOT"; }; + F3718D9D288A2760B6126585 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_mac_CoreGraphicsContext.h"; path = "../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h"; sourceTree = "SOURCE_ROOT"; }; + F38E4F0A432CAB98BA8F4F8A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "fm_op_kernel.h"; path = "../../Source/msfa/fm_op_kernel.h"; sourceTree = "SOURCE_ROOT"; }; + F39BD87913AB2F91817C50EF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableImage.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp"; sourceTree = "SOURCE_ROOT"; }; + F3EADB9BD1C520ABD153B785 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioPluginInstance.h"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h"; sourceTree = "SOURCE_ROOT"; }; + F4050C3BAC97B06A7ED35103 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAStreamBasicDescription.h; path = Extras/CoreAudio/PublicUtility/CAStreamBasicDescription.h; sourceTree = "DEVELOPER_DIR"; }; + F426F0185DB4E97E1E59A807 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../JuceLibraryCode/modules/juce_events/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + F47FA981083705D4B545339F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = pitchenv.h; path = ../../Source/msfa/pitchenv.h; sourceTree = "SOURCE_ROOT"; }; + F4EA09FAC67FDDA4D2E1D151 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_InterprocessConnection.h"; path = "../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.h"; sourceTree = "SOURCE_ROOT"; }; + F598F4A108550EDBF7504E7B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ThreadPool.cpp"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.cpp"; sourceTree = "SOURCE_ROOT"; }; + F5E56D366A88F772BE998AED = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryMappedFile.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_MemoryMappedFile.h"; sourceTree = "SOURCE_ROOT"; }; + F63CE53483AF125DCFB024F1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = exp2.cc; path = ../../Source/msfa/exp2.cc; sourceTree = "SOURCE_ROOT"; }; + F68AA879901D4E695CBC3FAF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_VSTPluginFormat.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + F6F950B6ABB40B62AE4C0B78 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_VST_Wrapper.mm"; path = "../../JuceLibraryCode/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm"; sourceTree = "SOURCE_ROOT"; }; + F74CAAECFC16D1E87041E5A7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DropShadower.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.h"; sourceTree = "SOURCE_ROOT"; }; + F7826D43ACD985679DEACFD0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PluginDescription.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.cpp"; sourceTree = "SOURCE_ROOT"; }; + F7B762EB74B4145099C06C5A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUBase.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.h; sourceTree = "DEVELOPER_DIR"; }; + F805C241B3074BB357475216 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToolbarButton.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp"; sourceTree = "SOURCE_ROOT"; }; + F83AF328F15F82C722B45598 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ImageEffectFilter.h"; path = "../../JuceLibraryCode/modules/juce_graphics/effects/juce_ImageEffectFilter.h"; sourceTree = "SOURCE_ROOT"; }; + F8A589597222065EA52C4F9C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_CommonFile.cpp"; path = "../../JuceLibraryCode/modules/juce_core/native/juce_linux_CommonFile.cpp"; sourceTree = "SOURCE_ROOT"; }; + F919F7358EF25E87A7BCC01D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AlertWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_AlertWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + F93F29D9762799B24457617D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DialogWindow.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DialogWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; + F957420DFF4D2354671B4116 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RectanglePlacement.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.cpp"; sourceTree = "SOURCE_ROOT"; }; + F9B29C9F01195D5A979AB5C9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SVGParser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_SVGParser.cpp"; sourceTree = "SOURCE_ROOT"; }; + F9FA29A5FF9C9921D785A1C0 = {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"; }; + FA0406B777C1CB9C71F86BC1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LuaCodeTokeniser.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp"; sourceTree = "SOURCE_ROOT"; }; + FA726CE9275EF0E84BBEA666 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LinkedListPointer.h"; path = "../../JuceLibraryCode/modules/juce_core/containers/juce_LinkedListPointer.h"; sourceTree = "SOURCE_ROOT"; }; + FA98BC06299525310A31107B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Label.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Label.h"; sourceTree = "SOURCE_ROOT"; }; + FAC5045BEAA6C0B1AC904BED = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextDragAndDropTarget.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h"; sourceTree = "SOURCE_ROOT"; }; + FB135AE48DBB6E5CF88A30F1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DocumentWindow.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_DocumentWindow.h"; sourceTree = "SOURCE_ROOT"; }; + FB35DC2702275D1038B7B960 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OptionalScopedPointer.h"; path = "../../JuceLibraryCode/modules/juce_core/memory/juce_OptionalScopedPointer.h"; sourceTree = "SOURCE_ROOT"; }; + FB48147A1424E6D0A320DA6B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_HighResolutionTimer.h"; path = "../../JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.h"; sourceTree = "SOURCE_ROOT"; }; + FC452B781AEE181BEF7F948E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentPeer.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp"; sourceTree = "SOURCE_ROOT"; }; + FC856709502EE15E8D3F448B = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; + FCABD85F0480D4972896F379 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ReverbAudioSource.cpp"; path = "../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; + FCBA692E842A80D9618CA467 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LiveConstantEditor.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_LiveConstantEditor.h"; sourceTree = "SOURCE_ROOT"; }; + FD2285710D78FDBC856ADF13 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorPlayer.h"; path = "../../JuceLibraryCode/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h"; sourceTree = "SOURCE_ROOT"; }; + FD333147C1339A81B846EC52 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RecentlyOpenedFilesList.h"; path = "../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h"; sourceTree = "SOURCE_ROOT"; }; + FD799268DEA0EC4CDFD4DA10 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NewLine.h"; path = "../../JuceLibraryCode/modules/juce_core/text/juce_NewLine.h"; sourceTree = "SOURCE_ROOT"; }; + FDA8E9094D7495F5116F7742 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PluginHostType.h"; path = "../../JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_PluginHostType.h"; sourceTree = "SOURCE_ROOT"; }; + FDDB0277D2D036AEFA3EBD2D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Font.cpp"; path = "../../JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.cpp"; sourceTree = "SOURCE_ROOT"; }; + FE42B80DEA2E49C07E9E1C0A = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeRectangle.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp"; sourceTree = "SOURCE_ROOT"; }; + FF01650D69FB076FD8FCCE32 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PropertyComponent.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + FF46344F53B1AE5119D163D5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CarbonVisibility.h"; path = "../../JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_CarbonVisibility.h"; sourceTree = "SOURCE_ROOT"; }; + FF5B77AA3517B4637F862BD3 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeCoordinatePositioner.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp"; sourceTree = "SOURCE_ROOT"; }; + FF6607118B29435E76806DFA = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Dexed.component; sourceTree = "BUILT_PRODUCTS_DIR"; }; + FF973BD60572C077A148D3AB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WildcardFileFilter.h"; path = "../../JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.h"; sourceTree = "SOURCE_ROOT"; }; + F472964B0FFEE5615B72CE3D = {isa = PBXGroup; children = ( + 0D5761BE1D2DEA319B57D740, + E6F65C031FCBB192F3927D4C, + 8B19E0BEAD29F2C0D46FA89C, + 4C67D4B9902C1B0CC80E11D8, + D5E8818F417B8FBF0F9FECBD, + CBEE3341DEFF854B1D114C0B, + 66E042C6FFE93F0E19B32F09, + C7577AF98915C39EDCEC259A, + 1D72CD485011A4EA3E6B0FD5, + 5A366F36F3B4E50587A30351, + 15B75D829C40872D542A38B8, + 0E3FA3D7B11FC7D19CC634BE, + 624B39364165E2F23A3D4540, + 9FB43E65C5F68B31FB16D0F5, ); name = Resources; sourceTree = ""; }; + 0652CE27AE4971C99654E3BF = {isa = PBXGroup; children = ( + 8BADEB7BF1A65E83A7A1736D, + DC75DFCDFCDB425927B11EC0, + 8BEBEDCAD409EE3A5D383B6D, + C222D35AC4FC5C2A3BB0F8B6, + 61F792AFE04C15F413A4F766, + 7A58027CF8C6967B02370E01, ); name = dsp; sourceTree = ""; }; + 427DD4218ED26D69B0149A90 = {isa = PBXGroup; children = ( + 018D0FB9E97B68D2EB3E3F72, + BD25F7AC4728A7875B6AE9D5, + 6B3889626BDBB814F2387085, + 1C3A85D115878AA5A495199E, + BF7A1720DADC7983F61E895C, + 0831514ABD7A268115E6FD43, + F221CF21582EE0B8FE774583, + 9AAC5E6C1A21F8FE2F66F0E0, + 03813BF0D93D100F6F0393C9, + D66793B7DB6B5CFC22A1BD9D, + A02775EA788AD4BF7DD1B1A1, + 29D6A187B80D22EB609C256D, + D984CE634945077E682B48F3, + 4567FB06348FF519FDC6D698, + 838E63F5800CA577B92EF6AE, + C2AA393651CBC37DCD7718BD, + 19CEF599CB23958AC63D427E, + 4B70CBF4DB4E571EDF5D3114, ); name = ui; sourceTree = ""; }; + BDC5059F1563FD8DD69AD324 = {isa = PBXGroup; children = ( + 3715DFDD7A1B12083F051F5A, + 8F395B738E7AB81A0333AF96, + 2D26E2304C0F6FC633936014, + 86412A8C98A3287951990C1B, + AF1DFD842A36E967DF140D5C, + 30B133CA0CDC245A147F4689, + AE09B4C2A4BDE8FDA01A8A13, + C6928FE8579AE1980061CA43, + 00FDFD1ABE59B4CEF74BF5A3, + 64CF42AFC2E05AEF9D350CD2, + F63CE53483AF125DCFB024F1, + 8AF9F9504D8671A590689E28, + C01EE75D859C1F942DA3AE61, + 1B06A67DF2B4FD2969A9781A, + 78CA76788217B98287D9E007, + F38E4F0A432CAB98BA8F4F8A, + 68EBBB35B7A5A57E4BA2F8E2, + 51E5757E2D48E638F9A4CB61, + F47FA981083705D4B545339F, + B0230FCCA099E6430411DFC9, + 3BE8F91A99E8F48CB9F10C1F, + 68D35AFE11BAA35EAE497D47, ); name = msfa; sourceTree = ""; }; + 29B923E6EB12F97B68585AFC = {isa = PBXGroup; children = ( + 0652CE27AE4971C99654E3BF, + 427DD4218ED26D69B0149A90, + BDC5059F1563FD8DD69AD324, + 0BD21CA621B7350EBED18C0A, + 45ADFD8885BE76C7F7D999AC, + 5C0A1B7E2BF8FCAF5A1E8616, + 59D15F780D468B587F9C7E78, + EA6FC4F1F0D6EAE661569905, + 7936BBAA586387B2FAFB958B, + C56E401381FF968837F82364, + 65BE679590BFE2466E16EA67, + F258C148A5FB04C70976E92A, ); name = Source; sourceTree = ""; }; + C21CEF3B473FDC99270B7623 = {isa = PBXGroup; children = ( + F472964B0FFEE5615B72CE3D, + 29B923E6EB12F97B68585AFC, ); name = Dexed; sourceTree = ""; }; + 69C415E16F27D7D969B1F5D4 = {isa = PBXGroup; children = ( + 1407F2665A3CA985C142273B, + D0096F2804DF0875565D0051, + 2A61EE6E849869617187D67A, + 1D95A78059DCCC7B58782F07, + D63FBBC40FA8CF0773BA9099, + 105DA88FCA60BE6C92A7249B, ); name = buffers; sourceTree = ""; }; + 8505FC6FFB5A4A907383795E = {isa = PBXGroup; children = ( + 71A60F40B7B20297A1A5CB18, + A810A279E11A672B8F84AD72, + 33DDC7D3B0B83DF72DF167AC, + B55F33C584CCF617C5C71EE6, + 3DC88C42A001EAAB6B959C6F, + 6F98D6B8CAA0577CE576CD06, + E2E2DC879339A8A8F83349D8, + 7202164C1666053D423871B0, + 49B29E84D07EAF1F08C30A4F, + 73E07C2D38F6ABA12AD6A458, ); name = midi; sourceTree = ""; }; + 22B86A69849E8A8394A7512D = {isa = PBXGroup; children = ( + 7A0FB6545BA2E344A1F45EA5, + BFD53B08DAEB98B6DD5D77B7, + 6A33E3588893DFC8E8370460, + E7F00CEE06961C2D9EDDA697, + 518104B0010D2466EB51D01A, + 46908987EEFC3623A53A95C2, + A040ED3E3D914E80D6F56110, + 8A566C440278C23B8FB3A9AB, ); name = effects; sourceTree = ""; }; + 119C8C138453E1EDB43BB203 = {isa = PBXGroup; children = ( + 528BBDB63A8BF7246C4DDBA1, + BFE7C6795569A2BC4EEF91FB, + 20D22F9CE83DD70583C68940, + 57A533082FEF0CE002D69EDB, + 3A2DE2FA7B6D718AEF872F43, + 7A26D67672786E0663369D49, + 3A0F35877A9E2F5D5D6A0434, + 5BA236D62129EFE13A9EAB1B, + 30C8F9B8F2E0D9D572E43E7A, + A95F8438AE6F3BA4CCD2A1EE, + 5548DEE5ED071453F8AD8AB6, + 37FEC98938A31E7E6DE9D515, + FCABD85F0480D4972896F379, + D7E27005916D044FD96919B8, + A0C5AA7F71F5C650FBBB83C9, + A57ACCF886A902BBCB603D5B, ); name = sources; sourceTree = ""; }; + 32FC8884626A89F0A805D4C0 = {isa = PBXGroup; children = ( + B4C62338187DC6B1B1F0CF54, + C49F636E4677A7C8C62A9859, ); name = synthesisers; sourceTree = ""; }; + A6591E1C9596C9585841C280 = {isa = PBXGroup; children = ( + 69C415E16F27D7D969B1F5D4, + 8505FC6FFB5A4A907383795E, + 22B86A69849E8A8394A7512D, + 119C8C138453E1EDB43BB203, + 32FC8884626A89F0A805D4C0, + 44E53EF6DC2C6F714A7863C0, + 15F31F8C2BAC231631AC3156, ); name = "juce_audio_basics"; sourceTree = ""; }; + D53856B782944C7AA8FC0B1E = {isa = PBXGroup; children = ( + 502D49C82606515A80907EB3, ); name = AU; sourceTree = ""; }; + 9302146DD804F9CBF819DE20 = {isa = PBXGroup; children = ( + 55E39FAA63BA8B9D40F40712, + D8038990994C30BDD631733E, + 4574217C2F5219DEDDDC9656, + 4E32AAF34A5EE096B8F3918E, + EAA5D8078BCC042BDF94C77A, + C7C6039A52C3EE370CA9E73A, + 3E312C7BB77E7FF22DF88B96, ); name = RTAS; sourceTree = ""; }; + B794B15ADD462305846C5903 = {isa = PBXGroup; children = ( + D6C6FCBA5ECA257959BFE674, + F6F950B6ABB40B62AE4C0B78, ); name = VST; sourceTree = ""; }; + FA8A91020A6EDA9A5DDF8D4A = {isa = PBXGroup; children = ( + D0178A36F6E46F92111E4883, + 01EF232D8B427B8CE38127C2, ); name = VST3; sourceTree = ""; }; + C6FD96042B8BCA45D8185D2F = {isa = PBXGroup; children = ( + 505852570B48EB3F18076B03, + 3254CAE4C282C4432214B016, ); name = AAX; sourceTree = ""; }; + 0FB9E2767E5705CC99B13E68 = {isa = PBXGroup; children = ( + FF46344F53B1AE5119D163D5, + C33C134DA87CD13FAF7BC5A1, + 477946525F6F1BE9135A3101, + 1358A353CB770ABF4DF73417, + A4010716414361F5F304407A, + FDA8E9094D7495F5116F7742, + B63E7FBEF314AA2B6A8083F4, + 4FD935EA5DAA0EAB4F266B2E, ); name = utility; sourceTree = ""; }; + C1286EFB30F4A6B5049A6E42 = {isa = PBXGroup; children = ( + D53856B782944C7AA8FC0B1E, + 9302146DD804F9CBF819DE20, + B794B15ADD462305846C5903, + FA8A91020A6EDA9A5DDF8D4A, + C6FD96042B8BCA45D8185D2F, + 0FB9E2767E5705CC99B13E68, + 7F1B3807BE4D056A05E18663, + BB7808FBEB84DD9C60978532, ); name = "juce_audio_plugin_client"; sourceTree = ""; }; + 2BB71E1725728DD1B293B270 = {isa = PBXGroup; children = ( + 7353E96136FAD8E0F0FAF2F3, + F3EADB9BD1C520ABD153B785, + B5D800CC11CBD506E9A6F4FB, + BEA2BC710D949E126E974D78, + EA15BEB063E386B16E2CA557, + DBEA78ADC148399D593D22A9, + 749FDD4CF73F9C8E26D09A7B, + 21E609C00045B8F41BA21DFE, + C29DCEB09280116E3F4E87C3, + 80B36B053E1EA2D1352BD0C9, + 4B82A76027BA14576D476E62, + 306D1B033E8EBB80F1E9A24A, + F7826D43ACD985679DEACFD0, + 8E04EF74113A0E9808FC4F09, ); name = processors; sourceTree = ""; }; + C89C5C051357DB3B9CD08C20 = {isa = PBXGroup; children = ( + B773C79C475482598391DF35, + 734BB0B03974DF78B8CB4FD8, + 37A3210291F1C2B3FF42BCDD, + 1914E45DEAEBD1592581F1FD, ); name = format; sourceTree = ""; }; + 90142123059D93BCEAB712F8 = {isa = PBXGroup; children = ( + 30DDED034404C826CAF112BB, + 78934C6C88D2B35DEF15BAB8, + 6E8FC799E88893F8CD15BB71, + B4AA6DED570BD1D3E701BA49, + 7DC83451FCA10947AC92EBBC, + 07333A7932C6B7538F4DF21F, + 3F15C4289E956EA0447392BD, + 153D4DE95D01307F844AA15B, + 83DC5A4F730ECA567FADFC3E, + F68AA879901D4E695CBC3FAF, + BEAE9210BD434DD07FD67CBF, ); name = "format_types"; sourceTree = ""; }; + 48B3AA9536D8F0B4104D3591 = {isa = PBXGroup; children = ( + 29AE4D440A28441D61C76EF4, + 5FE10203FC5AE23DBA573E3B, + 2754940A96851188581A2218, + 4AF614890823731010E97943, + 5A1BD822F8CB7D42BB0EAF7A, + 53CD8A358FB75E4D10571218, ); name = scanning; sourceTree = ""; }; + 51D3ACB3B8EB13CB9843F7F8 = {isa = PBXGroup; children = ( + 2BB71E1725728DD1B293B270, + C89C5C051357DB3B9CD08C20, + 90142123059D93BCEAB712F8, + 48B3AA9536D8F0B4104D3591, + 217D5E7DC9D4006AA1994A96, + 226462AF67A3DAA0A74B5BF0, ); name = "juce_audio_processors"; sourceTree = ""; }; + FA1B75BBFC7775827EA55903 = {isa = PBXGroup; children = ( + AC613C24CC21A18FCD6CD50B, + 4BC3C087DB2E037A932E3C57, + CCBC46262A82145F2206872E, + AC6693856E8A4626E5571CBC, + A03CA8621EA02C18B4117EC1, + B4821C5DCA629694CE0A29FB, + BF536BFBEDDD9802B9516022, + 3FEF83E9DA03570247528BE6, + 6F09FAB37276B4DA24BEBD41, + 2480150B544761DFA3DFF509, + 490146B41BBBC0E550BD73F2, ); name = gui; sourceTree = ""; }; + 79A8B90680DBB403FBF0FEB3 = {isa = PBXGroup; children = ( + D4811402C8922A6D8EB4C660, + FD2285710D78FDBC856ADF13, ); name = players; sourceTree = ""; }; + 93DBDE35F9396CE4E89673FB = {isa = PBXGroup; children = ( + FA1B75BBFC7775827EA55903, + 79A8B90680DBB403FBF0FEB3, + 4778838DB96C82580CBE10D0, + 687A7EC567E4B00B663808F1, ); name = "juce_audio_utils"; sourceTree = ""; }; + C563903C95875B98E023EB42 = {isa = PBXGroup; children = ( + 400C107C97F668916CF93FB2, + 980D53B155A6FE153BF4ECC4, + 23E9F8B6075CCB7BA9FE4782, + 43E05BD9AADCBDA27B58F5A4, + 45CC11D2029BA2CEAE1B0F76, + BC383B9F2F352E373DE6C4A6, + 7144CB121F03A13EC1A5383F, + 70BB114924D2EB3508565E8F, + AC0E5E706FA5E8597F943065, + D6C62054C5A49E8BB8902DF8, + FD799268DEA0EC4CDFD4DA10, + 32707C43C25AF3F79D120BCF, + A190462810A30005F66291F9, + 0733471B6DA02299D2C9590A, + 112C97A7D8CEC06ED2E1B1BE, + 7CDDAFACA226D14742566EE3, + BE0C6895B768F38281CCC0BC, + 1600EDBEE9B363CBAB68CD43, + 2BEBDED2BACDEEEE975583F3, + C294314DFA3B047D1F745A23, + B8F528366A0422FC84469E80, + F32BA2ADBCF84519105AB974, ); name = text; sourceTree = ""; }; + 0A1CD2C6C377E596E2BB643C = {isa = PBXGroup; children = ( + D70670809153CBEA5AB4E359, + 55474A49BF29196733C89BBB, + 6C1EBFA6E5161BFC6E0A6686, + 2BAC9F6B6869D1E85C51540B, + 0707C87B401DC983E3FF4263, + 1629C7407F033B97102CEF6B, + 89BBB19B9AFC6DAD43B9B512, + 83FAEF9BE29243FBED61B39F, + BF47505F73A4CD4D0EB3F430, ); name = maths; sourceTree = ""; }; + 82CBE4344E05C198564C7023 = {isa = PBXGroup; children = ( + 72F3014666D709C2DC843E32, + A0492880578DCB9152DE5EAD, + 6CBCD70FF1AE3E23D1598F84, + AED57A3601CE4B9FF8007855, + E18590F0257AB3D1F7F7CE8F, + 21BB88DADCF2268F24A63357, + 61A517E758E2BF89FF445D7F, + 7F0B06EA0B38D4555CFEBA61, + FB35DC2702275D1038B7B960, + 7A739B1B4B833A4668904CA6, + 4350188F5B6D76DC651BA40E, + EFABD729C0DFDF17DC9AAD80, + 8CE45844BA3103D92458CFB5, + 6475DF69D5BDC709E275BF4D, ); name = memory; sourceTree = ""; }; + 7F5AB44BFB3A934F692FA931 = {isa = PBXGroup; children = ( + 21B76774F02A7242990E433C, + 07CB27E064E2A82C2B1D3832, + 0B2C1056583363B66704DB9C, + DD683E5793B347EEB07FB199, + D1353A684AD92A6A9FAFBB1B, + DD1BF932ABF0CEC81A8B8A3A, + 0DE1759C594D2719742E928A, + 2D8A5B5929909ADD898D7E00, + FA726CE9275EF0E84BBEA666, + 6F0921F115160B435DC6D1D5, + 71FDCC63A1963F976C7AC8EE, + A3B840D8C76CA45D3096241C, + AE4B8002F4435BEADA3AE966, + 3F948548BB22C3E546E5B0C6, + 4166468539A5F6E92A7A153E, + B6A004CD5808CFA5481EFA02, + 05F4DA9558D39B50DA5DEF79, + 80149DC851E70B4D50DA03DB, + 9196D1FCEC768D074AAAD581, + D25566BCBFE5CCA4E425E6A7, ); name = containers; sourceTree = ""; }; + 4A2152604F8F0C4007090ED3 = {isa = PBXGroup; children = ( + 72C174C879B2CA24DCE2B6EC, + 7AB9FBAA49422497E050FFAC, + 9098E2A57CB22B2D5F675D9C, + 0C0B6B8DAD62A3F5C926825F, + 40ACF762CE264F32184C4F7D, + FB48147A1424E6D0A320DA6B, + 50EDB2B0543B5881029D3CCE, + 214092134C5925973C210C26, + AF298423A147823848DFBC30, + 4497D4F58A495EF3F3DB7DD2, + 8B87D00DA619D83BA6926E28, + 7658FE299B81691CFC697431, + 9EA6B9182B39D4F9B416B14A, + 2B455841042E415B99DEE263, + 7F081876B753390FC305329F, + 9B103127E2063BAFD4A4FD33, + 11842D3DF751D5951BD039D4, + F598F4A108550EDBF7504E7B, + 9F9EAFF1322AAE2B114A611B, + 11AEAEFECC79A2800B56DDF9, + D4B060A58438D21EE6CC8F76, + 91544DAFCDBE05708D10A24C, ); name = threads; sourceTree = ""; }; + 97627FB0974924D059AC681B = {isa = PBXGroup; children = ( + 02E962E65624D43B0906B0C6, + 13BE37C7C7C4904EE42B9CEA, + 1D31136D1C9D959792023095, + 03BC5E395E7CFFE130B7E5DE, + 7BF1EEFA4D36A91714D26060, + 8BBE375590444CD57A311DD2, ); name = time; sourceTree = ""; }; + 894A275601B3879388492127 = {isa = PBXGroup; children = ( + 247E415D0635F05B4067C255, + 4D488219CE9D736D69F6EF59, + 39423D67EFB8E7CEEF5FFAA9, + 95B7D6B36478C5A2977ADD4C, + 7ECA74A2FC82F26715446C70, + 2C65FDA74486C92DF5EA5C87, + D409BECBAD7CDC3DE48EFA2F, + 418C5A909668054B5140BDA9, + B446CB8C1ED8823EA2F33E30, + A70082D71DB8B5D779944812, + D1BEED433BFC4AA10346BE1C, + 3BB7B60AE87F68C10DBEE118, + F5E56D366A88F772BE998AED, + 4370F9713D43E71621F2AA2A, + F0E8BE4931D56987065FE1C1, + 829D2BFEB85DC3589FEBB868, + FF973BD60572C077A148D3AB, ); name = files; sourceTree = ""; }; + F71D9B3CC8688C2E11360EA4 = {isa = PBXGroup; children = ( + 06C4DD7797E7526DB1B47AE5, + 3444F7C54161FEB1F844619E, + 1F51658DEF590741920719FF, + E5ABDC305FF03E23A34302F1, + B4CCE3F32C6854405890C6BC, + 89CF359102665330C30E1F9A, + B8007B51F9FA8B2F52EF4CCD, + 8DC0C64EE71D0AFDD76FEAD7, + CB38F1D4BB78766DBD50FEB9, + 7A854175B4E6D35ABB7D4E45, ); name = network; sourceTree = ""; }; + 74D3D6965B4466AA78078555 = {isa = PBXGroup; children = ( + C78890910E4BE9A24F562397, + 4C3F61A4672F57399AB751A0, + E84D9D5463240034FD814D49, + 6E84E300D2ECD62ED1ED3478, + C92DFD53D297FAD265D1DB8D, + 3CAC36F05E2A916F49F6DC42, + CA8B960E006E1C65A6A2E8AA, + 95D4F595A6D807E681E1E2B5, + 954708C705637A2F8F204F0A, + F1D186A91AC8D4E99EA16650, + 2D9932D322EDA14CC872D08B, + 5F7F52E503E2E2B59D055E6C, + 2898384503D98B9CDE677C8F, + 33D3EE89C713EBE01C1D268D, + 22520CCBD52F680200524E87, ); name = streams; sourceTree = ""; }; + 5A49F3FE7F309CCDF2AA6D13 = {isa = PBXGroup; children = ( + 2A28E0E1ED91E3E66DD795C0, + A700ACBCC4D648B60362B3D6, + 212A0795619AC3D8387EB085, + A5C29A814EAFAD95B416C624, ); name = logging; sourceTree = ""; }; + B8C13B5C9FC988D111F5E51C = {isa = PBXGroup; children = ( + B29C1AA0C72B3F9D34F7FEE4, + 4342EA166DD20D383F6C9E50, + A11BA069921359F646E104A1, + 037F8EB68705A98C29AEE6B0, + D90A42D47F3DD9C505D8A925, + 77207D1536974D96B7ED2B85, ); name = system; sourceTree = ""; }; + 714343436E30203E40079511 = {isa = PBXGroup; children = ( + 03F0A9F328C7E73E37F70774, + 06387FD4ED709086E8E0152E, + 7C2634F55C78A3822A661CE2, + 9514C57B8C2FC488E49FF841, ); name = xml; sourceTree = ""; }; + DC210A66C6446D4F9D7B158B = {isa = PBXGroup; children = ( + 7FB4F731D177B36CE8616BAE, + D6F2BF4E3C3BE264123B3BB5, + A27B095F0D44EB7FFFC3951E, + 36E8717C91C6111A701379EB, ); name = javascript; sourceTree = ""; }; + 96D22057687FB227E2CD4C2C = {isa = PBXGroup; children = ( + 1F5C171B3E8790746AD764E6, + E4C0D5FE28A85EDD44727BE3, + AFB323F45D65FBC8B472B825, + EE6F7ABA79C5D3A9FFCEC493, + E60515FDC5AD0779F615C43E, + 475CE9A832328566544F457F, ); name = zip; sourceTree = ""; }; + E82FE59C6CD1F7A9DFD0A3DC = {isa = PBXGroup; children = ( + 8890765D8A8E2769231452A3, + AAD65774913834A6443A3B82, ); name = "unit_tests"; sourceTree = ""; }; + 16EFEE06D414EBB4E08A3DCA = {isa = PBXGroup; children = ( + 7FCE241BE34BC4D1E6988B1F, + 587A3ADC691765F0227C4707, + 99FFA4AC86A982F68CE03ED3, + 51D460DE650B5F3701174605, + 9B36F7CC7A136C2AEB4E5E53, ); name = misc; sourceTree = ""; }; + ABA32CBE72FAA2F9AD8357E4 = {isa = PBXGroup; children = ( + B1D9F99AC498364816DAC219, + A3E39527888583E832999240, + 268719C746B8E5EA06DDCF01, + 2068B2F409A743F7AA6005B8, + C4282ED857CAA664F85D5C4D, + CFFA7532FAFF5655253878FE, + EB7592B101CFEDF629993E39, + DBCAF79038544A7B358D6549, + F8A589597222065EA52C4F9C, + EEC5BFDA3C3B23D08E4528B7, + 6CAAD366E2D6A650900C75F0, + 2010DBBC52928BD3BA2E0704, + 448630170E2B48A00FBBA757, + 5D131F468F18FD82C14C3849, + 30956FDD9C1C2D706020AB84, + 49D8BE8809C3C20272870C06, + 5197B9D23C0D9B28F2FF7F93, + 99B1A018081D90D801667296, + 3A2252FE59FEB529074751B8, + 47168956BF1BAC3FCBD55BB8, + 8FB4C261F0F3760EEA4B7BBE, + C7EFC098CAC8AAB04A9D5183, + 0353CE3273A1063693BC5D55, + BF9449063F547456209F21FE, + B240D74DFFCFE7CC095CEF59, + EF5B2974D235161C6A1536A4, + BEEB5F341047830F06857DD9, ); name = native; sourceTree = ""; }; + 64272C7AB634CC1683F965CD = {isa = PBXGroup; children = ( + C563903C95875B98E023EB42, + 0A1CD2C6C377E596E2BB643C, + 82CBE4344E05C198564C7023, + 7F5AB44BFB3A934F692FA931, + 4A2152604F8F0C4007090ED3, + 97627FB0974924D059AC681B, + 894A275601B3879388492127, + F71D9B3CC8688C2E11360EA4, + 74D3D6965B4466AA78078555, + 5A49F3FE7F309CCDF2AA6D13, + B8C13B5C9FC988D111F5E51C, + 714343436E30203E40079511, + DC210A66C6446D4F9D7B158B, + 96D22057687FB227E2CD4C2C, + E82FE59C6CD1F7A9DFD0A3DC, + 16EFEE06D414EBB4E08A3DCA, + ABA32CBE72FAA2F9AD8357E4, + 2B905EB5C391A1F8D80EA4EE, + 153DD72C28F1B2C131090DEE, ); name = "juce_core"; sourceTree = ""; }; + 3F504387EAE40781EC731BB7 = {isa = PBXGroup; children = ( + DA27D90A90F1795DCD9DA064, + 543415735FAC3778D98C649B, + A348DAE6ECDEF51CAD6B5FE4, + B779A3FF92AF0ED28B97C03A, + 540CB571BDB23FFECCE0CD1B, + C9BA4E2199E2302799EFB744, ); name = values; sourceTree = ""; }; + 128F041FBAC450E8521EE891 = {isa = PBXGroup; children = ( + 3F0F5E60F2077B05385D6122, + 496ADA4A8E3A7E4906EADC88, + A763DB1FF5441EFF39491530, ); name = undomanager; sourceTree = ""; }; + 2D679CDB5DE0ECF6326A67CD = {isa = PBXGroup; children = ( + 9ED32BCD42EFF79D067525DF, + 306255E12C87DF0405A5D9EE, + CB7C9535E3F994DBA41FC649, + E56A4090F6CE76FD8C98FA76, ); name = "app_properties"; sourceTree = ""; }; + D617988BED63CC4252FDB0A6 = {isa = PBXGroup; children = ( + 3F504387EAE40781EC731BB7, + 128F041FBAC450E8521EE891, + 2D679CDB5DE0ECF6326A67CD, + 6D9DB37328ED695A9941A21C, + 930D512FD24D7E21E43C7322, ); name = "juce_data_structures"; sourceTree = ""; }; + 24E56C122BA7B936EB30D9EE = {isa = PBXGroup; children = ( + 33E4BED358B8566CCEE47B95, + C1CB32E507C8F16FFF6014F6, + DDEEAB98F5FD8C74E02FA413, + A1CD23B489568CB51325DB98, + CC1B6A4F3E42E9DE4C619D00, + 866BB30F214A58492E281430, + 2DF03B864D4F23315F18CC24, + 853996FFE0D8585AACC747C4, + 2752A284F49F193F36688FAA, + 006FC3A3740D97EE2F4A78B3, + 8D7D3383FF13817F3B277B02, + 0FB6B4A8DC064694A4A3B271, + A83F026919CEDB80894F3798, ); name = messages; sourceTree = ""; }; + 824BDCF231EC6398C13EF6B4 = {isa = PBXGroup; children = ( + A4BAD3C43AF0D19ECA1C2BB3, + A2C4984859B7A2F3CB17C609, + 288C1D78EC7B90B96377863A, + 78A82E89AC0283CC1329E84E, ); name = timers; sourceTree = ""; }; + 33D3E9073E0658530664DCA5 = {isa = PBXGroup; children = ( + 5C9576A21F7C608E767F2108, + EBFE4F00A24A7C0304DEFA1A, + EE692C17A4DC2AC9A4C52173, + E59D9D6522A13C689785C032, + AA6BE14C6DF4E89F72919216, + ACE30A4CDB9C2F2C13B8ADFA, + F0A4AF9F51C7A271A41DB640, + 29FCF15A6F116C0A823A186D, + ECB0C2120DE11AE690DB987B, ); name = broadcasters; sourceTree = ""; }; + 9ACE3BB033DC986A0A577EE8 = {isa = PBXGroup; children = ( + 17A328AD02B5D7DA362E1D5D, + 40DCD07DB4B1D9FBB9D47BE5, + 88DEE0054A9328954E19EECA, + F4EA09FAC67FDDA4D2E1D151, + EACE6ED62F30C9222D91ACB2, + CECC7AEC966A1651289B4701, ); name = interprocess; sourceTree = ""; }; + D4EE30FE8A31CD1DD0DCD093 = {isa = PBXGroup; children = ( + AB7EBBEDA6F3984B295E123F, + 778E69094A09D97D61E355B2, + 11593E224B032FD1CD5AD0A2, + 97DAB16E37783E73F1D039A3, + 1A468C18B5B893C90F31EF6C, + 8A58A60739C88C641626F590, + 04E04837EB4F3E03908835C9, + 8390BC6E8D8190A7C45C6A08, ); name = native; sourceTree = ""; }; + 7D34EB83085FA61FCC15CB33 = {isa = PBXGroup; children = ( + 24E56C122BA7B936EB30D9EE, + 824BDCF231EC6398C13EF6B4, + 33D3E9073E0658530664DCA5, + 9ACE3BB033DC986A0A577EE8, + D4EE30FE8A31CD1DD0DCD093, + F426F0185DB4E97E1E59A807, + 81E389AD161BE88DA92A59AA, ); name = "juce_events"; sourceTree = ""; }; + 6EFCA9BE2EA840377C657645 = {isa = PBXGroup; children = ( + 49D8C9E638BCBA98114A0E94, + E2E7F9942FA653428A583920, + 887686762AD249568D53FC85, + 6DCB546B40A962FCA3C74DB9, + EBC1D498822B210B1B578763, + E99DD30E1F2706D62695EB8C, + 29A10DF10817FC573A384056, + 6D256DC39965C982ADAAFA81, + 6AFA3298C0E6EBF44DF90481, ); name = colour; sourceTree = ""; }; + 2FD23E53C45A9929EED4ACB9 = {isa = PBXGroup; children = ( + BE353EDDEEF8601A3A817617, + 9E38FC6135AC278A4704BE9D, + DE594C0E9F4887C1B92F41E7, + E74E1F2048368E816394FA74, + 35F80132DF4DC3669B44BD4A, + 5FA112054E39C5FF09F6928B, + AC49A363BFC6B7631E1CD39B, ); name = contexts; sourceTree = ""; }; + 600B27C610B79902DCA4A031 = {isa = PBXGroup; children = ( + 1C30357241D1DC9CF46D556B, + E60A33E021C4CA870FFE07CF, + E7EF16D6D50A17A5672075F0, + F2A26292713BB459A7AE5780, + D17049595AD1C1353337817D, + 0236A082C107280C1505021A, + C1FFEA64DED8E45D6A8F17F2, + 8915FD41B7EB8AB0961F199A, ); name = images; sourceTree = ""; }; + F12369158044F272BDDEC2FD = {isa = PBXGroup; children = ( + C48DAE373124C258F3414CDB, + 1B9C8840393D305F594C613B, + E65D3A0B86F5E8834CE77DB5, ); name = "image_formats"; sourceTree = ""; }; + 7D12CD4DE3E2BE74F35105D5 = {isa = PBXGroup; children = ( + E1E5A0164A129C5DA1FA8DB7, + 47EF393874A20700CD249091, + 936D695F9C82434D08C181FC, + E90C9A775597228F1F127252, + 1FDE28E257271B411780600C, + 244636A4B3E48A7B6CC8E996, + DD9B0DAF1119ECB6FDC0A3AE, + A7C3E1CAAA03F545AA4FCFAA, + 69B3908CF6E97D2326117534, + F213F6D6186ABA1FD60ADC42, + 8A4EB298996C4C410C1B4CDC, + 4FDFC7D4EEEE8782C9FD9200, + 310AF93FF6F5B6D606FB6ED3, + B0A8FCF2D607B95C740D17C9, + 40D83B00A8BBE334104EB694, ); name = geometry; sourceTree = ""; }; + C28DB48D8EFA1D5455B2F7F9 = {isa = PBXGroup; children = ( + F1B87A9524CB1BFD0A3CDC47, + F957420DFF4D2354671B4116, + 1BC34A19A42AE647894C4D57, ); name = placement; sourceTree = ""; }; + 81324F847F78D2803D339D51 = {isa = PBXGroup; children = ( + 8EC249E14405CAC614E7A4CF, + 9851B7F5090C1FA428169434, + 27F84193A8E46E113C520776, + C16DEC12DA7B1444AF0FD5BB, + FDDB0277D2D036AEFA3EBD2D, + 942BA246938908E24A47A05B, + B57E1987459E64275B4652B2, + 61E56039E1D2929463E58D62, + 775C9C8633BA573DA512EDD6, + 4405EC65D1F518B70A5CF7B5, + D35E45B2269C44FCCAD7B1C4, + BDC553DA1A51C45837101B7B, ); name = fonts; sourceTree = ""; }; + 81228A7D287F23AC681C0DBC = {isa = PBXGroup; children = ( + F273ED17232368EBFAFC820B, + DAEFEE4711393EBF6BC1EB3A, + AA5AD3160392AC223285535C, + CC04B8DF2C8AAFD8DB02A142, + F83AF328F15F82C722B45598, ); name = effects; sourceTree = ""; }; + F079B9DA6D228299D276CFD1 = {isa = PBXGroup; children = ( + A44D9BDAD9BE9AD2E519D241, + 5B12686E2808FCCB8BBE0E24, + 9FA7591BA2EFB4349B6E02A9, + 9D5B06B94AB34DBEC8BD262E, + F3718D9D288A2760B6126585, + 0EA1F582E4E45EB90F02223A, + 06A207E085A240F774C4140D, + 6742794BECA5E223253EF810, + 72F342B2288D7D32917C66FF, + 8B160A62F6A6EF21379A8EA7, + ADC81E4F771BD99A4C3C822A, + B84CE707CF89EA0002595BCA, + 834F3F9FC2FE9564FF95243D, ); name = native; sourceTree = ""; }; + 5C634103A260BF82A0E31C45 = {isa = PBXGroup; children = ( + 6EFCA9BE2EA840377C657645, + 2FD23E53C45A9929EED4ACB9, + 600B27C610B79902DCA4A031, + F12369158044F272BDDEC2FD, + 7D12CD4DE3E2BE74F35105D5, + C28DB48D8EFA1D5455B2F7F9, + 81324F847F78D2803D339D51, + 81228A7D287F23AC681C0DBC, + F079B9DA6D228299D276CFD1, + C28D3CC3B868C4F092E68D45, + ACEA0E1D856960307276B8B8, ); name = "juce_graphics"; sourceTree = ""; }; + FE9550EAB790E5DA3F2D29FF = {isa = PBXGroup; children = ( + AD6C159D76B2BFAF579383F8, + 2DC82CD2D824B8A3A7059E73, + 041F12CAFA1CD7215AEC5098, + 1D798858682A27299589F4E5, + 36037C1183C5836D2EF64887, + 786A98F29FAA91898BB705F4, + 0B338B58E9C37E83F0FD865D, + 3EBA7E3E2CFD54B3C786098E, + AE4DF6AF917F1A8DDF5376E3, ); name = components; sourceTree = ""; }; + 2B22A7966C00D4C9740DBC50 = {isa = PBXGroup; children = ( + 5BC311F801FE9D018A7B231C, + 4051235A3DA7534A8E1286F0, + 7D5E3634F29C83FE1216E5EC, + 015FE0A32C2B3FDA879FAB57, + 72AC691AF255DD0B6D582EB3, + 753358C232EE9B14F9CFE87C, + D8498304CBB374B2800442D4, + 4CD97CB51FE3AD5248285B0A, + B1E71D410154F9F7964A8F5F, + B22154A68283179A2059275F, + 900CA19F25F2140D0067345B, + 0EF8098DE092ED5C25105241, + 46C20298CCB469481F5C8D36, + 9D2ECC20D62F513E41A28337, + A3C98189E1FB70E082F1AC6B, + ED07CA90BA1A84256E31290F, + 524D9B46D38DCF45CA2E8DD2, + C8DE1F3E1A1871ABB88A5B2D, + FAC5045BEAA6C0B1AC904BED, + 8645DD1C8D096C9D7B4B67F2, ); name = mouse; sourceTree = ""; }; + 5648974C3A509CF7BCB564A2 = {isa = PBXGroup; children = ( + A0EDFAC99A72166065DDD1FE, + ADF4E92197B00B0EB10384BA, + 0E989C4BC7933A41E9B0019E, + D921C8001631F2FC4D7EFF9D, + 349B7AFA001B78E62A9AFABB, + E02D54F56C0EA9C94494CFF7, + 8141C52E88E3E82A0A226FAD, + 7F63546442D6681E7AA27CB8, + 95812E339031893CDE82E8E5, + 7EC7AB8D0C164E19F70A4D8C, + 9D542FAE4CA607E1F19C3EC9, + 1EB6398B6F537A4302092240, + 443C4EE14F325512D74C6B0E, ); name = keyboard; sourceTree = ""; }; + F70E2701A89603A4BE984FF6 = {isa = PBXGroup; children = ( + 0A55490419140DC6D2FBB1DA, + BA4FF1F73CF544CF671433D0, + 949B3D44B0EFFFE18578E44E, + 8B86ECF3351C9D029821C621, + 969250C57EF34E88AF1062BE, + FA98BC06299525310A31107B, + A2D3A958C5D96910BEDE9283, + 64C579AFCDCEED8CAFEF9830, + DA4359972E065615EEF392EB, + AA84602D83F8E270AC0281AE, + 2FB4EFE77128A64F13B97946, + 14AF9F1F28D50F8E47606660, + 02139A14E2732DE36631414F, + DB9F89D1872247982F4D0913, + 420843F2827F7FB7A31A4C76, + BAE2BAF1F5DC75A6E72FC56A, + 7BE1A83B817F581F39B1F983, + 54A76CABA9E198F906FB01FC, + 431B6C9349785FFC83D695F5, + EF0D818197F7203D3DEF156E, + 51FA060C8445108FA58DF13D, + 20D4AE86B061E4D7F2F1F1BF, + 4E6FA435926EF660B86E1BFA, + ECD18CF97A794402B04570DB, + 742502F34E52826111A41605, + 875B62ECA8BBCC7085FA5F9C, + A2DABCCF72397C2C7C69F441, ); name = widgets; sourceTree = ""; }; + 2B9B650A5C371167F1E95054 = {isa = PBXGroup; children = ( + F919F7358EF25E87A7BCC01D, + CAF913DD133AC8882640F266, + 2860C307AFC727F3591D9FBB, + 37282A25BDD0EEC4AC5F5A8C, + FC452B781AEE181BEF7F948E, + 64E0EE125571D369100796D9, + F93F29D9762799B24457617D, + 84F48AAB7D37C193E401595F, + 040A33439B5E80CE3717319E, + FB135AE48DBB6E5CF88A30F1, + D77B73AB3166A76FCA536E3C, + 73A5B8C82401A8D56F700A49, + EF58FBB6E8FD659CC0939B06, + 1585F30843449EA6EA078288, + 577D5E62E1CE48CEAD5855AE, + C6559A509BD759234BFFCA5D, + 116D0566C94C0FF5C3B68DF3, + 18AD1662D33E576F96C30A6A, + 1754400A2E372510CB25043F, ); name = windows; sourceTree = ""; }; + 78B7B5349F52AFB72E0AB8C6 = {isa = PBXGroup; children = ( + 80153220EFB623D6F205FD1B, + 2A1C3333AE8043F0588BBBDF, + EA765AB65F269CFAD6CA3BFE, + 53EA5EAEF8A9688559300B1C, + 8A57C43210108CEEE8B61750, + 2DF4E9322A4790812A9E9273, ); name = menus; sourceTree = ""; }; + AF25CB689CF9F18AB7F18B70 = {isa = PBXGroup; children = ( + 03C1DC01A1B211F7FCA5043C, + 48C71FEAED1B46E11F17040C, + 135C6D9174F6937E278E86FB, + BB08970C0517BF01D80D49B3, + 4C6C14363344C87BDA4C1C71, + D2E57CCA4E6F6DBE2953744C, + BFF8708E6D65F4E2B84983F9, + 238202B3EA9976135C833C3A, + 1756BAFDC82F5E69704BEAFE, + 9BC0901018A3D55DCCA54301, + 1FDD2E98D27BD53D39C3AEB0, + 5D2301F260F7793BD491A81E, + 1F982064915D0D00759C6B17, + 0FC4F5F1B7E65CC1C9FA915F, + AA600E8588CD8DE76CB9C361, + EE40D10A94911C19595F860D, + B633E97B2CB9548F0AF0164A, + 3EBF429D4892591960A930F3, + 0CB234755B75E0DBC2FFB58E, + B9D163D4B1C34DFAF84F81E0, + 11329C73799FA61B7BC76418, + 4710CA869326390AF0CE2A0B, + 108462DA6B96E6F49DBD521E, + 309E703B70110A64AABCC674, + 4D8B2790A6E7552C64453A53, + 4836B8889A1100EA724CE7C2, + 2FD26019A4D247FA8F38FE29, + 462B768DFC2129F54233D51D, + 07037505B34930CDA76B04A5, + 4C9751F81C3C052C9A6390F4, + 7A905E3EE096DAA1D7BA7ABD, + 163C2312B370BA53F482B84B, + CCBC05EAC1621CB1519FA5A4, + 35892C1EF9CEA7C1F1C9109F, + 45E8F3FB24A3579F1C1F3DF5, + 9A68431EDA5B8D2023A10A02, ); name = layout; sourceTree = ""; }; + 3DE9AC051C508BB978AF0DB2 = {isa = PBXGroup; children = ( + E7E5B7A78A2D1C47285B79FC, + B11EC67DFA21869511B3041E, + 4A0A2B796676838D848432FF, + E8A01F45441E170E6190FADD, + D74AFAA3C82432B7113CF705, + 99D8CB814600E509F918CFC5, + 5721702823682EC883FCB870, + E2FAE3B77A936D9AF0E8DEEC, + 4DE54D4FA92B85E954BBDD0D, + 8F62A58CDAF0709EDE33F5E0, + 227001AE4630FAA6E65DD252, + B92920A799E0A58E3B4AF75D, + ACDE74B253321268CA9AB8C4, + F27DB431B9ECEE07B84281E8, + 911A3E44C161694FF7084464, + 9F4CAD2C33179825F3080F1F, + F805C241B3074BB357475216, + 0DCC7A5AD5AC5D3637FFAAFB, ); name = buttons; sourceTree = ""; }; + CAF6EDA5961A5335899392C7 = {isa = PBXGroup; children = ( + 0B7725520356AED2C80FC943, + 71AF0542AEBEDCA5238DFFAA, + D564C8B4087316C3A47936B0, + 5E2597BF6AD27698AA0E9A3D, + FF5B77AA3517B4637F862BD3, + F1406998FD7313F016AB99BA, + DE8C3DD36C117E355C7EB9FE, + BE574127E239EB558B051D34, + B7ABA3D144D21935200C8386, + 2DF16794D7C916F177B31322, + A013A93080FB0FB98C02C96B, + E9BA26E4F993EBFB0E36B18C, + FE42B80DEA2E49C07E9E1C0A, + 52E90BF34CEB39BB7DFA91DE, ); name = positioning; sourceTree = ""; }; + 6FDE421EF91F6A2ECE24F648 = {isa = PBXGroup; children = ( + C1E13F0AFFDADDB080D11B74, + 41700CC92AEEF157D3B53BA2, + E0DB95731A18E8D551F378BF, + 6833DFDF33AA9A5F551EA79D, + F39BD87913AB2F91817C50EF, + AAA6221960332B921DDF42A4, + 5439A08FE11BD3D1EF760CF8, + CE30C698B8FC1E23D6A8BB35, + E912092604DBF571BDC08D60, + A7BE5CE9E0BA615BCC867CB8, + 1A0415BC113C5E901B668D45, + E9E4792648C00B4A23C1A39D, + 3E5A6D7508BF64D897DABC3A, + 2599ADA2E34E536F438F1B76, + F9B29C9F01195D5A979AB5C9, ); name = drawables; sourceTree = ""; }; + D478C042D92EB811C777A864 = {isa = PBXGroup; children = ( + 68E9769CFD4CE3B4CA530DA3, + DF8DE64F9BD944A64F90B0EC, + 4F95F3371DCA260343D7D26A, + 72930EF8836E66B6E3A0711D, + 63B73D99B066179BB9661D4E, + A81FD2D7571ED030F7292079, + FF01650D69FB076FD8FCCE32, + 937CFA7E69529A634C1DCD5C, + 2494BCA24C9E3AB3D20372F2, + AEFD0A7D65FEC1D23A87FB1C, + 075BB641199B15A84856DE6E, + 413E92912A2C8CACB46AFD3B, + E5B0F6E8B90970181A8F8A5D, + 170F06D00B2197E66300D558, ); name = properties; sourceTree = ""; }; + E6BDE757CFD28DF7846CD1ED = {isa = PBXGroup; children = ( + 73BA60F5506ADDBEAF6243FC, + 1E1A0627C2977D5FCB8440CC, + F9FA29A5FF9C9921D785A1C0, + A5E6E877E1151D8B3E480B76, + 1B08D87085D8D577F6CBB008, + C74F0F7CA3A1A201C0EC4772, + 8312A52619B88D3763F6B493, + 3C11994F7B26920BEB9DA52D, ); name = lookandfeel; sourceTree = ""; }; + 64777E3332749BC9BC58A9C9 = {isa = PBXGroup; children = ( + AC7FD56AB45D297F1D62676C, + 8CA96F07FD8390BD5EEC909B, + 494508266CB5367CB38B5805, + 8E3B1087D0795F0D4E02DAF0, + 743154234C82FDB5DACEA8C7, + BF4E95E2F725801F38CFCA77, + 431D8FA9D233B45295488AA7, + 3344EDF97EBFA052C631F473, + 001A2BCC899370ADC99A8F3A, + 3223ECE0332620D3B03E301A, + E44EB5B165F16ABE2DFB809D, + 25F88A5C788D9CF7301569EB, + 8C4A3CBB322357AF0CA3C2CD, + 9E0A95AA535CE6ABE66D9A30, + 0A3CCDBDD4238A7F9CB559BD, + 24C467D96909731EB0D68B4A, + D33DD8892334E06135451054, + 1635BBF869518BAA7A88A6A0, + BA9FFDC7BCC2D364014E1280, + E8A7578ED10948AB49EE2997, + 2CA19470CA427333F8CAC0A5, + 27077B2F6AA5ED05FAF0B5D8, ); name = filebrowser; sourceTree = ""; }; + D20A63B1C4DF64E9DA6C9CE8 = {isa = PBXGroup; children = ( + 041EA7D542B0EBF7213B9BA2, + 17ED00953353016B7E7492B0, + 06625FB929EB46E8D09E77F8, + C5E92613992AB74C2E715271, + 3597896505C601CE1FFE1158, + 4313B453E6E7735DFFD2609A, + 600DDC87EB44F5B6EFA1500F, + D6DF0265148E2542CF8184CB, + 195B617C1FF754108A97F645, ); name = commands; sourceTree = ""; }; + 9335318EC700B990C16F4739 = {isa = PBXGroup; children = ( + 1BDDF13246E8EC9483F6826B, + EE05AF7337689377BBF4A40B, + 75EB9A0BC0C7717F3DCE5BAE, + F74CAAECFC16D1E87041E5A7, ); name = misc; sourceTree = ""; }; + E12CE38F88D50562CD35E502 = {isa = PBXGroup; children = ( + 4A463C15CF07B232605DC2F4, + BA52D32B1E0324546C26ACCA, ); name = application; sourceTree = ""; }; + 76ACF3D24BC1E838C60D1C40 = {isa = PBXGroup; children = ( + 1A5F53E93F3C800344F307DF, + AB91CD7D677DF03475CA2090, + 3A02DAB152A38D6A9EA9F5F5, + A199934EF3E1D20FD472E51D, + BAA40A78E81F4FF0F0E075A6, + 4461D6D26F4163DDA5B77F72, + 32E16F662BD317BE07A69E58, + 127F5C75CA1140A229F5C5FD, + 2CB4C73C121FCDEF65CBAC79, + B58C5191B1F0F0863167A322, + 89003B5CB547C82F42EEB0A9, + 17C3024C2A1EE03BC0ED9C96, + E5D86302F07C5564E71BDD33, + 69327BB424333BE9051A2C1D, + D4FC04482169FDDCEB7A3BB5, + A4A391D50A9F61201CBC277D, ); name = native; sourceTree = ""; }; + 102590FC92E1B5107F83576A = {isa = PBXGroup; children = ( + FE9550EAB790E5DA3F2D29FF, + 2B22A7966C00D4C9740DBC50, + 5648974C3A509CF7BCB564A2, + F70E2701A89603A4BE984FF6, + 2B9B650A5C371167F1E95054, + 78B7B5349F52AFB72E0AB8C6, + AF25CB689CF9F18AB7F18B70, + 3DE9AC051C508BB978AF0DB2, + CAF6EDA5961A5335899392C7, + 6FDE421EF91F6A2ECE24F648, + D478C042D92EB811C777A864, + E6BDE757CFD28DF7846CD1ED, + 64777E3332749BC9BC58A9C9, + D20A63B1C4DF64E9DA6C9CE8, + 9335318EC700B990C16F4739, + E12CE38F88D50562CD35E502, + 76ACF3D24BC1E838C60D1C40, + 3D52BDFF32D151178ABE21D0, + A354DF25FF89648B38DB63DC, ); name = "juce_gui_basics"; sourceTree = ""; }; + 997D1EDFF8867D6F34493768 = {isa = PBXGroup; children = ( + 1AB4868A9AC3151DB805E2ED, + 13785F78EFA77576147267E3, + 32F091EF95BC75166AAE583A, + EB82AEC0B78709874C1749EC, + 5DE3DC6998A92F718C9683FA, + 71DFB6F3C44390C0FD109073, + 7E68BB771E88E0A2A323D365, + 588255FD68989F1A03FDF31C, + FA0406B777C1CB9C71F86BC1, + 076C4F22CCC47AFEAC2D0C68, + 6DEFC761C7F27A8ED88790B4, + 46969E6B78BC89383358DCDA, ); name = "code_editor"; sourceTree = ""; }; + 3BAE6D34CB0FFE32A18C6008 = {isa = PBXGroup; children = ( + BAA44451865610A98B3A69AE, + 346937AF08405CC63D570161, ); name = documents; sourceTree = ""; }; + 8E4E901883E6B9C038471176 = {isa = PBXGroup; children = ( + 45F6575A7BDB9134EAEA7633, + 954D25A9D5C49DEB9D2FD167, + 24CFBAD49341D774EFA46056, ); name = embedding; sourceTree = ""; }; + B199AE84B656EEB377B44DAE = {isa = PBXGroup; children = ( + 0FC9BC24CE770EF8AFFE871C, + 8F8AA2BF15AB1270EA6A853A, + C4A2C1FDE57CCF33BE778B39, + ACDB4542A6B2FE5186631197, + E5241F77EBB47E4DF15750FA, + D5E430C641A42BA4693AC4AF, + 4F977F1C295B0D355391AAD3, + 6E2A781F28B3F735F4FAB2A2, + A00DC4E59356AF5F1D9C02D1, + 18D52C793029AFCC92C77A75, + FCBA692E842A80D9618CA467, + 5BFC8D75FFE4E8DEE50B3B1A, + A062855D9DD17397012BC224, + AE8321756C03700EB12FF98A, + FD333147C1339A81B846EC52, + 0FDAC75611540A0DE7FE3E22, + 271BCF94F884F0354E1EBCC7, + D154251B66BF13E992D3D06A, + CEFACF205D94175B714846DB, + 738B67C0D9862DF54EC53785, ); name = misc; sourceTree = ""; }; + E71EF502364BDEA76FE5A4E9 = {isa = PBXGroup; children = ( + 29C1872028A449607E80B677, + 717E18C7D784FE087436A768, + 34328035CBCDFA9F18BBA158, + DB3B5F6FE49267EE53089A05, + AF9A3BEBEC95195644691CA1, + CE8542A4C8BB33C6A0EA36A4, + E4644D1ECB4F5A7D7062E2CB, + 83B3A12467C52CB13FB353C6, + E5CD39DEA3BE8EC9959F8CFE, + 97187C062A4A90E3DE7B4B6F, + B06A13CEF4F653521D640041, + 3927B1AD5EFA95FBE77C0DAB, ); name = native; sourceTree = ""; }; + 24EAA5A95BB6182CEC97A78A = {isa = PBXGroup; children = ( + 997D1EDFF8867D6F34493768, + 3BAE6D34CB0FFE32A18C6008, + 8E4E901883E6B9C038471176, + B199AE84B656EEB377B44DAE, + E71EF502364BDEA76FE5A4E9, + 113019177161C70BFD9E655E, + 730BEAA59340DC3DF50E2127, ); name = "juce_gui_extra"; sourceTree = ""; }; + D62CAA66658707456DEC1897 = {isa = PBXGroup; children = ( + A6591E1C9596C9585841C280, + C1286EFB30F4A6B5049A6E42, + 51D3ACB3B8EB13CB9843F7F8, + 93DBDE35F9396CE4E89673FB, + 64272C7AB634CC1683F965CD, + D617988BED63CC4252FDB0A6, + 7D34EB83085FA61FCC15CB33, + 5C634103A260BF82A0E31C45, + 102590FC92E1B5107F83576A, + 24EAA5A95BB6182CEC97A78A, ); name = "Juce Modules"; sourceTree = ""; }; + C2089BDCA7170FE59577FA72 = {isa = PBXGroup; children = ( + 0598D37F24E489C12F43EF93, + F7B762EB74B4145099C06C5A, + C4DE747B720C310D6BC65936, + 42037D6AD47F7FEBAF6D4732, + 8ED1068B85DCEFEFDD3C4F82, + F2C763A217C6D0704C6FB4F2, + D8F138F48E933ECCF2DB2321, + 82D97C5FDE8A53DEBB075DC7, + 173994FFD45CE7CB6D2CCAD7, + 02802D92B7CF0D835254B6C1, + 801E57A03A710591F1B5FEC6, + 6B8B14C1AA3491F103E6A5F7, + 5AD3DDD0285C94CEB17BF03C, + 6A462A15DB909F68F4A9BECC, + 60F23312570D43B7F7FC0D43, + 10E7F81B8369A5A923D5EE9A, + 6E1E415B080EA491A7D58D3A, + 7B6DC352755033E8436427CA, + 3E301CD94F9029D7E3898EB2, + C89190A10B698C7B1E42C76D, + 16D7D354B7CBC971E8B0CFA5, + 8921057E004FE1036191B888, + 81A949AE03BA033D5D762E9F, + D0A92955B64EB66E9334F51F, + A7894AD5A242CD86ACE9455C, + BAADD431AF7666E435C6C4B3, + D251BD558FBD32ECA221D81C, + 4697BFC33D1A3C846B2DED19, + AE84ADD347C9AB73ECFCBED7, + D378EA436E4D111ECE7099C6, + F3171B20C2BBF12A5786B1F5, + 7A65F23E42CEFBDBA64EE2DA, + 0DB84FE1DF027D2AB0952F18, + BAEAEDCE17A81C84439E984A, + 6050F8DB4EA5F9A4A27D7653, + A31C49ABA24290126250F574, + 0337F4D67CD2D5C29939E940, + 3A44529EBD28E325DAA12D80, + 478D907DACBE0CF918C6A0AD, + 7B2E31BD7292002DEBCC366B, + F4050C3BAC97B06A7ED35103, + 2CA60524355CF872ADB42EA4, + 210364718D006CC26958D583, + 83281A9109419F0057EABD31, + 561A9793AA73B7FDDED14476, + C1F03CEB2804747AF4C6BF4D, + 68CCE716313990E1412107A8, + 4CB06EEFAA877AA4A28FE150, ); name = "Juce AU Wrapper"; sourceTree = ""; }; + 3E0C3A2E8ED7ED09FA4E1CF0 = {isa = PBXGroup; children = ( + C2089BDCA7170FE59577FA72, + A4732634AB48AFD0FB06D7FA, + 54363D0B39B88D43447C0123, + 7228D8E143CA465FB15BD546, + 505852570B48EB3F18076B03, + 3254CAE4C282C4432214B016, + 64CC83E4D891EAEC65EE41C4, + 502D49C82606515A80907EB3, + 3DF47857774F10344F12BE65, + 31AEFAC2A9E8C7C96ECB4B96, + 32FC163D919C52263303EF7E, + AA2F01B149F981C2997D583F, + 6273BD6D40C9A904273C592F, + 99078823EE2D77389696F0E5, + 48BDF7DFA849127655B86873, + AB6186E32E92664DEFA0C0A1, + 9E3820CD63B47B5385AF2DB6, + 19B56FF22ED0090A8D7A3E04, + 6DC26B61BA1638AFAF142A6C, + B63E7FBEF314AA2B6A8083F4, + 55E39FAA63BA8B9D40F40712, + D8038990994C30BDD631733E, + 4574217C2F5219DEDDDC9656, + C7C6039A52C3EE370CA9E73A, + EAA5D8078BCC042BDF94C77A, + D6C6FCBA5ECA257959BFE674, + F6F950B6ABB40B62AE4C0B78, + D0178A36F6E46F92111E4883, + 01EF232D8B427B8CE38127C2, + 8F32EF92B0A18751EC39A79B, ); name = "Juce Library Code"; sourceTree = ""; }; + 47F1FC7D160024027C543D04 = {isa = PBXGroup; children = ( + 2EFC0DDB732834CABE62C36E, + 6F9852573AA442CFBAD9695F, ); name = Resources; sourceTree = ""; }; + 37BC5C48642EECA7AE662C02 = {isa = PBXGroup; children = ( + E32283AE8CC5A022E1A6B30B, + 0A56796E1B84D05D8DD1100D, + 838A5E852BBD79A98CD9FDDD, + 817CC81F50861DAEEFB2043A, + 2FDF76165C655B2E77BE4CFD, + 3A01DC4DEBE65C313C7C8A44, + 919DF1054C09D19EDA044BE8, + A81F4DC234E8D93BF9803529, + 452C1184BD776249B33151E5, + FC856709502EE15E8D3F448B, + 2F55D83145737DE69999DB92, + 5E966C95FACF7B8D5A907FE3, ); name = Frameworks; sourceTree = ""; }; + 01533246E329E35CCD6F8580 = {isa = PBXGroup; children = ( + FF6607118B29435E76806DFA, ); name = Products; sourceTree = ""; }; + 8FF698E2E4B3B82B8C64B444 = {isa = PBXGroup; children = ( + C21CEF3B473FDC99270B7623, + D62CAA66658707456DEC1897, + 3E0C3A2E8ED7ED09FA4E1CF0, + 47F1FC7D160024027C543D04, + 37BC5C48642EECA7AE662C02, + 01533246E329E35CCD6F8580, ); name = Source; sourceTree = ""; }; + 93498502B083FC03423F6407 = {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; + COPY_PHASE_STRIP = NO; EXCLUDED_SOURCE_FILE_NAMES = "$(EXCLUDED_SOURCE_FILE_NAMES_$(CURRENT_ARCH))"; EXCLUDED_SOURCE_FILE_NAMES_x86_64 = "*Carbon*.cpp"; - GCC_GENERATE_DEBUGGING_SYMBOLS = NO; - GCC_OPTIMIZATION_LEVEL = s; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( - "_NDEBUG=1", - "NDEBUG=1", + "_DEBUG=1", + "DEBUG=1", "JUCER_XCODE_MAC_F6D2F4CF=1", "JUCE_APP_VERSION=1.0.0", - "JUCE_APP_VERSION_HEX=0x10000", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = YES; + "JUCE_APP_VERSION_HEX=0x10000", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GENERATE_PKGINFO_FILE = YES; - HEADER_SEARCH_PATHS = ( - "~/Documents/src/vstsdk2.4", - ../../JuceLibraryCode, - ../../JuceLibraryCode/modules, - "$(DEVELOPER_DIR)/Extras/CoreAudio/PublicUtility", - "$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/Utility", - "$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/AUBase", - "$(inherited)", - ); + HEADER_SEARCH_PATHS = ("~/Documents/src/vstsdk2.4", "../../JuceLibraryCode", "../../JuceLibraryCode/modules", "$(DEVELOPER_DIR)/Extras/CoreAudio/PublicUtility", "$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/Utility", "$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/AUBase", "$(inherited)"); INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Library/Audio/Plug-Ins/Components/"; LIBRARY_STYLE = Bundle; MACOSX_DEPLOYMENT_TARGET_ppc = 10.4; OTHER_LDFLAGS = "-bundle"; OTHER_REZFLAGS = "-d ppc_$ppc -d i386_$i386 -d ppc64_$ppc64 -d x86_64_$x86_64 -I /System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Versions/A/Headers -I \"$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/AUBase\""; - SDKROOT = macosx10.7; SDKROOT_ppc = macosx10.5; - WRAPPER_EXTENSION = component; - }; - name = Release; - }; - 93498502B083FC03423F6407 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { + WRAPPER_EXTENSION = component; }; name = Debug; }; + 4AA859F8A477DEBA3D568766 = {isa = XCBuildConfiguration; buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; 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; + DEAD_CODE_STRIPPING = YES; EXCLUDED_SOURCE_FILE_NAMES = "$(EXCLUDED_SOURCE_FILE_NAMES_$(CURRENT_ARCH))"; EXCLUDED_SOURCE_FILE_NAMES_x86_64 = "*Carbon*.cpp"; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_OPTIMIZATION_LEVEL = s; GCC_PREPROCESSOR_DEFINITIONS = ( - "_DEBUG=1", - "DEBUG=1", + "_NDEBUG=1", + "NDEBUG=1", "JUCER_XCODE_MAC_F6D2F4CF=1", "JUCE_APP_VERSION=1.0.0", - "JUCE_APP_VERSION_HEX=0x10000", - ); + "JUCE_APP_VERSION_HEX=0x10000", ); + GCC_SYMBOLS_PRIVATE_EXTERN = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GENERATE_PKGINFO_FILE = YES; - HEADER_SEARCH_PATHS = ( - "~/Documents/src/vstsdk2.4", - ../../JuceLibraryCode, - ../../JuceLibraryCode/modules, - "$(DEVELOPER_DIR)/Extras/CoreAudio/PublicUtility", - "$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/Utility", - "$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/AUBase", - "$(inherited)", - ); + HEADER_SEARCH_PATHS = ("~/Documents/src/vstsdk2.4", "../../JuceLibraryCode", "../../JuceLibraryCode/modules", "$(DEVELOPER_DIR)/Extras/CoreAudio/PublicUtility", "$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/Utility", "$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/AUBase", "$(inherited)"); INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Library/Audio/Plug-Ins/Components/"; LIBRARY_STYLE = Bundle; MACOSX_DEPLOYMENT_TARGET_ppc = 10.4; OTHER_LDFLAGS = "-bundle"; OTHER_REZFLAGS = "-d ppc_$ppc -d i386_$i386 -d ppc64_$ppc64 -d x86_64_$x86_64 -I /System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Versions/A/Headers -I \"$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/AUBase\""; - SDKROOT = macosx10.7; SDKROOT_ppc = macosx10.5; - WRAPPER_EXTENSION = component; - }; - name = Debug; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5900493D34C3F35BEFC2B3D6 /* Build configuration list for PBXNativeTarget "Dexed" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 93498502B083FC03423F6407 /* Debug */, - 4AA859F8A477DEBA3D568766 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; - 79EC971C74D382E87C0F443D /* Build configuration list for PBXProject "Dexed" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 164731727DFE228515FE9A35 /* Debug */, - 1F51A4544E7E3E72CAFCC59B /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Debug; - }; -/* End XCConfigurationList section */ + WRAPPER_EXTENSION = component; }; name = Release; }; + 164731727DFE228515FE9A35 = {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 = "Dexed"; + WARNING_CFLAGS = -Wreorder; + ZERO_LINK = NO; }; name = Debug; }; + 1F51A4544E7E3E72CAFCC59B = {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 = "Dexed"; + WARNING_CFLAGS = -Wreorder; + ZERO_LINK = NO; }; name = Release; }; + 79EC971C74D382E87C0F443D = {isa = XCConfigurationList; buildConfigurations = ( + 164731727DFE228515FE9A35, + 1F51A4544E7E3E72CAFCC59B, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; + 5900493D34C3F35BEFC2B3D6 = {isa = XCConfigurationList; buildConfigurations = ( + 93498502B083FC03423F6407, + 4AA859F8A477DEBA3D568766, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; + F33A1146DD22EEF53DEB0728 = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 813B2285513D65DDA30AA6E3, ); runOnlyForDeploymentPostprocessing = 0; }; + D7ECE35BCBD5C64A95ACCFC6 = {isa = PBXRezBuildPhase; buildActionMask = 2147483647; files = ( + 9D042F9D005532F763A72C26, ); runOnlyForDeploymentPostprocessing = 0; }; + 9DB7317ADCFFCEAB747A09AF = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + B18C192606DF6079E7B9AEB9, + 697C52FD23363CB2EB9075C6, + 4B27ACC5993C8C74FFCDD3BB, + 478699B4EF80A1A1C0D34C10, + 6252C45CDFF75E05CCDBF737, + 69A60891A52C61989A205791, + CD1CF0C6B4AB9F4C8175FE08, + 8F3B0996452972F266C749E0, + D5A4D43A16EA4C71D53E96CD, + 8121E10419E2D99645EA254E, + 082D6FF34EFF195C3A3B0CFB, + C510246D7D5E162C9DE63DDE, + 3AB728E101D7B85DD39C5CC8, + FAC9C3E771D11FDA4DFAF17E, + 47C317B0F77A29ECA0400B2B, + 9EC12165834B1341938E951D, + F9A9CC03BA0B3030E92675AD, + 7B82F1D5F8DED01AA8988D33, + 434647C21C803FA8A4D44A70, + 95105DC8536836A06FD5C7BB, + 0D3132A8B412AE9E63024927, + 1CBFE444B43C89E749602B7F, + 623AFA9E78826CA0136251DF, + 8BE2A084394DA3E45DDB5646, + EC23F9F2EE10A2DE3CB6D406, + 2360F3C87933B5A51B0D4839, + 26E1D92384FB66ED8FCF5101, + 02B7485A3DD3F44C6058AB0E, + 09E5F88C9C879073B1B103F1, + EE173D0BBBF66A8977FE3A7E, + EB464CA0288DD69ABBAE73B3, + 3FC0533D8E67D63666A51C64, + 0E0B0D39FCB31A57F5298C7A, + AE7F0435D9C8D94FFDA16DCA, + 3D8568887BBA0D81340FF64D, + 95D4EF9899B0D0D3FC729312, + C19B69B5974FA50D116A4F52, + ED19C7C3EF2026BC9386CAA3, + B96C21AF3AD25C7950EA6CE5, + DFA8CE3B7D7FE269254C9BDD, + DAC2F8A317486D36C0E0F81F, + 556863C97636A308001CFD21, + 6970EC0E1FEDCF3793098929, + 62798B841D9D5E0B71064A73, + CCC498943EDC85558AF6D8B8, + F1106DF1AB7F08D4FC6B6BBB, + 1C87DA0B69D67481FC6CF4FD, + E3FA856CA4DB2009BB0F13E7, + 7E6DF76EEA834AC1E96470CE, + 93279A1D631E5F4103EAB17E, + 87B95D41180EF626460B2EA3, + ED2B6C710BC0474617D147B7, + A451AE788A4BD5AA72174D4C, + 927401C89B9B4F84AC1FE42F, + FFA0B77789034ACCB5203F40, + 823ECA6DD062A4D0CC056CF0, + 52770E3D32989EC50834582A, + 6CE74A36A215C0D39041710F, + E52CB89B4C49057C5A54CFFE, + 069530C6CF2796C568DD3E90, + 5B3A6A14A3951CF8E37608FF, + C2090920CAE913A6C56E0ACE, + 5F4FB65ABC71FAAD6EDD822E, + 1E2E719F9E93AD97BC37565F, + DDD1E74DE1AC7E6493AF04CA, + A6E2908774D7F669F21B1874, + B82FDEB3E53C9455BC6A5DAE, + 00C044DBB8BA1AF35CBC42E6, + E8D9A2B640A87FE92D2DA887, + 52C0C94470D90310AF2F8433, + 13F8BF7C26D50908163425CF, ); runOnlyForDeploymentPostprocessing = 0; }; + 06D721A024B3596A28AB8EC1 = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 6443699C06267ECC22CF9D12, + 60686C2C30A9F2777CEF01BD, + 77C3EA8D0A12986429BA466D, + E8BEA8ABF5E288C5D5FCD620, + F329522961F1313091764113, + B0A4786A252B14B604101175, + 82253A3BBFF29FC56A08C972, + FA2AF2015CFD98299593EA30, + 7116DC8487DC8321F36CD3D8, + 68878920F603FF1473994736, + A7D45B047CA84D7EF7018CDC, + 7E444608AFB10ED54DB5C9AB, ); runOnlyForDeploymentPostprocessing = 0; }; + 3272AB811807EDC647D52F52 = {isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; name = "Post-build script"; shellPath = /bin/sh; shellScript = "\n# This script takes the build product and copies it to the AU, VST, and RTAS folders, depending on \n# which plugin types you've built\n\noriginal=$CONFIGURATION_BUILD_DIR/$FULL_PRODUCT_NAME\n\n# this looks inside the binary to detect which platforms are needed.. \ncopyAU=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'AudioUnit' | wc -l`\ncopyVST=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'VSTPlugin' | wc -l`\ncopyRTAS=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'CProcess' | wc -l`\ncopyAAX=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'ACFStartup' | wc -l`\n\nif [ $copyAU -gt 0 ]; then\n echo \"Copying to AudioUnit folder...\"\n AU=~/Library/Audio/Plug-Ins/Components/$PRODUCT_NAME.component\n if [ -d \"$AU\" ]; then \n rm -r \"$AU\"\n fi\n\n cp -r \"$original\" \"$AU\"\n sed -i \"\" -e 's/TDMwPTul/BNDLPTul/g' \"$AU/Contents/PkgInfo\"\n sed -i \"\" -e 's/TDMw/BNDL/g' \"$AU/Contents/$INFOPLIST_FILE\"\n\n # Fix info.plist for AUs built with Xcode 3\n if [ -f \"$DEVELOPER_DIR/Library/Developer/CoreAudio/AudioUnits/AUPublic/AUBase/AUPlugInDispatch.cpp\" ]; then\n echo\n else\n echo \"Removing AudioComponents entry from Info.plist because this is not a new-format AU\"\n /usr/libexec/PlistBuddy -c \"Delete AudioComponents\" \"$AU/Contents/Info.plist\"\n fi\nfi\n\nif [ $copyVST -gt 0 ]; then\n echo \"Copying to VST folder...\"\n VST=~/Library/Audio/Plug-Ins/VST/$PRODUCT_NAME.vst\n if [ -d \"$VST\" ]; then \n rm -r \"$VST\"\n fi\n\n cp -r \"$original\" \"$VST\"\n sed -i \"\" -e 's/TDMwPTul/BNDLPTul/g' \"$VST/Contents/PkgInfo\"\n sed -i \"\" -e 's/TDMw/BNDL/g' \"$VST/Contents/$INFOPLIST_FILE\"\nfi\n\nif [ $copyRTAS -gt 0 ]; then\n echo \"Copying to RTAS folder...\"\n RTAS=/Library/Application\\ Support/Digidesign/Plug-Ins/$PRODUCT_NAME.dpm\n if [ -d \"$RTAS\" ]; then\n rm -r \"$RTAS\"\n fi\n\n cp -r \"$original\" \"$RTAS\"\nfi\n\nif [ $copyAAX -gt 0 ]; then\n echo \"Copying to AAX folder...\"\n\n if [ -d \"/Applications/ProTools_3PDev/Plug-Ins\" ]; then\n AAX1=\"/Applications/ProTools_3PDev/Plug-Ins/$PRODUCT_NAME.aaxplugin\"\n\n if [ -d \"$AAX1\" ]; then\n rm -r \"$AAX1\"\n fi\n\n cp -r \"$original\" \"$AAX1\"\n fi\n\n if [ -d \"/Library/Application Support/Avid/Audio/Plug-Ins\" ]; then\n AAX2=\"/Library/Application Support/Avid/Audio/Plug-Ins/$PRODUCT_NAME.aaxplugin\"\n\n if [ -d \"$AAX2\" ]; then\n rm -r \"$AAX2\"\n fi\n\n cp -r \"$original\" \"$AAX2\"\n fi\nfi\n"; }; + CC364D6AF074DD367C3061CC = {isa = PBXNativeTarget; buildConfigurationList = 5900493D34C3F35BEFC2B3D6; buildPhases = ( + F33A1146DD22EEF53DEB0728, + D7ECE35BCBD5C64A95ACCFC6, + 9DB7317ADCFFCEAB747A09AF, + 06D721A024B3596A28AB8EC1, + 3272AB811807EDC647D52F52, ); buildRules = ( ); dependencies = ( ); name = Dexed; productName = Dexed; productReference = FF6607118B29435E76806DFA; productInstallPath = "$(HOME)/Library/Audio/Plug-Ins/Components/"; productType = "com.apple.product-type.bundle"; }; + 0DA61024CABBA334F84603C0 = {isa = PBXProject; buildConfigurationList = 79EC971C74D382E87C0F443D; attributes = { LastUpgradeCheck = 0440; }; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = 8FF698E2E4B3B82B8C64B444; projectDirPath = ""; projectRoot = ""; targets = ( CC364D6AF074DD367C3061CC ); }; }; - rootObject = 0DA61024CABBA334F84603C0 /* Project object */; + rootObject = 0DA61024CABBA334F84603C0; } diff --git a/Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate b/Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate index 8664738830cc3ed656cb76bec17a8ab4c633d592..1d0fcb82a3c80aa6350e008f2c03a8db84bbaa4f 100644 GIT binary patch literal 188920 zcmdSC2VfM{_BcFuW_EXGLw09-$tKzCCcD{WO9Fw=OMn0pYUnM7WD^2uq(A_{xfDf3 z6r_lXk^q9BQfvq+sGx$DJdriM34kU(1eVT2TlY|j*6catf(w1D;*VIHgR$=uc~r%d~QYFq#}4cEWWC& zTuY!k)@;#4K1nDDhR_ju!a#V4BqEvc5bF z>xn0bUBpYo%fu_hZekDdD)AceI&qjdLL4QI5yy!W#7W{^;xuudxJ-Oad_#Ood`J95 z{7n2p{EA3KAq9#+txzOVAw4pqC=`qAC<*ydchmz7Km*YrG#HIQBT){@L-}YDnu3Z^ z87fDWs0vL-HRv`p8_hv;(H-bcbT3+rmZ9b7F|-ENqB`_A+JRm~JJBxm5_%cEf_9@l z=pA$r9YTlE5p)zCL&wo+^gcR=K1CPNXXtbE75W-oL08c=^aJ`C{epf)zmbTPk#bT+ zTF6+^O(u~(GKFkIwj}u>d6oQ*{DJ(H{Eeb0no?2`6i1mU3uUFE zC>s?|B~UKPOZlkQR7a{4)tTx-b)_NDyq>JOTr5lzw*P17=3PP4RQ+9{!ZrKvq zQrQYwo$PVhQ?jRJ+hp5i&&ZyYJtuor_J-`B?2zoF?0wlq*_X1bvhQTS$o`O%a!Rh2 z>*ZE?lss1MkUQn^@)UWRyraC6yt_P0K3G0NK2knLK2}~RpCX?suaH;Er^%9ua`d|-zwiGe^&mS{CW9n^4H~i<@@CO<%i`*O3Y*0L@cuKKVu}!gE@rvR##eT&B z#X-d(#bLzB@9tx-$crLCj!g2s4z)W`;4NnK8^*CWi?!1xyK3&P-*hm};hmnZ?}3%x2~= zcQf}eiA=nW_z){*-UmIJBS_3j$%i% zV-$PYv1~Ovjh)Wcurt`1>@4;+b~ZbQy`AORW$bcx1-p`ckX^+-#6HYE!q%~mvm4l_ z*r(Yo>~rjk>`rzM`zreydy)N|{eu05{g(Zny~h5;{>=W){-LClw31P>%1EV3sa5Kf zCZ$%6`%3aFc z%Du{c$~TnnD32&lD&JL}Qhua7tGuYZq`a*BT6tA@UHPN(C*>azR0I>jMkph=2u*|` z!Wt13VT*7?xFV7xyb->LHWBF&og=zLbdBg0(Klj1#K4F_5yK-!M~sQcj|fH-L=;9$ ziYSWAiOh@4kDL@)6j>5k8d(up896<&Ci1q(*^xMMZsZ-2cShb5xhV4f$R&}>BUeN| z6!~!EW07kj*F~<6d?IpF$Mt&N3G4k`sFCxE*{5JCY$ZL^5MgAQ5d*mM~N=2&}6|0I=sZ?5( zPGwS=RW?<$Do*84xm0ddvdXJUQKhQds@kbKsyeBs`6BYs!6J1Rf%eM_+?)jHKi)f1|xR8On6tDaH4pxU8&N%gYoRn=>%H&kz`-d4S%I-)wNI;nbB z^}gx@)hDVmstc-5RiCLoSADJeM)jTQd)1GspH#o8epi!fO07^c>Q?GVwMMN~8`UOt zl-j1YtK-xOYL_}movaS1Q`Bkdw(1V*j_R)JZt9-uUh2N;e(C}0f$E{^Z1qU>DD^n? zcy+FNqPjp`sGg!OR+p=%s;kx0)HBty)VHg7^?daL^IFgfd3NC_c#c`a5GjK-E%0+RpoSlp3 z5;zZ+#QC`Z*M>{u+H)PaE?ieGgX_ul;ren}+yHI}HNl z;I4DOaKCB@4bsRoa*a|Gp;2o%jb3BWSTt5mj3!p&)WmBNH6D#mG?khvO^s%TX0~RI zX0B$Q=1$E*%_7acnkAa0niZOrnuj%yXx3%Yqn^%YM#|Rr+HDcQ}c>u zx8`-tUd>yY{hEWCLz-in+;o1?}k=jw((b}N4KwGGtq^;6cYo}?aYiqPKv@^A{w0CM3YVXqCt-VLPNPDk# zmG&X+!`er*tF@16AJcBuKB;|5`?Pk8cB^)qcDwc!?QZQJ?W@|?w6AOTYWHc6YL97; zYforTYTwnK(w^5|(0;1DsJ*KFPW!#~n)V0nb?uMZpL8;vT&K`6I=#-IGwMt_r!HQX zpmXV3>)PnjbZvF*bm_YGx(>SDx=dXkU0>ZW-EiFq-ALUi-Duqy-B?|rZj!D@H(57D zSF9`1mFi~dX6bIz&DPD)-LB(xi*)zu7V93;J*;~~w_5k8?lIjO-IKbfbWiKH=(g&% z>9*@$(e2jl(Y>lWs5_)PtUIDRsyn7TuKPrHMt4?sPIq2+LHDWdqVB5hJKguXYq}qF z*L6SYe$vbIa=k*&=vlo|AE9rhH|s5WtKOw|>l5`JeUd&|@74SC9rPXbo%EgcUG!b` z-SqwSS^5F`f%-xE!TKTk@%jn+9R02OT>V6So<3h+uAi!}&{yiK^ws)l`sw<4`uX|= z`aAS@>KE$o(%-FLpd)!V>o4d()nCzH)qkh|-ar_TfizGC+8{H? z4O)ZFpf?x{aR!IMX^1x@7+eOop^YKU(ALn-kYVU)=w;|_7-AS|$Tkc!+-k@*Of=*f z$_(X(sfG%}9K-Df-hd5r4f7214GRoQ3`-3U7?v598&()r8Xh#PGpsi}ZrEVhXn4Y~ z$*|e*f?HTsNxV@G2rV`pO*V?X09#{R~U z#!<%6#xcgR#&O2+#tFvB#wo^PV~MfUSY|9Y-e#O_oMXJ*$Q!Y7u5q66KI8qyCB~)3 z2aL;%%Z)3Hb;h;Eb;k9^ZN}}!XN=DppEEvhe8ITGxYxMP_=fRK<8k8&<4NPY#&gE= z#tX(zjaQ6Ujo%r+HxVXeB2AQuHpxtKlftAk=}iWc(c~~WP4T7_Q>v-8sg0?dsk^C% zDZ|v$)XUV{lxZ4j$~Fx%4L9YQCYth0Wu|h|R8xhi(o|)tHeu6T(>&9B(*n~SraMgw zP0LKnO)E?*O%Iw@nI1AdZrWhlXnMl*oauSf3#J{Wy{3JpH%!M&$4w_pCr$5~PMO{_ zT`+xWx@fv;`p)#d>6+;W({i=5F}F3h zGpC!|n>(00nmd_0oBNvknQt-oH;*)rGLJToF&CH%&6CVU=4$ga^K|n(^L+CH^Aht? z^8@B(<~8P8bDepud5d|gd7F8=`4#hS^B(i7=7Z)#=ELSA<`2yunLjpvVm@O&Yd&W_ zZ~n&ot@(=is`+>G9~Q#W$`WZ&S*(^Qi_H>k@mP{9$ri80XYpGCmJ~~8OBYL5OE*h@ zOO|DTWwd3CWvr#pGRab8nQWP6nQp1E%(pDC++kU2dBC#Fvc^(tsk5xLY_V*$Y_n{) zykgmH*<*Rta?ojDja?Wzza>4Sc<)Y=1SEtfQ=>tz)cXt>diYtrM)1ty8SU z))H%}wai*>oobzJonyV-dXIIH^qFLut&dnYTA#3PvTnA%VBKMT(Ynw2hV@PB zaq9`|N$b1TQ`Yyar>*Z>FIq2IFI&I2UbFrXMMhCkbQBk*iPA>tqV!RQC}Wf(${7_O zl@OI0)jFz8RJW+^Q9YtEq6S6{iW(d>Bx-!rgs7aTDN)5yB~hhOGoxlj-4?Yl>aM7} zqwa}X6m@UZ;;8$g9*%k>YIW2TQJbPRM?D#}BkIMdol(1@-i&%HYJb#$sCT1IMZFhw zI_lG?i&2-NE=PSIbuH?LsOvV$M%!dIjZJIQ*<4zo2|bs z%QnC^&^E|6*fzvA)HcDEW4qOsYny1xv*p`@wyCxXTcxea#@n!Mu5GdHKHL4aM{KKY zkJ=uyZMHpWd&>5-ZKrLQ?IqjGw*9sPwzqBX*xs|9w!Lrrz;?-Y+4h<3bK4KL>$V?l zKiPh^{bKtynu%tkmC?p%Q?xlcJ~|=V7442rjP^t)MJGq6N4Jme5Zy64GrCW7-{@h{ z!=pz;kBrWX&W{d87erS?S4LMwS4ZRMxzY2Y=SSZky(D^R^aIh$qL)Xnh+Y}JHhNw3 z`sl}_w?{t{{cQA}=vSj(i#`;6IQmHR(ddt&KaTz+`b_kf(O*S>9sN!8FVVk7{}%mw zj4~!7rd3R2j3vez6BXl*NsRHtB*i4hcw>Aq9b!7hbc*R5(>JDH%q=k^Vn)V{iWwaf zj46mIjH!&Nim8s77Be?yUd;TM`(u{GERA^}W?9Vgm=!T~F>7Pi#jKCn7PCF(nV4r| z_Qbpz^IFX7F^6N0#2k$|7IQr2M9j&UvoYsl&c|Gc`8MWC%+;9hV*ZFFVo@v^tBO^} za%rYAKNjuQ*7thF0uV$Z;9<6J2G}u?C97ru?4Y(v6Et}Vyk1P z#ZHf%7dt<8LF^r|OJg61T^740wl=mdc5UpI*sZbKVz61zKgPwcC)2V)P#9*#W{ zdo=b~?D5!7V$Z~$jXf9pb?i5>-^N~v{Vn$Q*gxzM_Ez>tyTxv`N7-%mXnTx3)^4|Z z?LNET-qGI4-r3&Q-p_uEeT03aeUyE)J!mhm7uqM;tL)YGY4+*%dG`7C1@2dAjdd2mQ%Z%$2*EgG0HL8k>|*F1RVvAa>rChh2u8IY{wkOLdRW>yB*6M%N;8mYaF$XI>(ca zryNf^b~s*i>~!pP>~p-~IN~_!IOh1+@rmP%<8#LsjxQZQIIcT>bdpZWNjqguwUcvd zoLZ;N8SRX5COSRNBxjnlt+So8yR(Ng!yjq+xd?3p!1OPJ?ClX z`_2o_Pn{Q?-#V{2uR4Eq{^tBWUKt+|-zq*b-V|?+x5PW+`izx;XuN{gd+*Z6W&cYo$z78Ckf{gK25ls@I}Jc30D%nPq?1&bHZ;f!bQ2{F4on` zrFLmu2AA0t<%)5|x#C@JSCY%;N^!MuwR3fFb#`@gWw?5~`nvkN2D*m0hPg(%#<<42 zZgu6k3S335Vpo}~!d306am{kgabeed*PX7rUH7`~cRk=*;acT-#Pyh~&b8jP(Y4w2 zv}>E|S=S4$ovxQ%dt9%(-f-=Az2iFUI_5g*de8NN>tokh*9F%l*XORUT;ICBbN%4@ z$@Q!24>#$SxfyqaTjkcc^=^~f>W+5X-A=d5?QwhE0e5S6TX%bRCwEtO4|gwjANMWp z0q()>Z1)KFX!kgGj(egz=$_=B;x2VhbyvBkyJxy*yLtCK_Z{xL+>6}zxtF?^yB~Bv z?0(c;>t5&H;NIkZ%DvV7jQe@_i|&`)yWOw3_qpG4zwJKcKI%Tz-Phbdx_@#1o`@3ZL`9-9F*1=$)Fm1dEs3_o*hEKSLSkZKa-u&mH8CwQ zJ+WhAm&ERgJrgq%`z2;24oV!FI6QGw;@HFqiMfgSiG_)i6U!1S6VE4JO1zx-W#U(f zR}!x#{*ZV*@t4G3J%k5&WFEOk>51^DJ)B4HF?cKv4MGJ&7KV$LH~TT6@}f z(mm}xojqMVJvGJ!PIsPnD;} zGs836GsiR6GtYCUXQ5}2=U&ee&r;6{&q~k3o<}@uJhh(np2t0#JexgRJX<}_dY<#V z=-KIc#k1SLC+!2G0$<&DbIVJ4?Q1w&U(&yE_yC`zVLkM`POsAbKUc! z=hq}UiA{=3(k7XcEJ@Kx&LmfoH_4aOCMhkcV^XK29!b5E`X>!Y%1#=YG(PFpq=KZv zq>`l4q>7}Pq*+NgX>QWOq(wK6d_DQc+`01)4d(M-MqcMncgh#Q11xuIPU~+zBlMC@|Jn0dZ&A9yfeJmJJ&nU zJKwv&d!P4y?-K7)?<((F?>g^#@8jML-i_WTyw7-_^*-l)-n+;9s`oYTKJQ8IyWUgY z_q?aQ?|VP?p7oydp7&nzb?|lZb@gTVdiwhK`uehb1AIe#LwzHBBYk6i<9xUJa(zKx zfp4;Jim%L9?yK@u`)2rN`sVm<_s#Ro_bv3@<-6Cn*tgX8fN!PmLEj_3)xKI^o$qnq z2H$4ilfJFKZNBGx&--@zcKLSu_W1Vt_WAbv4)_lF4*QP#PWayQo%Vg?``CBRciwl& zciH!)?Hrte z1S|n-ASz%B#0L@ru7Eob2&4p31FZuc1Dyh$1HA&h1DSz=fkA=6fl-0cfiZ!JfxJL| zpg2$xC=HYarUz;QGXgUMa|81N^8UfxUr!f&GC4fkT1Af#bvDORI~Ej}t7RBqE4bgqqNf9GLB&5}Z*v27cFP z6vYOJ$m;} z^|kBSA-#9+l=OD#8EtboeZOA4N0wDgsVvXU3-&6@t1bzaR)uCZ60t<$M#4mx2@7E* zq6ixiO~mjrUd}6chG%&tAHlcUNZ5%u!U15!LlYO_;3Ihz&jCmpXkvp;Srdd=ic0g# zre{{(4f<(f!Tw^tSuAbVppOsk@y7Bjp$DFATo%aL@%N@kxBI7 zwY-kk^9J6?n|L#C;jK>){eXY{i7a9OF%UR9m>9xG0SBWoGGi2r$@_Q?lMi9?VLodt z-~`xYG9Sao@^(IsckoU=o=@Oiyqkx{#Y72F3UnhHg7{eqLA7=yL`MDMOV~Rznhr!|y zh%TTkb%udPNQr#udv^825?DNA8V$`EnvPlDK8Mr6^IpM%-0I@0Ucrggg%Sre;^)F( zMI%Pp>zfT0rmCz0iVY2xR|G5JLv9rm5dh$v08^-|Fj9z`^NBl!UDaR;BoC)W`R ziMx0&@8h$^ixUhkt1J?R$l($snCtm-v#A_i{}>-0`#xf+F!ue#65h`T>WBx3Wqb-h zp3fTHqqr(qQJPy795x`gs5Au2Dq=OET}wPfJWM>or}C}&HfxDTfn#g#jHr5gw z__q9*5Kx3n;>1K*MF#CP66JVQK7JV!iFyg=+A zUgW#*UHLxzaDD_ok{`uqjT5B3S8i4Auo>mSu@X!ow4juFh&3I#prM*_EQixbD-YiE zs|uD36g9RbWE@&}7ZrNfy9NY6C>?1~zGFl0h7SeNR+m>#EH29P=lLcDb3y%w5Zz1c zC$#H`eZ(8Yo5WjuH@-XHgU?t;93b8XJ#>)o$@hY_(Ockxd2mHhNp8iA(73~jN`jSD zxh3Ub^P0V?SHL|d@#5*# z&z~tYjhWRUCCzJ3OKUfK^sLsYDQ&#=6j0ZKdOk(GH*R2dSPnoRpCUS)B;F@J04x3> z@e%Pc@d_wR7}0C%__?i*U5wil1bVLT9kl%Har$=Olf|wW>7(>Z^Ju&2;Y|< z#uNNtNt7-SZR?0niHm$cegLlyQTa3C3nHU)OTyxxB;j_2xC&ZfVD^CODnVizkX%b#5zq`x@jdZ_FvT@~U@dW-AH-*k0cwZs zaN?*u&_I4rF8zzD{E}kp3CpOktYU`0XIXVAFsVGZqNRR$_6@&dhrHNpHqc3E{r zUNF!ChKNQoz_8bdVWEB@&eS0}(W&KEB5e?Z*c>hqkZQ6tZnnJYkWv`#FSl>Tj%HtT zI9C&zN?Z$};Fs|22}D1R)IyU})Bz=_LSdeu>SPDe1V=b}>eupS`$ObA5Mf2nMF<^Z}*Cs{qY&xXFGHIOx zj!nIspg5G!T-_oUF%>296F}Wg=QE}8lEDK)UOp!*!zh5#|CLHa?NJBR5p_bHi5;jb ze=DEM2l;Bg2vp)ULFO%CB~)HqUFj45suTqy1YHK|(~>$ueNjKcf%@|k`8-fZ`Fv)* zS{S-+9C&YSQ`&+n*ShuWF|%5yv`L3ADYF|be>4OQCC;E>#8keLFND=vzz@#h0%7(w zksfLB`@=3%c2z}nUR8BPP@>ByqV0M#8jV3?(Ks}opTtk$OZYN=DtLcOj#I2uF+Ih+low?SZGGO%i*vKgFPR8fZt1&RIBHqx|3Xd++CPaaxb zBz-S|@1^|Y5t0~6&!)n&a(?n~aY0Its^L*Z=u!Q`M>B+l&sRxHyvN^L;(#oe@5cCd z>{uDB8Vq)!WI(X8GPf|8C?RbxsVwv~S}SOVxGt(Bvdsrzd_Oh^LnLra7K?&oi-MN9eFd{$#;1+732!RkRP(Sv9eKZn1a z=hvc#VfC!$F|3~T{|}rMv{oR+I(}}$%G`jqz{*4$(GzGB+Kiq=PobyzdHj5S0e=U7 zC%=%tYXjPfwxR9l8T2fA4n5D`&ELa6z}N9B`L+DI|9j5Lzt$74qBlTKpx4mrXfN8w zFXHdz7xVY6LvNzDKu;Xt@8_3*o>=<7bX#`iUhTX%w&VC&si`UL+j;G&?K`A_f=X?j z(iS$GO%>D$bP^QQDNs;r_~oFWmi^}n>H|SReTY6nAEQsu8GZ%-Apa2m2>)nEK|Kpg zex<0Dn(wtFm2e5(uWF=8zJTu!H`65Fz_ZmMwIOx;4jw%gdKA(m*F{ZID`}Ej>NQC* z_+7=5$||e=y4TPg(j2Z=URlY+vW&8t!DZ#uYl2}jpOwNxvrC6a`-NK*Xcf?6^(Sl!e%>ENk$ zNNqcN_6br!G9*hxkV@h#*@}z=&#$7atV-HZ346zZVqC>kC~h_-FG7f@1Z%3KH|BE5 z?Y`j^za2o?$UpZksU|s?KtpOt9ZaGmjZm{}CVm+OrQ^l<6~WRG;M##NI5tlhx3o&w zlH_pqkZadqewuDa#+Jd3s(v#GGi~Re>;qM70^uz?U21m*xI_^^`!#V%L z40U9GVf4S!wBA~g1IR&Ot;m7=j#_ds|Kh)G?#N-}2w{NX{LWf(B)_Yvxg*DtIbiO{ zapZV%0{;^KGXKh2@>XIhIg#HD=I-4819L}C68Kfb?+KebvY4y_b4QktrDPddPEI8& z$V&cI{x$w}elNd|e}jK>16fT@Bd3!!a&i^MUgkZf)ldJQBIay_8Q+kxDTn4{HjUP$4SAW!bxB`3yRBf ztL%ZKN^vZR3?>B{9+ni9N^>-So?Fx8IT)VGD!cTkV@K(CcGZmHpfIrTTNqS&?6Oyi zGl6w(7v7->L5rJiu!V>*1pg|_N~I=^HWB15Q2nF%k0s%HLr^7e^5*Ll)oy`5BS8j{KCoNM0f@^I!2_^WX5_u7lv+RPsy01!`e1e+9zbun~$1 zcNV}AV#Ad~bEl8UEf&LZ)~0XkgK^n;Wumjt?9SVpbaGQ30h2_G$XY51BkIp^@e8;Fs1%H7jMxTj+EDF;nbWAY7|Ae_*HP(I zdyEtqF@FK0@l81D>|U{^354CKjAn!PqQU-3Y7JFO)lqAyb<}!{JQ#Jss1HU37!_i&2PShdIR%qdqW)>3&!wmv z=nj8YSt00;=$pLFo&j68V%V?T$Cc}!%%;6k2 zd7S}rJ*B)1OelaJb(2QJAU|?*z{8QnkVI^wc0$&l+D<(~Jxe`DJx{$r?Vw)72v&bG zMqZ4382K>@U<3<2btAQla8NJ9&u(fD{QVk6tszT{+6sTQ!>EJsyQ4sNU9hGcyr5uy zgZ=`b?I5v0`7o(6%Bm#gE2gRX2WLQ}Ee}cpa?2~5^%OQJje8Ca=D|L(d1qI%Rw3R< zN%G2uSscw8)+di()T)L?LQO*BIs1S^Q=TzH0<+oB;yYqYR9CV$^E`bsf^-4k%sxMeq$U z>J5$o$J;Q<4EYE`Jwfk~xCq8lD#4HzVOUlK>)sa%JaQqE333t-omyxCCZGxuX^?w{*3vp!Pa9|>ZNjK8M*T1Xo7EqqEQ|(VG!Uaf7!Ae< zEYeVnvY(_av=zt;u9x_qi;klmw3C>M(J+ig0i^|JO!yBdo`caujPfP#N2ss}>#;DE zAskZ-#X&u)AS*Dj8nW0SI(S-aF6h7;+X_U#acI#!8&qCjCmNS8 z)Qx}&ZTvb6oiJU4uNv+?Kv2h`Z!hs8{36^jJ5Q)IYN#;~$}7UH`W2RzRRnuNiY$i{ z(v{&C4c+TG9?B9n(j-D$=H?xSmQ5EkD?;vBkk}hr_6(^zQG-A;p-3y-Oh8!lXz4aY z1f52=g^C}EBNz?GXyh??nohT;JB)_pUZt4H!Ds~Jg&{>vccMFklMqheN&VKs<1S+5 zkn~+@+KuiGsj_g><}6)H_n=^l+fS z2zn$viXIKmvx{a1fkXwF#kqx*@LecpaCUb|j)$fdSf}wAO&FI|omZ5f3ma3gP!a*g z(c|lft)s_|j+LT|sne^!*q;1v2Ho&{Y`KLq3g$ z3Mx&Qb)k-H=^A>5z_J@(H5%?;`6?krbsK#L_-gcQdJcU%4P}S)TzVcopI(5`B#eqM znv4-Rro|YQU{s1x8Ajz#z-fbp^j-Ab@Ou#rF(Xok7QR&b`ySg7aRtm zY_4}jMOlSp(;+3Bs2}^hWv#dK0~wev*C)qiT%q$EXgY ztr)$55x4`NVv@k50h8dUg?8ukR{A;EozvUs?esJBvlvao2z>n-jApE(pQm4-chKP9 z&BW+-jPAhbK5>s1ipz(jv~qN1^~55Pki)8kYN7(D$*fPFN?`7Rq7(X6`ZbJZVKj$V zpC*2z_t9_AZ-V5%Mf^_hrw`C?)9=vlfUq8<4-seSL-Y~QZcx2bQ3dn_4px_x4y-Pj zDAa6fgQfX5Jk;bhspWx{0$X6Ip%7~d_YDo%_+j(DWqBCg#u+i1&E@lirq!+-u3v#v zN%9{ghk61I19D3tuTvog07c#&r%ynP5VnTHAdeC%$_Np3Eq#)HS6GfWYtVAdNy}6{ zO}|f?!c_f8z$}r2J@#w?vx5?UJ^?S3K0}|yh{tGQ*q5X)&_e8{W$E~w{sN@qD~vEk zu(Uxs?yTP-(%%Z~zCvHcXfB4Nc#G`52I{UvWcPJo_jURwjOGah4**ySM-F%Ue?aiR z8nzUMo>&3VrC@~=wiFbD;1&y!IUMTYg4PN6=fxM zw;0~aA1v(Sf)$;G_-n_Gy^1PehX939g8vG;gvu-^uk311a@(uQ?Cw8lV|Tgj1u%6g z#5!{;3L95+%VaX;%~&mqkhP+B$W$2Jh0(nts~6X^TBZS3%d|2bMt5Vhs6|%Gj50V% zEU;Q;ALy(X0pbR1&{b#i=pNLL*)4z{Y^+vbv`WP9p%8w91pEeLw6bOVvSq_$!$kZ> z0DdE6qcD1q(+K!=0{j@9!%Y)364WXFJJ#i|DmzG-6b7s6b2pGWE{4obWffE=2nC!1 zF~-&lb6+?eQBqzEVFu7D`Sx-sDFX#nQB|E=Y=>IpNoDzVcR6gAt6-m!5l-2-L5}Qh z=>&wZ+bVAD4oORnEdQp|49W_Cn&1yUg3)6lH6ijS!81jmCU}RdTc&1Nn3_|8np0)4 zJ9t!}WnZAB^3ea7mecBK+3l~=vS+ZkxCIjCa2=r#Su6mCm77~?mrnKwi!^s4m=Gvh zw&w|93A^BM-Gu(LWc*F(k7aXZ^JMceT8q)+7(I>AmJt2#6zIPYLkU+)hFf-zY>{k{ zD9ww3{)=VcWv=HSU_YBP0|%&OIb5hD@86N;`tn;b*cB4Y2cTqB2C8I3!vb9?gD~(- z7U*i(qq4_j;687}XfsAnV)Rr9C7~ouwhp5wT1IJuY@=+Wh|(rNX_E}PZsJ%0B|V@- z{`R*NkXTCC3lwcxq2&GvYi>)uoEUl*L*=2Z_3`1 zy(RMC0Px^|>>Z4r;UJ7ZTZ0fVA!bz$*Y`irk|ETKs|$-th2sta4_ff;WN*rjfNDMp zPKq@D31NOK7YPsu(=U>A)4PJ&Ns3v7{R`5Hg_+;X7GZ%{0F4@Qv;F* zL9W2eqH@VU9#d2<$U%!tV|M46t#X;fAdEdfGkR61|09*BbF#=q0un z2`!g==^XCq2Isk;x>P(z^A|nm#?Deb{2e>Ohu(0Ia7M^k{?kS`dQ_e4!okD>_$h_@ zi>gV%up4ckUQ{*7o>Xu8XbI8G{@;HrXOC7ERvqQr!BpgcjIbW_$Q%e}x_KSpn2 zbUEALyH^d*n0LeRp zB9nKKLk{L`jE;sCnY@QQ^QPGKk@p4cZovq2^I;LYBO&Yt2-pq8=wQp(4GGI^Hei=6 zACA!>0lTh%ow6o}EB>#jFJaJnzgN&+@B@43dgnqus$Ld*{{>I2s8Z;kU0o!eaFX1$ z>=`u;gNB7;oILlY3nk$mrl$S2eg${{j(yk+tghsjq8OzPE^99YjKn{=I$LPbB*>D%QhMUASdJnMS9yx?UJ^(gopn#arbh__vEz-fFgCcrp zH}O#9Fui<-w=>;OK&=$uH8 z^C5aXE=c4C3^`cDsKq+M!O;8 zB6Sq@9L=OOBw5$wKi`ywzsP@;|0V~4x{eXVOMk`aw|W{X5YSLTV)SE+G*rmw_v!Zq z8Y&bD27X{4`;$n)&KUiy@qd}amHpEc6gLZ%GvJJWiL_rB3O&NV z(;{_>IE4d~aGO5eGT9TFr>`(c0ojEB_dl0AYGEU#NT5$Ek_CR(=gmHXiMe!fYHuJfvGu)TQRA|q^4!2=G~CSA-VsynQ;Yu>Ol=%)5Oxnu za*i$SS^wb#j$*0;YI@fxDioFUGm2_V8Zl`SoEg%*PBC3kqnM$XiAf74K@B=Fnfz}% zGYVc1B&?W=Nh>C8Eeq0ukg8PNNt{*OskjT1Q6NYf6a~Jct1Fxu-eX>XY%8$${c5@BZnzRj47li;DD+~sc=kY@CdaC^FCuciOL)^8QT zsnw8uuC%9xBVUzXJJkN!+t{ar11^-NP6LNKY;m7a?6@hpUR3M^a=nB}7bZO-xspQU z+AWZ44<_9$lk0WGUd3L~$9V%J=nchNm`vp4Krk)_M2JTJJjvd!R~M68rct603ly?v zMR`S#nJFuu(Ky}eX%eyw(=atm!xl*h`{BkBtHvhhCh6OrRTag(Mu``1g(4D)BZ`wZ zH3;u2PJuxQP@isCBZ_B|$BW3sJ?Te}c$*9F{u#AKV6ar-44Z3zXd$TShR z|3#pM2?fIc(Kr=DGdGP-GfD>H(@Z2L+hekmNV(4Slw%-1UCU@N*`Y1WWoH7b^FIkSr4~eW~B8Fm5IQMe|G|<6)ARWX8+*7(XV# z?e2-mUYP8S$xKZ4!DQbJ#8f7ga4>C{G^px!z!5*PpHL}z3np)c>TU55lBrilpKyV4 zPpNE3$kyLbFDaB#3zd*U6?#9R<_J!Rh_!ZNr4dx5!F%!K$uOvgtrU*mi$@?}2PV{H z!somxLJ<{o6N;F`BL`5&2eS{G1kv>TK@~%)gVjN)EL-eRKiAOe(o&cw19HYfMR%hc zg4%Rw?X|b<&~Swc(}U?lB(7&Nn4U~8rZ)p*=#R-POb)>0Kuiu=&-7)4+X`I_JOg43 zfina)Ob!#A8KD5XcTF&_S|}{?c*(6we5a({nIfa03_T zK|ZpuXZ`&L^?hPOV~5U*giBAw$tR@Lq!;9+w=S62rXVFPMG~Rm^y)fh1TzwoLot~R zm7T+~;L4`a!e91;1iN%Zgc%2cL1sLLWAtMh-H$+=Wpar#OdbPOju=kY55wdLOy&Ua z;qyXGAn>Q^ZVW;7rvhOpd|iI82VOKON1K!jS@Uv~aw+ZR`3v zCW+*I%Zeeh*0Cd8ITeJ``b4S5sV9_l)|bBJ3?G)+-Xk7@W-5eH#`2R#NiqdEBDmRz z86i9#%1@TQ!9i>ccLKmv=Fa&7z3p&>Ln^F;RF6QOuDaX*kp6IRoR$@8VVK*Q`Cw6C z$zf(LGf!M=FiajM^Vcy8V2$0$EW~6`SX~8}ED|J2kcWn|R^c@U-aRayK_FvdU9xok zF2q*B?U!oz!==f>NtXJ@4b{P-=(lgvE_@D$xsO=_CFacim@KSimSS?!pOlz0E0~o{ z&fzc*F^@F#UX97gd}avoHB4>Ow(FQD1WK%D9%nW%8!=go$r4PKVzO)oyu`fR6w^J-TcBv^Im~O!>&#weAM*wS(bytP!v1I)CZ}Vv z29q-|IdcQEUqt*JK>iSO7{kR4BKo%pG`Itk_X_gh0MLh*R>I2950&-ah@WttCA;SU zVcA!=KpNpxM@U_WD_@cf;iQaIXnymNZ={@XbSEs9O-9WKf*)C*76Z=QAbwJDdV0e# zFy=J#fk5c@F*&=I`4E$H{*2IPm~(J`lsSvZ+iMwc5P3dJy4ouwbC;OU;UZ4vGW824 zAt{qt$9y4tgqq>Z=1sq4zJsRJFU(bViOG4wM~Dc+$N79#{Uu_dVSi$NmD)nw6dEjm zwlFMw6o!Qh$m-j%Buj^pVP%-SGrSsDhJ|9-deGSjOfC$cie*(SC%gh*6xXug3fkjnpk^Kr_$-{f3k#BTY#MXoVVMwweb`%?4bYzj8w`8s6>yqc5bE%~ zzs~NO!VYWJcQ^~i=s`@b3QZoquUDG9f)@vXQn|lS78R;5Yj%Ba2=a04B)Gko z9nVf+bJ$ziTy`Rx$L6y^wt$6G!k{W2#pGj{T!Ts2-Pd7qEhg7t687_tV{*f0!o^M| zrn1Fs30umRvE?kdVc>{?)3Fh}u~rY@Rx5C;hjFVHajTs;a+RPp1XZDLup5EX+#!MaVh%Sc1SXUkflT=751atR(t{j05t7>t;$=eawO_9;sqNadOLs}{grwo{ z;qWjsB`v*YYP;6H_U&5t@TK+c-PYG3txbDh+q51%Tc`Ez**-J9R|vUXEI2l`>`R#3 zRm;AD$(ID=g#B9IV9gC!!HS!e;!hF(!0ku%pTbza&YmC=w{RT0m)*y{!M@49#qMVh zuy3>Pum{;g>|yo@dz3xK9>*k11aZ38Fu50#Z(#B*Odi1GJD5C#$s?FNhRG9{d>51N zVG_KC4}~F5vhT8|*!S4e?ECBo?1$_}?8odU>>2hfdyYNNUcltXnEVuzUtscEOkTs} z&zSrJQ#7VnOsO!X!;~3Q(U@{#xO{|yJHZ=^$!8M%cmHSAqCRF|cs*th(G^ zIisfW@Lx;Azna4hF8KGe?hV6N7X_r-gmPN9t7+ZNUtU_+c$)8|XhGzctlFsB;FxmQ!9>;)gobMpGzBX^Q37HN- zAHAK!4f(s1WJBR0_}@8g+JQ7QpQn{H&%qpS)Zd+_@h!JG?c1f*q^8|~mPVTHa1J-- z?@l+U9PVF$V``G_$!Xm_y{2_)`{wu=r3sJz19S|FUIs)Hn#r9Ka!Ufgj^}WL{w`u! z!i8BmsRI3)V`G^OTCm`A%d>#hRL(M`h+qAZm}2cvY)E# zrR=SQEtYW8MA%Op3@3)AW6MHF7dFu6FnQr0v}?{DJEmN}uzW>^c-mZfi?Y9TlXn<^ z<|wRHW+?{<$C8Ec#Z6nad^Wk>Nl^|`4iSh32wkjI4#ni9ze2PT0?{DCdATXk#wy1t zGX>gwj>*qN+Wg~2+1X>~nOz_AhTB8%=PL6W;Lpe8m-RbqC4@d}m6I^}RZ|#?l_e64 z-(d1<5ytJxDZAz0s3?r(tg0H%~7SPu%Y9>P>aQ&^8F zk4vydVycx0>wnRI5~2Mi@1?L-dQbU&1GFDtN*#jsV*%PvFvT^6_Pp|f1g#cR5W@t@ z{%!W(;CzWdo}WABV2GrjDTRMyre5`biK$R|rScmA$Zs)aXbR-_%4-skCQKPcApdF4 zO$711wcn?OK>S$=q2myUzhNqL=V1f^AVwfeS(|_uA&ZbpAlfh$C4%^$6l34q?UMkE z<(%~ZMnptJ0)P>%Fcni90h{62zhFKiv;y$3ZHC&TMm|S`DZ(rP@4ys9pFs%zNq-W& zi)nRt-Q7wN0zEnc{>i|4+D6zh6)KI2a0=kXV=AF3c!?1n2|PEZTq1b?kTWV0_1g~v zr$UhVBT^b5OU0C@e)UA836QnLR8mvOIz)7oAoF4>S%mEG`yI_ZSrNwl1=G8RVC)vr zqXEVYO!-4F_7-5w#8jXujJHJemtX{ZQbZX4_Tp*g28$qmq^S8Q1mfTb;r7#rA((1Y z8}Gefn?$8al1%;!WdUXjQ zU?3rwgk}U83nOq^LAOtXNR~Gw*Ka;rB_{FaL8q$IyOn zX71d%)9&1&Mba~Ji98aMf1oP{ojQQ>zkBKHzkEjQA08qbOu59IyrR5m8J+6a{B-2@ zM^*)C9joB5gk_1p%j4t68S0lX?dyqjQp(pocz4JOnyOrQGQ8YF25|l zBEKrXCa;j|GT^S^560aB|&MXoTca#y}~KH zA}FFFDF#JW6ve1CS6V2EN=qe4F)3yxS+OWqB}K6*b|qDDC{D$tq$zI2qogYtN~UtQ za*lGY(n@Kqv{BkB?UeJB_DYtLt>h?PC0EH)@|6OmP$^Q1mGhMj$_2`W%0N=K!W za*5Je>7rb!bX6`>E?2rKS14C1-IX3nPo$-!kC+K>Et`F$?fo=fk27zt} z=!Ss~^?3y7MuKh>=thI?8qkdeT?OdIgKh%oszFx^x=Em$0=nx!cRlE)gKh@sZUmgj ztD6bBTR}G)baO#BA9Qzs?k>>X1G;-bcOU2;0Nq2Ndjxckf$j;=`9ZfBbWee9Dd?UB z-Sac>H(mhUOQ3rhbhw39fUW^_uY>MQ(7gpX30R35@$ANM@=ta;QK(BzlIp`BXp9Fd{=q;d60lgjc4$!+m?*@H3=rcio4(MBf zz76QxfxbQHvqA3#eIDowKwkv<^FecZ(EkDYsQ${Oelxvi7WvntzsZc7F@k*64LAh3`R%(=5Wuh`knXF7vrYhGd zb;|Y1G-bMSgEB(_^E_<&g57a#%T{e6Ji;eo%f?eo}r`eo=l^jw!z>zbk(ze=5h7zm&g~6UGE% zGvirCol$S(jJ#1Wiblz3Fv>>7Xf!rAwlF3dTN;y$CZpMyY_u4y#uTH?Xg8)B9Y&|o zWlS@=jUHpVF~gW?JllAV@mymoV{2m@V_Rc8<9WvR#w=sDF~{gN<{I;i`Njfcp|QwV zY&_rC!FYl3LgPioi;W$Pos5?lI~%(gFEw^GUS_=9*v)u_@k(QNV-I6bV=rTG<5k8! z#=gdW#{R|u#(~B`#=*uR#-YYx#^J!V11=l5BH%6nt_yHi0@nw)A;66Ut{k{Z;3fh$ z6}V}@0dThgHxIZ4z&v4vX#-1ES_0$e?CZvnRvxDNrxZ*X4#w-<1122R4@eh0o8 z@DlJXflmhB3H;f>p9g#n@I}C10DNcQF9ZHc;Clhz7x;m|`+y$CDz+VUabikXx z{A}Rw0{&j$9{~Ol;2#J6Y2aS~eg)taPkt@%?*acI;9W@mGvIds-ectV1Ahqk?}0xC z{GWjL^#l$CBM4>?Qb2HkkOsmzAhZU&ekBxvZ~+J%LAV@*?jZCAp&tkXK^OwU)gX)n zVKfM1K^PChB*1$Z!ZZ+OfN(Pib3wQRgu6kw7la2uco>AoKv)FA62OZB!ZHwE17Q^i zt3g-?!aE>r24M>bAA|5I2s=Ue7K8&J90uViU_-QU41_;GJPSk)MC@~uK}-VC0-_B> zCx{*pGeK+xVp|Y%K`a3Ad=M`J@e;sBOYsU2dxCfsi2Xnu1mZ9deISkju?oZ*5GR2+ z6~t*E0*JSOcpHfGK)e&g`#^jU#796}4B}G2#xe0l5MKeY9>h05TnFMiAif9KQ6+u^ z;-?^f0peGHEkokBARY$s2M~V-@i)Ns8Sw;2XMrSvWCZNKk&;1jfaC@#6QoukwF4;& zq+E~+0Xtlzi$LlG(xo7E1MEYQdV|ytq(LD0Kq>`n?2yKSR0+~VkfwlC2hwzqZUkv2 zwi|#n52QOmx(B5DKzb0cEG<0_(vyI-W32s3uYgn!SZbBlg0vB&_dxm(q>rN{eKz%x_a|yQ8wZA5!9A+HD=(so@bcCL#$%+~? z7Md^?Nk;{vqmwVO=8VhZKhS~qnjmQm9A^pfd;R-($9(Ir`7ZB-X1BGrio zzS0V663^_j6e7WqWWTSuzh7^T2lh?vwGN!%@rI4qIGXV?Zkr^iTQ4bkcYy3zZ1HY1^jFLC5)$VVf9 z#?~@?C%ys)p0YQP!@q8y6UqDS?8Ci$iQ`Y>!>4J;Xcj>v5%(}6t~!&qiz4ywXZU@a zdcZ&=O^+~|`uh^6pK-y5E#^Nz;*}G-5Q`X51AU33&ooi$903B2nA#J)2cBXdAAEYb z%1FyyGj)9JHNJ^>J0toF&#^BI^(B_ag+1(5Vf#EVlPp%e^k(K@&<&68AWO7@Y|wE) z($o_g76svg8;mGrzF*6E{H^KJHl zQePsR>D3Gz#ZjkRpMIVCvel)Zd^m(Ll-qA#9m)85Mi<@!nS7?{Qa2H6BV?p>$A^H* zMzL3Ix?n2g8~UwSa=v2Z zRQVDwJq>aK2Dk6jnzAY6Uq!3k*9`kwU*dJAf&Gtu1>2mX$|m77)tW47f1gywb^{KU z@pZ;)FFo+}kXU9}^QaDc+^5EepjdA`)}4>>h*`I(ZsO_nVV!i^MN6OcnCkF7kTV{R zX`SQU#-CE!5EfLn5s;fJ_*3?LG<6Zq)dP4{&Nkx64IcrVT zO^e6w4(0^t;}}f@Huq(L-^LDi`rT-9SQD%6hSO_TjO2K9rLSs&ZydgbRaO!G4c5S_ zgE(xevPl?P)?{I4eaWa&yx9^S+=bpVb9*&h&Xzivkq6?O}@nI&-5mbFtGp0 zsg8`ro3kER-7RrAd?HASviX|UzBy}>)y=|}15QIW0ev9L8jPZ&*ksMIy4!q-b4~;O zAMHKerSRbyi%)Cd*!r3*%rE%R*kY2Qwmf+BN5uM=843JRw631bPNX@FvH%E<`MJtq z4lFv3ZO(dYb@P0Qv(K~;Vo#GSyxxhgKlo^xcfcBSqKS4mva^=Wg~2;p_!pvO!1{A_ zIL`8ndqNS)7?mzW*I;Co`XWK(Mr9qmx;uS|!~T_|Xl7jWi`7gpBh`1b173joptY}j z{OGF4PZqQFzq=^|Zf}fN(j156Qbf2Q9t#pYGscuv;S&$lQv<;Z#t1l;o(6tLN(aZy z5+MtHi4*?Sf~egZS^v0yBQ!(HOhu7_4?PeW_s8Q54QEA89U;eT=pKxm2YrdPXId(% z_d>@xd!&*rPQZ3e#W%oWHKh+D|Hfs;)EXf>sU%k7$uA1pyuj=M#km?F*ffL94H^X z+eR}oo{W>9g1%sNNmOK1URC4k-;JIO4`+j-GW5;IF_Mlhi&#UUgP)eMQ0Q^yA}*6jvH z(6TrjKI)Q3hUQp}sIDp>`|90N-Kk8nDeVB|-sN%bD%+hwk z_^p;*dyiI@+ZZj&eTlw*MazHVnMC?3(O;dHcrh|vOln0;VnqoN(0w}*H7dv-00jeDP9=x_KEZ~j+G z@?UsM0Z0FzQqNt=$CT690N>>}q$(yW-h2roZPovN6m+CJ`7ER2?WT0Lb7RfSi;So> zjZ(VEi?*>Jc$Ix%U88m}i{3QK`ps7|_zjKH>2SU_W=p=s(BFwe+2X%3!ZFmWW7NER zdfBV!f_OyjJIXKE#J;gPUguxr)O2#Y@Mx?2foCyXWE>o2l1533U=xZ zs;sz_JpveQEk9-iY>7kIb&^}$IT-VF!I=fMWxcDgNn>g>IolaIAH^YQ9P*SRofE1X z&_m)i(K-6&I~g6H#KBG1GV_{!G%@>PFC*zwEE@!8kc=v?!N&se&7+E`IDiC)Ta=FT zjm9KZS;PR6yquzfb86KwjWmv=@Er9o;E#EcR(n4K-`@C|MA?)HnCmEw1V7Bczi5>8 zVvSk&aOKn(^dA}emyL=aShaclq!{dD4Erlz;w@)-dq!ABf{uE)IP|a%?HEdiQ`Rx| z$T`kv+wDu7ai(e0Qqh_x|Bf5%d5SIlolS&tSx z`}Q}DSF}nslNgOIGxUAF#Eg?Tn^;qw6?oJ!tG2u{I>pu^k^Rd9|Mrs9Bpk6gYMi%y zUe<((Bhgs4$6saDsIzRc@Xx&Mr(~&1Rfeydl-5p((U2C&?6Zd&)#nkJ_m8$nE$j^c zaHGT>`Fv&M(byu5p?@ETr=$b=9c-km(MYKe=-V$BPwq;rokvlX$*B6FQI4K!ZLqdR zCuB5yYX<*Q9J(cAc8+E-C0s%2iZ&@$pV~9xeu+a)G{PE2#ghFnrJ>;vx5#Cr9BW$R z7n{^?QN+ml{a>EZxkb78*%60y=#0*eI7VAs$iV-MgPZ=}m0Y7X!X=EFzv8exBb0#* zZPd|7dPyTq!^zAjsxD(xooG}>JMg+f&^$!%(C+FN8u=Ijb7lfv=26a4i>nyEu2G?C zR6Z!iY7bx^;NsxZ{C9ShPLxZj#;y}y_S*GvQd!%t1R>w*Dcx%Ol8=nIP|{+c2QIwuv7m)^18qFHH#M089m8y z*wti?@feP&D+SZ~1ItEU!Um&;O>)dS+{9?J#-aI{$tutTP>F_xiAi-@aR4V?ql$H6 zZe_&S;&E;T>+Z1`hR*2c#dd5()!r@ETdBZJNU+rDbs9YZn2ONmllVe7U5|8Q)gH7&VPu}<7s@V1Ro^D zY(~@p_&5X4XjI4+S-gnZii;Wk+40gdDnYU>$SyoZbN3AU`nmBc$70vhH9-}lAG-$L zmXEH9wRnM%(fWT>!@*ZcDsc2R6ASY#Lo?4~ttdOGg8vdjAe1DYsERy&5x2pwXCR zv3bfC@3Rl&$AM=pZv>MgOq=nCkUtV*X+B~k75>{vohRo3)jEQj{5v^c@)`R|@fpz5 zF4$}uy=-4H@D6e4Yz;^?7-DK=pgL(bbw;}ldl-cm#=*0S(Dmqy48434?1GKjc>5SJ z7spKr|H;kki%%GqjW3N!r+vpr>eQ%g9W!I9dc^4X4-CF@9IW*}IJRnPE=uyhGCD4e z10Cw-i*0l2HF-QfDN$Wr663x6$>_KY-%p~%P1Nh(4uitg2=Cr~Lu>>r2hZ>Tbk%$JtY!+DIFD<nieaO@-6(!8VE83*vxdP7rmD}$%u?XDqPs*AJ26U1 zBU;H)0Q9N~uP5 zOKDP0G%dXuE#-}hzGAL_MM=It`@pz3DbwOGg-LZ-BCjR&V9(gmW6aSOauy@vhSM7ue+BksbuS-TT~a-jdegHm!G{T} zr)tE@iF4U^AP#kgK=cq!s7wg|sBY>&6kk?TT3tRt4fa{Rj`um_y`c_JKR&;2$%S60WlJq?_gy*oBNaLG@Y1 zXuDF+D7iZhMd_3F`^mTBDR~f3!jmt=C%(yOThKTiFTr$tkC%sn_U#Abke`fjEHrNcM;V{3jE;xnZ3dzn z5iXgC?YY&lCh1c~%cK7}S4!`zNAIg0?B70qdRJtE_Bp0aDn?&+vu`Z=PuB=c;eG@=*#!Uv6Nx#$u$%F(@hE&DO} zEpc!zBQ|f8B@E;!qqrQ*$oMD@8N{fBLUbh2Bhbq6tCKHM*(%cFytme;V4Y(Kq}R_sS2l8;fWRI;yp5r-NATd-i!kX9_JI>yEV zM+>%^QS;^hVqD-q8wj<5l3v1&CU7z%@T*4Ejbf&>#2ic4vrp{CGwy++3%;Lzf>>;b^&>fgg** zz$&e@O~l12?VbIg3yDe8U zO8$ylru)BY`Hj*34UDK0jXJy3?H%FcMkkZrQ$N8q^CiwY$;|!d0$HrjqLo_=+Agim z@RJG~F#_1asME!v2`&_rMUR&4j>8wD?f5oE1LsTZbQ%&0q^Q-}Lp1Ie3|BZa-Xg7p z#wfLxyVzHxMj235g+>RGkx>Tp8wM{oUPH0?HU@jKeHe*F%jqEdgfVV5LUU&ZN*z(m ze$Oar5eLsZ!hS~P(rBm?8}LY#lc?l-%byuFE#olkG_*HVvl;wV^s@ZUK5zQhx&Ola z|CIZ0`8UH(Zj@Woxum*QYs`C+j-gu{pG6|4G|HSNi45BouPJC1_!J7N0_%M0j=zWr zcan^ZfYc^vXAWGRrW-XUwJs(lF}j?Mj|6J4*DP{dCRrJDS{$}zpdO5KJ7OMi2r^0k zkEX`KsPV+hX^y)6(NCR*7UNYVc^C;9aVQRJUxH@I9L>#k4x{DlI26p)7$WN3qEo-& zlGK*bajq}1)k&v#WH^WO4zo%}m5q*0)+J@Lf8II{zWganKP&8njeoRfl$6g1Y8!{N zT?9c<*+ZO)z+OQhQWB&DLxP-ClyqT2D}Tbeg!Ks<5;o4bct*z=on~C(Pr4}S;)L|1 zPQaZ9T>BaL{&v=k?iroxKkqO;;T`X=x|~99b~|@YzBg~$kh+|LqT+ULZ_%_M=w(UW z5j5%Yq;5%9B;jk!Ily^=%LOjapVT9%Cj$2dE+4o80xq1<-ItisyBc%r*s51miudrx z*HTX?4iT)J;7iPm`J(~lHRagjLoe-=lw!6>ZT1;{dHJZaP8Aj1YHB8y)nFq-%s*li zSg@WI^{+BIHS8Vr!R0?UA68dTl#`DP6%-du8(deEombG#T^QnLNRscA{ESE{L4Hbs zD+ca-;->=%s$uV#-}#G=46n<{&MV4A;M}~zX+!IB@c;Ok0&fVqJZU^Zk4+kvRFQ-) zRbL3)MZjGQTt|OWRni26t_BX5;Sz%G+?1lKKi;wR9hp8{`|NC7?wp*wToe_Kbj)ez z&JFQ%eG(8q(~_nq-H4~I8N%+WlU*P%y*B`h6{-ni8OHiwx25um5gGj3eH{~kS zUw*;0f8JyrR_86s&BKK#E-FNel9yA68!#tqQI;pIAckH}dL`-Aq}PBO3fwT@@agxf z{Ymvn4am^z!1;h1K@62NDMP~xuG*e(?XbH1;$qq+dEQ)RBGC$X!%DV3>0M%IL(;~i zcak;%hX!O6aAm-a_9wlUw3#W{7~rmHawS_a<&IXl+efQP=FN>zvd@yfL>5jyI(8;~ zh3l~!xUs;EqxGmzkB%Kn-puaJ4XrE4$?>9bEzCi&6yz1)?kmU-Dek_c??^2BlMW;u zOgaSIc;Kpln*iLk{-nc6M-cZYaA*;02)DK=*Lh{h(HoES89ca-j=qATJhFwkwBp$z zX8uSzaVlm^38rQV=_Va;lYpB{%uFF6tt>gzY>$24@H%f!UJlw-FX|AA$&053s!s^n zB$=8c@>#Ray7jEv&YC@A(~Ng#yf` z6q2>e%csLAFS`)G5nfSKipfa?Yn|IBmnjXQJ-|%|?goOMp`LTQf7XwxeP>u*VYU}n z6$w=xf?_X8C3MP}&Na0|U{fnoYf~FjTi|X4?k3=F2JRNW={!?=1kMI-CUCO|_|~Re z))k%FEI4=1-6);xY!p>-A;~|dP<3!}f-7q}-*oXQ1=Z2i3Hj*^+-%_H5I=KOLG3xx z?8_;OhSe42I&19rtT&@b>;(iJ8*XZccC&O!v9>@4JWB6?*gY(Q<6HSwt<$eOVMaWRodN}p>3Fi-+K5r0tIE8tk zv&RIcnWVj1XOC%?=~l+UlfW$waFEey#gzGPR*e{{B6+jJ``~udJtT`eOm~{@GTjZ_ zQ^28Pu@tyx{H6t_dl}NRz&+RGvS|2XGWSl8Ec7!9^HCh$?4mFikDC?~7f+ZLnfxZ? zdl_&q0QVwrFZoSNOiwW`mIL>4lXFqOJ^QSux2NJEnn#CdQE^_#BrP|o9+IZ*t~a5F zWI_+=Rp4GjCb$&=+r56lZ#~eV_ZCy^QSz}sjT4!1hTmx_` zfkUh}{HBejcbIVA1a4K63unc~oJ~hg{4}&KH;2NvqQda`^Ra0=G4Y9Mo9R>2XTZG; z+-l&~0Jqj}`rPyd3g=7U)&aMkgtMV3jZpoT`v=RT<{}f>xC}YoLe+cB&BfJ@IH>oT z$W1csHytn?G@+aH4shs0z6;!Ye$!zSx=E&^z-^CQv(N8j?pY#cE+lZS_o06OQ=jMDo z*!LcKQW!DPF`k!KpoaCuIq2|&&vCQSoP;cCnpm^RY-YP=J8+*POLR!6Cid0J1gC0Z zi;F^`oH^C(MkKSt>@>T~X~69O4s~@Wa9{b&9&}gWr9C~chZQP!r zbzU#Im4(@P(+1)38R-p}+naNVn=Es-Imhe;?rY$_0q$Gi_W8|u=6oiX{lFav$ffBr zLo2qvcvr>!yU`KM%`HMl5HnqY^p?4!`BGw{llc;JXLA?ea07k^++pC3_|09-moX;3 z2kvN-Gf_X$cl^b=7Ub)D(MKyT3T--bAM-$BqOZB1xxaY;a6ba~6L3ER_lw^=$UGSJ z3S;bFfjdTe^;=WwRm0bd+?j1(WhTUnp4ecFHgHLDLLQB|%siHu8Eqb8zQ$Y*+#kUG z3EXku{_>m0nJbVP3?$LAoIqyygr;Pse$#aOO*d9ygqNqrblw7t@Nml%z5!VR;CbK$Vo7XLmX4pjY0=pe0w%t&2zPy9 zHu}t=?2UPj`3~Y`u6dq$zWH|G4ZzF5E5IB5<~z-IAusm;-yHZB#7kmR^0LzKZ7(O4DN-&drWnARla1$ZUdUrKKVn{l44o8zoBie|k(njHCjoCFX3S*T>$g1Qxh-u3 z`kvX@YNV7)pt<=)>K8(0p8ay!PT@b$NMeq9>=2^0fKIYAGNL{EPVy64S5d zW9Hw?zXR_DJ{R~r;Pd_FKh4M0qmeHFz7T<%I5&I35_NZd==H-W2NEVV6WI;0p znQTmMo{*l5GARb0iaoqq?7>uE?cNPHqF3n6rer~Gb`F(BiVMkW52;YHB{>y=ldZ`q z$+l$N#}@*B5%3oS-_f7!NOm&WbON4AJxwc{6)!q!pE&fZ>WdZ?gnZHDR>|if2Pb8G zliMd}p;&T&?*ja#B$lqK+1uH2*OX3EhS%liOYWaM1c5ax5y?Z7havFQ z!1o58szZDq75M6BH^2Vl!+WAkHK|V430cj zlJ8G`g!p+N`N8Cek{<^C8sN);9}E0AfAXWrk0C!#0AB%oCGj)9N%=Xt{`ja@ThMOC zd=VMBTyk9V^RWWl&Yd6LdCw-lh%9NkG086_FGrSM0e%AT*Ah$Bsv0{xJh0^F$tbFv zVqEQ9tdf%&=M|B&6gCqpliwm)y`KC=@|(%4fUgC9BJh)dpX^V5J9#y;pHqOJioi{4 zKkHX7erDN{S?mbTEe;#d&B>HR)c?Q(L^pra30G!0FCo|lA`lO5V|mX;O^NlVK&wOB1F z$P;=ScLRS9@w9-XRbMr+{~Ny#Mn%F>Am#;B|J|EMM_ssTXK`E3M%-qro2_ZKw%NKF zb7#z(F@MJGe#<$Qa}l#O@C$*zk1+3Nn)>4f^AoP5+*mf5gdECFlkbVT8ezgMS(ZFR z)hsev@+}33Tm<}sz&}LD4-<03&Nj)-w~j$%Odyhh$W@W^iq#Tn$Us;wvUH}k)pD>b zT`ZR}1Mw*Ek0Ej(>Gq;y^r}1WVoo5rw1Mqp>2A3Sp)5TtJuST~y@5w7ya;$d@K5?J zeJp*E$o{}D27U<<`Bamt$jq8BNQ{`1!jn|rTHCA?bW$Bf>-p6fPm_vJ@IG?N#DlFv>Le|=H zv*k8o=oZUN%Ph;Sz}Exc0Q^eeU-w&PTjn4`Xp!Ck{!LOLF0hY zA9^v~LaIK6RcxW4(G2q_@el@YPM%~gQjyNV79$-tIUrer%*PDm2 zQy6rywsSm{087R`Yq2|oP(-h*`d9G1Xh%M2=1hpDe2^Zy`6Uf!_=~Rcv^y*r1Kx+4Adq2lgYYm&a-i zSdS))jUT~pgw5VY%Vvbttgu_&w|s!mTY$&^wi5J5s;NG|=T&_wuS4kKY|3oqVDlp# zmWUj+1fN=V5VBU8$?~OTCnBS#@d@x$nBlQ7LurC}9VTVpikSg5L5tNZY>UY!fia|0VD{f&U8lU4F}-7EC@^{sw+G@Oub&Z&PYa!{IHrZXf*vW>X3a(OJpy z7O2^j+|chc0gpzo%{^^FNFMSQ!Zrv6Ps_h4eE;te6`uH2we!YWI5T9 zMK9}R*6zrTW_7~a!`c(s=?y$Ow7(NOe~_T+H^Emu?DfM@Kk|y{9Pwfw(ol>ZF(FO* zA6kO})}geVTD_{)Vb4|f=Dl$BBt)-vm8>liD> zq9;H|0HGNOXZfvTt(bzq?p;9#f<6G(gucS+gI63{(uJ}$s^qctE+mvm);i*1vUQ4e zs`WY$cn|~-L=Ysu^?K_xl=lrF7(kGb3qfg8_4#?z2W!qrVaK4iC?EGLzQ2pELWq~! ztn-PN+15GMxz>3gGzXyt2uOEJzx8(O9c)FCK%iHuci;Bmum@P~CR{7AK4^XH zl&kT$^$A=JKM2VnSZFn@s`mfd;+{4K&L$_yOL=QAI#GkEAp#{6wq#4K%Me%7hqAt4 zeGze&gJ1)}PPnOryHfuArESd@pw1MNp+&1(fVdb~V}KYoKJ`{QrL~RjDl4AUvH22doFJhd^ipLR%2pfpDJRdf19RE7qeRvVeQ$70d`S*vF+E%Q8T8~@*vi=Q%7ld38@<7PPQre_sA#O_Bly)iSrJ$yC0^t%6I)l)~pOT%DgSaUFOF`&LxR*7l1~qKEH|N+* z%p&9!P;9C-R<4FaqF&J<}QajLQ`g@P? zy?E^dgA?Qy17$V&g{Bl)4~ua@$^!(f)uoy8V9G-X{0Im>5a=F@fcIE%)p!4TfLq^Y zC`yhT!6IA}b!({mB(ydBDNhrwR_!QdY05K*`y2?RAdDj1GQ!2$(RaT;gds>yK`w4H zOaxLU)>}*l!W%MjDa%u+tyDAhl2V_7ZKWx%gD?gJx~C$PtH2#zm^pp)yF=>=)%-oy z2@tm+p9O>=f>)4PR>OUgEcP1&0AQOd_DpMX#W!UPbm1)Uq*H6YXy?8GKD5nV287@Gbg zhJaqm8KAKvD}e>|s2%-v$^qo(q?AF*!IVSD%V7{EgD{17nW~Ct`_rr6`GC1#_((ii zX41c~`u&vh8^UStkl$1OU^}D^1gbx<%~ro6OBuE6I7T9vNhfElFnn9b*38BuoaWxO z2{w_zO$UMQi-h*>8%3=?Mng|6#~3Ju{4QGyo0-70wuUX)W=Tl5rGNk++(_)+MC>-~ zdOg9=D+w)30p%@_G)hk8si%w`JPSMqG4X zZUbR9;m&DNl~_3DjfeVS4I`(xI1dk3uh&aj?#(VPP=6KFa$AnA09n#3_Sgz-Maa_m zAYiaCpIEwG-IR%W`?s1cZ1Yg>JEmn+gA&pWTSpspHEM>EwyrkT)hOHv!d;=oY#5ov z^;y$Q1;w;f$Y|Jl+WHcGT9rCmKU;sM7x#d$AOwXKv!(kdE@Dvm5h^y!rd}V>NPAW$7bV0DN#*WA;x^ly}6Azn&CwZNJI<;{xnRYyOp7~^ackV?(XV7t~< z&8U131S&*?HiPjqAs?Z!?-%tKYa5|R%{J9Go#dyfzc=8^ed_6h*8R~CT*IEjFF!Vu z3oJ@@DDPvNWt&S-T1gt)JllK*^*9JmgrROZw4+bkA%Ud`*KlkLY;@q9)Tw5B(1wSN z4avda>q(N`V%30rv~}0t!+=h)JakvE|14NxeZFz1gJ3tbg%<9P4iwa}-kxM@})OI0w{4o<_F)w!@@GS^<>pi0yl( z=5K-UHZl{~fCHz^n)%?vsGs>PGK;VjzuNvpG|f7f?YQkPhPDQTwIQ?>rAK!htGfd4 zc#&sS9KK&+*V`q;(loGkgI!KYw;Mq~h1x)3-WV{jyY6&s#p67idS9`9v{<#VQ3`1{ z*;5c#vp2$Sv)d8Z0m3E_-X+}kR9t7#jOhtc;88rx!W_lmGs6mZP!7u&m>66{iYR|bX-8EJ-!$b`UTNQK z+`oY?R;e2$4|CCIYm2BsI;@7(_Q|xsTAiQvDfX#sMfQQPKfJ&PkG+Y3f|`k@etzuS z2*b^=--2+Or>T9WeHKawUABWD93ts_M_S#mclhCN>Rv-{5c3C!mhDw7D7INs@EH>O z?RL7dsOg*77ueaAMd1ht--qd3y?9>#K6bVR^Kp(xa0MT>KS4BV1zq+pM*N!`sQhue?v?Z$Bvu4sA%W?0>ZD6G|swe zM@Q_)E+8)_ry$%4X>YKvA~Ll`jM(3@zs=Bo1A)p9!L3(p8#mQW2{1J_%#D!WMmtp- z?eEw(+26Il2g08q90%bq5dQYt-?wA6(Y^(Q6Cfran%Jx<)wcf83kD6YzZp$3<}=8C zs3AFam8qUhXcfP(?>eP;cH8%;;t_Qq25TOe**IRDvaQvZC~P*SB0rqgu^+G>IpxxQ zZ$HY=co6B@MnKr;`nKD94*L0&Awq98Y$A@?kDn6kFZqF(oYHkZA(GDWr;Sli- z2b!&~TO1z!_)Vxx7`~Db#N^B1x&n2iQpnV#c22zWzq$Iz9D< z)ETJ&VmlDe1F=1bS^m_UQg22QXM&gwVh)k$ZBqMn{~h-aKd57>i%s3A7KPOD7PdC2 zccd;jrC9DwUC6|e2V#DNSmwWc-NGMPbp~Y})PqM-=|+=gzkI4c6>l}AE&;I+#3B+) zF|Azv_O_oc`+gp-T#gzZ7OA7N&`ZPZ6&Ck%sdTAHGph9~9GHQyVZD7l^=;x@YameS>eMxeyAH&QLF`Dlom6_SUOLe^ z)`E70mDCHe)l8~damWoD%6C&gJSD+fQnw=T#~^kFu?qoT$_SoSq_n>u%ky;f;uR3J zc%k-Pgzx94exCXj5v-LSNZpmX8*%r7co~S76K*%cZP>Ns<%=_P>TELAp~3DxbQaVD zK0oBpq#j766GwBlO6vEic;ck~2;!9>b|>H-1dKCI9=`RBzisp)Fp*V~TsSk*K zLr6Gp;x%s31pzG$BbgmGMAEE6IP8wpgmi}!#Qq>su|OQCuKJ zC)bPX6gmMM8ID#2s?|R0Xzgf&plBlogE)jhhpM1ekLMllUPq}p^no$YL|rV{+K;P* zJ-UG{ z-QU5EeoWP?DeSOrj&_VAHPSl!92JgA8{NhkR@3_-(FF|PqKaPct`;grSK)en_8bc+jW2jb^ z9GQJ*hc@Wx;EW(-H@8?l(z3}P5AVju98VIimYsAgb}T{Mr$L+!BGnW`HiK%<58`{v zezF93La*HV|inIEOIjs^;i;(TC$NyeP0ncok<5U9yX$bBAL$@vb!w(6PsXw?iD? zfH)t-+X?dy74z~BR}Fk^F`W@=^JxLrS<%L+zrf=nXp{~)j*8R{KypQUJw@|Fey|Mh7}7Bz5Yb|s=(nCHmiR*&mz%i<=UM(r=D?eKZp+m zIKU;mW&e+3-wLQjQMgyeDLWGpO7m`sv!yeMK|KWG!y%~p@3#N;OuGZ>%Ha*h(C%{D zoGyfN+MTIRhZE1VM?riH#K%E=!tYFTx)ai!=#wu3(N7EZWK+s@Mfd!gA)l;L<(iAV zt9bu_M#F~oh_jtDhoqua403v%xyVXBi0E8CMXWrn>fY+b_qE=(isEa!_<|uZ8Hxh+ zx@Q=-gR>*zYVK!eC+8(h+8De%8tzRQxHtuQP z@QY{6987UF<;O5?BVcT$M#nmw-*HZI)*cp|tMfJx-vn_Lh;M=Tw%<9&ITs<(?5qZH4MDDL zN=2@JHsAH!?-oo)Vxt#jVralEMj`p?HSUNtz0dhDvZSppk2oJimT;f02a$>cqFNll z>sGy5e|?M@Xf^~XKbPhUgbQ`fCC+CNRa>2(b3V`1c@v0K8VCg9Q|7N~Ufq(R7USiB zpgzCiY(OZ@x{7n9^K}Nb8AQ5k5b)dwPJ3y{Pd(Ts#$^m5t#NKdB+WXA^Bw0VWc57| zKLl|LvAUHMVkH)u$0$>9LYaEWn~n|a(XFsfcP

(hea`&|c@V_UK-^A{pA%%mu66Ua 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 literal 185897 zcmdSC2VfJ&wm-bHyOLJ2Wz@TDNiMR=%94v@0|8WQdI_dCV{8EiH(aP8*+~x}gpyvd zAprseNJ4sO=^=p>AiWXNDH z{YMBykOW20goqI5Df3j5vKGdhnrj;BCuKFvnisEXX`Y-_*;F;R1}=}wYH4Ux5$N*u zJCyPULP9Wvn$Qqh!bP|V58)+P!bjv0ej-5R6G5UsaUM}lj3dSq6Nrh#Bw{i#g_ufA zBc>BGh{ePbVkxnVxPVwrTu59*a0DhUCN3eaB32OB5;qbz5jPXJ5VsO{5O))sh|R=S z;$GqbVmI*^@i_4e@htHi@jUSo@jmeZ@gZ@X_=q?`d`x^od`g@mejt7%ejwWJDHZMK)wd4wQ>rh(!UEkBU)$Gzf)J1Pwt$(P%UVO+i!9G&CJm zqGr^BTG2wZ2rWiS&{DJvU4gDdSD_W?YP1qvgI1yI(Dmqcv>vsgjp#148Erw^&~~&F z?LxcJgXkgjFnS#AL;KP5=mm5Ty@-yWqv#m=0DXv#qmR(1=vVX``W^j&PNP53UnD^y zQck9keMkkVBvquE)Q~1JgUlv#NGHjXJ~EFiAPdPNGDwEVe&j%M5IKw-Mb0EE$vU#0 zY#tkgLcwL*!xdW%3R3P4X@B1M)-iQ}Q$N8}eK72l5Z{H2Ej_7e!DEC8cDPj?z;G z%1D_gE0sxQQMr_#>Prox22;bRk<=KfoEk?>qNY=oRGg}z8mJcP0%|#RA$2)*1$8@h z2X!a4o@%4osSVUd>MrVT>QU-3>T&7`Y7e!S+DGlD4p7fg&r>f^FH^^;*QvLu52z2R zOM7WQT}YSE z1L!b4m>xopq0gts(NpNDbOjx!Yv}oOBfWsWg1(Zzie5oqO|PV{p;yt@(yQq;^mX)2 z^hSCoy^Fq&zMp=8euRF8ewKcbevLjtAEn=-KcT;*PtxDhKhZzazlp@66p>P-66r*G zkx7&za*A?AE|E`EC@K=2CmJ9cD2j>3h{lN~i>8RCie`xBiRwkIqJ^SGqNSqCMJq&W zL~BLsL^p{xiZ+XOh<1v0i5?K`6Fnt*L3B{`qUf;bZP5p!Peq@Jz7c&ZIwkr`Oo?UU z6mhD!kJv1>iL=DnVz<~M_KW+A!{SnLnRu9ZxOkL!inu~tC9W3F71xMs#f!xkh%Xjj zBED37nfNO4_2QewcZ%1G+r;hSyTrT1yTy-+9}_<=-Y0 zk|mO*l4TN3vQn~Ia=qjR$&Hd*BzH^hk?fT0lH4cREqPe-m}HOS1<66li;|Zlha^WN zMzDP)S70n9+Aj2X%dV@5KgnDd!&%y?!3Gm)ub<}ve`TBeSvXBwDBW+AhPSf>PFz+(&G4C@UFds6< znU9zg%*V{H%x}!^%pc5Y=1=A?DIrDD1=3dOLg`ZJGU-K9PI{^IGU-*)71CAGYo+U? z*GX@Z-YmUcdWW=Kx>qSx?Q?UdY|+`=|j@Tq>oGYN%u>imOdkWL3&VnSo*T` zi1euRP3c?G_oVMjKa!r1ekT1~`nB{M>G#r8(x0WjNdJ(YmLVA_6U!vB6j`cFAydk< zGM&sMGs`k$Hd&S|Tjr9vWj{;1!vO}`Nve#s9%HEM3mwh7pO7^YnN7+xZKV+v

Li)mZC^e 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 diff --git a/Builds/VisualStudio2012/Dexed.vcxproj b/Builds/VisualStudio2012/Dexed.vcxproj index c853050..0e7a1e6 100644 --- a/Builds/VisualStudio2012/Dexed.vcxproj +++ b/Builds/VisualStudio2012/Dexed.vcxproj @@ -38,10 +38,8 @@ <_ProjectFileVersion>10.0.30319.1 - .\Debug\ Dexed true - .\Release\ Dexed true v110 @@ -58,7 +56,7 @@ Disabled EditAndContinue ..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;C:\work\vstsdk2.4;%(AdditionalIncludeDirectories) - WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2012_78A501F=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2012_78A501F=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;%(PreprocessorDefinitions) MultiThreadedDebugDLL true @@ -100,7 +98,7 @@ MinSpace ..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;C:\work\vstsdk2.4;%(AdditionalIncludeDirectories) - WIN32;_WINDOWS;NDEBUG;JUCER_VS2012_78A501F=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2012_78A501F=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -182,6 +180,9 @@ true + + true + true @@ -251,6 +252,9 @@ true + + true + true @@ -458,6 +462,9 @@ true + + true + true @@ -497,6 +504,9 @@ true + + true + true @@ -1031,6 +1041,9 @@ true + + true + true @@ -1148,6 +1161,7 @@ + @@ -1193,6 +1207,7 @@ + @@ -1315,6 +1330,7 @@ + @@ -1521,6 +1537,7 @@ + diff --git a/Builds/VisualStudio2012/Dexed.vcxproj.filters b/Builds/VisualStudio2012/Dexed.vcxproj.filters index 59954ab..abfc540 100644 --- a/Builds/VisualStudio2012/Dexed.vcxproj.filters +++ b/Builds/VisualStudio2012/Dexed.vcxproj.filters @@ -376,6 +376,9 @@ Juce Modules\juce_audio_basics\midi + + Juce Modules\juce_audio_basics\effects + Juce Modules\juce_audio_basics\effects @@ -463,6 +466,9 @@ Juce Modules\juce_audio_processors\scanning + + Juce Modules\juce_audio_utils\gui + Juce Modules\juce_audio_utils\gui @@ -670,6 +676,9 @@ Juce Modules\juce_core\native + + Juce Modules\juce_core\native + Juce Modules\juce_core\native @@ -724,6 +733,9 @@ Juce Modules\juce_data_structures\values + + Juce Modules\juce_data_structures\values + Juce Modules\juce_data_structures\undomanager @@ -1291,6 +1303,9 @@ Juce Modules\juce_gui_extra\documents + + Juce Modules\juce_gui_extra\misc + Juce Modules\juce_gui_extra\misc @@ -1530,6 +1545,9 @@ Juce Modules\juce_audio_basics\effects + + Juce Modules\juce_audio_basics\effects + Juce Modules\juce_audio_basics\effects @@ -1665,6 +1683,9 @@ Juce Modules\juce_audio_processors + + Juce Modules\juce_audio_utils\gui + Juce Modules\juce_audio_utils\gui @@ -2031,6 +2052,9 @@ Juce Modules\juce_data_structures\values + + Juce Modules\juce_data_structures\values + Juce Modules\juce_data_structures\undomanager @@ -2649,6 +2673,9 @@ Juce Modules\juce_gui_extra\embedding + + Juce Modules\juce_gui_extra\misc + Juce Modules\juce_gui_extra\misc diff --git a/Dexed.jucer b/Dexed.jucer index f650582..425c742 100644 --- a/Dexed.jucer +++ b/Dexed.jucer @@ -8,7 +8,7 @@ pluginWantsMidiIn="1" pluginProducesMidiOut="0" pluginSilenceInIsSilenceOut="0" pluginEditorRequiresKeys="0" pluginAUExportPrefix="DexedAU" pluginRTASCategory="" aaxIdentifier="com.yourcompany.Dexed" pluginAAXCategory="AAX_ePlugInCategory_Dynamics" - jucerVersion="3.1.0" companyName="Digital Suburban" buildVST3="0" + jucerVersion="3.2.0" companyName="Digital Suburban" buildVST3="0" buildRTAS="0" buildAAX="0" pluginManufacturerEmail="support@yourcompany.com"> @@ -110,11 +110,11 @@ + postbuildCommand=" # This script takes the build product and copies it to the AU, VST, and RTAS folders, depending on # which plugin types you've built original=$CONFIGURATION_BUILD_DIR/$FULL_PRODUCT_NAME # this looks inside the binary to detect which platforms are needed.. copyAU=`nm -g "$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH" | grep -i 'AudioUnit' | wc -l` copyVST=`nm -g "$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH" | grep -i 'VSTPlugin' | wc -l` copyRTAS=`nm -g "$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH" | grep -i 'CProcess' | wc -l` copyAAX=`nm -g "$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH" | grep -i 'ACFStartup' | wc -l` if [ $copyAU -gt 0 ]; then echo "Copying to AudioUnit folder..." AU=~/Library/Audio/Plug-Ins/Components/$PRODUCT_NAME.component if [ -d "$AU" ]; then rm -r "$AU" fi cp -r "$original" "$AU" sed -i "" -e 's/TDMwPTul/BNDLPTul/g' "$AU/Contents/PkgInfo" sed -i "" -e 's/TDMw/BNDL/g' "$AU/Contents/$INFOPLIST_FILE" # Fix info.plist for AUs built with Xcode 3 if [ -f "$DEVELOPER_DIR/Library/Developer/CoreAudio/AudioUnits/AUPublic/AUBase/AUPlugInDispatch.cpp" ]; then echo else echo "Removing AudioComponents entry from Info.plist because this is not a new-format AU" /usr/libexec/PlistBuddy -c "Delete AudioComponents" "$AU/Contents/Info.plist" fi fi if [ $copyVST -gt 0 ]; then echo "Copying to VST folder..." VST=~/Library/Audio/Plug-Ins/VST/$PRODUCT_NAME.vst if [ -d "$VST" ]; then rm -r "$VST" fi cp -r "$original" "$VST" sed -i "" -e 's/TDMwPTul/BNDLPTul/g' "$VST/Contents/PkgInfo" sed -i "" -e 's/TDMw/BNDL/g' "$VST/Contents/$INFOPLIST_FILE" fi if [ $copyRTAS -gt 0 ]; then echo "Copying to RTAS folder..." RTAS=/Library/Application\ Support/Digidesign/Plug-Ins/$PRODUCT_NAME.dpm if [ -d "$RTAS" ]; then rm -r "$RTAS" fi cp -r "$original" "$RTAS" fi if [ $copyAAX -gt 0 ]; then echo "Copying to AAX folder..." if [ -d "/Applications/ProTools_3PDev/Plug-Ins" ]; then AAX1="/Applications/ProTools_3PDev/Plug-Ins/$PRODUCT_NAME.aaxplugin" if [ -d "$AAX1" ]; then rm -r "$AAX1" fi cp -r "$original" "$AAX1" fi if [ -d "/Library/Application Support/Avid/Audio/Plug-Ins" ]; then AAX2="/Library/Application Support/Avid/Audio/Plug-Ins/$PRODUCT_NAME.aaxplugin" if [ -d "$AAX2" ]; then rm -r "$AAX2" fi cp -r "$original" "$AAX2" fi fi "> - diff --git a/JuceLibraryCode/AppConfig.h b/JuceLibraryCode/AppConfig.h index e0b709f..ae82088 100644 --- a/JuceLibraryCode/AppConfig.h +++ b/JuceLibraryCode/AppConfig.h @@ -35,6 +35,11 @@ #define JUCE_MODULE_AVAILABLE_juce_gui_basics 1 #define JUCE_MODULE_AVAILABLE_juce_gui_extra 1 +//============================================================================== +#ifndef JUCE_STANDALONE_APPLICATION + #define JUCE_STANDALONE_APPLICATION 0 +#endif + //============================================================================== // juce_audio_devices flags: @@ -46,6 +51,10 @@ //#define JUCE_WASAPI #endif +#ifndef JUCE_WASAPI_EXCLUSIVE + //#define JUCE_WASAPI_EXCLUSIVE +#endif + #ifndef JUCE_DIRECTSOUND //#define JUCE_DIRECTSOUND #endif @@ -131,6 +140,10 @@ //#define JUCE_INCLUDE_ZLIB_CODE #endif +#ifndef JUCE_USE_CURL + //#define JUCE_USE_CURL +#endif + //============================================================================== // juce_graphics flags: diff --git a/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp b/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp index a78b395..a2a033e 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp +++ b/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h b/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h index b3f49a6..e11c6c1 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h +++ b/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -487,13 +487,10 @@ public: } /** Scans a block of data, returning the lowest and highest levels as floats */ - void findMinAndMax (size_t numSamples, float& minValue, float& maxValue) const noexcept + Range findMinAndMax (size_t numSamples) const noexcept { if (numSamples == 0) - { - minValue = maxValue = 0; - return; - } + return Range(); Pointer dest (*this); @@ -512,27 +509,32 @@ public: if (v < mn) mn = v; } - minValue = mn; - maxValue = mx; + return Range (mn, mx); } - else + + int32 mn = dest.getAsInt32(); + dest.advance(); + int32 mx = mn; + + while (--numSamples > 0) { - int32 mn = dest.getAsInt32(); + const int v = 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; + } - if (mx < v) mx = v; - if (v < mn) mn = v; - } + return Range (mn * (float) (1.0 / (1.0 + Int32::maxValue)), + mx * (float) (1.0 / (1.0 + Int32::maxValue))); + } - minValue = mn * (float) (1.0 / (1.0 + Int32::maxValue)); - maxValue = mx * (float) (1.0 / (1.0 + Int32::maxValue)); - } + /** Scans a block of data, returning the lowest and highest levels as floats */ + void findMinAndMax (size_t numSamples, float& minValue, float& maxValue) const noexcept + { + Range r (findMinAndMax (numSamples)); + minValue = r.getStart(); + maxValue = r.getEnd(); } /** Returns true if the pointer is using a floating-point format. */ diff --git a/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.cpp b/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.cpp index 15b59da..e9fd6e0 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.cpp +++ b/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -116,8 +116,11 @@ void AudioSampleBuffer::setDataToReferTo (float** dataToReferTo, jassert (dataToReferTo != nullptr); jassert (newNumChannels >= 0 && newNumSamples >= 0); - allocatedBytes = 0; - allocatedData.free(); + if (allocatedBytes != 0) + { + allocatedBytes = 0; + allocatedData.free(); + } numChannels = newNumChannels; size = newNumSamples; diff --git a/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h b/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h index 8b9a72c..12e2de8 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h +++ b/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp b/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp index 2fc6898..971ff65 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp +++ b/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -49,8 +49,13 @@ namespace FloatVectorHelpers { typedef float Type; typedef __m128 ParallelType; + typedef __m128 IntegerType; enum { numParallel = 4 }; + // Integer and parallel types are the same for SSE. On neon they have different types + static forcedinline IntegerType toint (ParallelType v) noexcept { return v; } + static forcedinline ParallelType toflt (IntegerType v) noexcept { return v; } + 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); } @@ -63,6 +68,11 @@ namespace FloatVectorHelpers 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 ParallelType bit_and (ParallelType a, ParallelType b) noexcept { return _mm_and_ps (a, b); } + static forcedinline ParallelType bit_not (ParallelType a, ParallelType b) noexcept { return _mm_andnot_ps (a, b); } + static forcedinline ParallelType bit_or (ParallelType a, ParallelType b) noexcept { return _mm_or_ps (a, b); } + static forcedinline ParallelType bit_xor (ParallelType a, ParallelType b) noexcept { return _mm_xor_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]); } }; @@ -71,8 +81,13 @@ namespace FloatVectorHelpers { typedef double Type; typedef __m128d ParallelType; + typedef __m128d IntegerType; enum { numParallel = 2 }; + // Integer and parallel types are the same for SSE. On neon they have different types + static forcedinline IntegerType toint (ParallelType v) noexcept { return v; } + static forcedinline ParallelType toflt (IntegerType v) noexcept { return v; } + 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); } @@ -85,10 +100,17 @@ namespace FloatVectorHelpers 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 ParallelType bit_and (ParallelType a, ParallelType b) noexcept { return _mm_and_pd (a, b); } + static forcedinline ParallelType bit_not (ParallelType a, ParallelType b) noexcept { return _mm_andnot_pd (a, b); } + static forcedinline ParallelType bit_or (ParallelType a, ParallelType b) noexcept { return _mm_or_pd (a, b); } + static forcedinline ParallelType bit_xor (ParallelType a, ParallelType b) noexcept { return _mm_xor_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()) \ @@ -126,14 +148,66 @@ namespace FloatVectorHelpers #define JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST(normalOp, vecOp, locals, increment, setupOp) \ JUCE_BEGIN_VEC_OP \ setupOp \ + if (FloatVectorHelpers::isAligned (dest)) \ + { \ + if (FloatVectorHelpers::isAligned (src1)) \ + { \ + if (FloatVectorHelpers::isAligned (src2)) JUCE_VEC_LOOP_TWO_SOURCES (vecOp, Mode::loadA, Mode::loadA, Mode::storeA, locals, increment) \ + else JUCE_VEC_LOOP_TWO_SOURCES (vecOp, Mode::loadA, Mode::loadU, Mode::storeA, locals, increment) \ + } \ + else \ + { \ + if (FloatVectorHelpers::isAligned (src2)) JUCE_VEC_LOOP_TWO_SOURCES (vecOp, Mode::loadU, Mode::loadA, Mode::storeA, locals, increment) \ + else JUCE_VEC_LOOP_TWO_SOURCES (vecOp, Mode::loadU, Mode::loadU, Mode::storeA, locals, increment) \ + } \ + } \ + else \ + { \ + if (FloatVectorHelpers::isAligned (src1)) \ + { \ + if (FloatVectorHelpers::isAligned (src2)) JUCE_VEC_LOOP_TWO_SOURCES (vecOp, Mode::loadA, Mode::loadA, Mode::storeU, locals, increment) \ + else JUCE_VEC_LOOP_TWO_SOURCES (vecOp, Mode::loadA, Mode::loadU, Mode::storeU, locals, increment) \ + } \ + else \ + { \ + if (FloatVectorHelpers::isAligned (src2)) JUCE_VEC_LOOP_TWO_SOURCES (vecOp, Mode::loadU, Mode::loadA, Mode::storeU, locals, increment) \ + else JUCE_VEC_LOOP_TWO_SOURCES (vecOp, Mode::loadU, Mode::loadU, Mode::storeU, locals, increment) \ + } \ + } \ + JUCE_FINISH_VEC_OP (normalOp) + + #define JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST(normalOp, vecOp, locals, increment, setupOp) \ + JUCE_BEGIN_VEC_OP \ + setupOp \ + if (FloatVectorHelpers::isAligned (dest)) \ { \ - 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); \ + if (FloatVectorHelpers::isAligned (src1)) \ + { \ + if (FloatVectorHelpers::isAligned (src2)) JUCE_VEC_LOOP_TWO_SOURCES_WITH_DEST_LOAD (vecOp, Mode::loadA, Mode::loadA, Mode::loadA, Mode::storeA, locals, increment) \ + else JUCE_VEC_LOOP_TWO_SOURCES_WITH_DEST_LOAD (vecOp, Mode::loadA, Mode::loadU, Mode::loadA, Mode::storeA, locals, increment) \ + } \ + else \ + { \ + if (FloatVectorHelpers::isAligned (src2)) JUCE_VEC_LOOP_TWO_SOURCES_WITH_DEST_LOAD (vecOp, Mode::loadU, Mode::loadA, Mode::loadA, Mode::storeA, locals, increment) \ + else JUCE_VEC_LOOP_TWO_SOURCES_WITH_DEST_LOAD (vecOp, Mode::loadU, Mode::loadU, Mode::loadA, Mode::storeA, locals, increment) \ + } \ + } \ + else \ + { \ + if (FloatVectorHelpers::isAligned (src1)) \ + { \ + if (FloatVectorHelpers::isAligned (src2)) JUCE_VEC_LOOP_TWO_SOURCES_WITH_DEST_LOAD (vecOp, Mode::loadA, Mode::loadA, Mode::loadU, Mode::storeU, locals, increment) \ + else JUCE_VEC_LOOP_TWO_SOURCES_WITH_DEST_LOAD (vecOp, Mode::loadA, Mode::loadU, Mode::loadU, Mode::storeU, locals, increment) \ + } \ + else \ + { \ + if (FloatVectorHelpers::isAligned (src2)) JUCE_VEC_LOOP_TWO_SOURCES_WITH_DEST_LOAD (vecOp, Mode::loadU, Mode::loadA, Mode::loadU, Mode::storeU, locals, increment) \ + else JUCE_VEC_LOOP_TWO_SOURCES_WITH_DEST_LOAD (vecOp, Mode::loadU, Mode::loadU, Mode::loadU, Mode::storeU, locals, increment) \ + } \ } \ JUCE_FINISH_VEC_OP (normalOp) + //============================================================================== #elif JUCE_USE_ARM_NEON @@ -141,8 +215,12 @@ namespace FloatVectorHelpers { typedef float Type; typedef float32x4_t ParallelType; + typedef uint32x4_t IntegerType; enum { numParallel = 4 }; + static forcedinline IntegerType toint (ParallelType v) noexcept { union { ParallelType f; IntegerType i; } u; u.f = v; return u.i; } + static forcedinline ParallelType toflt (IntegerType v) noexcept { union { ParallelType f; IntegerType i; } u; u.i = v; return u.f; } + 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); } @@ -155,6 +233,11 @@ namespace FloatVectorHelpers 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 ParallelType bit_and (ParallelType a, ParallelType b) noexcept { return toflt (vandq_u32 (toint (a), toint (b))); } + static forcedinline ParallelType bit_not (ParallelType a, ParallelType b) noexcept { return toflt (vbicq_u32 (toint (a), toint (b))); } + static forcedinline ParallelType bit_or (ParallelType a, ParallelType b) noexcept { return toflt (vorrq_u32 (toint (a), toint (b))); } + static forcedinline ParallelType bit_xor (ParallelType a, ParallelType b) noexcept { return toflt (veorq_u32 (toint (a), toint (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]); } }; @@ -163,8 +246,12 @@ namespace FloatVectorHelpers { typedef double Type; typedef double ParallelType; + typedef uint64 IntegerType; enum { numParallel = 1 }; + static forcedinline IntegerType toint (ParallelType v) noexcept { union { ParallelType f; IntegerType i; } u; u.f = v; return u.i; } + static forcedinline ParallelType toflt (IntegerType v) noexcept { union { ParallelType f; IntegerType i; } u; u.i = v; return u.f; } + 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; } @@ -177,6 +264,11 @@ namespace FloatVectorHelpers 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 ParallelType bit_and (ParallelType a, ParallelType b) noexcept { return toflt (toint (a) & toint (b)); } + static forcedinline ParallelType bit_not (ParallelType a, ParallelType b) noexcept { return toflt ((~toint (a)) & toint (b)); } + static forcedinline ParallelType bit_or (ParallelType a, ParallelType b) noexcept { return toflt (toint (a) | toint (b)); } + static forcedinline ParallelType bit_xor (ParallelType a, ParallelType b) noexcept { return toflt (toint (a) ^ toint (b)); } + static forcedinline Type max (ParallelType a) noexcept { return a; } static forcedinline Type min (ParallelType a) noexcept { return a; } }; @@ -211,6 +303,13 @@ namespace FloatVectorHelpers JUCE_VEC_LOOP_TWO_SOURCES (vecOp, Mode::loadU, Mode::loadU, Mode::storeU, locals, increment) \ JUCE_FINISH_VEC_OP (normalOp) + #define JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST(normalOp, vecOp, locals, increment, setupOp) \ + JUCE_BEGIN_VEC_OP \ + setupOp \ + JUCE_VEC_LOOP_TWO_SOURCES_WITH_DEST_LOAD (vecOp, Mode::loadU, Mode::loadU, Mode::loadU, Mode::storeU, locals, increment) \ + JUCE_FINISH_VEC_OP (normalOp) + + //============================================================================== #else #define JUCE_PERFORM_VEC_OP_DEST(normalOp, vecOp, locals, setupOp) \ @@ -221,6 +320,10 @@ namespace FloatVectorHelpers #define JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST(normalOp, vecOp, locals, increment, setupOp) \ for (int i = 0; i < num; ++i) normalOp; + + #define JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST(normalOp, vecOp, locals, increment, setupOp) \ + for (int i = 0; i < num; ++i) normalOp; + #endif //============================================================================== @@ -240,11 +343,20 @@ namespace FloatVectorHelpers increment; \ } + #define JUCE_VEC_LOOP_TWO_SOURCES_WITH_DEST_LOAD(vecOp, src1Load, src2Load, dstLoad, dstStore, locals, increment) \ + for (int i = 0; i < numLongOps; ++i) \ + { \ + locals (src1Load, src2Load, dstLoad); \ + 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); + #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_SRC1_SRC2_DEST(src1Load, src2Load, dstLoad) const Mode::ParallelType d = dstLoad (dest), 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; }; @@ -395,7 +507,7 @@ 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)); + zeromem (dest, (size_t) num * sizeof (float)); #endif } @@ -404,7 +516,7 @@ 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)); + zeromem (dest, (size_t) num * sizeof (double)); #endif } @@ -462,8 +574,12 @@ void JUCE_CALLTYPE FloatVectorOperations::copyWithMultiply (double* dest, const void JUCE_CALLTYPE FloatVectorOperations::add (float* dest, float amount, int num) noexcept { + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vsadd (dest, 1, &amount, dest, 1, (vDSP_Length) num); + #else JUCE_PERFORM_VEC_OP_DEST (dest[i] += amount, Mode::add (d, amountToAdd), JUCE_LOAD_DEST, const Mode::ParallelType amountToAdd = Mode::load1 (amount);) + #endif } void JUCE_CALLTYPE FloatVectorOperations::add (double* dest, double amount, int num) noexcept @@ -568,9 +684,13 @@ void JUCE_CALLTYPE FloatVectorOperations::subtract (double* dest, const double* void JUCE_CALLTYPE FloatVectorOperations::addWithMultiply (float* dest, const float* src, float multiplier, int num) noexcept { + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vsma (src, 1, &multiplier, dest, 1, dest, 1, (vDSP_Length) num); + #else 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);) + #endif } void JUCE_CALLTYPE FloatVectorOperations::addWithMultiply (double* dest, const double* src, double multiplier, int num) noexcept @@ -580,6 +700,28 @@ void JUCE_CALLTYPE FloatVectorOperations::addWithMultiply (double* dest, const d const Mode::ParallelType mult = Mode::load1 (multiplier);) } +void JUCE_CALLTYPE FloatVectorOperations::addWithMultiply (float* dest, const float* src1, const float* src2, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vma ((float*) src1, 1, (float*) src2, 1, dest, 1, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST (dest[i] += src1[i] * src2[i], Mode::add (d, Mode::mul (s1, s2)), + JUCE_LOAD_SRC1_SRC2_DEST, + JUCE_INCREMENT_SRC1_SRC2_DEST, ) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::addWithMultiply (double* dest, const double* src1, const double* src2, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vmaD ((double*) src1, 1, (double*) src2, 1, dest, 1, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST (dest[i] += src1[i] * src2[i], Mode::add (d, Mode::mul (s1, s2)), + JUCE_LOAD_SRC1_SRC2_DEST, + JUCE_INCREMENT_SRC1_SRC2_DEST, ) + #endif +} + void JUCE_CALLTYPE FloatVectorOperations::multiply (float* dest, const float* src, int num) noexcept { #if JUCE_USE_VDSP_FRAMEWORK @@ -668,6 +810,33 @@ void FloatVectorOperations::negate (double* dest, const double* src, int num) no #endif } +void FloatVectorOperations::abs (float* dest, const float* src, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vabs ((float*) src, 1, dest, 1, (vDSP_Length) num); + #else + union {float f; uint32 i;} signMask; + signMask.i = 0x7fffffffUL; + JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = fabsf (src[i]), Mode::bit_and (s, mask), + JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, + const Mode::ParallelType mask = Mode::load1 (signMask.f);) + #endif +} + +void FloatVectorOperations::abs (double* dest, const double* src, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vabsD ((double*) src, 1, dest, 1, (vDSP_Length) num); + #else + union {double d; uint64 i;} signMask; + signMask.i = 0x7fffffffffffffffULL; + + JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = fabs (src[i]), Mode::bit_and (s, mask), + JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, + const Mode::ParallelType mask = Mode::load1 (signMask.d);) + #endif +} + void JUCE_CALLTYPE FloatVectorOperations::convertFixedToFloat (float* dest, const int* src, float multiplier, int num) noexcept { #if JUCE_USE_ARM_NEON @@ -682,6 +851,96 @@ void JUCE_CALLTYPE FloatVectorOperations::convertFixedToFloat (float* dest, cons #endif } +void JUCE_CALLTYPE FloatVectorOperations::min (float* dest, const float* src, float comp, int num) noexcept +{ + JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmin (src[i], comp), Mode::min (s, cmp), + JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, + const Mode::ParallelType cmp = Mode::load1 (comp);) +} + +void JUCE_CALLTYPE FloatVectorOperations::min (double* dest, const double* src, double comp, int num) noexcept +{ + JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmin (src[i], comp), Mode::min (s, cmp), + JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, + const Mode::ParallelType cmp = Mode::load1 (comp);) +} + +void JUCE_CALLTYPE FloatVectorOperations::min (float* dest, const float* src1, const float* src2, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vmin ((float*) src1, 1, (float*) src2, 1, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = jmin (src1[i], src2[i]), Mode::min (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, ) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::min (double* dest, const double* src1, const double* src2, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vminD ((double*) src1, 1, (double*) src2, 1, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = jmin (src1[i], src2[i]), Mode::min (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, ) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::max (float* dest, const float* src, float comp, int num) noexcept +{ + JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmax (src[i], comp), Mode::max (s, cmp), + JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, + const Mode::ParallelType cmp = Mode::load1 (comp);) +} + +void JUCE_CALLTYPE FloatVectorOperations::max (double* dest, const double* src, double comp, int num) noexcept +{ + JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmax (src[i], comp), Mode::max (s, cmp), + JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, + const Mode::ParallelType cmp = Mode::load1 (comp);) +} + +void JUCE_CALLTYPE FloatVectorOperations::max (float* dest, const float* src1, const float* src2, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vmax ((float*) src1, 1, (float*) src2, 1, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = jmax (src1[i], src2[i]), Mode::max (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, ) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::max (double* dest, const double* src1, const double* src2, int num) noexcept +{ + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vmaxD ((double*) src1, 1, (double*) src2, 1, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = jmax (src1[i], src2[i]), Mode::max (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, ) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::clip (float* dest, const float* src, float low, float high, int num) noexcept +{ + jassert(high >= low); + + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vclip ((float*) src, 1, &low, &high, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmax (jmin (src[i], high), low), Mode::max (Mode::min (s, hi), lo), + JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, + const Mode::ParallelType lo = Mode::load1 (low); const Mode::ParallelType hi = Mode::load1 (high);) + #endif +} + +void JUCE_CALLTYPE FloatVectorOperations::clip (double* dest, const double* src, double low, double high, int num) noexcept +{ + jassert(high >= low); + + #if JUCE_USE_VDSP_FRAMEWORK + vDSP_vclipD ((double*) src, 1, &low, &high, dest, 1, (vDSP_Length) num); + #else + JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmax (jmin (src[i], high), low), Mode::max (Mode::min (s, hi), lo), + JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, + const Mode::ParallelType lo = Mode::load1 (low); const Mode::ParallelType hi = Mode::load1 (high);) + #endif +} + Range JUCE_CALLTYPE FloatVectorOperations::findMinAndMax (const float* src, int num) noexcept { #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON @@ -821,8 +1080,19 @@ public: FloatVectorOperations::subtract (data1, data2, num); u.expect (areAllValuesEqual (data1, num, (ValueType) 512)); + FloatVectorOperations::abs (data1, data2, num); + u.expect (areAllValuesEqual (data1, num, (ValueType) 256)); + + FloatVectorOperations::abs (data2, data1, num); + u.expect (areAllValuesEqual (data2, num, (ValueType) 256)); + fillRandomly (random, int1, num); doConversionTest (u, data1, data2, int1, num); + + FloatVectorOperations::fill (data1, (ValueType) 2, num); + FloatVectorOperations::fill (data2, (ValueType) 3, num); + FloatVectorOperations::addWithMultiply (data1, data1, data2, num); + u.expect (areAllValuesEqual (data1, num, (ValueType) 8)); } static void doConversionTest (UnitTest& u, float* data1, float* data2, int* const int1, int num) diff --git a/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h b/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h index 0b3fcb6..0c85e60 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h +++ b/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -101,6 +101,12 @@ public: /** 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 each source1 value by the corresponding source2 value, then adds it to the destination value. */ + static void JUCE_CALLTYPE addWithMultiply (float* dest, const float* src1, const float* src2, int num) noexcept; + + /** Multiplies each source1 value by the corresponding source2 value, then adds it to the destination value. */ + static void JUCE_CALLTYPE addWithMultiply (double* dest, const double* src1, const double* src2, int num) noexcept; + /** Multiplies the destination values by the source values. */ static void JUCE_CALLTYPE multiply (float* dest, const float* src, int numValues) noexcept; @@ -131,9 +137,45 @@ public: /** Copies a source vector to a destination, negating each value. */ static void JUCE_CALLTYPE negate (double* dest, const double* src, int numValues) noexcept; + /** Copies a source vector to a destination, taking the absolute of each value. */ + static void JUCE_CALLTYPE abs (float* dest, const float* src, int numValues) noexcept; + + /** Copies a source vector to a destination, taking the absolute of each value. */ + static void JUCE_CALLTYPE abs (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; + /** Each element of dest will be the minimum of the corresponding element of the source array and the given comp value. */ + static void JUCE_CALLTYPE min (float* dest, const float* src, float comp, int num) noexcept; + + /** Each element of dest will be the minimum of the corresponding element of the source array and the given comp value. */ + static void JUCE_CALLTYPE min (double* dest, const double* src, double comp, int num) noexcept; + + /** Each element of dest will be the minimum of the corresponding source1 and source2 values. */ + static void JUCE_CALLTYPE min (float* dest, const float* src1, const float* src2, int num) noexcept; + + /** Each element of dest will be the minimum of the corresponding source1 and source2 values. */ + static void JUCE_CALLTYPE min (double* dest, const double* src1, const double* src2, int num) noexcept; + + /** Each element of dest will be the maximum of the corresponding element of the source array and the given comp value. */ + static void JUCE_CALLTYPE max (float* dest, const float* src, float comp, int num) noexcept; + + /** Each element of dest will be the maximum of the corresponding element of the source array and the given comp value. */ + static void JUCE_CALLTYPE max (double* dest, const double* src, double comp, int num) noexcept; + + /** Each element of dest will be the maximum of the corresponding source1 and source2 values. */ + static void JUCE_CALLTYPE max (float* dest, const float* src1, const float* src2, int num) noexcept; + + /** Each element of dest will be the maximum of the corresponding source1 and source2 values. */ + static void JUCE_CALLTYPE max (double* dest, const double* src1, const double* src2, int num) noexcept; + + /** Each element of dest is calculated by hard clipping the corresponding src element so that it is in the range specified by the arguments low and high. */ + static void JUCE_CALLTYPE clip (float* dest, const float* src, float low, float high, int num) noexcept; + + /** Each element of dest is calculated by hard clipping the corresponding src element so that it is in the range specified by the arguments low and high. */ + static void JUCE_CALLTYPE clip (double* dest, const double* src, double low, double high, int num) noexcept; + /** Finds the miniumum and maximum values in the given array. */ static Range JUCE_CALLTYPE findMinAndMax (const float* src, int numValues) noexcept; diff --git a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Decibels.h b/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Decibels.h index c63746c..6e039e3 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Decibels.h +++ b/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Decibels.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_FFT.cpp b/JuceLibraryCode/modules/juce_audio_basics/effects/juce_FFT.cpp new file mode 100644 index 0000000..d333c2b --- /dev/null +++ b/JuceLibraryCode/modules/juce_audio_basics/effects/juce_FFT.cpp @@ -0,0 +1,277 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2015 - ROLI 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. + + ============================================================================== +*/ + +// (For the moment, we'll implement a few local operators for this complex class - one +// day we'll probably either have a juce complex class, or use the C++11 one) +static FFT::Complex operator+ (FFT::Complex a, FFT::Complex b) noexcept { FFT::Complex c = { a.r + b.r, a.i + b.i }; return c; } +static FFT::Complex operator- (FFT::Complex a, FFT::Complex b) noexcept { FFT::Complex c = { a.r - b.r, a.i - b.i }; return c; } +static FFT::Complex operator* (FFT::Complex a, FFT::Complex b) noexcept { FFT::Complex c = { a.r * b.r - a.i * b.i, a.r * b.i + a.i * b.r }; return c; } +static FFT::Complex& operator+= (FFT::Complex& a, FFT::Complex b) noexcept { a.r += b.r; a.i += b.i; return a; } + +//============================================================================== +struct FFT::FFTConfig +{ + FFTConfig (int sizeOfFFT, bool isInverse) + : fftSize (sizeOfFFT), inverse (isInverse), twiddleTable ((size_t) sizeOfFFT) + { + for (int i = 0; i < fftSize; ++i) + { + const double phase = (isInverse ? 2.0 : -2.0) * double_Pi * i / fftSize; + twiddleTable[i].r = (float) cos (phase); + twiddleTable[i].i = (float) sin (phase); + } + + const int root = (int) std::sqrt ((double) fftSize); + int divisor = 4, n = fftSize; + + for (int i = 0; i < numElementsInArray (factors); ++i) + { + while ((n % divisor) != 0) + { + if (divisor == 2) divisor = 3; + else if (divisor == 4) divisor = 2; + else divisor += 2; + + if (divisor > root) + divisor = n; + } + + n /= divisor; + + jassert (divisor == 1 || divisor == 2 || divisor == 4); + factors[i].radix = divisor; + factors[i].length = n; + } + } + + void perform (const Complex* input, Complex* output) const noexcept + { + perform (input, output, 1, 1, factors); + } + + const int fftSize; + const bool inverse; + + struct Factor { int radix, length; }; + Factor factors[32]; + HeapBlock twiddleTable; + + void perform (const Complex* input, Complex* output, const int stride, const int strideIn, const Factor* facs) const noexcept + { + const Factor factor (*facs++); + Complex* const originalOutput = output; + const Complex* const outputEnd = output + factor.radix * factor.length; + + if (stride == 1 && factor.radix <= 5) + { + for (int i = 0; i < factor.radix; ++i) + perform (input + stride * strideIn * i, output + i * factor.length, stride * factor.radix, strideIn, facs); + + butterfly (factor, output, stride); + return; + } + + if (factor.length == 1) + { + do + { + *output++ = *input; + input += stride * strideIn; + } + while (output < outputEnd); + } + else + { + do + { + perform (input, output, stride * factor.radix, strideIn, facs); + input += stride * strideIn; + output += factor.length; + } + while (output < outputEnd); + } + + butterfly (factor, originalOutput, stride); + } + + void butterfly (const Factor factor, Complex* data, const int stride) const noexcept + { + switch (factor.radix) + { + case 1: break; + case 2: butterfly2 (data, stride, factor.length); return; + case 4: butterfly4 (data, stride, factor.length); return; + default: jassertfalse; break; + } + + Complex* scratch = static_cast (alloca (sizeof (Complex) * (size_t) factor.radix)); + + for (int i = 0; i < factor.length; ++i) + { + for (int k = i, q1 = 0; q1 < factor.radix; ++q1) + { + scratch[q1] = data[k]; + k += factor.length; + } + + for (int k = i, q1 = 0; q1 < factor.radix; ++q1) + { + int twiddleIndex = 0; + data[k] = scratch[0]; + + for (int q = 1; q < factor.radix; ++q) + { + twiddleIndex += stride * k; + + if (twiddleIndex >= fftSize) + twiddleIndex -= fftSize; + + data[k] += scratch[q] * twiddleTable[twiddleIndex]; + } + + k += factor.length; + } + } + } + + void butterfly2 (Complex* data, const int stride, const int length) const noexcept + { + Complex* dataEnd = data + length; + const Complex* tw = twiddleTable; + + for (int i = length; --i >= 0;) + { + const Complex s (*dataEnd * *tw); + tw += stride; + *dataEnd++ = *data - s; + *data++ += s; + } + } + + void butterfly4 (Complex* data, const int stride, const int length) const noexcept + { + const int lengthX2 = length * 2; + const int lengthX3 = length * 3; + + const Complex* twiddle1 = twiddleTable; + const Complex* twiddle2 = twiddle1; + const Complex* twiddle3 = twiddle1; + + for (int i = length; --i >= 0;) + { + const Complex s0 = data[length] * *twiddle1; + const Complex s1 = data[lengthX2] * *twiddle2; + const Complex s2 = data[lengthX3] * *twiddle3; + const Complex s3 = s0 + s2; + const Complex s4 = s0 - s2; + const Complex s5 = *data - s1; + *data += s1; + data[lengthX2] = *data - s3; + twiddle1 += stride; + twiddle2 += stride * 2; + twiddle3 += stride * 3; + *data += s3; + + if (inverse) + { + data[length].r = s5.r - s4.i; + data[length].i = s5.i + s4.r; + data[lengthX3].r = s5.r + s4.i; + data[lengthX3].i = s5.i - s4.r; + } + else + { + data[length].r = s5.r + s4.i; + data[length].i = s5.i - s4.r; + data[lengthX3].r = s5.r - s4.i; + data[lengthX3].i = s5.i + s4.r; + } + + ++data; + } + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FFTConfig) +}; + + +//============================================================================== +FFT::FFT (int order, bool inverse) : config (new FFTConfig (1 << order, inverse)), size (1 << order) {} +FFT::~FFT() {} + +void FFT::perform (const Complex* const input, Complex* const output) const noexcept +{ + config->perform (input, output); +} + +void FFT::performRealOnlyForwardTransform (float* d) const noexcept +{ + // This can only be called on an FFT object that was created to do forward transforms. + jassert (! config->inverse); + + Complex* const scratch = static_cast (alloca (16 + sizeof (Complex) * (size_t) size)); + + for (int i = 0; i < size; ++i) + { + scratch[i].r = d[i]; + scratch[i].i = 0; + } + + perform (scratch, reinterpret_cast (d)); +} + +void FFT::performRealOnlyInverseTransform (float* d) const noexcept +{ + // This can only be called on an FFT object that was created to do inverse transforms. + jassert (config->inverse); + + Complex* const scratch = static_cast (alloca (16 + sizeof (Complex) * (size_t) size)); + + perform (reinterpret_cast (d), scratch); + + const float scaleFactor = 1.0f / size; + + for (int i = 0; i < size; ++i) + { + d[i] = scratch[i].r * scaleFactor; + d[i + size] = scratch[i].i * scaleFactor; + } +} + +void FFT::performFrequencyOnlyForwardTransform (float* d) const noexcept +{ + performRealOnlyForwardTransform (d); + const int twiceSize = size * 2; + + for (int i = 0; i < twiceSize; i += 2) + { + d[i / 2] = juce_hypot (d[i], d[i + 1]); + + if (i >= size) + { + d[i] = 0; + d[i + 1] = 0; + } + } +} diff --git a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_FFT.h b/JuceLibraryCode/modules/juce_audio_basics/effects/juce_FFT.h new file mode 100644 index 0000000..03eee85 --- /dev/null +++ b/JuceLibraryCode/modules/juce_audio_basics/effects/juce_FFT.h @@ -0,0 +1,92 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2015 - ROLI 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. + + ============================================================================== +*/ + +/** + A very minimal FFT class. + + This is only a simple low-footprint implementation and isn't tuned for speed - it may + be useful for simple applications where one of the more complex FFT libraries would be + overkill. (But in the future it may end up becoming optimised of course...) + + The FFT class itself contains lookup tables, so there's some overhead in creating + one, you should create and cache an FFT object for each size/direction of transform + that you need, and re-use them to perform the actual operation. +*/ +class JUCE_API FFT +{ +public: + /** Initialises an object for performing either a forward or inverse FFT with the given size. + The the number of points the FFT will operate on will be 2 ^ order. + */ + FFT (int order, bool isInverse); + + /** Destructor. */ + ~FFT(); + + /** A complex number, for the purposes of the FFT class. */ + struct Complex + { + float r; /**< Real part. */ + float i; /**< Imaginary part. */ + }; + + /** Performs an out-of-place FFT, either forward or inverse depending on the mode + that was passed to this object's constructor. + + The arrays must contain at least getSize() elements. + */ + void perform (const Complex* input, Complex* output) const noexcept; + + /** Performs an in-place forward transform on a block of real data. + + The size of the array passed in must be 2 * getSize(), and the first half + should contain your raw input sample data. On return, the array will contain + complex frequency + phase data, and can be passed to performRealOnlyInverseTransform() + in order to convert it back to reals. + */ + void performRealOnlyForwardTransform (float* inputOutputData) const noexcept; + + /** Performs a reverse operation to data created in performRealOnlyForwardTransform(). + + The size of the array passed in must be 2 * getSize(), containing complex + frequency and phase data. On return, the first half of the array will contain + the reconstituted samples. + */ + void performRealOnlyInverseTransform (float* inputOutputData) const noexcept; + + /** Takes an array and simply transforms it to the frequency spectrum. + This may be handy for things like frequency displays or analysis. + */ + void performFrequencyOnlyForwardTransform (float* inputOutputData) const noexcept; + + /** Returns the number of data points that this FFT was created to work with. */ + int getSize() const noexcept { return size; } + +private: + struct FFTConfig; + ScopedPointer config; + const int size; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FFT) +}; diff --git a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.cpp b/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.cpp index 908a69e..836c0f6 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.cpp +++ b/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -23,7 +23,7 @@ */ #if JUCE_INTEL - #define JUCE_SNAP_TO_ZERO(n) if (! (n < -1.0e-8 || n > 1.0e-8)) n = 0; + #define JUCE_SNAP_TO_ZERO(n) if (! (n < -1.0e-8f || n > 1.0e-8f)) n = 0; #else #define JUCE_SNAP_TO_ZERO(n) #endif @@ -64,7 +64,7 @@ IIRCoefficients IIRCoefficients::makeLowPass (const double sampleRate, { jassert (sampleRate > 0); - const double n = 1.0 / tan (double_Pi * frequency / sampleRate); + const double n = 1.0 / std::tan (double_Pi * frequency / sampleRate); const double nSquared = n * n; const double c1 = 1.0 / (1.0 + std::sqrt (2.0) * n + nSquared); @@ -79,7 +79,7 @@ IIRCoefficients IIRCoefficients::makeLowPass (const double sampleRate, IIRCoefficients IIRCoefficients::makeHighPass (const double sampleRate, const double frequency) noexcept { - const double n = tan (double_Pi * frequency / sampleRate); + const double n = std::tan (double_Pi * frequency / sampleRate); const double nSquared = n * n; const double c1 = 1.0 / (1.0 + std::sqrt (2.0) * n + nSquared); diff --git a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.h b/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.h index 8269cf5..03deee7 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.h +++ b/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.cpp b/JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.cpp index 7bab3a5..aa4eccc 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.cpp +++ b/JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -87,7 +87,10 @@ int LagrangeInterpolator::process (const double actualRatio, const float* in, if (numOut >= 4) { - memcpy (lastInputSamples, in + (numOut - 4), 4 * sizeof (float)); + const float* end = in + numOut; + + for (int i = 0; i < 4; ++i) + lastInputSamples[i] = *--end; } else { @@ -152,7 +155,10 @@ int LagrangeInterpolator::processAdding (const double actualRatio, const float* if (numOut >= 4) { - memcpy (lastInputSamples, in + (numOut - 4), 4 * sizeof (float)); + const float* end = in + numOut; + + for (int i = 0; i < 4; ++i) + lastInputSamples[i] = *--end; } else { diff --git a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.h b/JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.h index caa4802..c3f7fd2 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.h +++ b/JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Reverb.h b/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Reverb.h index 53457a6..4dcc0fc 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Reverb.h +++ b/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Reverb.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -82,12 +82,13 @@ public: 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; + dryGain.setValue (newParams.dryLevel * dryScaleFactor); + wetGain1.setValue (0.5f * wet * (1.0f + newParams.width)); + wetGain2.setValue (0.5f * wet * (1.0f - newParams.width)); + gain = isFrozen (newParams.freezeMode) ? 0.0f : 0.015f; parameters = newParams; - shouldUpdateDamping = true; + updateDamping(); } //============================================================================== @@ -115,7 +116,12 @@ public: allPass[1][i].setSize ((intSampleRate * (allPassTunings[i] + stereoSpread)) / 44100); } - shouldUpdateDamping = true; + const double smoothTime = 0.01; + damping .reset (sampleRate, smoothTime); + feedback.reset (sampleRate, smoothTime); + dryGain .reset (sampleRate, smoothTime); + wetGain1.reset (sampleRate, smoothTime); + wetGain2.reset (sampleRate, smoothTime); } /** Clears the reverb's buffers. */ @@ -137,18 +143,18 @@ public: { 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; + const float damp = damping.getNextValue(); + const float feedbck = feedback.getNextValue(); + 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); + outL += comb[0][j].process (input, damp, feedbck); + outR += comb[1][j].process (input, damp, feedbck); } for (int j = 0; j < numAllPasses; ++j) // run the allpass filters in series @@ -157,6 +163,10 @@ public: outR = allPass[1][j].process (outR); } + const float dry = dryGain.getNextValue(); + const float wet1 = wetGain1.getNextValue(); + const float wet2 = wetGain2.getNextValue(); + left[i] = outL * wet1 + outR * wet2 + left[i] * dry; right[i] = outR * wet1 + outL * wet2 + right[i] * dry; } @@ -167,32 +177,30 @@ public: { jassert (samples != nullptr); - if (shouldUpdateDamping) - updateDamping(); - for (int i = 0; i < numSamples; ++i) { const float input = samples[i] * gain; float output = 0; + const float damp = damping.getNextValue(); + const float feedbck = feedback.getNextValue(); + for (int j = 0; j < numCombs; ++j) // accumulate the comb filters in parallel - output += comb[0][j].process (input); + output += comb[0][j].process (input, damp, feedbck); for (int j = 0; j < numAllPasses; ++j) // run the allpass filters in series output = allPass[0][j].process (output); + const float dry = dryGain.getNextValue(); + const float wet1 = wetGain1.getNextValue(); + 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; } + static bool isFrozen (const float freezeMode) noexcept { return freezeMode >= 0.5f; } void updateDamping() noexcept { @@ -200,8 +208,6 @@ private: const float roomOffset = 0.7f; const float dampScaleFactor = 0.4f; - shouldUpdateDamping = false; - if (isFrozen (parameters.freezeMode)) setDamping (0.0f, 1.0f); else @@ -211,19 +217,15 @@ private: 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); + damping.setValue (dampingToUse); + feedback.setValue (roomSizeToUse); } //============================================================================== class CombFilter { public: - CombFilter() noexcept - : bufferSize (0), bufferIndex (0), - feedback (0), last (0), damp1 (0), damp2 (0) - {} + CombFilter() noexcept : bufferSize (0), bufferIndex (0), last (0) {} void setSize (const int size) { @@ -243,22 +245,15 @@ private: 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 + float process (const float input, const float damp, const float feedbackLevel) noexcept { - const float output = buffer [bufferIndex]; - last = (output * damp2) + (last * damp1); + const float output = buffer[bufferIndex]; + last = (output * (1.0f - damp)) + (last * damp); JUCE_UNDENORMALISE (last); - float temp = input + (last * feedback); + float temp = input + (last * feedbackLevel); JUCE_UNDENORMALISE (temp); - buffer [bufferIndex] = temp; + buffer[bufferIndex] = temp; bufferIndex = (bufferIndex + 1) % bufferSize; return output; } @@ -266,7 +261,7 @@ private: private: HeapBlock buffer; int bufferSize, bufferIndex; - float feedback, last, damp1, damp2; + float last; JUCE_DECLARE_NON_COPYABLE (CombFilter) }; @@ -294,7 +289,7 @@ private: buffer.clear ((size_t) bufferSize); } - inline float process (const float input) noexcept + float process (const float input) noexcept { const float bufferedValue = buffer [bufferIndex]; float temp = input + (bufferedValue * 0.5f); @@ -311,11 +306,65 @@ private: JUCE_DECLARE_NON_COPYABLE (AllPassFilter) }; + //============================================================================== + class LinearSmoothedValue + { + public: + LinearSmoothedValue() noexcept + : currentValue (0), target (0), step (0), countdown (0), stepsToTarget (0) + { + } + + void reset (double sampleRate, double fadeLengthSeconds) noexcept + { + jassert (sampleRate > 0 && fadeLengthSeconds >= 0); + stepsToTarget = (int) std::floor (fadeLengthSeconds * sampleRate); + currentValue = target; + countdown = 0; + } + + void setValue (float newValue) noexcept + { + if (target != newValue) + { + target = newValue; + countdown = stepsToTarget; + + if (countdown <= 0) + currentValue = target; + else + step = (target - currentValue) / (float) countdown; + } + } + + float getNextValue() noexcept + { + if (countdown <= 0) + return target; + + --countdown; + currentValue += step; + return currentValue; + } + + private: + float currentValue, target, step; + int countdown, stepsToTarget; + + JUCE_DECLARE_NON_COPYABLE (LinearSmoothedValue) + }; + + //============================================================================== enum { numCombs = 8, numAllPasses = 4, numChannels = 2 }; + Parameters parameters; + float gain; + CombFilter comb [numChannels][numCombs]; AllPassFilter allPass [numChannels][numAllPasses]; + LinearSmoothedValue damping, feedback, dryGain, wetGain1, wetGain2; + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Reverb) }; diff --git a/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.cpp b/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.cpp index da98659..05673cc 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.cpp +++ b/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -66,6 +66,9 @@ #if __ARM_NEON__ && ! (JUCE_USE_VDSP_FRAMEWORK || defined (JUCE_USE_ARM_NEON)) #define JUCE_USE_ARM_NEON 1 +#endif + +#if JUCE_USE_ARM_NEON #include #endif @@ -77,6 +80,7 @@ namespace juce #include "buffers/juce_FloatVectorOperations.cpp" #include "effects/juce_IIRFilter.cpp" #include "effects/juce_LagrangeInterpolator.cpp" +#include "effects/juce_FFT.cpp" #include "midi/juce_MidiBuffer.cpp" #include "midi/juce_MidiFile.cpp" #include "midi/juce_MidiKeyboardState.cpp" diff --git a/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.h b/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.h index 70c5432..bffa1ef 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.h +++ b/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -31,12 +31,16 @@ namespace juce { +#undef Complex // apparently some C libraries actually define these symbols (!) +#undef Factor + #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_FFT.h" #include "effects/juce_Reverb.h" #include "midi/juce_MidiMessage.h" #include "midi/juce_MidiBuffer.h" diff --git a/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.mm b/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.mm index 54083fd..33bccab 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.mm +++ b/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/juce_module_info b/JuceLibraryCode/modules/juce_audio_basics/juce_module_info index c9cdd3d..6621745 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/juce_module_info +++ b/JuceLibraryCode/modules/juce_audio_basics/juce_module_info @@ -1,7 +1,7 @@ { "id": "juce_audio_basics", "name": "JUCE audio and midi data classes", - "version": "3.0.8", + "version": "3.2.0", "description": "Classes for audio buffer manipulation, midi message handling, synthesis, etc", "website": "http://www.juce.com/juce", "license": "GPL/Commercial", diff --git a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp index 43ab4c1..4fc1eb7 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp +++ b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -26,12 +26,12 @@ namespace MidiBufferHelpers { inline int getEventTime (const void* const d) noexcept { - return *static_cast (d); + return readUnaligned (d); } inline uint16 getEventDataSize (const void* const d) noexcept { - return *reinterpret_cast (static_cast (d) + sizeof (int32)); + return readUnaligned (static_cast (d) + sizeof (int32)); } inline uint16 getEventTotalSize (const void* const d) noexcept @@ -124,8 +124,8 @@ void MidiBuffer::addEvent (const void* const newData, const int maxBytes, const data.insertMultiple (offset, 0, (int) newItemSize); uint8* const d = data.begin() + offset; - *reinterpret_cast (d) = sampleNumber; - *reinterpret_cast (d + 4) = (uint16) numBytes; + writeUnaligned (d, sampleNumber); + writeUnaligned (d + 4, static_cast (numBytes)); memcpy (d + 6, newData, (size_t) numBytes); } } diff --git a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.h b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.h index ecbc56a..d93ab52 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.h +++ b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.cpp b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.cpp index e798cc0..e24443b 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.cpp +++ b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.h b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.h index 2a69937..7f98fc3 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.h +++ b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp index a40262b..287a4fa 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp +++ b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -145,7 +145,7 @@ void MidiKeyboardState::processNextMidiBuffer (MidiBuffer& buffer, const bool injectIndirectEvents) { MidiBuffer::Iterator i (buffer); - MidiMessage message (0xf4, 0.0); + MidiMessage message; int time; const ScopedLock sl (lock); diff --git a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h index 885b7d8..520dfec 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h +++ b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.cpp b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.cpp index 07e2ccd..5638afe 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.cpp +++ b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.h b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.h index 9002aa0..6d59c59 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.h +++ b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp index 94a6b9b..dcac30e 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp +++ b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -276,14 +276,11 @@ void MidiMessageSequence::deleteSysExMessages() } //============================================================================== -void MidiMessageSequence::createControllerUpdatesForTime (const int channelNumber, - const double time, - OwnedArray& dest) +void MidiMessageSequence::createControllerUpdatesForTime (const int channelNumber, const double time, Array& dest) { bool doneProg = false; bool donePitchWheel = false; - Array doneControllers; - doneControllers.ensureStorageAllocated (32); + bool doneControllers[128] = { 0 }; for (int i = list.size(); --i >= 0;) { @@ -291,28 +288,25 @@ void MidiMessageSequence::createControllerUpdatesForTime (const int channelNumbe if (mm.isForChannel (channelNumber) && mm.getTimeStamp() <= time) { - if (mm.isProgramChange()) + if (mm.isProgramChange() && ! doneProg) { - if (! doneProg) - { - dest.add (new MidiMessage (mm, 0.0)); - doneProg = true; - } + doneProg = true; + dest.add (MidiMessage (mm, 0.0)); } - else if (mm.isController()) + else if (mm.isPitchWheel() && ! donePitchWheel) { - if (! doneControllers.contains (mm.getControllerNumber())) - { - dest.add (new MidiMessage (mm, 0.0)); - doneControllers.add (mm.getControllerNumber()); - } + donePitchWheel = true; + dest.add (MidiMessage (mm, 0.0)); } - else if (mm.isPitchWheel()) + else if (mm.isController()) { - if (! donePitchWheel) + const int controllerNumber = mm.getControllerNumber(); + jassert (isPositiveAndBelow (controllerNumber, 128)); + + if (! doneControllers[controllerNumber]) { - dest.add (new MidiMessage (mm, 0.0)); - donePitchWheel = true; + doneControllers[controllerNumber] = true; + dest.add (MidiMessage (mm, 0.0)); } } } diff --git a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h index b62940c..5d2f977 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h +++ b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -247,7 +247,7 @@ public: state at the required time. */ void createControllerUpdatesForTime (int channelNumber, double time, - OwnedArray& resultMessages); + Array& resultMessages); //============================================================================== /** Swaps this sequence with another one. */ diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_AudioSource.h b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_AudioSource.h index cfbd59f..9708530 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_AudioSource.h +++ b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_AudioSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp index 21dc173..c47cc5e 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp +++ b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h index b0ab4d2..4d507d7 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h +++ b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp index 7e0a58c..ac06074 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp +++ b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h index 483fe99..1c44aa4 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h +++ b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp index 08e87f0..4305a39 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp +++ b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h index 40844c5..ef3da93 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h +++ b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp index 60ae191..14a3f87 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp +++ b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.h b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.h index f581ac3..98269c5 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.h +++ b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h index 2213722..2084f0b 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h +++ b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp index 6a0704e..d4b68e3 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp +++ b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -24,14 +24,14 @@ ResamplingAudioSource::ResamplingAudioSource (AudioSource* const inputSource, const bool deleteInputWhenDeleted, - const int numChannels_) + const int channels) : input (inputSource, deleteInputWhenDeleted), ratio (1.0), lastRatio (1.0), bufferPos (0), sampsInBuffer (0), subSampleOffset (0), - numChannels (numChannels_) + numChannels (channels) { jassert (input != nullptr); zeromem (coefficients, sizeof (coefficients)); @@ -51,9 +51,10 @@ void ResamplingAudioSource::prepareToPlay (int samplesPerBlockExpected, double s { const SpinLock::ScopedLockType sl (ratioLock); - input->prepareToPlay (samplesPerBlockExpected, sampleRate); + const int scaledBlockSize = roundToInt (samplesPerBlockExpected * ratio); + input->prepareToPlay (scaledBlockSize, sampleRate * ratio); - buffer.setSize (numChannels, roundToInt (samplesPerBlockExpected * ratio) + 32); + buffer.setSize (numChannels, scaledBlockSize + 32); filterStates.calloc ((size_t) numChannels); srcBuffers.calloc ((size_t) numChannels); @@ -93,7 +94,7 @@ void ResamplingAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& inf lastRatio = localRatio; } - const int sampsNeeded = roundToInt (info.numSamples * localRatio) + 2; + const int sampsNeeded = roundToInt (info.numSamples * localRatio) + 3; int bufferSize = buffer.getNumSamples(); @@ -138,8 +139,11 @@ void ResamplingAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& inf } int nextPos = (bufferPos + 1) % bufferSize; + for (int m = info.numSamples; --m >= 0;) { + jassert (sampsInBuffer > 0 && nextPos != endOfBufferPos); + const float alpha = (float) subSampleOffset; for (int channel = 0; channel < channelsToProcess; ++channel) @@ -148,8 +152,6 @@ void ResamplingAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& inf subSampleOffset += localRatio; - jassert (sampsInBuffer > 0); - while (subSampleOffset >= 1.0) { if (++bufferPos >= bufferSize) diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h index 09d27a8..09491cb 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h +++ b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp index d630075..4701855 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp +++ b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h index 6b90e18..547a44e 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h +++ b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp index a0e04ef..05ec255 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp +++ b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h index 5d09ad8..c45143d 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h +++ b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp b/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp index 81110ed..16ef359 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp +++ b/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -29,8 +29,10 @@ SynthesiserSound::~SynthesiserSound() {} SynthesiserVoice::SynthesiserVoice() : currentSampleRate (44100.0), currentlyPlayingNote (-1), + currentPlayingMidiChannel (0), noteOnTime (0), keyIsDown (false), + sustainPedalDown (false), sostenutoPedalDown (false) { } @@ -41,8 +43,7 @@ SynthesiserVoice::~SynthesiserVoice() bool SynthesiserVoice::isPlayingChannel (const int midiChannel) const { - return currentlyPlayingSound != nullptr - && currentlyPlayingSound->appliesToChannel (midiChannel); + return currentPlayingMidiChannel == midiChannel; } void SynthesiserVoice::setCurrentPlaybackSampleRate (const double newRate) @@ -59,9 +60,11 @@ void SynthesiserVoice::clearCurrentNote() { currentlyPlayingNote = -1; currentlyPlayingSound = nullptr; + currentPlayingMidiChannel = 0; } void SynthesiserVoice::aftertouchChanged (int) {} +void SynthesiserVoice::channelPressureChanged (int) {} bool SynthesiserVoice::wasStartedBefore (const SynthesiserVoice& other) const noexcept { @@ -72,6 +75,7 @@ bool SynthesiserVoice::wasStartedBefore (const SynthesiserVoice& other) const no Synthesiser::Synthesiser() : sampleRate (0), lastNoteOnCounter (0), + minimumSubBlockSize (32), shouldStealNotes (true) { for (int i = 0; i < numElementsInArray (lastPitchWheelValues); ++i) @@ -130,6 +134,12 @@ void Synthesiser::setNoteStealingEnabled (const bool shouldSteal) shouldStealNotes = shouldSteal; } +void Synthesiser::setMinimumRenderingSubdivisionSize (int numSamples) noexcept +{ + jassert (numSamples > 0); // it wouldn't make much sense for this to be less than 1 + minimumSubBlockSize = numSamples; +} + //============================================================================== void Synthesiser::setCurrentPlaybackSampleRate (const double newRate) { @@ -152,30 +162,45 @@ void Synthesiser::renderNextBlock (AudioSampleBuffer& outputBuffer, const MidiBu // 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); + + int midiEventPos; + MidiMessage m; + + const ScopedLock sl (lock); while (numSamples > 0) { - int midiEventPos; - const bool useEvent = midiIterator.getNextEvent (m, midiEventPos) - && midiEventPos < startSample + numSamples; + if (! midiIterator.getNextEvent (m, midiEventPos)) + { + renderVoices (outputBuffer, startSample, numSamples); + return; + } - const int numThisTime = useEvent ? midiEventPos - startSample - : numSamples; + const int samplesToNextMidiMessage = midiEventPos - startSample; - if (numThisTime > 0) - renderVoices (outputBuffer, startSample, numThisTime); + if (samplesToNextMidiMessage >= numSamples) + { + renderVoices (outputBuffer, startSample, numSamples); + handleMidiEvent (m); + break; + } - if (useEvent) + if (samplesToNextMidiMessage < minimumSubBlockSize) + { handleMidiEvent (m); + continue; + } - startSample += numThisTime; - numSamples -= numThisTime; + renderVoices (outputBuffer, startSample, samplesToNextMidiMessage); + handleMidiEvent (m); + startSample += samplesToNextMidiMessage; + numSamples -= samplesToNextMidiMessage; } + + while (midiIterator.getNextEvent (m, midiEventPos)) + handleMidiEvent (m); } void Synthesiser::renderVoices (AudioSampleBuffer& buffer, int startSample, int numSamples) @@ -186,33 +211,41 @@ void Synthesiser::renderVoices (AudioSampleBuffer& buffer, int startSample, int void Synthesiser::handleMidiEvent (const MidiMessage& m) { + const int channel = m.getChannel(); + if (m.isNoteOn()) { - noteOn (m.getChannel(), m.getNoteNumber(), m.getFloatVelocity()); + noteOn (channel, m.getNoteNumber(), m.getFloatVelocity()); } else if (m.isNoteOff()) { - noteOff (m.getChannel(), m.getNoteNumber(), m.getFloatVelocity(), true); + noteOff (channel, m.getNoteNumber(), m.getFloatVelocity(), true); } else if (m.isAllNotesOff() || m.isAllSoundOff()) { - allNotesOff (m.getChannel(), true); + allNotesOff (channel, 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()); + handleAftertouch (channel, m.getNoteNumber(), m.getAfterTouchValue()); + } + else if (m.isChannelPressure()) + { + handleChannelPressure (channel, m.getChannelPressureValue()); } else if (m.isController()) { - handleController (m.getChannel(), m.getControllerNumber(), m.getControllerValue()); + handleController (channel, m.getControllerNumber(), m.getControllerValue()); + } + else if (m.isProgramChange()) + { + handleProgramChange (channel, m.getProgramChangeNumber()); } } @@ -258,14 +291,16 @@ void Synthesiser::startVoice (SynthesiserVoice* const voice, if (voice->currentlyPlayingSound != nullptr) voice->stopNote (0.0f, false); - voice->startNote (midiNoteNumber, velocity, sound, - lastPitchWheelValues [midiChannel - 1]); - voice->currentlyPlayingNote = midiNoteNumber; + voice->currentPlayingMidiChannel = midiChannel; voice->noteOnTime = ++lastNoteOnCounter; voice->currentlyPlayingSound = sound; voice->keyIsDown = true; voice->sostenutoPedalDown = false; + voice->sustainPedalDown = sustainPedalsDown[midiChannel]; + + voice->startNote (midiNoteNumber, velocity, sound, + lastPitchWheelValues [midiChannel - 1]); } } @@ -290,16 +325,19 @@ void Synthesiser::noteOff (const int midiChannel, { SynthesiserVoice* const voice = voices.getUnchecked (i); - if (voice->getCurrentlyPlayingNote() == midiNoteNumber) + if (voice->getCurrentlyPlayingNote() == midiNoteNumber + && voice->isPlayingChannel (midiChannel)) { if (SynthesiserSound* const sound = voice->getCurrentlyPlayingSound()) { if (sound->appliesToNote (midiNoteNumber) && sound->appliesToChannel (midiChannel)) { + jassert (! voice->keyIsDown || voice->sustainPedalDown == sustainPedalsDown [midiChannel]); + voice->keyIsDown = false; - if (! (sustainPedalsDown [midiChannel] || voice->sostenutoPedalDown)) + if (! (voice->sustainPedalDown || voice->sostenutoPedalDown)) stopVoice (voice, velocity, allowTailOff); } } @@ -372,6 +410,19 @@ void Synthesiser::handleAftertouch (int midiChannel, int midiNoteNumber, int aft } } +void Synthesiser::handleChannelPressure (int midiChannel, int channelPressureValue) +{ + const ScopedLock sl (lock); + + for (int i = voices.size(); --i >= 0;) + { + SynthesiserVoice* const voice = voices.getUnchecked (i); + + if (midiChannel <= 0 || voice->isPlayingChannel (midiChannel)) + voice->channelPressureChanged (channelPressureValue); + } +} + void Synthesiser::handleSustainPedal (int midiChannel, bool isDown) { jassert (midiChannel > 0 && midiChannel <= 16); @@ -380,6 +431,14 @@ void Synthesiser::handleSustainPedal (int midiChannel, bool isDown) if (isDown) { sustainPedalsDown.setBit (midiChannel); + + for (int i = voices.size(); --i >= 0;) + { + SynthesiserVoice* const voice = voices.getUnchecked (i); + + if (voice->isPlayingChannel (midiChannel) && voice->isKeyDown()) + voice->sustainPedalDown = true; + } } else { @@ -387,8 +446,13 @@ void Synthesiser::handleSustainPedal (int midiChannel, bool isDown) { SynthesiserVoice* const voice = voices.getUnchecked (i); - if (voice->isPlayingChannel (midiChannel) && ! voice->keyIsDown) - stopVoice (voice, 1.0f, true); + if (voice->isPlayingChannel (midiChannel)) + { + voice->sustainPedalDown = false; + + if (! voice->isKeyDown()) + stopVoice (voice, 1.0f, true); + } } sustainPedalsDown.clearBit (midiChannel); @@ -420,6 +484,12 @@ void Synthesiser::handleSoftPedal (int midiChannel, bool /*isDown*/) jassert (midiChannel > 0 && midiChannel <= 16); } +void Synthesiser::handleProgramChange (int midiChannel, int programNumber) +{ + (void) midiChannel; (void) programNumber; + jassert (midiChannel > 0 && midiChannel <= 16); +} + //============================================================================== SynthesiserVoice* Synthesiser::findFreeVoice (SynthesiserSound* soundToPlay, int midiChannel, int midiNoteNumber, @@ -445,15 +515,20 @@ struct VoiceAgeSorter { static int compareElements (SynthesiserVoice* v1, SynthesiserVoice* v2) noexcept { - return v1->wasStartedBefore (*v2) ? 1 : (v2->wasStartedBefore (*v1) ? -1 : 0); + 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 voice-stealing algorithm applies the following heuristics: + // - Re-use the oldest notes first + // - Protect the lowest & topmost notes, even if sustained, but not if they've been released. + + // These are the voices we want to protect (ie: only steal if unavoidable) + SynthesiserVoice* low = nullptr; // Lowest sounding note, might be sustained, but NOT in release phase + SynthesiserVoice* top = nullptr; // Highest sounding note, might be sustained, but NOT in release phase // this is a list of voices we can steal, sorted by how long they've been running Array usableVoices; @@ -465,23 +540,32 @@ SynthesiserVoice* Synthesiser::findVoiceToSteal (SynthesiserSound* soundToPlay, if (voice->canPlaySound (soundToPlay)) { + jassert (voice->isVoiceActive()); // We wouldn't be here otherwise + VoiceAgeSorter sorter; usableVoices.addSorted (sorter, voice); - const int note = voice->getCurrentlyPlayingNote(); + if (! voice->isPlayingButReleased()) // Don't protect released notes + { + const int note = voice->getCurrentlyPlayingNote(); - if (bottom == nullptr || note < bottom->getCurrentlyPlayingNote()) - bottom = voice; + if (low == nullptr || note < low->getCurrentlyPlayingNote()) + low = voice; - if (top == nullptr || note > top->getCurrentlyPlayingNote()) - top = voice; + if (top == nullptr || note > top->getCurrentlyPlayingNote()) + top = voice; + } } } - jassert (bottom != nullptr && top != nullptr); + // Eliminate pathological cases (ie: only 1 note playing): we always give precedence to the lowest note(s) + if (top == low) + top = nullptr; + + const int numUsableVoices = usableVoices.size(); - // The oldest note that's playing with the target pitch playing is ideal.. - for (int i = 0; i < usableVoices.size(); ++i) + // The oldest note that's playing with the target pitch is ideal.. + for (int i = 0; i < numUsableVoices; ++i) { SynthesiserVoice* const voice = usableVoices.getUnchecked (i); @@ -489,15 +573,39 @@ SynthesiserVoice* Synthesiser::findVoiceToSteal (SynthesiserSound* soundToPlay, return voice; } - // ..otherwise, look for the oldest note that isn't the top or bottom note.. - for (int i = 0; i < usableVoices.size(); ++i) + // Oldest voice that has been released (no finger on it and not held by sustain pedal) + for (int i = 0; i < numUsableVoices; ++i) { SynthesiserVoice* const voice = usableVoices.getUnchecked (i); - if (voice != bottom && voice != top) + if (voice != low && voice != top && voice->isPlayingButReleased()) return voice; } - // ..otherwise, there's only one or two voices to choose from - we'll return the top one.. - return top; + // Oldest voice that doesn't have a finger on it: + for (int i = 0; i < numUsableVoices; ++i) + { + SynthesiserVoice* const voice = usableVoices.getUnchecked (i); + + if (voice != low && voice != top && ! voice->isKeyDown()) + return voice; + } + + // Oldest voice that isn't protected + for (int i = 0; i < numUsableVoices; ++i) + { + SynthesiserVoice* const voice = usableVoices.getUnchecked (i); + + if (voice != low && voice != top) + return voice; + } + + // We've only got "protected" voices now: lowest note takes priority + jassert (low != nullptr); + + // Duophonic synth: give priority to the bass note: + if (top != nullptr) + return top; + + return low; } diff --git a/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h b/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h index 3c20a85..7052b00 100644 --- a/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h +++ b/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -161,6 +161,11 @@ public: */ virtual void aftertouchChanged (int newAftertouchValue); + /** Called to let the voice know that the channel pressure has changed. + This will be called during the rendering callback, so must be fast and thread-safe. + */ + virtual void channelPressureChanged (int newChannelPressureValue); + //============================================================================== /** Renders the next block of data for this voice. @@ -191,17 +196,17 @@ public: */ 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; + virtual bool isPlayingChannel (int midiChannel) const; + + /** 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 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 @@ -209,9 +214,18 @@ public: */ bool isKeyDown() const noexcept { return keyIsDown; } + /** Returns true if the sustain pedal is currently active for this voice. */ + bool isSustainPedalDown() const noexcept { return sustainPedalDown; } + /** Returns true if the sostenuto pedal is currently active for this voice. */ bool isSostenutoPedalDown() const noexcept { return sostenutoPedalDown; } + /** Returns true if a voice is sounding in its release phase **/ + bool isPlayingButReleased() const noexcept + { + return isVoiceActive() && ! (isKeyDown() || isSostenutoPedalDown() || isSustainPedalDown()); + } + /** Returns true if this voice started playing its current note before the other voice did. */ bool wasStartedBefore (const SynthesiserVoice& other) const noexcept; @@ -236,10 +250,10 @@ private: friend class Synthesiser; double currentSampleRate; - int currentlyPlayingNote; + int currentlyPlayingNote, currentPlayingMidiChannel; uint32 noteOnTime; SynthesiserSound::Ptr currentlyPlayingSound; - bool keyIsDown, sostenutoPedalDown; + bool keyIsDown, sustainPedalDown, sostenutoPedalDown; #if JUCE_CATCH_DEPRECATED_CODE_MISUSE // Note the new parameters for this method. @@ -440,6 +454,20 @@ public: */ virtual void handleAftertouch (int midiChannel, int midiNoteNumber, int aftertouchValue); + /** Sends a channel pressure message. + + This will send a channel pressure 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 channelPressureValue the pressure value, between 0 and 127, as returned + by MidiMessage::getChannelPressureValue() + */ + virtual void handleChannelPressure (int midiChannel, int channelPressureValue); + /** Handles a sustain pedal event. */ virtual void handleSustainPedal (int midiChannel, bool isDown); @@ -449,6 +477,13 @@ public: /** Can be overridden to handle soft pedal events. */ virtual void handleSoftPedal (int midiChannel, bool isDown); + /** Can be overridden to handle an incoming program change message. + The base class implementation of this has no effect, but you may want to make your + own synth react to program changes. + */ + virtual void handleProgramChange (int midiChannel, + int programNumber); + //============================================================================== /** Tells the synthesiser what the sample rate is for the audio it's being used to render. @@ -479,6 +514,22 @@ public: */ double getSampleRate() const noexcept { return sampleRate; } + /** Sets a minimum limit on the size to which audio sub-blocks will be divided when rendering. + + When rendering, the audio blocks that are passed into renderNextBlock() will be split up + into smaller blocks that lie between all the incoming midi messages, and it is these smaller + sub-blocks that are rendered with multiple calls to renderVoices(). + + Obviously in a pathological case where there are midi messages on every sample, then + renderVoices() could be called once per sample and lead to poor performance, so this + setting allows you to set a lower limit on the block size. + + The default setting is 32, which means that midi messages are accurate to about < 1ms + accuracy, which is probably fine for most purposes, but you may want to increase or + decrease this value for your synth. + */ + void setMinimumRenderingSubdivisionSize (int numSamples) noexcept; + protected: //============================================================================== /** This is used to control access to the rendering callback and the note trigger methods. */ @@ -537,6 +588,7 @@ private: //============================================================================== double sampleRate; uint32 lastNoteOnCounter; + int minimumSubBlockSize; bool shouldStealNotes; BigInteger sustainPedalsDown; diff --git a/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDBurner.h b/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDBurner.h index 88b1ef2..fae2cd0 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDBurner.h +++ b/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDBurner.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.cpp b/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.cpp index ca9c5b0..b9d7987 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.cpp +++ b/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.h b/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.h index 0e868db..bcf0f48 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.h +++ b/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp b/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp index fad5eea..25451fe 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp +++ b/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -92,7 +92,6 @@ AudioDeviceManager::AudioDeviceManager() : numInputChansNeeded (0), numOutputChansNeeded (2), listNeedsScanning (true), - useInputNames (false), inputLevel (0), testSoundPosition (0), cpuUsageMs (0), @@ -154,7 +153,8 @@ static void addIfNotNull (OwnedArray& list, AudioIODeviceType void AudioDeviceManager::createAudioDeviceTypes (OwnedArray& list) { - addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_WASAPI()); + addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_WASAPI (false)); + addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_WASAPI (true)); addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_DirectSound()); addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_ASIO()); addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_CoreAudio()); @@ -177,6 +177,17 @@ void AudioDeviceManager::addAudioDeviceType (AudioIODeviceType* newDeviceType) } } +static bool deviceListContains (AudioIODeviceType* type, bool isInput, const String& name) +{ + StringArray devices (type->getDeviceNames (isInput)); + + for (int i = devices.size(); --i >= 0;) + if (devices[i].trim().equalsIgnoreCase (name.trim())) + return true; + + return false; +} + //============================================================================== String AudioDeviceManager::initialise (const int numInputChannelsNeeded, const int numOutputChannelsNeeded, @@ -363,8 +374,8 @@ AudioIODeviceType* AudioDeviceManager::findType (const String& inputName, const { AudioIODeviceType* const type = availableDeviceTypes.getUnchecked(i); - if ((inputName.isNotEmpty() && type->getDeviceNames (true).contains (inputName, true)) - || (outputName.isNotEmpty() && type->getDeviceNames (false).contains (outputName, true))) + if ((inputName.isNotEmpty() && deviceListContains (type, true, inputName)) + || (outputName.isNotEmpty() && deviceListContains (type, false, outputName))) { return type; } @@ -458,17 +469,11 @@ String AudioDeviceManager::setAudioDeviceSetup (const AudioDeviceSetup& newSetup deleteCurrentDevice(); scanDevicesIfNeeded(); - if (newOutputDeviceName.isNotEmpty() - && ! type->getDeviceNames (false).contains (newOutputDeviceName)) - { + if (newOutputDeviceName.isNotEmpty() && ! deviceListContains (type, false, newOutputDeviceName)) return "No such device: " + newOutputDeviceName; - } - if (newInputDeviceName.isNotEmpty() - && ! type->getDeviceNames (true).contains (newInputDeviceName)) - { + if (newInputDeviceName.isNotEmpty() && ! deviceListContains (type, true, newInputDeviceName)) return "No such device: " + newInputDeviceName; - } currentAudioDevice = type->createDevice (newOutputDeviceName, newInputDeviceName); @@ -546,6 +551,11 @@ double AudioDeviceManager::chooseBestSampleRate (double rate) const const Array rates (currentAudioDevice->getAvailableSampleRates()); + if (rate > 0 && rates.contains (rate)) + return rate; + + rate = currentAudioDevice->getCurrentSampleRate(); + if (rate > 0 && rates.contains (rate)) return rate; diff --git a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h b/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h index f1e483f..978ed35 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h +++ b/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -450,7 +450,6 @@ private: BigInteger inputChannels, outputChannels; ScopedPointer lastExplicitSettings; mutable bool listNeedsScanning; - bool useInputNames; Atomic inputLevelMeasurementEnabledCount; double inputLevel; ScopedPointer testSound; diff --git a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp b/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp index 95221ba..990550e 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp +++ b/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h b/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h index 8ce41d0..921c57d 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h +++ b/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp b/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp index 80026e7..0df87eb 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp +++ b/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -50,7 +50,7 @@ AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_iOSAudio() #endif #if ! (JUCE_WINDOWS && JUCE_WASAPI) -AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_WASAPI() { return nullptr; } +AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_WASAPI (bool) { return nullptr; } #endif #if ! (JUCE_WINDOWS && JUCE_DIRECTSOUND) diff --git a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h b/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h index d6cd99a..73b8afc 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h +++ b/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -151,7 +151,7 @@ public: /** 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(); + static AudioIODeviceType* createAudioIODeviceType_WASAPI (bool exclusiveMode); /** 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. */ diff --git a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h b/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h index 689e1f2..5088976 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h +++ b/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.cpp b/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.cpp index a9733db..2bc3c6a 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.cpp +++ b/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -72,7 +72,7 @@ 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). + (see http://www.steinberg.net/en/company/developers.html). 2) Enable this code with a global definition #define JUCE_ASIO 1. diff --git a/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.h b/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.h index b8528d5..249f6b2 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.h +++ b/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -43,12 +43,21 @@ #endif /** Config: JUCE_WASAPI - Enables WASAPI audio devices (Windows Vista and above). + Enables WASAPI audio devices (Windows Vista and above). See also the + JUCE_WASAPI_EXCLUSIVE flag. */ #ifndef JUCE_WASAPI #define JUCE_WASAPI 1 #endif +/** Config: JUCE_WASAPI_EXCLUSIVE + Enables WASAPI audio devices in exclusive mode (Windows Vista and above). +*/ +#ifndef JUCE_WASAPI_EXCLUSIVE + #define JUCE_WASAPI_EXCLUSIVE 0 +#endif + + /** Config: JUCE_DIRECTSOUND Enables DirectSound audio (MS Windows only). */ diff --git a/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.mm b/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.mm index a135119..b49480d 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.mm +++ b/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_devices/juce_module_info b/JuceLibraryCode/modules/juce_audio_devices/juce_module_info index 6ef2131..add21aa 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/juce_module_info +++ b/JuceLibraryCode/modules/juce_audio_devices/juce_module_info @@ -1,7 +1,7 @@ { "id": "juce_audio_devices", "name": "JUCE audio and midi I/O device classes", - "version": "3.0.8", + "version": "3.2.0", "description": "Classes to play and record from audio and midi i/o devices.", "website": "http://www.juce.com/juce", "license": "GPL/Commercial", diff --git a/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiInput.h b/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiInput.h index 6308020..0c5a5b6 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiInput.h +++ b/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiInput.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -139,7 +139,7 @@ public: //============================================================================== /** Destructor. */ - virtual ~MidiInput(); + ~MidiInput(); /** Returns the name of this device. */ const String& getName() const noexcept { return name; } @@ -158,23 +158,21 @@ public: @see stop */ - virtual void start(); + void start(); /** Stops the device running. - @see start */ - virtual void stop(); + void stop(); -protected: +private: //============================================================================== String name; void* internal; - explicit MidiInput (const String& name); + // The input objects are created with the openDevice() method. + explicit MidiInput (const String&); -private: - //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiInput) }; diff --git a/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp b/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp index 28e81c0..f4b9525 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp +++ b/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h b/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h index 5b16737..c77401a 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h +++ b/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp b/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp index 0af7d1b..984c9ad 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp +++ b/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.h b/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.h index c668f8a..c908263 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.h +++ b/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -82,13 +82,12 @@ public: //============================================================================== /** Destructor. */ - virtual ~MidiOutput(); + ~MidiOutput(); /** Makes this device output a midi message. - @see MidiMessage */ - virtual void sendMessageNow (const MidiMessage& message); + void sendMessageNow (const MidiMessage& message); //============================================================================== /** This lets you supply a block of messages that will be sent out at some point @@ -100,7 +99,7 @@ public: 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 + A time is specified, 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 @@ -108,38 +107,34 @@ public: samplesPerSecondForBuffer value is needed to convert this sample position to a real time. */ - virtual void sendBlockOfMessages (const MidiBuffer& buffer, - double millisecondCounterToStartAt, - double samplesPerSecondForBuffer); + void sendBlockOfMessages (const MidiBuffer& buffer, + double millisecondCounterToStartAt, + double samplesPerSecondForBuffer); - /** Gets rid of any midi messages that had been added by sendBlockOfMessages(). - */ - virtual void clearAllPendingMessages(); + /** Gets rid of any midi messages that had been added by sendBlockOfMessages(). */ + 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(); + void startBackgroundThread(); /** Stops the background thread, and clears any pending midi events. - @see startBackgroundThread */ - virtual void stopBackgroundThread(); + void stopBackgroundThread(); -protected: +private: //============================================================================== void* internal; CriticalSection lock; struct PendingMessage; PendingMessage* firstMessage; - MidiOutput(); + MidiOutput(); // These objects are created with the openDevice() method. void run() override; -private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiOutput) }; diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_MidiDataConcatenator.h b/JuceLibraryCode/modules/juce_audio_devices/native/juce_MidiDataConcatenator.h index 4dc70b9..0cefb83 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_MidiDataConcatenator.h +++ b/JuceLibraryCode/modules/juce_audio_devices/native/juce_MidiDataConcatenator.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Audio.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Audio.cpp index 80711da..d32f5cf 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Audio.cpp +++ b/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Audio.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Midi.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Midi.cpp index 88eeae6..59ddf3e 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Midi.cpp +++ b/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Midi.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_OpenSL.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_OpenSL.cpp index 53dc5df..f4c09bb 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_OpenSL.cpp +++ b/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_OpenSL.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -47,13 +47,13 @@ public: // 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); + 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; + const int64 longestLatency = jmax (inputLatency, outputLatency); + const int64 totalLatency = inputLatency + outputLatency; + inputLatency = (int) ((longestLatency * inputLatency) / totalLatency) & ~15; + outputLatency = (int) ((longestLatency * outputLatency) / totalLatency) & ~15; } ~OpenSLAudioIODevice() diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_ios_Audio.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_ios_Audio.cpp index 70490aa..16dba0c 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_ios_Audio.cpp +++ b/JuceLibraryCode/modules/juce_audio_devices/native/juce_ios_Audio.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_ALSA.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_ALSA.cpp index 091ffba..85fb8c5 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_ALSA.cpp +++ b/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_ALSA.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -30,7 +30,7 @@ namespace #endif #if JUCE_ALSA_LOGGING - #define JUCE_ALSA_LOG(dbgtext) { juce::String tempDbgBuf ("ALSA: "); tempDbgBuf << dbgtext; Logger::writeToLog (tempDbgBuf); DBG (tempDbgBuf) } + #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) @@ -57,7 +57,7 @@ static void getDeviceSampleRates (snd_pcm_t* handle, Array& rates) 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) + && snd_pcm_hw_params_test_rate (handle, hwParams, (unsigned int) ratesToTry[i], 0) == 0) { rates.addIfNotAlreadyThere ((double) ratesToTry[i]); } @@ -149,7 +149,7 @@ class ALSADevice { public: ALSADevice (const String& devID, bool forInput) - : handle (0), + : handle (nullptr), bitDepth (16), numChannelsRunning (0), latency (0), @@ -183,16 +183,16 @@ public: void closeNow() { - if (handle != 0) + if (handle != nullptr) { snd_pcm_close (handle); - handle = 0; + handle = nullptr; } } bool setParameters (unsigned int sampleRate, int numChannels, int bufferSize) { - if (handle == 0) + if (handle == nullptr) return false; JUCE_ALSA_LOG ("ALSADevice::setParameters(" << deviceID << ", " @@ -257,10 +257,10 @@ public: int dir = 0; unsigned int periods = 4; - snd_pcm_uframes_t samplesPerPeriod = bufferSize; + snd_pcm_uframes_t samplesPerPeriod = (snd_pcm_uframes_t) 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_channels (handle, hwParams, (unsigned int ) 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))) @@ -274,7 +274,7 @@ public: || 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..) + latency = (int) frames * ((int) periods - 1); // (this is the method JACK uses to guess the latency..) JUCE_ALSA_LOG ("frames: " << (int) frames << ", periods: " << (int) periods << ", samplesPerPeriod: " << (int) samplesPerPeriod); @@ -316,22 +316,22 @@ public: if (isInterleaved) { - scratch.ensureSize (sizeof (float) * numSamples * numChannelsRunning, false); + scratch.ensureSize ((size_t) ((int) 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); + numDone = snd_pcm_writei (handle, scratch.getData(), (snd_pcm_uframes_t) numSamples); } else { for (int i = 0; i < numChannelsRunning; ++i) converter->convertSamples (data[i], data[i], numSamples); - numDone = snd_pcm_writen (handle, (void**) data, numSamples); + numDone = snd_pcm_writen (handle, (void**) data, (snd_pcm_uframes_t) numSamples); } - if (numDone < 0 && JUCE_ALSA_FAILED (snd_pcm_recover (handle, numDone, 1 /* silent */))) + if (numDone < 0 && JUCE_ALSA_FAILED (snd_pcm_recover (handle, (int) numDone, 1 /* silent */))) return false; if (numDone < numSamples) @@ -347,12 +347,12 @@ public: if (isInterleaved) { - scratch.ensureSize (sizeof (float) * numSamples * numChannelsRunning, false); + scratch.ensureSize ((size_t) ((int) 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); + snd_pcm_sframes_t num = snd_pcm_readi (handle, scratch.getData(), (snd_pcm_uframes_t) numSamples); - if (num < 0 && JUCE_ALSA_FAILED (snd_pcm_recover (handle, num, 1 /* silent */))) + if (num < 0 && JUCE_ALSA_FAILED (snd_pcm_recover (handle, (int) num, 1 /* silent */))) return false; if (num < numSamples) @@ -363,9 +363,9 @@ public: } else { - snd_pcm_sframes_t num = snd_pcm_readn (handle, (void**) data, numSamples); + snd_pcm_sframes_t num = snd_pcm_readn (handle, (void**) data, (snd_pcm_uframes_t) numSamples); - if (num < 0 && JUCE_ALSA_FAILED (snd_pcm_recover (handle, num, 1 /* silent */))) + if (num < 0 && JUCE_ALSA_FAILED (snd_pcm_recover (handle, (int) num, 1 /* silent */))) return false; if (num < numSamples) @@ -486,14 +486,17 @@ public: sampleRate = newSampleRate; bufferSize = newBufferSize; - inputChannelBuffer.setSize (jmax ((int) minChansIn, inputChannels.getHighestBit()) + 1, bufferSize); + int maxInputsRequested = inputChannels.getHighestBit() + 1; + maxInputsRequested = jmax ((int) minChansIn, jmin ((int) maxChansIn, maxInputsRequested)); + + inputChannelBuffer.setSize (maxInputsRequested, bufferSize); inputChannelBuffer.clear(); inputChannelDataForCallback.clear(); currentInputChans.clear(); if (inputChannels.getHighestBit() >= 0) { - for (int i = 0; i <= jmax (inputChannels.getHighestBit(), (int) minChansIn); ++i) + for (int i = 0; i < maxInputsRequested; ++i) { if (inputChannels[i]) { @@ -503,16 +506,19 @@ public: } } - ensureMinimumNumBitsSet (outputChannels, minChansOut); + ensureMinimumNumBitsSet (outputChannels, (int) minChansOut); + + int maxOutputsRequested = outputChannels.getHighestBit() + 1; + maxOutputsRequested = jmax ((int) minChansOut, jmin ((int) maxChansOut, maxOutputsRequested)); - outputChannelBuffer.setSize (jmax ((int) minChansOut, outputChannels.getHighestBit()) + 1, bufferSize); + outputChannelBuffer.setSize (maxOutputsRequested, bufferSize); outputChannelBuffer.clear(); outputChannelDataForCallback.clear(); currentOutputChans.clear(); if (outputChannels.getHighestBit() >= 0) { - for (int i = 0; i <= jmax (outputChannels.getHighestBit(), (int) minChansOut); ++i) + for (int i = 0; i < maxOutputsRequested; ++i) { if (outputChannels[i]) { @@ -557,7 +563,7 @@ public: return; } - ensureMinimumNumBitsSet (currentInputChans, minChansIn); + ensureMinimumNumBitsSet (currentInputChans, (int) minChansIn); if (! inputDevice->setParameters ((unsigned int) sampleRate, jlimit ((int) minChansIn, (int) maxChansIn, currentInputChans.getHighestBit() + 1), @@ -644,8 +650,21 @@ public: { while (! threadShouldExit()) { - if (inputDevice != nullptr && inputDevice->handle) + if (inputDevice != nullptr && inputDevice->handle != nullptr) { + if (outputDevice == nullptr || outputDevice->handle == nullptr) + { + JUCE_ALSA_FAILED (snd_pcm_wait (inputDevice->handle, 2000)); + + if (threadShouldExit()) + break; + + snd_pcm_sframes_t avail = snd_pcm_avail_update (inputDevice->handle); + + if (avail < 0) + JUCE_ALSA_FAILED (snd_pcm_recover (inputDevice->handle, (int) avail, 0)); + } + audioIoInProgress = true; if (! inputDevice->readFromInputDevice (inputChannelBuffer, bufferSize)) @@ -675,11 +694,11 @@ public: else { for (int i = 0; i < outputChannelDataForCallback.size(); ++i) - zeromem (outputChannelDataForCallback[i], sizeof (float) * bufferSize); + zeromem (outputChannelDataForCallback[i], sizeof (float) * (size_t) bufferSize); } } - if (outputDevice != nullptr && outputDevice->handle) + if (outputDevice != nullptr && outputDevice->handle != nullptr) { JUCE_ALSA_FAILED (snd_pcm_wait (outputDevice->handle, 2000)); @@ -689,7 +708,7 @@ public: snd_pcm_sframes_t avail = snd_pcm_avail_update (outputDevice->handle); if (avail < 0) - JUCE_ALSA_FAILED (snd_pcm_recover (outputDevice->handle, avail, 0)); + JUCE_ALSA_FAILED (snd_pcm_recover (outputDevice->handle, (int) avail, 0)); audioIoInProgress = true; @@ -702,6 +721,7 @@ public: audioIoInProgress = false; } } + audioIoInProgress = false; } @@ -782,10 +802,10 @@ class ALSAAudioIODevice : public AudioIODevice { public: ALSAAudioIODevice (const String& deviceName, - const String& typeName, + const String& deviceTypeName, const String& inputDeviceID, const String& outputDeviceID) - : AudioIODevice (deviceName, typeName), + : AudioIODevice (deviceName, deviceTypeName), inputId (inputDeviceID), outputId (outputDeviceID), isOpen_ (false), @@ -910,8 +930,8 @@ private: class ALSAAudioIODeviceType : public AudioIODeviceType { public: - ALSAAudioIODeviceType (bool onlySoundcards, const String &typeName) - : AudioIODeviceType (typeName), + ALSAAudioIODeviceType (bool onlySoundcards, const String &deviceTypeName) + : AudioIODeviceType (deviceTypeName), hasScanned (false), listOnlySoundcards (onlySoundcards) { @@ -1078,9 +1098,9 @@ private: if (snd_ctl_pcm_next_device (handle, &device) < 0 || device < 0) break; - snd_pcm_info_set_device (pcmInfo, device); + snd_pcm_info_set_device (pcmInfo, (unsigned int) device); - for (int subDevice = 0, nbSubDevice = 1; subDevice < nbSubDevice; ++subDevice) + for (unsigned 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); @@ -1104,7 +1124,7 @@ private: } else { - id << "hw:" << cardId << "," << device << "," << subDevice; + id << "hw:" << cardId << "," << device << "," << (int) subDevice; name << cardName << ", " << snd_pcm_info_get_name (pcmInfo) << " {" << snd_pcm_info_get_subdevice_name (pcmInfo) << "}"; } diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_AudioCDReader.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_AudioCDReader.cpp index a645333..938486b 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_AudioCDReader.cpp +++ b/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_AudioCDReader.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp index 38ad64d..ac9846f 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp +++ b/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_Midi.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_Midi.cpp index a6799f3..821a538 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_Midi.cpp +++ b/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_Midi.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -133,14 +133,14 @@ private: 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 pfd ((size_t) numPfds); + snd_seq_poll_descriptors (seqHandle, pfd, (unsigned int) 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 (poll (pfd, (nfds_t) 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; @@ -154,14 +154,14 @@ private: 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, + const long 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, + const MidiMessage message ((const uint8*) buffer, (int) numBytes, Time::getMillisecondCounter() * 0.001); client.handleIncomingMidiMessage (message, inputEvent->dest.port); @@ -410,7 +410,7 @@ public: maxEventSize (16 * 1024) { jassert (port.isValid() && midiOutput != nullptr); - snd_midi_event_new (maxEventSize, &midiParser); + snd_midi_event_new ((size_t) maxEventSize, &midiParser); } ~MidiOutputDevice() @@ -419,13 +419,13 @@ public: port.deletePort(); } - void sendMessageNow (const MidiMessage& message) + bool sendMessageNow (const MidiMessage& message) { if (message.getRawDataSize() > maxEventSize) { maxEventSize = message.getRawDataSize(); snd_midi_event_free (midiParser); - snd_midi_event_new (maxEventSize, &midiParser); + snd_midi_event_new ((size_t) maxEventSize, &midiParser); } snd_seq_event_t event; @@ -435,12 +435,17 @@ public: const uint8* data = message.getRawData(); snd_seq_t* seqHandle = port.client->get(); + bool success = true; while (numBytes > 0) { const long numSent = snd_midi_event_encode (midiParser, data, numBytes, &event); + if (numSent <= 0) + { + success = numSent == 0; break; + } numBytes -= numSent; data += numSent; @@ -449,11 +454,15 @@ public: snd_seq_ev_set_subs (&event); snd_seq_ev_set_direct (&event); - snd_seq_event_output (seqHandle, &event); + if (snd_seq_event_output_direct (seqHandle, &event) < 0) + { + success = false; + break; + } } - snd_seq_drain_output (seqHandle); snd_midi_event_reset_encode (midiParser); + return success; } private: diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDBurner.mm b/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDBurner.mm index 8dd7bfa..3489a80 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDBurner.mm +++ b/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDBurner.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm b/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm index 447c98b..8d87fac 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm +++ b/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp index d7044eb..02c7a5d 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp +++ b/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -277,7 +277,7 @@ public: 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 }; + static const double possibleRates[] = { 44100.0, 48000.0, 88200.0, 96000.0, 176400.0, 192000.0, 384000.0 }; for (int i = 0; i < numElementsInArray (possibleRates); ++i) { @@ -543,7 +543,7 @@ public: // set sample rate AudioObjectPropertyAddress pa; pa.mSelector = kAudioDevicePropertyNominalSampleRate; - pa.mScope = kAudioObjectPropertyScopeWildcard; + pa.mScope = kAudioObjectPropertyScopeGlobal; pa.mElement = kAudioObjectPropertyElementMaster; Float64 sr = newSampleRate; @@ -1067,6 +1067,12 @@ public: jassert (! isOpen()); jassert (! device->isOpen()); devices.add (new DeviceWrapper (*this, device, useInputs, useOutputs)); + + if (currentSampleRate == 0) + currentSampleRate = device->getCurrentSampleRate(); + + if (currentBufferSize == 0) + currentBufferSize = device->getCurrentBufferSizeSamples(); } Array getDevices() const diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp index 5f8b3d5..a16674c 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp +++ b/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -45,6 +45,14 @@ namespace CoreMidiHelpers #define CHECK_ERROR(a) CoreMidiHelpers::checkError (a, __LINE__) //============================================================================== + struct ScopedCFString + { + ScopedCFString() noexcept : cfString (nullptr) {} + ~ScopedCFString() noexcept { if (cfString != nullptr) CFRelease (cfString); } + + CFStringRef cfString; + }; + static String getMidiObjectName (MIDIObjectRef entity) { String result; @@ -116,7 +124,7 @@ namespace CoreMidiHelpers if (numConnections > 0) { - const SInt32* pid = reinterpret_cast (CFDataGetBytePtr (connections)); + const SInt32* pid = reinterpret_cast (CFDataGetBytePtr (connections)); for (int i = 0; i < numConnections; ++i, ++pid) { @@ -133,7 +141,7 @@ namespace CoreMidiHelpers || connObjectType == kMIDIObjectType_ExternalDestination) { // Connected to an external device's endpoint (10.3 and later). - s = getEndpointName (static_cast (connObject), true); + s = getEndpointName (static_cast (connObject), true); } else { @@ -208,9 +216,9 @@ namespace CoreMidiHelpers // correctly when called from the message thread! jassert (MessageManager::getInstance()->isThisTheMessageThread()); - CFStringRef name = getGlobalMidiClientName().toCFString(); - CHECK_ERROR (MIDIClientCreate (name, &globalSystemChangeCallback, nullptr, &globalMidiClient)); - CFRelease (name); + CoreMidiHelpers::ScopedCFString name; + name.cfString = getGlobalMidiClientName().toCFString(); + CHECK_ERROR (MIDIClientCreate (name.cfString, &globalSystemChangeCallback, nullptr, &globalMidiClient)); } return globalMidiClient; @@ -220,12 +228,12 @@ namespace CoreMidiHelpers class MidiPortAndEndpoint { public: - MidiPortAndEndpoint (MIDIPortRef p, MIDIEndpointRef ep) + MidiPortAndEndpoint (MIDIPortRef p, MIDIEndpointRef ep) noexcept : port (p), endPoint (ep) { } - ~MidiPortAndEndpoint() + ~MidiPortAndEndpoint() noexcept { if (port != 0) MIDIPortDispose (port); @@ -234,7 +242,7 @@ namespace CoreMidiHelpers MIDIEndpointDispose (endPoint); } - void send (const MIDIPacketList* const packets) + void send (const MIDIPacketList* const packets) noexcept { if (port != 0) MIDISend (port, endPoint, packets); @@ -302,7 +310,7 @@ namespace CoreMidiHelpers static void midiInputProc (const MIDIPacketList* pktlist, void* readProcRefCon, void* /*srcConnRefCon*/) { - static_cast (readProcRefCon)->handlePackets (pktlist); + static_cast (readProcRefCon)->handlePackets (pktlist); } } @@ -318,19 +326,18 @@ MidiOutput* MidiOutput::openDevice (int index) { MIDIEndpointRef endPoint = MIDIGetDestination ((ItemCount) index); - CFStringRef pname; - if (CHECK_ERROR (MIDIObjectGetStringProperty (endPoint, kMIDIPropertyName, &pname))) + CoreMidiHelpers::ScopedCFString pname; + + if (CHECK_ERROR (MIDIObjectGetStringProperty (endPoint, kMIDIPropertyName, &pname.cfString))) { MIDIClientRef client = CoreMidiHelpers::getGlobalMidiClient(); MIDIPortRef port; - if (client != 0 && CHECK_ERROR (MIDIOutputPortCreate (client, pname, &port))) + if (client != 0 && CHECK_ERROR (MIDIOutputPortCreate (client, pname.cfString, &port))) { mo = new MidiOutput(); mo->internal = new CoreMidiHelpers::MidiPortAndEndpoint (port, endPoint); } - - CFRelease (pname); } } @@ -339,20 +346,20 @@ MidiOutput* MidiOutput::openDevice (int index) 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))) + CoreMidiHelpers::ScopedCFString name; + name.cfString = deviceName.toCFString(); + + if (client != 0 && CHECK_ERROR (MIDISourceCreate (client, name.cfString, &endPoint))) { - mo = new MidiOutput(); + MidiOutput* mo = new MidiOutput(); mo->internal = new CoreMidiHelpers::MidiPortAndEndpoint (0, endPoint); + return mo; } - CFRelease (name); - return mo; + return nullptr; } MidiOutput::~MidiOutput() @@ -370,7 +377,7 @@ void MidiOutput::sendMessageNow (const MidiMessage& message) const MIDITimeStamp timeStamp = AudioGetCurrentHostTime(); #endif - HeapBlock allocatedPackets; + HeapBlock allocatedPackets; MIDIPacketList stackPacket; MIDIPacketList* packetToSend = &stackPacket; const size_t dataSize = (size_t) message.getRawDataSize(); @@ -436,16 +443,16 @@ MidiInput* MidiInput::openDevice (int index, MidiInputCallback* callback) { if (MIDIEndpointRef endPoint = MIDIGetSource ((ItemCount) index)) { - CFStringRef name; + ScopedCFString name; - if (CHECK_ERROR (MIDIObjectGetStringProperty (endPoint, kMIDIPropertyName, &name))) + if (CHECK_ERROR (MIDIObjectGetStringProperty (endPoint, kMIDIPropertyName, &name.cfString))) { if (MIDIClientRef client = getGlobalMidiClient()) { MIDIPortRef port; - ScopedPointer mpc (new MidiPortAndCallback (*callback)); + ScopedPointer mpc (new MidiPortAndCallback (*callback)); - if (CHECK_ERROR (MIDIInputPortCreate (client, name, midiInputProc, mpc, &port))) + if (CHECK_ERROR (MIDIInputPortCreate (client, name.cfString, midiInputProc, mpc, &port))) { if (CHECK_ERROR (MIDIPortConnectSource (port, endPoint, nullptr))) { @@ -465,8 +472,6 @@ MidiInput* MidiInput::openDevice (int index, MidiInputCallback* callback) } } } - - CFRelease (name); } } @@ -482,13 +487,14 @@ MidiInput* MidiInput::createNewDevice (const String& deviceName, MidiInputCallba if (MIDIClientRef client = getGlobalMidiClient()) { - ScopedPointer mpc (new MidiPortAndCallback (*callback)); + ScopedPointer mpc (new MidiPortAndCallback (*callback)); mpc->active = false; MIDIEndpointRef endPoint; - CFStringRef name = deviceName.toCFString(); + ScopedCFString name; + name.cfString = deviceName.toCFString(); - if (CHECK_ERROR (MIDIDestinationCreate (client, name, midiInputProc, mpc, &endPoint))) + if (CHECK_ERROR (MIDIDestinationCreate (client, name.cfString, midiInputProc, mpc, &endPoint))) { mpc->portAndEndpoint = new MidiPortAndEndpoint (0, endPoint); @@ -499,8 +505,6 @@ MidiInput* MidiInput::createNewDevice (const String& deviceName, MidiInputCallba const ScopedLock sl (callbackLock); activeCallbacks.add (mpc.release()); } - - CFRelease (name); } return mi; diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_ASIO.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_ASIO.cpp index b171bed..a44ce7d 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_ASIO.cpp +++ b/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_ASIO.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -123,9 +123,9 @@ struct ASIOSampleFormat { 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; + 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; } } @@ -141,9 +141,9 @@ struct ASIOSampleFormat { 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; + 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; } } @@ -300,7 +300,7 @@ private: //============================================================================== class ASIOAudioIODevice; -static ASIOAudioIODevice* volatile currentASIODev[3] = { 0 }; +static ASIOAudioIODevice* volatile currentASIODev[16] = { 0 }; extern HWND juce_messageWindowHandle; @@ -438,8 +438,6 @@ public: currentBlockSizeSamples = bufferSizeSamples; currentChansOut.clear(); currentChansIn.clear(); - inBuffers.clear (totalNumInputChans + 1); - outBuffers.clear (totalNumOutputChans + 1); updateSampleRates(); @@ -458,6 +456,13 @@ public: setSampleRate (sampleRate); + // (need to get this again in case a sample rate change affected the channel count) + err = asioObject->getChannels (&totalNumInputChans, &totalNumOutputChans); + jassert (err == ASE_OK); + + inBuffers.calloc (totalNumInputChans + 8); + outBuffers.calloc (totalNumOutputChans + 8); + if (needToReset) { JUCE_ASIO_LOG (" Resetting"); @@ -1320,7 +1325,7 @@ private: inputFormat[i].convertToFloat (infos[i].buffers[bi], inBuffers[i], samps); } - currentCallback->audioDeviceIOCallback (const_cast (inBuffers.getData()), numActiveInputChans, + currentCallback->audioDeviceIOCallback (const_cast (inBuffers.getData()), numActiveInputChans, outBuffers, numActiveOutputChans, samps); for (int i = 0; i < numActiveOutputChans; ++i) @@ -1340,6 +1345,29 @@ private: asioObject->outputReady(); } + long asioMessagesCallback (long selector, long value) + { + switch (selector) + { + case kAsioSelectorSupported: + if (value == kAsioResetRequest || value == kAsioEngineVersion || value == kAsioResyncRequest + || value == kAsioLatenciesChanged || value == kAsioSupportsInputMonitor) + return 1; + break; + + case kAsioBufferSizeChange: JUCE_ASIO_LOG ("kAsioBufferSizeChange"); resetRequest(); return 1; + case kAsioResetRequest: JUCE_ASIO_LOG ("kAsioResetRequest"); resetRequest(); return 1; + case kAsioResyncRequest: JUCE_ASIO_LOG ("kAsioResyncRequest"); resetRequest(); return 1; + case kAsioLatenciesChanged: JUCE_ASIO_LOG ("kAsioLatenciesChanged"); return 1; + case kAsioEngineVersion: return 2; + + case kAsioSupportsTimeInfo: + case kAsioSupportsTimeCode: return 0; + } + + return 0; + } + //============================================================================== template struct ASIOCallbackFunctions @@ -1360,56 +1388,43 @@ private: 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; + return currentASIODev[deviceIndex] != nullptr + ? currentASIODev[deviceIndex]->asioMessagesCallback (selector, value) + : 0; } static void JUCE_ASIOCALLBACK sampleRateChangedCallback (ASIOSampleRate) { - sendResetRequest (deviceIndex); + if (currentASIODev[deviceIndex] != nullptr) + currentASIODev[deviceIndex]->resetRequest(); } - static long sendResetRequest (int index) + static void setCallbacks (ASIOCallbacks& callbacks) noexcept { - if (currentASIODev[index] != nullptr) - currentASIODev[index]->resetRequest(); - - return 1; + callbacks.bufferSwitch = &bufferSwitchCallback; + callbacks.asioMessage = &asioMessagesCallback; + callbacks.bufferSwitchTimeInfo = &bufferSwitchTimeInfoCallback; + callbacks.sampleRateDidChange = &sampleRateChangedCallback; } - static void setCallbacks (ASIOCallbacks& callbacks) + static void setCallbacksForDevice (ASIOCallbacks& callbacks, ASIOAudioIODevice* device) noexcept { - callbacks.bufferSwitch = &bufferSwitchCallback; - callbacks.asioMessage = &asioMessagesCallback; - callbacks.bufferSwitchTimeInfo = &bufferSwitchTimeInfoCallback; - callbacks.sampleRateDidChange = &sampleRateChangedCallback; + if (currentASIODev[deviceIndex] == device) + setCallbacks (callbacks); + else + ASIOCallbackFunctions::setCallbacksForDevice (callbacks, device); } }; - void setCallbackFunctions() + template <> + struct ASIOCallbackFunctions + { + static void setCallbacksForDevice (ASIOCallbacks&, ASIOAudioIODevice*) noexcept {} + }; + + void setCallbackFunctions() noexcept { - 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; + ASIOCallbackFunctions<0>::setCallbacksForDevice (callbacks, this); } JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ASIOAudioIODevice) @@ -1503,15 +1518,16 @@ public: 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); + const String deviceName (outputDeviceName.isNotEmpty() ? outputDeviceName + : inputDeviceName); + const int index = deviceNames.indexOf (deviceName); if (index >= 0) { const int freeSlot = findFreeSlot(); if (freeSlot >= 0) - return new ASIOAudioIODevice (this, outputDeviceName, + return new ASIOAudioIODevice (this, deviceName, classIds.getReference (index), freeSlot); } diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDBurner.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDBurner.cpp index 3c3befb..03a3c32 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDBurner.cpp +++ b/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDBurner.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp index 064ca91..fe9076a 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp +++ b/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp index 88a5960..1491ab2 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp +++ b/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -640,7 +640,7 @@ public: DWORD dwsize1 = 0; DWORD dwsize2 = 0; - HRESULT hr = pInputBuffer->Lock ((DWORD) readOffset, (DWORD) bytesPerBuffer, + hr = pInputBuffer->Lock ((DWORD) readOffset, (DWORD) bytesPerBuffer, (void**) &buf1, &dwsize1, (void**) &buf2, &dwsize2, 0); @@ -753,9 +753,9 @@ public: String open (const BigInteger& inputChannels, const BigInteger& outputChannels, - double sampleRate, int bufferSizeSamples) override + double newSampleRate, int newBufferSize) override { - lastError = openDevice (inputChannels, outputChannels, sampleRate, bufferSizeSamples); + lastError = openDevice (inputChannels, outputChannels, newSampleRate, newBufferSize); isOpen_ = lastError.isEmpty(); return lastError; diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_Midi.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_Midi.cpp index 2737b1e..75069ab 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_Midi.cpp +++ b/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_Midi.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -143,37 +143,37 @@ private: public: MidiHeader() {} - void prepare (HMIDIIN deviceHandle) + void prepare (HMIDIIN device) { zerostruct (hdr); hdr.lpData = data; hdr.dwBufferLength = (DWORD) numElementsInArray (data); - midiInPrepareHeader (deviceHandle, &hdr, sizeof (hdr)); + midiInPrepareHeader (device, &hdr, sizeof (hdr)); } - void unprepare (HMIDIIN deviceHandle) + void unprepare (HMIDIIN device) { if ((hdr.dwFlags & WHDR_DONE) != 0) { int c = 10; - while (--c >= 0 && midiInUnprepareHeader (deviceHandle, &hdr, sizeof (hdr)) == MIDIERR_STILLPLAYING) + while (--c >= 0 && midiInUnprepareHeader (device, &hdr, sizeof (hdr)) == MIDIERR_STILLPLAYING) Thread::sleep (20); jassert (c >= 0); } } - void write (HMIDIIN deviceHandle) + void write (HMIDIIN device) { hdr.dwBytesRecorded = 0; - midiInAddBuffer (deviceHandle, &hdr, sizeof (hdr)); + midiInAddBuffer (device, &hdr, sizeof (hdr)); } - void writeIfFinished (HMIDIIN deviceHandle) + void writeIfFinished (HMIDIIN device) { if ((hdr.dwFlags & WHDR_DONE) != 0) - write (deviceHandle); + write (device); } private: diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp index 0ef7811..1b2a4ad 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp +++ b/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -45,6 +45,7 @@ void logFailure (HRESULT hr) { case E_POINTER: m = "E_POINTER"; break; case E_INVALIDARG: m = "E_INVALIDARG"; break; + case E_NOINTERFACE: m = "E_NOINTERFACE"; break; #define JUCE_WASAPI_ERR(desc, n) \ case MAKE_HRESULT(1, 0x889, n): m = #desc; break; @@ -126,7 +127,11 @@ enum EDataFlow eAll = (eCapture + 1) }; -enum { DEVICE_STATE_ACTIVE = 1 }; +enum +{ + DEVICE_STATE_ACTIVE = 1, + AUDCLNT_BUFFERFLAGS_SILENT = 2 +}; JUCE_IUNKNOWNCLASS (IPropertyStore, "886d8eeb-8cf2-4446-8d02-cdba1dbdcf99") { @@ -328,6 +333,11 @@ int refTimeToSamples (const REFERENCE_TIME& t, const double sampleRate) noexcept return roundToInt (sampleRate * ((double) t) * 0.0000001); } +REFERENCE_TIME samplesToRefTime (const int numSamples, const double sampleRate) noexcept +{ + return (REFERENCE_TIME) ((numSamples * 10000.0 * 1000.0 / sampleRate) + 0.5); +} + void copyWavFormat (WAVEFORMATEXTENSIBLE& dest, const WAVEFORMATEX* const src) noexcept { memcpy (&dest, src, src->wFormatTag == WAVE_FORMAT_EXTENSIBLE ? sizeof (WAVEFORMATEXTENSIBLE) @@ -348,9 +358,12 @@ public: defaultBufferSize (0), latencySamples (0), useExclusiveMode (exclusiveMode), + actualBufferSize (0), + bytesPerSample (0), + bytesPerFrame (0), sampleRateHasChanged (false) { - clientEvent = CreateEvent (0, false, false, _T("JuceWASAPI")); + clientEvent = CreateEvent (nullptr, false, false, nullptr); ComSmartPtr tempClient (createClient()); if (tempClient == nullptr) @@ -376,16 +389,24 @@ public: rates.addUsingDefaultSort (defaultSampleRate); - static const int ratesToTest[] = { 44100, 48000, 88200, 96000, 176400, 192000 }; + if (useExclusiveMode + && findSupportedFormat (tempClient, defaultSampleRate, format.dwChannelMask, format)) + { + // Got a format that is supported by the device so we can ask what sample rates are supported (in whatever format) + } + + static const int ratesToTest[] = { 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000 }; for (int i = 0; i < numElementsInArray (ratesToTest); ++i) { - if (ratesToTest[i] == defaultSampleRate) + if (rates.contains (ratesToTest[i])) continue; - format.Format.nSamplesPerSec = (DWORD) ratesToTest[i]; + format.Format.nSamplesPerSec = (DWORD) ratesToTest[i]; + format.Format.nAvgBytesPerSec = (DWORD) (format.Format.nSamplesPerSec * format.Format.nChannels * format.Format.wBitsPerSample / 8); - if (SUCCEEDED (tempClient->IsFormatSupported (useExclusiveMode ? AUDCLNT_SHAREMODE_EXCLUSIVE : AUDCLNT_SHAREMODE_SHARED, + if (SUCCEEDED (tempClient->IsFormatSupported (useExclusiveMode ? AUDCLNT_SHAREMODE_EXCLUSIVE + : AUDCLNT_SHAREMODE_SHARED, (WAVEFORMATEX*) &format, 0))) if (! rates.contains (ratesToTest[i])) rates.addUsingDefaultSort (ratesToTest[i]); @@ -400,7 +421,7 @@ public: bool isOk() const noexcept { return defaultBufferSize > 0 && defaultSampleRate > 0; } - bool openClient (const double newSampleRate, const BigInteger& newChannels) + bool openClient (const double newSampleRate, const BigInteger& newChannels, const int bufferSizeSamples) { sampleRate = newSampleRate; channels = newChannels; @@ -413,8 +434,7 @@ public: client = createClient(); if (client != nullptr - && (tryInitialisingWithFormat (true, 4) || tryInitialisingWithFormat (false, 4) - || tryInitialisingWithFormat (false, 3) || tryInitialisingWithFormat (false, 2))) + && tryInitialisingWithBufferSize (bufferSizeSamples)) { sampleRateHasChanged = false; @@ -465,7 +485,7 @@ public: BigInteger channels; Array channelMaps; UINT32 actualBufferSize; - int bytesPerSample; + int bytesPerSample, bytesPerFrame; bool sampleRateHasChanged; virtual void updateFormat (bool isFloat) = 0; @@ -527,21 +547,28 @@ private: //============================================================================== ComSmartPtr createClient() { - ComSmartPtr client; + ComSmartPtr newClient; if (device != nullptr) logFailure (device->Activate (__uuidof (IAudioClient), CLSCTX_INPROC_SERVER, - nullptr, (void**) client.resetAndGetPointerAddress())); + nullptr, (void**) newClient.resetAndGetPointerAddress())); - return client; + return newClient; } - bool tryInitialisingWithFormat (const bool useFloat, const int bytesPerSampleToTry) + struct AudioSampleFormat + { + bool useFloat; + int bitsPerSampleToTry; + int bytesPerSampleContainer; + }; + + bool tryFormat (const AudioSampleFormat sampleFormat, IAudioClient* clientToUse, double newSampleRate, + DWORD newMixFormatChannelMask, WAVEFORMATEXTENSIBLE& format) const { - WAVEFORMATEXTENSIBLE format; zerostruct (format); - if (numChannels <= 2 && bytesPerSampleToTry <= 2) + if (numChannels <= 2 && sampleFormat.bitsPerSampleToTry <= 16) { format.Format.wFormatTag = WAVE_FORMAT_PCM; } @@ -551,47 +578,99 @@ private: format.Format.cbSize = sizeof (WAVEFORMATEXTENSIBLE) - sizeof (WAVEFORMATEX); } - format.Format.nSamplesPerSec = (DWORD) sampleRate; + format.Format.nSamplesPerSec = (DWORD) newSampleRate; 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; + format.Format.wBitsPerSample = (WORD) (8 * sampleFormat.bytesPerSampleContainer); + format.Samples.wValidBitsPerSample = (WORD) (sampleFormat.bitsPerSampleToTry); + format.Format.nBlockAlign = (WORD) (format.Format.nChannels * format.Format.wBitsPerSample / 8); + format.Format.nAvgBytesPerSec = (DWORD) (format.Format.nSamplesPerSec * format.Format.nBlockAlign); + format.SubFormat = sampleFormat.useFloat ? KSDATAFORMAT_SUBTYPE_IEEE_FLOAT : KSDATAFORMAT_SUBTYPE_PCM; + format.dwChannelMask = newMixFormatChannelMask; WAVEFORMATEXTENSIBLE* nearestFormat = nullptr; - HRESULT hr = client->IsFormatSupported (useExclusiveMode ? AUDCLNT_SHAREMODE_EXCLUSIVE - : AUDCLNT_SHAREMODE_SHARED, - (WAVEFORMATEX*) &format, - useExclusiveMode ? nullptr : (WAVEFORMATEX**) &nearestFormat); + HRESULT hr = clientToUse->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); + copyWavFormat (format, (const WAVEFORMATEX*) nearestFormat); hr = S_OK; } CoTaskMemFree (nearestFormat); + return check (hr); + } - REFERENCE_TIME defaultPeriod = 0, minPeriod = 0; - if (useExclusiveMode) - check (client->GetDevicePeriod (&defaultPeriod, &minPeriod)); + bool findSupportedFormat (IAudioClient* clientToUse, double newSampleRate, + DWORD newMixFormatChannelMask, WAVEFORMATEXTENSIBLE& format) const + { + static const AudioSampleFormat formats[] = + { + { true, 32, 4 }, + { false, 32, 4 }, + { false, 24, 4 }, + { false, 24, 3 }, + { false, 20, 4 }, + { false, 20, 3 }, + { false, 16, 2 } + }; + + for (int i = 0; i < numElementsInArray (formats); ++i) + if (tryFormat (formats[i], clientToUse, newSampleRate, newMixFormatChannelMask, format)) + return true; + + return false; + } - 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))) + bool tryInitialisingWithBufferSize (const int bufferSizeSamples) + { + WAVEFORMATEXTENSIBLE format; + + if (findSupportedFormat (client, sampleRate, mixFormatChannelMask, format)) { - actualNumChannels = format.Format.nChannels; - const bool isFloat = format.Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE && format.SubFormat == KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; - bytesPerSample = format.Format.wBitsPerSample / 8; + REFERENCE_TIME defaultPeriod = 0, minPeriod = 0; - updateFormat (isFloat); - return true; + check (client->GetDevicePeriod (&defaultPeriod, &minPeriod)); + + if (useExclusiveMode && bufferSizeSamples > 0) + defaultPeriod = jmax (minPeriod, samplesToRefTime (bufferSizeSamples, format.Format.nSamplesPerSec)); + + for (;;) + { + GUID session; + HRESULT hr = client->Initialize (useExclusiveMode ? AUDCLNT_SHAREMODE_EXCLUSIVE : AUDCLNT_SHAREMODE_SHARED, + 0x40000 /*AUDCLNT_STREAMFLAGS_EVENTCALLBACK*/, + defaultPeriod, useExclusiveMode ? defaultPeriod : 0, (WAVEFORMATEX*) &format, &session); + + if (check (hr)) + { + actualNumChannels = format.Format.nChannels; + const bool isFloat = format.Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE && format.SubFormat == KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; + bytesPerSample = format.Format.wBitsPerSample / 8; + bytesPerFrame = format.Format.nBlockAlign; + + updateFormat (isFloat); + return true; + } + + // Handle the "alignment dance" : http://msdn.microsoft.com/en-us/library/windows/desktop/dd370875(v=vs.85).aspx (see Remarks) + if (hr != MAKE_HRESULT (1, 0x889, 0x19)) // AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED + break; + + UINT32 numFrames = 0; + if (! check (client->GetBufferSize (&numFrames))) + break; + + // Recreate client + client = nullptr; + client = createClient(); + + defaultPeriod = samplesToRefTime (numFrames, format.Format.nSamplesPerSec); + } } return false; @@ -615,12 +694,9 @@ public: close(); } - bool open (const double newSampleRate, const BigInteger& newChannels) + bool open (const double newSampleRate, const BigInteger& newChannels, int bufferSizeSamples) { - reservoirSize = 0; - reservoirCapacity = 16384; - reservoir.setSize (actualNumChannels * reservoirCapacity * sizeof (float)); - return openClient (newSampleRate, newChannels) + return openClient (newSampleRate, newChannels, bufferSizeSamples) && (numChannels == 0 || check (client->GetService (__uuidof (IAudioCaptureClient), (void**) captureClient.resetAndGetPointerAddress()))); } @@ -630,88 +706,129 @@ public: closeClient(); captureClient = nullptr; reservoir.reset(); + reservoirReadPos = reservoirWritePos = 0; } template - void updateFormatWithType (SourceType*) + void updateFormatWithType (SourceType*) noexcept { typedef AudioData::Pointer NativeType; converter = new AudioData::ConverterInstance, NativeType> (actualNumChannels, 1); } - void updateFormat (bool isFloat) + void updateFormat (bool isFloat) override + { + if (isFloat) updateFormatWithType ((AudioData::Float32*) nullptr); + else if (bytesPerSample == 4) updateFormatWithType ((AudioData::Int32*) nullptr); + else if (bytesPerSample == 3) updateFormatWithType ((AudioData::Int24*) nullptr); + else updateFormatWithType ((AudioData::Int16*) nullptr); + } + + bool start (const int userBufferSize) + { + reservoirSize = actualBufferSize + userBufferSize; + reservoirMask = nextPowerOfTwo (reservoirSize) - 1; + reservoir.setSize ((reservoirMask + 1) * bytesPerFrame, true); + reservoirReadPos = reservoirWritePos = 0; + + if (! check (client->Start())) + return false; + + purgeInputBuffers(); + return true; + } + + void purgeInputBuffers() { - 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); + uint8* inputData; + UINT32 numSamplesAvailable; + DWORD flags; + + while (captureClient->GetBuffer (&inputData, &numSamplesAvailable, &flags, nullptr, nullptr) + != MAKE_HRESULT (0, 0x889, 0x1) /* AUDCLNT_S_BUFFER_EMPTY */) + captureClient->ReleaseBuffer (numSamplesAvailable); } - void copyBuffers (float** destBuffers, int numDestBuffers, int bufferSize, Thread& thread) + int getNumSamplesInReservoir() const noexcept { return reservoirWritePos - reservoirReadPos; } + + void handleDeviceBuffer() { if (numChannels <= 0) return; - int offset = 0; + uint8* inputData; + UINT32 numSamplesAvailable; + DWORD flags; - while (bufferSize > 0) + while (check (captureClient->GetBuffer (&inputData, &numSamplesAvailable, &flags, nullptr, nullptr)) && numSamplesAvailable > 0) { - if (reservoirSize > 0) // There's stuff in the reservoir, so use that... + int samplesLeft = (int) numSamplesAvailable; + + while (samplesLeft > 0) { - const int samplesToDo = jmin (bufferSize, (int) reservoirSize); + const int localWrite = reservoirWritePos & reservoirMask; + const int samplesToDo = jmin (samplesLeft, reservoirMask + 1 - localWrite); + const int samplesToDoBytes = samplesToDo * bytesPerFrame; - for (int i = 0; i < numDestBuffers; ++i) - converter->convertSamples (destBuffers[i] + offset, 0, reservoir.getData(), channelMaps.getUnchecked(i), samplesToDo); + void* reservoirPtr = addBytesToPointer (reservoir.getData(), localWrite * bytesPerFrame); - bufferSize -= samplesToDo; - offset += samplesToDo; - reservoirSize = 0; + if ((flags & AUDCLNT_BUFFERFLAGS_SILENT) != 0) + zeromem (reservoirPtr, samplesToDoBytes); + else + memcpy (reservoirPtr, inputData, samplesToDoBytes); + + reservoirWritePos += samplesToDo; + inputData += samplesToDoBytes; + samplesLeft -= samplesToDo; } - else - { - UINT32 packetLength = 0; - if (! check (captureClient->GetNextPacketSize (&packetLength))) - break; - if (packetLength == 0) - { - if (thread.threadShouldExit() - || WaitForSingleObject (clientEvent, 1000) == WAIT_TIMEOUT) - break; + if (getNumSamplesInReservoir() > reservoirSize) + reservoirReadPos = reservoirWritePos - reservoirSize; - continue; - } + captureClient->ReleaseBuffer (numSamplesAvailable); + } + } - uint8* inputData; - UINT32 numSamplesAvailable; - DWORD flags; + void copyBuffersFromReservoir (float** destBuffers, int numDestBuffers, int bufferSize) + { + if ((numChannels <= 0 && bufferSize == 0) || reservoir.getSize() == 0) + return; - if (check (captureClient->GetBuffer (&inputData, &numSamplesAvailable, &flags, 0, 0))) - { - const int samplesToDo = jmin (bufferSize, (int) numSamplesAvailable); + int offset = jmax (0, bufferSize - getNumSamplesInReservoir()); - for (int i = 0; i < numDestBuffers; ++i) - converter->convertSamples (destBuffers[i] + offset, 0, inputData, channelMaps.getUnchecked(i), samplesToDo); + if (offset > 0) + { + for (int i = 0; i < numDestBuffers; ++i) + zeromem (destBuffers[i], offset * sizeof (float)); - bufferSize -= samplesToDo; - offset += samplesToDo; + bufferSize -= offset; + reservoirReadPos -= offset / 2; + } - if (samplesToDo < (int) numSamplesAvailable) - { - reservoirSize = jmin ((int) (numSamplesAvailable - samplesToDo), reservoirCapacity); - memcpy ((uint8*) reservoir.getData(), inputData + bytesPerSample * actualNumChannels * samplesToDo, - (size_t) (bytesPerSample * actualNumChannels * reservoirSize)); - } + while (bufferSize > 0) + { + const int localRead = reservoirReadPos & reservoirMask; - captureClient->ReleaseBuffer (numSamplesAvailable); - } - } + const int samplesToDo = jmin (bufferSize, getNumSamplesInReservoir(), reservoirMask + 1 - localRead); + if (samplesToDo <= 0) + break; + + const int reservoirOffset = localRead * bytesPerFrame; + + for (int i = 0; i < numDestBuffers; ++i) + converter->convertSamples (destBuffers[i] + offset, 0, addBytesToPointer (reservoir.getData(), reservoirOffset), channelMaps.getUnchecked(i), samplesToDo); + + bufferSize -= samplesToDo; + offset += samplesToDo; + reservoirReadPos += samplesToDo; } } ComSmartPtr captureClient; MemoryBlock reservoir; - int reservoirSize, reservoirCapacity; + int reservoirSize, reservoirMask; + volatile int reservoirReadPos, reservoirWritePos; + ScopedPointer converter; private: @@ -732,10 +849,11 @@ public: close(); } - bool open (const double newSampleRate, const BigInteger& newChannels) + bool open (const double newSampleRate, const BigInteger& newChannels, int bufferSizeSamples) { - return openClient (newSampleRate, newChannels) - && (numChannels == 0 || check (client->GetService (__uuidof (IAudioRenderClient), (void**) renderClient.resetAndGetPointerAddress()))); + return openClient (newSampleRate, newChannels, bufferSizeSamples) + && (numChannels == 0 || check (client->GetService (__uuidof (IAudioRenderClient), + (void**) renderClient.resetAndGetPointerAddress()))); } void close() @@ -751,15 +869,42 @@ public: converter = new AudioData::ConverterInstance > (1, actualNumChannels); } - void updateFormat (bool isFloat) + void updateFormat (bool isFloat) override + { + if (isFloat) updateFormatWithType ((AudioData::Float32*) nullptr); + else if (bytesPerSample == 4) updateFormatWithType ((AudioData::Int32*) nullptr); + else if (bytesPerSample == 3) updateFormatWithType ((AudioData::Int24*) nullptr); + else updateFormatWithType ((AudioData::Int16*) nullptr); + } + + bool start() { - 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); + int samplesToDo = getNumSamplesAvailableToCopy(); + uint8* outputData; + + if (check (renderClient->GetBuffer (samplesToDo, &outputData))) + renderClient->ReleaseBuffer (samplesToDo, AUDCLNT_BUFFERFLAGS_SILENT); + + return check (client->Start()); + } + + int getNumSamplesAvailableToCopy() const + { + if (numChannels <= 0) + return 0; + + if (! useExclusiveMode) + { + UINT32 padding = 0; + if (check (client->GetCurrentPadding (&padding))) + return actualBufferSize - (int) padding; + } + + return actualBufferSize; } - void copyBuffers (const float** const srcBuffers, const int numSrcBuffers, int bufferSize, Thread& thread) + void copyBuffers (const float** const srcBuffers, const int numSrcBuffers, int bufferSize, + WASAPIInputDevice* inputDevice, Thread& thread) { if (numChannels <= 0) return; @@ -768,22 +913,25 @@ public: while (bufferSize > 0) { - UINT32 padding = 0; - if (! check (client->GetCurrentPadding (&padding))) - return; + // This is needed in order not to drop any input data if the output device endpoint buffer was full + if ((! useExclusiveMode) && inputDevice != nullptr + && WaitForSingleObject (inputDevice->clientEvent, 0) == WAIT_OBJECT_0) + inputDevice->handleDeviceBuffer(); - int samplesToDo = useExclusiveMode ? bufferSize - : jmin ((int) (actualBufferSize - padding), bufferSize); + int samplesToDo = jmin (getNumSamplesAvailableToCopy(), bufferSize); - if (samplesToDo <= 0) + if (samplesToDo == 0) { - if (thread.threadShouldExit() - || WaitForSingleObject (clientEvent, 1000) == WAIT_TIMEOUT) - break; + // This can ONLY occur in non-exclusive mode + if (! thread.threadShouldExit() && WaitForSingleObject (clientEvent, 1000) == WAIT_OBJECT_0) + continue; - continue; + break; } + if (useExclusiveMode && WaitForSingleObject (clientEvent, 1000) == WAIT_TIMEOUT) + break; + uint8* outputData = nullptr; if (check (renderClient->GetBuffer ((UINT32) samplesToDo, &outputData))) { @@ -791,10 +939,10 @@ public: converter->convertSamples (outputData, channelMaps.getUnchecked(i), srcBuffers[i] + offset, 0, samplesToDo); renderClient->ReleaseBuffer ((UINT32) samplesToDo, 0); - - offset += samplesToDo; - bufferSize -= samplesToDo; } + + bufferSize -= samplesToDo; + offset += samplesToDo; } } @@ -812,13 +960,14 @@ class WASAPIAudioIODevice : public AudioIODevice, { public: WASAPIAudioIODevice (const String& deviceName, - const String& outputDeviceId_, - const String& inputDeviceId_, + const String& typeName, + const String& outputDeviceID, + const String& inputDeviceID, const bool exclusiveMode) - : AudioIODevice (deviceName, "Windows Audio"), + : AudioIODevice (deviceName, typeName), Thread ("Juce WASAPI"), - outputDeviceId (outputDeviceId_), - inputDeviceId (inputDeviceId_), + outputDeviceId (outputDeviceID), + inputDeviceId (inputDeviceID), useExclusiveMode (exclusiveMode), isOpen_ (false), isStarted (false), @@ -932,19 +1081,33 @@ public: lastKnownInputChannels = inputChannels; lastKnownOutputChannels = outputChannels; - if (inputDevice != nullptr && ! inputDevice->open (currentSampleRate, inputChannels)) + if (inputDevice != nullptr && ! inputDevice->open (currentSampleRate, inputChannels, bufferSizeSamples)) { lastError = TRANS("Couldn't open the input device!"); return lastError; } - if (outputDevice != nullptr && ! outputDevice->open (currentSampleRate, outputChannels)) + if (outputDevice != nullptr && ! outputDevice->open (currentSampleRate, outputChannels, bufferSizeSamples)) { close(); lastError = TRANS("Couldn't open the output device!"); return lastError; } + if (useExclusiveMode) + { + // This is to make sure that the callback uses actualBufferSize in case of exclusive mode + if (inputDevice != nullptr && outputDevice != nullptr && inputDevice->actualBufferSize != outputDevice->actualBufferSize) + { + close(); + lastError = TRANS("Couldn't open the output device (buffer size mismatch)"); + return lastError; + } + + currentBufferSizeSamples = outputDevice != nullptr ? outputDevice->actualBufferSize + : inputDevice->actualBufferSize; + } + if (inputDevice != nullptr) ResetEvent (inputDevice->clientEvent); if (outputDevice != nullptr) ResetEvent (outputDevice->clientEvent); @@ -955,7 +1118,7 @@ public: { latencyIn = (int) (inputDevice->latencySamples + currentBufferSizeSamples); - if (! check (inputDevice->client->Start())) + if (! inputDevice->start (currentBufferSizeSamples)) { close(); lastError = TRANS("Couldn't start the input device!"); @@ -967,7 +1130,7 @@ public: { latencyOut = (int) (outputDevice->latencySamples + currentBufferSizeSamples); - if (! check (outputDevice->client->Start())) + if (! outputDevice->start()) { close(); lastError = TRANS("Couldn't start the output device!"); @@ -1056,34 +1219,48 @@ public: const int bufferSize = currentBufferSizeSamples; const int numInputBuffers = getActiveInputChannels().countNumberOfSetBits(); const int numOutputBuffers = getActiveOutputChannels().countNumberOfSetBits(); - bool sampleRateChanged = false; + bool sampleRateHasChanged = 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(); + outs.clear(); while (! threadShouldExit()) { if (inputDevice != nullptr) { - inputDevice->copyBuffers (inputBuffers, numInputBuffers, bufferSize, *this); + if (outputDevice == nullptr) + { + if (WaitForSingleObject (inputDevice->clientEvent, 1000) == WAIT_TIMEOUT) + break; - if (threadShouldExit()) - break; + inputDevice->handleDeviceBuffer(); + + if (inputDevice->getNumSamplesInReservoir() < bufferSize) + continue; + } + else + { + if (useExclusiveMode && WaitForSingleObject (inputDevice->clientEvent, 0) == WAIT_OBJECT_0) + inputDevice->handleDeviceBuffer(); + } + + inputDevice->copyBuffersFromReservoir (inputBuffers, numInputBuffers, bufferSize); if (inputDevice->sampleRateHasChanged) { - sampleRateChanged = true; + sampleRateHasChanged = true; sampleRateChangedByOutput = false; } } { - const ScopedLock sl (startStopLock); + const ScopedTryLock sl (startStopLock); - if (isStarted) + if (sl.isLocked() && isStarted) callback->audioDeviceIOCallback (const_cast (inputBuffers), numInputBuffers, outputBuffers, numOutputBuffers, bufferSize); else @@ -1092,16 +1269,18 @@ public: if (outputDevice != nullptr) { - outputDevice->copyBuffers (const_cast (outputBuffers), numOutputBuffers, bufferSize, *this); + // Note that this function is handed the input device so it can check for the event and make sure + // the input reservoir is filled up correctly even when bufferSize > device actualBufferSize + outputDevice->copyBuffers (const_cast (outputBuffers), numOutputBuffers, bufferSize, inputDevice, *this); if (outputDevice->sampleRateHasChanged) { - sampleRateChanged = true; + sampleRateHasChanged = true; sampleRateChangedByOutput = true; } } - if (sampleRateChanged) + if (sampleRateHasChanged) { triggerAsyncUpdate(); break; // Quit the thread... will restart it later! @@ -1208,9 +1387,10 @@ class WASAPIAudioIODeviceType : public AudioIODeviceType, private DeviceChangeDetector { public: - WASAPIAudioIODeviceType() - : AudioIODeviceType ("Windows Audio"), + WASAPIAudioIODeviceType (bool exclusive) + : AudioIODeviceType (exclusive ? "Windows Audio (Exclusive Mode)" : "Windows Audio"), DeviceChangeDetector (L"Windows Audio"), + exclusiveMode (exclusive), hasScanned (false) { } @@ -1267,7 +1447,6 @@ public: { jassert (hasScanned); // need to call scanForDevices() before doing this - const bool useExclusiveMode = false; ScopedPointer device; const int outputIndex = outputDeviceNames.indexOf (outputDeviceName); @@ -1277,9 +1456,10 @@ public: { device = new WASAPIAudioIODevice (outputDeviceName.isNotEmpty() ? outputDeviceName : inputDeviceName, + getTypeName(), outputDeviceIds [outputIndex], inputDeviceIds [inputIndex], - useExclusiveMode); + exclusiveMode); if (! device->initialise()) device = nullptr; @@ -1293,7 +1473,7 @@ public: StringArray inputDeviceNames, inputDeviceIds; private: - bool hasScanned; + bool exclusiveMode, hasScanned; ComSmartPtr enumerator; //============================================================================== @@ -1343,10 +1523,10 @@ private: } //============================================================================== - void scan (StringArray& outputDeviceNames, - StringArray& inputDeviceNames, - StringArray& outputDeviceIds, - StringArray& inputDeviceIds) + void scan (StringArray& outDeviceNames, + StringArray& inDeviceNames, + StringArray& outDeviceIds, + StringArray& inDeviceIds) { if (enumerator == nullptr) { @@ -1402,19 +1582,19 @@ private: if (flow == eRender) { const int index = (deviceId == defaultRenderer) ? 0 : -1; - outputDeviceIds.insert (index, deviceId); - outputDeviceNames.insert (index, name); + outDeviceIds.insert (index, deviceId); + outDeviceNames.insert (index, name); } else if (flow == eCapture) { const int index = (deviceId == defaultCapture) ? 0 : -1; - inputDeviceIds.insert (index, deviceId); - inputDeviceNames.insert (index, name); + inDeviceIds.insert (index, deviceId); + inDeviceNames.insert (index, name); } } - inputDeviceNames.appendNumbersToDuplicates (false, false); - outputDeviceNames.appendNumbersToDuplicates (false, false); + inDeviceNames.appendNumbersToDuplicates (false, false); + outDeviceNames.appendNumbersToDuplicates (false, false); } //============================================================================== @@ -1493,12 +1673,16 @@ struct MMDeviceMasterVolume } //============================================================================== -AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_WASAPI() +AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_WASAPI (bool exclusiveMode) { - if (SystemStats::getOperatingSystemType() >= SystemStats::WinVista) - return new WasapiClasses::WASAPIAudioIODeviceType(); + #if ! JUCE_WASAPI_EXCLUSIVE + if (exclusiveMode) + return nullptr; + #endif - return nullptr; + return SystemStats::getOperatingSystemType() >= SystemStats::WinVista + ? new WasapiClasses::WASAPIAudioIODeviceType (exclusiveMode) + : nullptr; } //============================================================================== diff --git a/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp b/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp index c351795..2e231d7 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp +++ b/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h b/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h index 0a3751c..02e4449 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h +++ b/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp b/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp index feb58a9..9e013ef 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp +++ b/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.h b/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.h index e60dee0..d964d92 100644 --- a/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.h +++ b/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/all.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/all.h index cc01e05..c7f3032 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/all.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/all.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/alloc.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/alloc.h index 83595ac..3aab81c 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/alloc.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/alloc.h @@ -1,6 +1,6 @@ /* alloc - Convenience routines for safely allocating memory * Copyright (C) 2007-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -33,7 +33,7 @@ #ifndef FLAC__SHARE__ALLOC_H #define FLAC__SHARE__ALLOC_H -#if HAVE_CONFIG_H +#ifdef HAVE_CONFIG_H # include #endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/assert.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/assert.h index fab30f7..f02aeac 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/assert.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/assert.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/callback.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/callback.h index 5f58552..9928843 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/callback.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/callback.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2004-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/compat.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/compat.h index 6c436cc..a3dc7c7 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/compat.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/compat.h @@ -1,5 +1,5 @@ /* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2012 Xiph.org Foundation + * Copyright (C) 2012-2014 Xiph.org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -73,23 +73,25 @@ #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 +#if defined __INTEL_COMPILER || (defined _MSC_VER && defined _WIN64) +/* MSVS generates VERY slow 32-bit code with __restrict */ +#define flac_restrict __restrict +#elif defined __GNUC__ +#define flac_restrict __restrict__ #else -#define FLAC__U64L(x) x##LLU +#define flac_restrict #endif +#define FLAC__U64L(x) x##ULL + #if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__ +#define FLAC__STRCASECMP stricmp #define FLAC__STRNCASECMP strnicmp #else +#define FLAC__STRCASECMP strcasecmp #define FLAC__STRNCASECMP strncasecmp #endif @@ -139,6 +141,7 @@ #ifdef _WIN32 /* All char* strings are in UTF-8 format. Added to support Unicode files on Windows */ +#include "win_utf8_io.h" #define flac_printf printf_utf8 #define flac_fprintf fprintf_utf8 @@ -160,12 +163,7 @@ #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 @@ -177,8 +175,14 @@ #define flac_fstat fstat #endif +#ifndef M_LN2 +#define M_LN2 0.69314718055994530942 +#endif +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif -/* FLAC needs to compile and work correctly on systems with a norrmal ISO C99 +/* FLAC needs to compile and work correctly on systems with a normal ISO C99 * snprintf as well as Microsoft Visual Studio which has an non-standards * conformant snprint_s function. * @@ -188,6 +192,7 @@ extern "C" { #endif int flac_snprintf(char *str, size_t size, const char *fmt, ...); +int flac_vsnprintf(char *str, size_t size, const char *fmt, va_list va); #ifdef __cplusplus }; #endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/endswap.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/endswap.h index 2e09404..b2a7e85 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/endswap.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/endswap.h @@ -1,5 +1,5 @@ /* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2012 Xiph.org Foundation + * Copyright (C) 2012-2014 Xiph.org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -33,20 +33,46 @@ #if HAVE_BSWAP32 /* GCC and Clang */ +/* GCC prior to 4.8 didn't provide bswap16 on x86_64 */ +#if ! HAVE_BSWAP16 +static inline unsigned short __builtin_bswap16(unsigned short a) +{ + return (a<<8)|(a>>8); +} +#endif + +#define ENDSWAP_16(x) (__builtin_bswap16 (x)) #define ENDSWAP_32(x) (__builtin_bswap32 (x)) #elif defined _MSC_VER /* Windows. Apparently in . */ +#define ENDSWAP_16(x) (_byteswap_ushort (x)) #define ENDSWAP_32(x) (_byteswap_ulong (x)) #elif defined HAVE_BYTESWAP_H /* Linux */ #include +#define ENDSWAP_16(x) (bswap_16 (x)) #define ENDSWAP_32(x) (bswap_32 (x)) #else -#define ENDSWAP_32(x) ((((x) >> 24) & 0xFF) + (((x) >> 8) & 0xFF00) + (((x) & 0xFF00) << 8) + (((x) & 0xFF) << 24)) +#define ENDSWAP_16(x) ((((x) >> 8) & 0xFF) | (((x) & 0xFF) << 8)) +#define ENDSWAP_32(x) ((((x) >> 24) & 0xFF) | (((x) >> 8) & 0xFF00) | (((x) & 0xFF00) << 8) | (((x) & 0xFF) << 24)) + +#endif + + +/* Host to little-endian byte swapping. */ +#if CPU_IS_BIG_ENDIAN + +#define H2LE_16(x) ENDSWAP_16 (x) +#define H2LE_32(x) ENDSWAP_32 (x) + +#else + +#define H2LE_16(x) (x) +#define H2LE_32(x) (x) #endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/export.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/export.h index d7ca735..30f018b 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/export.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/export.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -61,9 +61,9 @@ #elif defined(_MSC_VER) #ifdef FLAC_API_EXPORTS -#define FLAC_API _declspec(dllexport) +#define FLAC_API __declspec(dllexport) #else -#define FLAC_API _declspec(dllimport) +#define FLAC_API __declspec(dllimport) #endif #elif defined(FLAC__USE_VISIBILITY_ATTR) diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/format.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/format.h index ecebe80..a151b67 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/format.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/format.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -509,9 +509,11 @@ typedef enum { FLAC__METADATA_TYPE_PICTURE = 6, /**< PICTURE block */ - FLAC__METADATA_TYPE_UNDEFINED = 7 + FLAC__METADATA_TYPE_UNDEFINED = 7, /**< marker to denote beginning of undefined type range; this number will increase as new metadata types are added */ + FLAC__MAX_METADATA_TYPE = FLAC__MAX_METADATA_TYPE_CODE, + /**< No type will ever be greater than this. There is not enough room in the protocol block. */ } FLAC__MetadataType; /** Maps a FLAC__MetadataType to a C string. diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c index 3ea040e..e011f84 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -30,12 +30,11 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if HAVE_CONFIG_H +#ifdef HAVE_CONFIG_H # include #endif #include "include/private/bitmath.h" -#include "../assert.h" /* An example of what FLAC__bitmath_silog2() computes: * diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c index 3fc7e1d..a4632e3 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -30,7 +30,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if HAVE_CONFIG_H +#ifdef HAVE_CONFIG_H # include #endif @@ -73,7 +73,6 @@ */ 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 */ @@ -87,7 +86,6 @@ struct FLAC__BitReader { 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) @@ -119,8 +117,7 @@ static inline void crc16_update_word_(FLAC__BitReader *br, uint32_t word) 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) +static FLAC__bool bitreader_read_from_client_(FLAC__BitReader *br) { unsigned start, end; size_t bytes; @@ -231,7 +228,7 @@ void FLAC__bitreader_delete(FLAC__BitReader *br) * ***********************************************************************/ -FLAC__bool FLAC__bitreader_init(FLAC__BitReader *br, FLAC__CPUInfo cpu, FLAC__BitReaderReadCallback rcb, void *cd) +FLAC__bool FLAC__bitreader_init(FLAC__BitReader *br, FLAC__BitReaderReadCallback rcb, void *cd) { FLAC__ASSERT(0 != br); @@ -243,7 +240,6 @@ FLAC__bool FLAC__bitreader_init(FLAC__BitReader *br, FLAC__CPUInfo cpu, FLAC__Bi return false; br->read_callback = rcb; br->client_data = cd; - br->cpu_info = cpu; return true; } @@ -1048,9 +1044,9 @@ FLAC__bool FLAC__bitreader_read_utf8_uint64(FLAC__BitReader *br, FLAC__uint64 *v return true; } -/* These functions a declared inline in this file but are also callable as +/* These functions are 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 + * According to the C99 spec, 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 diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c index 9ac9ee5..565fbcd 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -30,7 +30,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if HAVE_CONFIG_H +#ifdef HAVE_CONFIG_H # include #endif @@ -47,8 +47,7 @@ /* 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__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 @@ -524,28 +523,6 @@ FLAC__bool FLAC__bitwriter_write_rice_signed_block(FLAC__BitWriter *bw, const FL 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; @@ -555,7 +532,6 @@ FLAC__bool FLAC__bitwriter_write_rice_signed_block(FLAC__BitWriter *bw, const FL 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)) @@ -610,9 +586,7 @@ break1: bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); bw->accum = uval; } -#if 1 } -#endif vals++; nvals--; } @@ -853,9 +827,9 @@ FLAC__bool FLAC__bitwriter_zero_pad_to_byte_boundary(FLAC__BitWriter *bw) return true; } -/* These functions a declared inline in this file but are also callable as +/* These functions are 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 + * According to the C99 spec, 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 diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c index e352c95..46db9e3 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -30,47 +30,47 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if HAVE_CONFIG_H +#ifdef HAVE_CONFIG_H # include #endif #include "include/private/cpu.h" -#include -#include + +#if 0 + #include + #include + #include +#endif #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) + +static void disable_sse(FLAC__CPUInfo *info) { - if (!canjump) { - signal (sig, SIG_DFL); - raise (sig); - } - canjump = 0; - siglongjmp (jmpbuf, 1); + info->ia32.sse = false; + info->ia32.sse2 = false; + info->ia32.sse3 = false; + info->ia32.ssse3 = false; + info->ia32.sse41 = false; + info->ia32.sse42 = false; +} + +static void disable_avx(FLAC__CPUInfo *info) +{ + info->ia32.avx = false; + info->ia32.avx2 = false; + info->ia32.fma = false; } -# endif /* FLAC__SYS_DARWIN */ -# endif /* FLAC__NO_ASM */ -#endif /* FLAC__CPU_PPC */ + +#elif defined FLAC__CPU_X86_64 + +static void disable_avx(FLAC__CPUInfo *info) +{ + info->x86.avx = false; + info->x86.avx2 = false; + info->x86.fma = false; +} +#endif #if defined (__NetBSD__) || defined(__OpenBSD__) #include @@ -87,25 +87,34 @@ static void sigill_handler (int sig) /* how to get sysctlbyname()? */ #endif +#ifdef FLAC__CPU_IA32 /* 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; +#endif + /* 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; +static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE41 = 0x00080000; +static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE42 = 0x00100000; +#if defined FLAC__AVX_SUPPORTED +/* these are flags in ECX of CPUID AX=00000001 */ +static const unsigned FLAC__CPUINFO_IA32_CPUID_OSXSAVE = 0x08000000; +static const unsigned FLAC__CPUINFO_IA32_CPUID_AVX = 0x10000000; +static const unsigned FLAC__CPUINFO_IA32_CPUID_FMA = 0x00001000; +/* these are flags in EBX of CPUID AX=00000007 */ +static const unsigned FLAC__CPUINFO_IA32_CPUID_AVX2 = 0x00000020; +#endif /* * 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(FLAC__CPU_IA32) && !defined FLAC__NO_ASM && (defined FLAC__HAS_NASM || defined FLAC__HAS_X86INTRIN) && !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 @@ -120,35 +129,14 @@ static const unsigned FLAC__CPUINFO_IA32_CPUID_EXTENDED_AMD_EXTMMX = 0x00400000; * 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 @@ -159,261 +147,344 @@ void FLAC__cpu_info(FLAC__CPUInfo *info) * IA32-specific */ #ifdef FLAC__CPU_IA32 + FLAC__bool ia32_fxsr = false; + FLAC__bool ia32_osxsave = false; + (void) ia32_fxsr; (void) ia32_osxsave; /* to avoid warnings about unused variables */ + memset(info, 0, sizeof(*info)); info->type = FLAC__CPUINFO_TYPE_IA32; -#if !defined FLAC__NO_ASM && defined FLAC__HAS_NASM +#if !defined FLAC__NO_ASM && (defined FLAC__HAS_NASM || defined FLAC__HAS_X86INTRIN) 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; +#ifdef FLAC__HAS_X86INTRIN + if(!FLAC__cpu_have_cpuid_x86()) + return; +#else + if(!FLAC__cpu_have_cpuid_asm_ia32()) + return; +#endif + { + /* http://www.sandpile.org/x86/cpuid.htm */ +#ifdef FLAC__HAS_X86INTRIN + FLAC__uint32 flags_eax, flags_ebx, flags_ecx, flags_edx; + FLAC__cpu_info_x86(1, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx); #else - info->data.ia32._3dnow = info->data.ia32.ext3dnow = info->data.ia32.extmmx = false; + FLAC__uint32 flags_ecx, flags_edx; + FLAC__cpu_info_asm_ia32(&flags_edx, &flags_ecx); #endif + info->ia32.cmov = (flags_edx & FLAC__CPUINFO_IA32_CPUID_CMOV )? true : false; + info->ia32.mmx = (flags_edx & FLAC__CPUINFO_IA32_CPUID_MMX )? true : false; + ia32_fxsr = (flags_edx & FLAC__CPUINFO_IA32_CPUID_FXSR )? true : false; + info->ia32.sse = (flags_edx & FLAC__CPUINFO_IA32_CPUID_SSE )? true : false; + info->ia32.sse2 = (flags_edx & FLAC__CPUINFO_IA32_CPUID_SSE2 )? true : false; + info->ia32.sse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE3 )? true : false; + info->ia32.ssse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSSE3)? true : false; + info->ia32.sse41 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE41)? true : false; + info->ia32.sse42 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE42)? true : false; +#if defined FLAC__HAS_X86INTRIN && defined FLAC__AVX_SUPPORTED + ia32_osxsave = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_OSXSAVE)? true : false; + info->ia32.avx = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_AVX )? true : false; + info->ia32.fma = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_FMA )? true : false; + FLAC__cpu_info_x86(7, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx); + info->ia32.avx2 = (flags_ebx & FLAC__CPUINFO_IA32_CPUID_AVX2 )? true : 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'); + fprintf(stderr, "CPU info (IA-32):\n"); + fprintf(stderr, " CMOV ....... %c\n", info->ia32.cmov ? 'Y' : 'n'); + fprintf(stderr, " MMX ........ %c\n", info->ia32.mmx ? 'Y' : 'n'); + fprintf(stderr, " SSE ........ %c\n", info->ia32.sse ? 'Y' : 'n'); + fprintf(stderr, " SSE2 ....... %c\n", info->ia32.sse2 ? 'Y' : 'n'); + fprintf(stderr, " SSE3 ....... %c\n", info->ia32.sse3 ? 'Y' : 'n'); + fprintf(stderr, " SSSE3 ...... %c\n", info->ia32.ssse3 ? 'Y' : 'n'); + fprintf(stderr, " SSE41 ...... %c\n", info->ia32.sse41 ? 'Y' : 'n'); + fprintf(stderr, " SSE42 ...... %c\n", info->ia32.sse42 ? 'Y' : 'n'); +# if defined FLAC__HAS_X86INTRIN && defined FLAC__AVX_SUPPORTED + fprintf(stderr, " AVX ........ %c\n", info->ia32.avx ? 'Y' : 'n'); + fprintf(stderr, " FMA ........ %c\n", info->ia32.fma ? 'Y' : 'n'); + fprintf(stderr, " AVX2 ....... %c\n", info->ia32.avx2 ? 'Y' : 'n'); +# endif #endif - /* - * now have to check for OS support of SSE/SSE2 - */ - if(info->data.ia32.fxsr || info->data.ia32.sse || info->data.ia32.sse2) { + /* + * now have to check for OS support of SSE instructions + */ + if(info->ia32.sse) { #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; + /* assume user knows better than us; turn it off */ + disable_sse(info); #elif defined FLAC__SSE_OS - /* assume user knows better than us; leave as detected above */ + /* 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; + 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) + disable_sse(info); #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; + int val = 0, mib[2] = { CTL_MACHDEP, CPU_SSE }; + size_t len = sizeof(val); + if(sysctl(mib, 2, &val, &len, NULL, 0) < 0 || !val) + disable_sse(info); + else { /* double-check SSE2 */ + mib[1] = CPU_SSE2; + len = sizeof(val); + if(sysctl(mib, 2, &val, &len, NULL, 0) < 0 || !val) { + disable_sse(info); + info->ia32.sse = true; } + } # else - info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; + disable_sse(info); # 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); - } + int sse = 0; + struct sigaction sigill_save; + 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)) + { + /* http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html */ + /* see sigill_handler_sse_os() for an explanation of the following: */ + asm volatile ( + "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) + : "0"(sse) + ); - if(!sse) - info->data.ia32.fxsr = info->data.ia32.sse = info->data.ia32.sse2 = info->data.ia32.sse3 = info->data.ia32.ssse3 = false; + sigaction(SIGILL, &sigill_save, NULL); + } + + if(!sse) + disable_sse(info); #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 */ + __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 - 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 + } + __except(EXCEPTION_EXECUTE_HANDLER) { + if (_exception_code() == STATUS_ILLEGAL_INSTRUCTION) + disable_sse(info); + } +#elif defined(__GNUC__) /* MinGW goes here */ + int sse = 0; + /* Based on the idea described in Agner Fog's manual "Optimizing subroutines in assembly language" */ + /* In theory, not guaranteed to detect lack of OS SSE support on some future Intel CPUs, but in practice works (see the aforementioned manual) */ + if (ia32_fxsr) { + struct { + FLAC__uint32 buff[128]; + } __attribute__((aligned(16))) fxsr; + FLAC__uint32 old_val, new_val; + + asm volatile ("fxsave %0" : "=m" (fxsr) : "m" (fxsr)); + old_val = fxsr.buff[50]; + fxsr.buff[50] ^= 0x0013c0de; /* change value in the buffer */ + asm volatile ("fxrstor %0" : "=m" (fxsr) : "m" (fxsr)); /* try to change SSE register */ + fxsr.buff[50] = old_val; /* restore old value in the buffer */ + asm volatile ("fxsave %0 " : "=m" (fxsr) : "m" (fxsr)); /* old value will be overwritten if SSE register was changed */ + new_val = fxsr.buff[50]; /* == old_val if FXRSTOR didn't change SSE register and (old_val ^ 0x0013c0de) otherwise */ + fxsr.buff[50] = old_val; /* again restore old value in the buffer */ + asm volatile ("fxrstor %0" : "=m" (fxsr) : "m" (fxsr)); /* restore old values of registers */ + + if ((old_val^new_val) == 0x0013c0de) + sse = 1; + } + if(!sse) + disable_sse(info); #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; + /* no way to test, disable to be safe */ + disable_sse(info); #endif #ifdef DEBUG - fprintf(stderr, " SSE OS sup . %c\n", info->data.ia32.sse ? 'Y' : 'n'); + fprintf(stderr, " SSE OS sup . %c\n", info->ia32.sse ? 'Y' : 'n'); #endif + } + else /* info->ia32.sse == false */ + disable_sse(info); - } + /* + * now have to check for OS support of AVX instructions + */ + if(info->ia32.avx && ia32_osxsave) { + FLAC__uint32 ecr = FLAC__cpu_xgetbv_x86(); + if ((ecr & 0x6) != 0x6) + disable_avx(info); +#ifdef DEBUG + fprintf(stderr, " AVX OS sup . %c\n", info->ia32.avx ? 'Y' : 'n'); +#endif } + else /* no OS AVX support*/ + disable_avx(info); #else info->use_asm = false; #endif /* - * PPC-specific + * x86-64-specific */ -#elif defined FLAC__CPU_PPC - info->type = FLAC__CPUINFO_TYPE_PPC; -# if !defined FLAC__NO_ASM +#elif defined FLAC__CPU_X86_64 + FLAC__bool x86_osxsave = false; + (void) x86_osxsave; /* to avoid warnings about unused variables */ + memset(info, 0, sizeof(*info)); + info->type = FLAC__CPUINFO_TYPE_X86_64; +#if !defined FLAC__NO_ASM && defined FLAC__HAS_X86INTRIN 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); + /* http://www.sandpile.org/x86/cpuid.htm */ + FLAC__uint32 flags_eax, flags_ebx, flags_ecx, flags_edx; + FLAC__cpu_info_x86(1, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx); + info->x86.sse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE3 )? true : false; + info->x86.ssse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSSE3)? true : false; + info->x86.sse41 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE41)? true : false; + info->x86.sse42 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE42)? true : false; +#if defined FLAC__AVX_SUPPORTED + x86_osxsave = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_OSXSAVE)? true : false; + info->x86.avx = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_AVX )? true : false; + info->x86.fma = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_FMA )? true : false; + FLAC__cpu_info_x86(7, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx); + info->x86.avx2 = (flags_ebx & FLAC__CPUINFO_IA32_CPUID_AVX2 )? true : false; +#endif } - { - 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); +#ifdef DEBUG + fprintf(stderr, "CPU info (x86-64):\n"); + fprintf(stderr, " SSE3 ....... %c\n", info->x86.sse3 ? 'Y' : 'n'); + fprintf(stderr, " SSSE3 ...... %c\n", info->x86.ssse3 ? 'Y' : 'n'); + fprintf(stderr, " SSE41 ...... %c\n", info->x86.sse41 ? 'Y' : 'n'); + fprintf(stderr, " SSE42 ...... %c\n", info->x86.sse42 ? 'Y' : 'n'); +# if defined FLAC__AVX_SUPPORTED + fprintf(stderr, " AVX ........ %c\n", info->x86.avx ? 'Y' : 'n'); + fprintf(stderr, " FMA ........ %c\n", info->x86.fma ? 'Y' : 'n'); + fprintf(stderr, " AVX2 ....... %c\n", info->x86.avx2 ? 'Y' : 'n'); +# endif +#endif - info->data.ppc.ppc64 = (hostInfo.cpu_type == CPU_TYPE_POWERPC) && (hostInfo.cpu_subtype == CPU_SUBTYPE_POWERPC_970); + /* + * now have to check for OS support of AVX instructions + */ + if(info->x86.avx && x86_osxsave) { + FLAC__uint32 ecr = FLAC__cpu_xgetbv_x86(); + if ((ecr & 0x6) != 0x6) + disable_avx(info); +#ifdef DEBUG + fprintf(stderr, " AVX OS sup . %c\n", info->x86.avx ? 'Y' : 'n'); +#endif } -# 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; + else /* no OS AVX support*/ + disable_avx(info); +#else + info->use_asm = false; +#endif - signal (SIGILL, sigill_handler); - canjump = 0; - if (!sigsetjmp (jmpbuf, 1)) { - canjump = 1; +/* + * unknown CPU + */ +#else + info->type = FLAC__CPUINFO_TYPE_UNKNOWN; + info->use_asm = false; +#endif +} - asm volatile ( - "mtspr 256, %0\n\t" - "vand %%v0, %%v0, %%v0" - : - : "r" (-1) - ); +#if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN - 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) ); +#if defined _MSC_VER +#include /* for __cpuid() and _xgetbv() */ +#elif defined __GNUC__ && defined HAVE_CPUID_H +#include /* for __get_cpuid() and __get_cpuid_max() */ +#endif - info->data.ppc.ppc64 = 1; - } - signal (SIGILL, SIG_DFL); /*@@@@@@ should save and restore old signal */ +FLAC__uint32 FLAC__cpu_have_cpuid_x86(void) +{ +#ifdef FLAC__CPU_X86_64 + return 1; +#else +# if defined _MSC_VER || defined __INTEL_COMPILER /* Do they support CPUs w/o CPUID support (or OSes that work on those CPUs)? */ + FLAC__uint32 flags1, flags2; + __asm { + pushfd + pushfd + pop eax + mov flags1, eax + xor eax, 0x200000 + push eax + popfd + pushfd + pop eax + mov flags2, eax + popfd } -# endif -# else /* !FLAC__USE_ALTIVEC */ - info->data.ppc.altivec = 0; - info->data.ppc.ppc64 = 0; -# endif + if (((flags1^flags2) & 0x200000) != 0) + return 1; + else + return 0; +# elif defined __GNUC__ && defined HAVE_CPUID_H + if (__get_cpuid_max(0, 0) != 0) + return 1; + else + return 0; # else - info->use_asm = false; + return 0; # endif +#endif +} -/* - * unknown CPI - */ +void FLAC__cpu_info_x86(FLAC__uint32 level, FLAC__uint32 *eax, FLAC__uint32 *ebx, FLAC__uint32 *ecx, FLAC__uint32 *edx) +{ + (void) level; + +#if defined _MSC_VER || defined __INTEL_COMPILER + int cpuinfo[4]; + int ext = level & 0x80000000; + __cpuid(cpuinfo, ext); + if((unsigned)cpuinfo[0] < level) { + *eax = *ebx = *ecx = *edx = 0; + return; + } +#if defined FLAC__AVX_SUPPORTED + __cpuidex(cpuinfo, level, 0); /* for AVX2 detection */ #else - info->type = FLAC__CPUINFO_TYPE_UNKNOWN; - info->use_asm = false; + __cpuid(cpuinfo, level); /* some old compilers don't support __cpuidex */ +#endif + *eax = cpuinfo[0]; *ebx = cpuinfo[1]; *ecx = cpuinfo[2]; *edx = cpuinfo[3]; +#elif defined __GNUC__ && defined HAVE_CPUID_H + FLAC__uint32 ext = level & 0x80000000; + __cpuid(ext, *eax, *ebx, *ecx, *edx); + if (*eax < level) { + *eax = *ebx = *ecx = *edx = 0; + return; + } + __cpuid_count(level, 0, *eax, *ebx, *ecx, *edx); +#else + *eax = *ebx = *ecx = *edx = 0; #endif } + +FLAC__uint32 FLAC__cpu_xgetbv_x86(void) +{ +#if (defined _MSC_VER || defined __INTEL_COMPILER) && defined FLAC__AVX_SUPPORTED + return (FLAC__uint32)_xgetbv(0); +#elif defined __GNUC__ + FLAC__uint32 lo, hi; + asm volatile (".byte 0x0f, 0x01, 0xd0" : "=a"(lo), "=d"(hi) : "c" (0)); + return lo; +#else + return 0; +#endif +} + +#endif /* (FLAC__CPU_IA32 || FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN */ diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/crc.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/crc.c index 225b26d..f58e7be 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/crc.c +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/crc.c @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -30,7 +30,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if HAVE_CONFIG_H +#ifdef HAVE_CONFIG_H # include #endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c index f8ebeda..78a9ec0 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -30,21 +30,17 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if HAVE_CONFIG_H +#ifdef HAVE_CONFIG_H # include #endif #include #include +#include "../compat.h" #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 @@ -320,20 +316,11 @@ unsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsig 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; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/float.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/float.c index ae10407..1c16a2b 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/float.c +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/float.c @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2004-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -30,7 +30,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if HAVE_CONFIG_H +#ifdef HAVE_CONFIG_H # include #endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/format.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/format.c index 1f37de9..eb8f56f 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/format.c +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/format.c @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -30,7 +30,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if HAVE_CONFIG_H +#ifdef HAVE_CONFIG_H # include #endif @@ -45,12 +45,7 @@ /* 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 char *FLAC__VENDOR_STRING = "reference libFLAC " VERSION " 20141125"; FLAC_API const FLAC__byte FLAC__STREAM_SYNC_STRING[4] = { 'f','L','a','C' }; FLAC_API const unsigned FLAC__STREAM_SYNC = 0x664C6143; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h index 2925309..a526071 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h index 371bd48..9ca9ec3 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -34,6 +34,7 @@ #define FLAC__PRIVATE__BITMATH_H #include "../../../ordinals.h" +#include "../../../assert.h" /* for CHAR_BIT */ #include @@ -74,16 +75,19 @@ static inline unsigned int FLAC__clz_soft_uint32(unsigned int word) static inline unsigned int FLAC__clz_uint32(FLAC__uint32 v) { /* Never used with input 0 */ + FLAC__ASSERT(v > 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. */ + * -march= setting or to a software routine in exotic machines. */ return __builtin_clz(v); #elif defined(_MSC_VER) && (_MSC_VER >= 1400) - FLAC__uint32 idx; - _BitScanReverse((DWORD*) &idx, v); - return idx ^ 31U; + { + unsigned long idx; + _BitScanReverse(&idx, v); + return idx ^ 31U; + } #else return FLAC__clz_soft_uint32(v); #endif @@ -99,7 +103,7 @@ static inline unsigned int FLAC__clz2_uint32(FLAC__uint32 v) /* An example of what FLAC__bitmath_ilog2() computes: * - * ilog2( 0) = undefined + * ilog2( 0) = assertion failure * ilog2( 1) = 0 * ilog2( 2) = 1 * ilog2( 3) = 1 @@ -122,45 +126,56 @@ static inline unsigned int FLAC__clz2_uint32(FLAC__uint32 v) static inline unsigned FLAC__bitmath_ilog2(FLAC__uint32 v) { + FLAC__ASSERT(v > 0); +#if defined(__INTEL_COMPILER) + return _bit_scan_reverse(v); +#elif defined(_MSC_VER) && (_MSC_VER >= 1400) + { + unsigned long idx; + _BitScanReverse(&idx, v); + return idx; + } +#else return sizeof(FLAC__uint32) * CHAR_BIT - 1 - FLAC__clz_uint32(v); +#endif } -#ifdef FLAC__INTEGER_ONLY_LIBRARY /*Unused otherwise */ +#ifdef FLAC__INTEGER_ONLY_LIBRARY /* Unused otherwise */ static inline unsigned FLAC__bitmath_ilog2_wide(FLAC__uint64 v) { - if (v == 0) - return 0; + FLAC__ASSERT(v > 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; +/* Sorry, only supported in x64/Itanium.. and both have fast FPU which makes integer-only encoder pointless */ +#elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && (defined(_M_IA64) || defined(_M_X64)) + { + unsigned long idx; + _BitScanReverse64(&idx, v); + return idx; + } #else -/* Brain-damaged compilers will use the fastest possible way that is, +/* 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). + (C) Timothy B. Terriberry (tterribe@xiph.org) 2001-2009 CC0 (Public domain). */ - 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; + { + 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 + }; + v|= v>>1; + v|= v>>2; + v|= v>>4; + v|= v>>8; + v|= v>>16; + v|= v>>32; + v= (v>>1)+1; + return DEBRUIJN_IDX64[v*0x218A392CD3D5DBF>>58&0x3F]; + } #endif } #endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h index 4d9668f..83f8361 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -50,7 +50,7 @@ typedef FLAC__bool (*FLAC__BitReaderReadCallback)(FLAC__byte buffer[], size_t *b */ 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); +FLAC__bool FLAC__bitreader_init(FLAC__BitReader *br, 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); @@ -82,19 +82,10 @@ FLAC__bool FLAC__bitreader_read_byte_block_aligned_no_crc(FLAC__BitReader *br, F 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/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h index b1ff5e6..1e23efe 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h index 930d678..655800e 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -41,49 +41,59 @@ typedef enum { FLAC__CPUINFO_TYPE_IA32, - FLAC__CPUINFO_TYPE_PPC, + FLAC__CPUINFO_TYPE_X86_64, FLAC__CPUINFO_TYPE_UNKNOWN } FLAC__CPUInfo_Type; +#if defined FLAC__CPU_IA32 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__bool sse41; + FLAC__bool sse42; + FLAC__bool avx; + FLAC__bool avx2; + FLAC__bool fma; } FLAC__CPUInfo_IA32; - +#elif defined FLAC__CPU_X86_64 typedef struct { - FLAC__bool altivec; - FLAC__bool ppc64; -} FLAC__CPUInfo_PPC; + FLAC__bool sse3; + FLAC__bool ssse3; + FLAC__bool sse41; + FLAC__bool sse42; + FLAC__bool avx; + FLAC__bool avx2; + FLAC__bool fma; +} FLAC__CPUInfo_x86; +#endif typedef struct { FLAC__bool use_asm; FLAC__CPUInfo_Type type; - union { - FLAC__CPUInfo_IA32 ia32; - FLAC__CPUInfo_PPC ppc; - } data; +#if defined FLAC__CPU_IA32 + FLAC__CPUInfo_IA32 ia32; +#elif defined FLAC__CPU_X86_64 + FLAC__CPUInfo_x86 x86; +#endif } FLAC__CPUInfo; void FLAC__cpu_info(FLAC__CPUInfo *info); #ifndef FLAC__NO_ASM -#ifdef FLAC__CPU_IA32 -#ifdef FLAC__HAS_NASM +# if defined FLAC__CPU_IA32 && defined 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 +# if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN +FLAC__uint32 FLAC__cpu_have_cpuid_x86(void); +void FLAC__cpu_info_x86(FLAC__uint32 level, FLAC__uint32 *eax, FLAC__uint32 *ebx, FLAC__uint32 *ecx, FLAC__uint32 *edx); +FLAC__uint32 FLAC__cpu_xgetbv_x86(void); +# endif #endif #endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h index 6284783..8ebe5c8 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -51,7 +51,7 @@ FLAC__uint8 FLAC__crc8(const FLAC__byte *data, unsigned len); */ extern unsigned const FLAC__crc16_table[256]; -#define FLAC__CRC16_UPDATE(data, crc) (((((crc)<<8) & 0xffff) ^ FLAC__crc16_table[((crc)>>8) ^ (data)])) +#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) diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h index 0123bed..e4c044b 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -37,6 +37,7 @@ #include #endif +#include "cpu.h" #include "float.h" #include "../../../format.h" @@ -54,14 +55,22 @@ */ #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]); +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]); # 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]); +# if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN +# ifdef FLAC__SSE2_SUPPORTED +unsigned FLAC__fixed_compute_best_predictor_intrin_sse2(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]); +unsigned FLAC__fixed_compute_best_predictor_wide_intrin_sse2(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]); +# endif +# ifdef FLAC__SSSE3_SUPPORTED +unsigned FLAC__fixed_compute_best_predictor_intrin_ssse3(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); +unsigned FLAC__fixed_compute_best_predictor_wide_intrin_ssse3(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]); # endif # endif +# if defined FLAC__CPU_IA32 && defined 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 -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]); diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h index 74d17ed..af09336 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2004-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/format.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/format.h index 996c7e9..87fb9e1 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/format.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/format.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/lpc.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/lpc.h index d639e25..d97c26b 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/lpc.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/lpc.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -37,6 +37,7 @@ #include #endif +#include "cpu.h" #include "float.h" #include "../../../format.h" @@ -75,7 +76,15 @@ void FLAC__lpc_compute_autocorrelation_asm_ia32(const FLAC__real data[], unsigne 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[]); +void FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_16(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); +# endif +# endif +# if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN +# ifdef FLAC__SSE_SUPPORTED +void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_4(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); +void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_8(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); +void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_12(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); +void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_16(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); # endif # endif #endif @@ -145,6 +154,22 @@ void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 *da # 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[]); +void FLAC__lpc_compute_residual_from_qlp_coefficients_wide_asm_ia32(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); +# endif +# endif +# if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN +# ifdef FLAC__SSE2_SUPPORTED +void FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_sse2(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_intrin_sse2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); +# endif +# ifdef FLAC__SSE4_1_SUPPORTED +void FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_sse41(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_intrin_sse41(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); +# endif +# ifdef FLAC__AVX2_SUPPORTED +void FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_avx2(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_intrin_avx2(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_intrin_avx2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); # endif # endif #endif @@ -173,11 +198,17 @@ void FLAC__lpc_restore_signal_wide(const FLAC__int32 residual[], unsigned data_l # 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[]); +void FLAC__lpc_restore_signal_wide_asm_ia32(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__CPU_IA32 */ +# if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN +# ifdef FLAC__SSE2_SUPPORTED +void FLAC__lpc_restore_signal_16_intrin_sse2(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); +# endif +# ifdef FLAC__SSE4_1_SUPPORTED +void FLAC__lpc_restore_signal_wide_intrin_sse41(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); +# endif +# endif #endif /* FLAC__NO_ASM */ #ifndef FLAC__INTEGER_ONLY_LIBRARY diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h index 2cf5c5d..b1324a9 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h @@ -28,11 +28,17 @@ #include "../../../ordinals.h" +typedef union { + FLAC__byte *p8; + FLAC__int16 *p16; + FLAC__int32 *p32; +} FLAC__multibyte; + typedef struct { FLAC__uint32 in[16]; FLAC__uint32 buf[4]; FLAC__uint32 bytes[2]; - FLAC__byte *internal_buf; + FLAC__multibyte internal_buf; size_t capacity; } FLAC__MD5Context; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h index d6651c6..c387ea6 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h index a29050e..29c73e0 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2002-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder.h new file mode 100644 index 0000000..3ba6dd2 --- /dev/null +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder.h @@ -0,0 +1,67 @@ +/* libFLAC - Free Lossless Audio Codec library + * Copyright (C) 2000-2009 Josh Coalson + * Copyright (C) 2011-2014 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_H +#define FLAC__PRIVATE__STREAM_ENCODER_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +/* + * This is used to avoid overflow with unusual signals in 32-bit + * accumulator in the *precompute_partition_info_sums_* functions. + */ +#define FLAC__MAX_EXTRA_RESIDUAL_BPS 4 + +#if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN +#include "cpu.h" +#include "../../../format.h" + +#ifdef FLAC__SSE2_SUPPORTED +extern void FLAC__precompute_partition_info_sums_intrin_sse2(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); +#endif + +#ifdef FLAC__SSSE3_SUPPORTED +extern void FLAC__precompute_partition_info_sums_intrin_ssse3(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); +#endif + +#ifdef FLAC__AVX2_SUPPORTED +extern void FLAC__precompute_partition_info_sums_intrin_avx2(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); +#endif + +#endif + +#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h index 51bf8c3..eaa9958 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h index 8acec39..8464d22 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2006-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -65,6 +65,8 @@ 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_partial_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p, const FLAC__real start, const FLAC__real end); +void FLAC__window_punchout_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p, const FLAC__real start, const FLAC__real end); void FLAC__window_welch(FLAC__real *window, const FLAC__int32 L); #endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h index 057cd73..b852c2b 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h index 0d5813f..d8a3e61 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -40,6 +40,7 @@ typedef struct FLAC__StreamDecoderProtected { FLAC__StreamDecoderState state; + FLAC__StreamDecoderInitStatus initstate; unsigned channels; FLAC__ChannelAssignment channel_assignment; unsigned bits_per_sample; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h index 2c632f9..bd0cf25 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -59,6 +59,8 @@ typedef enum { FLAC__APODIZATION_RECTANGLE, FLAC__APODIZATION_TRIANGLE, FLAC__APODIZATION_TUKEY, + FLAC__APODIZATION_PARTIAL_TUKEY, + FLAC__APODIZATION_PUNCHOUT_TUKEY, FLAC__APODIZATION_WELCH } FLAC__ApodizationFunction; @@ -71,6 +73,11 @@ typedef struct { struct { FLAC__real p; } tukey; + struct { + FLAC__real p; + FLAC__real start; + FLAC__real end; + } multiple_tukey; } parameters; } FLAC__ApodizationSpecification; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c index 5741e7c..87e2321 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -30,7 +30,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if HAVE_CONFIG_H +#ifdef HAVE_CONFIG_H # include #endif @@ -50,11 +50,6 @@ #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 @@ -65,7 +60,7 @@ 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... +/* If this fails, we are in the presence 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) @@ -160,7 +155,7 @@ void FLAC__lpc_compute_lp_coefficients(const FLAC__real autoc[], unsigned *max_o 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 */ + /* see SF bug https://sourceforge.net/p/flac/bugs/234/ */ if(err == 0.0) { *max_order = i+1; return; @@ -264,7 +259,12 @@ int FLAC__lpc_quantize_coefficients(const FLAC__real lp_coeff[], unsigned order, 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(_MSC_VER) +// silence MSVC warnings about __restrict modifier +#pragma warning ( disable : 4028 ) +#endif + +void FLAC__lpc_compute_residual_from_qlp_coefficients(const FLAC__int32 * flac_restrict data, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict residual) #if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) { FLAC__int64 sumo; @@ -524,7 +524,7 @@ void FLAC__lpc_compute_residual_from_qlp_coefficients(const FLAC__int32 *data, u } #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[]) +void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 * flac_restrict data, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict residual) #if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) { unsigned i, j; @@ -780,7 +780,7 @@ void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 *da #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[]) +void FLAC__lpc_restore_signal(const FLAC__int32 * flac_restrict residual, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict data) #if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) { FLAC__int64 sumo; @@ -1041,7 +1041,7 @@ void FLAC__lpc_restore_signal(const FLAC__int32 residual[], unsigned data_len, c } #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[]) +void FLAC__lpc_restore_signal_wide(const FLAC__int32 * flac_restrict residual, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict data) #if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) { unsigned i, j; @@ -1295,6 +1295,10 @@ void FLAC__lpc_restore_signal_wide(const FLAC__int32 residual[], unsigned data_l } #endif +#if defined(_MSC_VER) +#pragma warning ( default : 4028 ) +#endif + #ifndef FLAC__INTEGER_ONLY_LIBRARY FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample(FLAC__double lpc_error, unsigned total_samples) diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/md5.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/md5.c index c448b87..d41f6a8 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/md5.c +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/md5.c @@ -1,4 +1,4 @@ -#if HAVE_CONFIG_H +#ifdef HAVE_CONFIG_H # include #endif @@ -7,6 +7,7 @@ #include "include/private/md5.h" #include "../alloc.h" +#include "../endswap.h" /* * This code implements the MD5 message-digest algorithm. @@ -223,7 +224,7 @@ void FLAC__MD5Init(FLAC__MD5Context *ctx) ctx->bytes[0] = 0; ctx->bytes[1] = 0; - ctx->internal_buf = 0; + ctx->internal_buf.p8= 0; ctx->capacity = 0; } @@ -259,9 +260,9 @@ void FLAC__MD5Final(FLAC__byte digest[16], FLAC__MD5Context *ctx) byteSwap(ctx->buf, 4); memcpy(digest, ctx->buf, 16); - if(0 != ctx->internal_buf) { - free(ctx->internal_buf); - ctx->internal_buf = 0; + if (0 != ctx->internal_buf.p8) { + free(ctx->internal_buf.p8); + ctx->internal_buf.p8= 0; ctx->capacity = 0; } memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */ @@ -270,58 +271,124 @@ void FLAC__MD5Final(FLAC__byte digest[16], FLAC__MD5Context *ctx) /* * 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) +static void format_input_(FLAC__multibyte *mbuf, const FLAC__int32 * const signal[], unsigned channels, unsigned samples, unsigned bytes_per_sample) { + FLAC__byte *buf_ = mbuf->p8; + FLAC__int16 *buf16 = mbuf->p16; + FLAC__int32 *buf32 = mbuf->p32; + FLAC__int32 a_word; 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; + /* Storage in the output buffer, buf, is little endian. */ + +#define BYTES_CHANNEL_SELECTOR(bytes, channels) (bytes * 100 + channels) + + /* First do the most commonly used combinations. */ + switch (BYTES_CHANNEL_SELECTOR (bytes_per_sample, channels)) { + /* One byte per sample. */ + case (BYTES_CHANNEL_SELECTOR (1, 1)): + for (sample = 0; sample < samples; sample++) + *buf_++ = signal[0][sample]; + return; + + case (BYTES_CHANNEL_SELECTOR (1, 2)): + for (sample = 0; sample < samples; sample++) { + *buf_++ = signal[0][sample]; + *buf_++ = signal[1][sample]; } - } - else if(channels == 1) { - for(sample = 0; sample < samples; sample++) { + return; + + case (BYTES_CHANNEL_SELECTOR (1, 4)): + for (sample = 0; sample < samples; sample++) { + *buf_++ = signal[0][sample]; + *buf_++ = signal[1][sample]; + *buf_++ = signal[2][sample]; + *buf_++ = signal[3][sample]; + } + return; + + case (BYTES_CHANNEL_SELECTOR (1, 6)): + for (sample = 0; sample < samples; sample++) { + *buf_++ = signal[0][sample]; + *buf_++ = signal[1][sample]; + *buf_++ = signal[2][sample]; + *buf_++ = signal[3][sample]; + *buf_++ = signal[4][sample]; + *buf_++ = signal[5][sample]; + } + return; + + case (BYTES_CHANNEL_SELECTOR (1, 8)): + for (sample = 0; sample < samples; sample++) { + *buf_++ = signal[0][sample]; + *buf_++ = signal[1][sample]; + *buf_++ = signal[2][sample]; + *buf_++ = signal[3][sample]; + *buf_++ = signal[4][sample]; + *buf_++ = signal[5][sample]; + *buf_++ = signal[6][sample]; + *buf_++ = signal[7][sample]; + } + return; + + /* Two bytes per sample. */ + case (BYTES_CHANNEL_SELECTOR (2, 1)): + for (sample = 0; sample < samples; sample++) + *buf16++ = H2LE_16(signal[0][sample]); + return; + + case (BYTES_CHANNEL_SELECTOR (2, 2)): + for (sample = 0; sample < samples; sample++) { + *buf16++ = H2LE_16(signal[0][sample]); + *buf16++ = H2LE_16(signal[1][sample]); + } + return; + + case (BYTES_CHANNEL_SELECTOR (2, 4)): + for (sample = 0; sample < samples; sample++) { + *buf16++ = H2LE_16(signal[0][sample]); + *buf16++ = H2LE_16(signal[1][sample]); + *buf16++ = H2LE_16(signal[2][sample]); + *buf16++ = H2LE_16(signal[3][sample]); + } + return; + + case (BYTES_CHANNEL_SELECTOR (2, 6)): + for (sample = 0; sample < samples; sample++) { + *buf16++ = H2LE_16(signal[0][sample]); + *buf16++ = H2LE_16(signal[1][sample]); + *buf16++ = H2LE_16(signal[2][sample]); + *buf16++ = H2LE_16(signal[3][sample]); + *buf16++ = H2LE_16(signal[4][sample]); + *buf16++ = H2LE_16(signal[5][sample]); + } + return; + + case (BYTES_CHANNEL_SELECTOR (2, 8)): + for (sample = 0; sample < samples; sample++) { + *buf16++ = H2LE_16(signal[0][sample]); + *buf16++ = H2LE_16(signal[1][sample]); + *buf16++ = H2LE_16(signal[2][sample]); + *buf16++ = H2LE_16(signal[3][sample]); + *buf16++ = H2LE_16(signal[4][sample]); + *buf16++ = H2LE_16(signal[5][sample]); + *buf16++ = H2LE_16(signal[6][sample]); + *buf16++ = H2LE_16(signal[7][sample]); + } + return; + + /* Three bytes per sample. */ + case (BYTES_CHANNEL_SELECTOR (3, 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; - } - } - } - } - else if(bytes_per_sample == 3) { - if(channels == 2) { - for(sample = 0; sample < samples; sample++) { + return; + + case (BYTES_CHANNEL_SELECTOR (3, 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; @@ -331,60 +398,90 @@ static void format_input_(FLAC__byte *buf, const FLAC__int32 * const signal[], u *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; + return; + + /* Four bytes per sample. */ + case (BYTES_CHANNEL_SELECTOR (4, 1)): + for (sample = 0; sample < samples; sample++) + *buf32++ = H2LE_32(signal[0][sample]); + return; + + case (BYTES_CHANNEL_SELECTOR (4, 2)): + for (sample = 0; sample < samples; sample++) { + *buf32++ = H2LE_32(signal[0][sample]); + *buf32++ = H2LE_32(signal[1][sample]); } - } - 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; - } + return; + + case (BYTES_CHANNEL_SELECTOR (4, 4)): + for (sample = 0; sample < samples; sample++) { + *buf32++ = H2LE_32(signal[0][sample]); + *buf32++ = H2LE_32(signal[1][sample]); + *buf32++ = H2LE_32(signal[2][sample]); + *buf32++ = H2LE_32(signal[3][sample]); } - } - } - 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; + return; + + case (BYTES_CHANNEL_SELECTOR (4, 6)): + for (sample = 0; sample < samples; sample++) { + *buf32++ = H2LE_32(signal[0][sample]); + *buf32++ = H2LE_32(signal[1][sample]); + *buf32++ = H2LE_32(signal[2][sample]); + *buf32++ = H2LE_32(signal[3][sample]); + *buf32++ = H2LE_32(signal[4][sample]); + *buf32++ = H2LE_32(signal[5][sample]); } - } - else if(channels == 1) { - for(sample = 0; sample < samples; sample++) { - a_word = signal[0][sample]; - *buf_++ = (FLAC__byte)a_word; + return; + + case (BYTES_CHANNEL_SELECTOR (4, 8)): + for (sample = 0; sample < samples; sample++) { + *buf32++ = H2LE_32(signal[0][sample]); + *buf32++ = H2LE_32(signal[1][sample]); + *buf32++ = H2LE_32(signal[2][sample]); + *buf32++ = H2LE_32(signal[3][sample]); + *buf32++ = H2LE_32(signal[4][sample]); + *buf32++ = H2LE_32(signal[5][sample]); + *buf32++ = H2LE_32(signal[6][sample]); + *buf32++ = H2LE_32(signal[7][sample]); } - } - else { - for(sample = 0; sample < samples; sample++) { - for(channel = 0; channel < channels; channel++) { + return; + + default: + break; + } + + /* General version. */ + switch (bytes_per_sample) { + case 1: + for (sample = 0; sample < samples; sample++) + for (channel = 0; channel < channels; channel++) + *buf_++ = signal[channel][sample]; + return; + + case 2: + for (sample = 0; sample < samples; sample++) + for (channel = 0; channel < channels; channel++) + *buf16++ = H2LE_16(signal[channel][sample]); + return; + + case 3: + 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 { /* 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; - } - } + return; + + case 4: + for (sample = 0; sample < samples; sample++) + for (channel = 0; channel < channels; channel++) + *buf32++ = H2LE_32(signal[channel][sample]); + return; + + default: + break; } } @@ -396,26 +493,26 @@ FLAC__bool FLAC__MD5Accumulate(FLAC__MD5Context *ctx, const FLAC__int32 * const 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) + 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) + 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))) + if (ctx->capacity < bytes_needed) { + FLAC__byte *tmp = (FLAC__byte*) realloc(ctx->internal_buf.p8, bytes_needed); + if (0 == tmp) { + free(ctx->internal_buf.p8); + if (0 == (ctx->internal_buf.p8= (FLAC__byte*) safe_malloc_(bytes_needed))) return false; } else - ctx->internal_buf = tmp; + ctx->internal_buf.p8= tmp; ctx->capacity = bytes_needed; } - format_input_(ctx->internal_buf, signal, channels, samples, bytes_per_sample); + format_input_(&ctx->internal_buf, signal, channels, samples, bytes_per_sample); - FLAC__MD5Update(ctx, ctx->internal_buf, bytes_needed); + FLAC__MD5Update(ctx, ctx->internal_buf.p8, bytes_needed); return true; } diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/memory.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/memory.c index dd972e0..fb125f1 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/memory.c +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/memory.c @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -30,10 +30,14 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if HAVE_CONFIG_H +#ifdef HAVE_CONFIG_H # include #endif +#ifdef HAVE_STDINT_H +#include +#endif + #include "include/private/memory.h" #include "../assert.h" #include "../alloc.h" @@ -46,25 +50,8 @@ void *FLAC__memory_alloc_aligned(size_t bytes, void **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 + x = safe_malloc_add_2op_(bytes, /*+*/31L); + *aligned_address = (void*)(((uintptr_t)x + 31L) & -32L); #else x = safe_malloc_(bytes); *aligned_address = x; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c index 04e1766..d6a7973 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -30,7 +30,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if HAVE_CONFIG_H +#ifdef HAVE_CONFIG_H # include #endif @@ -70,7 +70,7 @@ FLAC_API int FLAC_API_SUPPORTS_OGG_FLAC = * ***********************************************************************/ -static FLAC__byte ID3V2_TAG_[3] = { 'I', 'D', '3' }; +static const FLAC__byte ID3V2_TAG_[3] = { 'I', 'D', '3' }; /*********************************************************************** * @@ -86,7 +86,7 @@ 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_vorbiscomment_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_VorbisComment *obj, unsigned length); 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); @@ -141,9 +141,6 @@ typedef struct FLAC__StreamDecoderPrivate { 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; @@ -380,7 +377,7 @@ static FLAC__StreamDecoderInitStatus init_stream_internal_( #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; + return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE; #endif /* @@ -391,42 +388,44 @@ static FLAC__StreamDecoderInitStatus init_stream_internal_( 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_64bit = FLAC__lpc_restore_signal_wide_asm_ia32; /* OPT_IA32: was really necessary for GCC < 4.9 */ + if(decoder->private_->cpuinfo.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; +#ifdef FLAC__HAS_X86INTRIN +# if defined FLAC__SSE2_SUPPORTED && !defined FLAC__HAS_NASM /* OPT_SSE: not better than MMX asm */ + if(decoder->private_->cpuinfo.ia32.sse2) { + decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_16_intrin_sse2; + } +# endif +# if defined FLAC__SSE4_1_SUPPORTED + if(decoder->private_->cpuinfo.ia32.sse41) { + decoder->private_->local_lpc_restore_signal_64bit = FLAC__lpc_restore_signal_wide_intrin_sse41; } +# endif +#endif +#elif defined FLAC__CPU_X86_64 + FLAC__ASSERT(decoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_X86_64); + /* No useful SSE optimizations yet */ #endif } #endif /* from here on, errors are fatal */ - if(!FLAC__bitreader_init(decoder->private_->input, decoder->private_->cpuinfo, read_callback_, decoder)) { + if(!FLAC__bitreader_init(decoder->private_->input, read_callback_, decoder)) { decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; return FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR; } @@ -528,10 +527,10 @@ static FLAC__StreamDecoderInitStatus init_FILE_internal_( 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); + return decoder->protected_->initstate = 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); + return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS; /* * To make sure that our file does not go unclosed after an error, we @@ -602,10 +601,10 @@ static FLAC__StreamDecoderInitStatus init_file_internal_( * 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); + return decoder->protected_->initstate = 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); + return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS; file = filename? flac_fopen(filename, "rb") : stdin; @@ -652,7 +651,7 @@ FLAC_API FLAC__bool FLAC__stream_decoder_finish(FLAC__StreamDecoder *decoder) if(decoder->protected_->state == FLAC__STREAM_DECODER_UNINITIALIZED) return true; - /* see the comment in FLAC__seekable_stream_decoder_reset() as to why we + /* see the comment in FLAC__stream_decoder_reset() as to why we * always call FLAC__MD5Final() */ FLAC__MD5Final(decoder->private_->computed_md5sum, &decoder->private_->md5context); @@ -1316,9 +1315,6 @@ FLAC__bool allocate_output_(FLAC__StreamDecoder *decoder, unsigned size, unsigne 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; @@ -1368,6 +1364,10 @@ FLAC__bool find_metadata_(FLAC__StreamDecoder *decoder) id_ = 0; continue; } + + if(id_ >= 3) + return false; + if(x == ID3V2_TAG_[id_]) { id_++; i = 0; @@ -1446,6 +1446,7 @@ FLAC__bool read_metadata_(FLAC__StreamDecoder *decoder) unsigned real_length = length; FLAC__StreamMetadata block; + memset(&block, 0, sizeof(block)); block.is_last = is_last; block.type = (FLAC__MetadataType)type; block.length = length; @@ -1470,36 +1471,37 @@ FLAC__bool read_metadata_(FLAC__StreamDecoder *decoder) return false; /* read_callback_ sets the state for us */ } else { + FLAC__bool ok = true; 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 */ + ok = 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; + ok = 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 if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.application.data, real_length)) + ok = 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; + if(!read_metadata_vorbiscomment_(decoder, &block.data.vorbis_comment, real_length)) + ok = false; break; case FLAC__METADATA_TYPE_CUESHEET: if(!read_metadata_cuesheet_(decoder, &block.data.cue_sheet)) - return false; + ok = false; break; case FLAC__METADATA_TYPE_PICTURE: if(!read_metadata_picture_(decoder, &block.data.picture)) - return false; + ok = false; break; case FLAC__METADATA_TYPE_STREAMINFO: case FLAC__METADATA_TYPE_SEEKTABLE: @@ -1509,16 +1511,16 @@ FLAC__bool read_metadata_(FLAC__StreamDecoder *decoder) 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; + ok = 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 if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.unknown.data, real_length)) + ok = false; /* read_callback_ sets the state for us */ } else block.data.unknown.data = 0; break; } - if(!decoder->private_->is_seeking && decoder->private_->metadata_callback) + if(ok && !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 */ @@ -1563,6 +1565,9 @@ FLAC__bool read_metadata_(FLAC__StreamDecoder *decoder) free(block.data.unknown.data); break; } + + if(!ok) /* anything that unsets "ok" should also make sure decoder->protected_->state is updated */ + return false; } } @@ -1689,58 +1694,88 @@ FLAC__bool read_metadata_seektable_(FLAC__StreamDecoder *decoder, FLAC__bool is_ return true; } -FLAC__bool read_metadata_vorbiscomment_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_VorbisComment *obj) +FLAC__bool read_metadata_vorbiscomment_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_VorbisComment *obj, unsigned length) { 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)) + if (length >= 8) { + length -= 8; /* vendor string length + num comments entries alone take 8 bytes */ + 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 */ - obj->vendor_string.entry[obj->vendor_string.length] = '\0'; - } - else - obj->vendor_string.entry = 0; + if (obj->vendor_string.length > 0) { + if (length < obj->vendor_string.length) { + obj->vendor_string.length = 0; + obj->vendor_string.entry = 0; + goto skip; + } + else + length -= obj->vendor_string.length; + 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 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; + /* 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 (length < 4) { + obj->num_comments = i; + goto skip; } - if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->comments[i].entry, obj->comments[i].length)) + else + length -= 4; + if (!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->comments[i].length)) return false; /* read_callback_ sets the state for us */ - obj->comments[i].entry[obj->comments[i].length] = '\0'; + if (obj->comments[i].length > 0) { + if (length < obj->comments[i].length) { + obj->comments[i].length = 0; + obj->comments[i].entry = 0; + obj->num_comments = i; + goto skip; + } + else + length -= obj->comments[i].length; + 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[i].entry = 0; } + else + obj->comments = 0; } - else { - obj->comments = 0; + + skip: + if (length > 0) { + /* This will only happen on files with invalid data in comments */ + if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, length)) + return false; /* read_callback_ sets the state for us */ } return true; @@ -2655,12 +2690,8 @@ FLAC__bool read_subframe_lpc_(FLAC__StreamDecoder *decoder, unsigned channel, un 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); - } + if(bps <= 16 && subframe->qlp_coeff_precision <= 16) + 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 @@ -2708,14 +2739,16 @@ FLAC__bool read_residual_partitioned_rice_(FLAC__StreamDecoder *decoder, unsigne 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; + /* We have received a potentially malicious bit stream. All we can do is error out to avoid a heap overflow. */ + return false; } } 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; + /* We have received a potentially malicious bit stream. All we can do is error out to avoid a heap overflow. */ + return false; } } @@ -2732,7 +2765,7 @@ FLAC__bool read_residual_partitioned_rice_(FLAC__StreamDecoder *decoder, unsigne 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)) + if(!FLAC__bitreader_read_rice_signed_block(decoder->private_->input, residual + sample, u, rice_parameter)) return false; /* read_callback_ sets the state for us */ sample += u; } @@ -3074,12 +3107,7 @@ FLAC__bool seek_to_absolute_sample_(FLAC__StreamDecoder *decoder, FLAC__uint64 s 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) @@ -3203,12 +3231,7 @@ FLAC__bool seek_to_absolute_sample_ogg_(FLAC__StreamDecoder *decoder, FLAC__uint } 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)) diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c index 20e98da..f5eb90e 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -30,7 +30,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if HAVE_CONFIG_H +#ifdef HAVE_CONFIG_H # include #endif @@ -55,10 +55,10 @@ #include "include/private/ogg_helper.h" #include "include/private/ogg_mapping.h" #endif +#include "include/private/stream_encoder.h" #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 @@ -103,16 +103,18 @@ static struct CompressionLevels { unsigned min_residual_partition_order; unsigned max_residual_partition_order; unsigned rice_parameter_search_dist; + const char *apodization; } 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 } + { false, false, 0, 0, false, false, false, 0, 3, 0, "tukey(5e-1)" }, + { true , true , 0, 0, false, false, false, 0, 3, 0, "tukey(5e-1)" }, + { true , false, 0, 0, false, false, false, 0, 3, 0, "tukey(5e-1)" }, + { false, false, 6, 0, false, false, false, 0, 4, 0, "tukey(5e-1)" }, + { true , true , 8, 0, false, false, false, 0, 4, 0, "tukey(5e-1)" }, + { true , false, 8, 0, false, false, false, 0, 5, 0, "tukey(5e-1)" }, + { true , false, 8, 0, false, false, false, 0, 6, 0, "tukey(5e-1);partial_tukey(2)" }, + { true , false, 12, 0, false, false, false, 0, 6, 0, "tukey(5e-1);partial_tukey(2)" }, + { true , false, 12, 0, false, false, false, 0, 6, 0, "tukey(5e-1);partial_tukey(2);punchout_tukey(3)" } + /* here we use locale-independent 5e-1 instead of 0.5 or 0,5 */ }; @@ -342,10 +344,13 @@ typedef struct FLAC__StreamEncoderPrivate { unsigned current_frame_number; FLAC__MD5Context md5context; FLAC__CPUInfo cpuinfo; + void (*local_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); #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]); + unsigned (*local_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 (*local_fixed_compute_best_predictor)(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); + unsigned (*local_fixed_compute_best_predictor_wide)(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[]); @@ -873,7 +878,9 @@ static FLAC__StreamEncoderInitStatus init_stream_internal_( #ifndef FLAC__INTEGER_ONLY_LIBRARY encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation; #endif + encoder->private_->local_precompute_partition_info_sums = precompute_partition_info_sums_; encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor; + encoder->private_->local_fixed_compute_best_predictor_wide = FLAC__fixed_compute_best_predictor_wide; #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; @@ -886,21 +893,23 @@ static FLAC__StreamEncoderInitStatus init_stream_internal_( # 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->private_->cpuinfo.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 if(encoder->protected_->max_lpc_order < 16) + encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_16; 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_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide_asm_ia32; /* OPT_IA32: was really necessary for GCC < 4.9 */ + if(encoder->private_->cpuinfo.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; } @@ -908,16 +917,137 @@ static FLAC__StreamEncoderInitStatus init_stream_internal_( 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) + + if(encoder->private_->cpuinfo.ia32.mmx && encoder->private_->cpuinfo.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 */ +# ifdef FLAC__HAS_X86INTRIN +# if defined FLAC__SSE_SUPPORTED + if(encoder->private_->cpuinfo.ia32.sse) { + if(encoder->protected_->max_lpc_order < 4) + encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_4; + else if(encoder->protected_->max_lpc_order < 8) + encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_8; + else if(encoder->protected_->max_lpc_order < 12) + encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_12; + else if(encoder->protected_->max_lpc_order < 16) + encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_16; + else + encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation; + } +# endif + +# ifdef FLAC__SSE2_SUPPORTED + if(encoder->private_->cpuinfo.ia32.sse2) { + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_sse2; + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_sse2; + } +# endif +# ifdef FLAC__SSE4_1_SUPPORTED + if(encoder->private_->cpuinfo.ia32.sse41) { + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_sse41; + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_sse41; + } +# endif +# ifdef FLAC__AVX2_SUPPORTED + if(encoder->private_->cpuinfo.ia32.avx2) { + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_avx2; + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_avx2; + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_avx2; + } +# endif + +# ifdef FLAC__SSE2_SUPPORTED + if (encoder->private_->cpuinfo.ia32.sse2) { + encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_intrin_sse2; + encoder->private_->local_fixed_compute_best_predictor_wide = FLAC__fixed_compute_best_predictor_wide_intrin_sse2; + } +# endif +# ifdef FLAC__SSSE3_SUPPORTED + if (encoder->private_->cpuinfo.ia32.ssse3) { + encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_intrin_ssse3; + encoder->private_->local_fixed_compute_best_predictor_wide = FLAC__fixed_compute_best_predictor_wide_intrin_ssse3; + } +# endif +# endif /* FLAC__HAS_X86INTRIN */ +# elif defined FLAC__CPU_X86_64 + FLAC__ASSERT(encoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_X86_64); +# ifdef FLAC__HAS_X86INTRIN +# ifdef FLAC__SSE_SUPPORTED + if(encoder->protected_->max_lpc_order < 4) + encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_4; + else if(encoder->protected_->max_lpc_order < 8) + encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_8; + else if(encoder->protected_->max_lpc_order < 12) + encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_12; + else if(encoder->protected_->max_lpc_order < 16) + encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_16; +# endif + +# ifdef FLAC__SSE2_SUPPORTED + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_sse2; +# endif +# ifdef FLAC__SSE4_1_SUPPORTED + if(encoder->private_->cpuinfo.x86.sse41) { + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_sse41; + } +# endif +# ifdef FLAC__AVX2_SUPPORTED + if(encoder->private_->cpuinfo.x86.avx2) { + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_avx2; + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_avx2; + encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_avx2; + } +# endif + +# ifdef FLAC__SSE2_SUPPORTED + encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_intrin_sse2; + encoder->private_->local_fixed_compute_best_predictor_wide = FLAC__fixed_compute_best_predictor_wide_intrin_sse2; +# endif +# ifdef FLAC__SSSE3_SUPPORTED + if (encoder->private_->cpuinfo.x86.ssse3) { + encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_intrin_ssse3; + encoder->private_->local_fixed_compute_best_predictor_wide = FLAC__fixed_compute_best_predictor_wide_intrin_ssse3; + } +# endif +# endif /* FLAC__HAS_X86INTRIN */ +# endif /* FLAC__CPU_... */ } # endif /* !FLAC__NO_ASM */ #endif /* !FLAC__INTEGER_ONLY_LIBRARY */ +#if !defined FLAC__NO_ASM && defined FLAC__HAS_X86INTRIN + if(encoder->private_->cpuinfo.use_asm) { +# if defined FLAC__CPU_IA32 +# ifdef FLAC__SSE2_SUPPORTED + if(encoder->private_->cpuinfo.ia32.sse2) + encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_sse2; +# endif +# ifdef FLAC__SSSE3_SUPPORTED + if(encoder->private_->cpuinfo.ia32.ssse3) + encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_ssse3; +# endif +# ifdef FLAC__AVX2_SUPPORTED + if(encoder->private_->cpuinfo.ia32.avx2) + encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_avx2; +# endif +# elif defined FLAC__CPU_X86_64 +# ifdef FLAC__SSE2_SUPPORTED + encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_sse2; +# endif +# ifdef FLAC__SSSE3_SUPPORTED + if(encoder->private_->cpuinfo.x86.ssse3) + encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_ssse3; +# endif +# ifdef FLAC__AVX2_SUPPORTED + if(encoder->private_->cpuinfo.x86.avx2) + encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_avx2; +# endif +# endif /* FLAC__CPU_... */ + } +#endif /* !FLAC__NO_ASM && FLAC__HAS_X86INTRIN */ /* 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; + encoder->private_->local_fixed_compute_best_predictor = encoder->private_->local_fixed_compute_best_predictor_wide; } /* set state to OK; from here on, errors are fatal and we'll override the state then */ @@ -1152,7 +1282,7 @@ static FLAC__StreamEncoderInitStatus init_FILE_internal_( FLAC__StreamEncoder *encoder, FILE *file, FLAC__StreamEncoderProgressCallback progress_callback, - void * /*client_data*/, + void *client_data, FLAC__bool is_ogg ) { @@ -1178,6 +1308,13 @@ static FLAC__StreamEncoderInitStatus init_FILE_internal_( if(file == stdout) file = get_binary_stdout_(); /* just to be safe */ +#ifdef _WIN32 + /* + * Windows can suffer quite badly from disk fragmentation. This can be + * reduced significantly by setting the output buffer size to be 10MB. + */ + setvbuf(file, NULL, _IOFBF, 10*1024*1024); +#endif encoder->private_->file = file; encoder->private_->progress_callback = progress_callback; @@ -1447,11 +1584,10 @@ FLAC_API FLAC__bool FLAC__stream_encoder_set_compression_level(FLAC__StreamEncod 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: */ +#if 1 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 + /* equivalent to -A tukey(0.5) */ encoder->protected_->num_apodizations = 1; encoder->protected_->apodizations[0].type = FLAC__APODIZATION_TUKEY; encoder->protected_->apodizations[0].parameters.tukey.p = 0.5; @@ -1555,6 +1691,48 @@ FLAC_API FLAC__bool FLAC__stream_encoder_set_apodization(FLAC__StreamEncoder *en encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_TUKEY; } } + else if(n>15 && 0 == strncmp("partial_tukey(" , specification, 14)) { + FLAC__int32 tukey_parts = (FLAC__int32)strtod(specification+14, 0); + const char *si_1 = strchr(specification, '/'); + FLAC__real overlap = si_1?flac_min((FLAC__real)strtod(si_1+1, 0),0.99f):0.1f; + FLAC__real overlap_units = 1.0f/(1.0f - overlap) - 1.0f; + const char *si_2 = strchr((si_1?(si_1+1):specification), '/'); + FLAC__real tukey_p = si_2?(FLAC__real)strtod(si_2+1, 0):0.2f; + + if (tukey_parts <= 1) { + encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.tukey.p = tukey_p; + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_TUKEY; + }else if (encoder->protected_->num_apodizations + tukey_parts < 32){ + FLAC__int32 m; + for(m = 0; m < tukey_parts; m++){ + encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.multiple_tukey.p = tukey_p; + encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.multiple_tukey.start = m/(tukey_parts+overlap_units); + encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.multiple_tukey.end = (m+1+overlap_units)/(tukey_parts+overlap_units); + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_PARTIAL_TUKEY; + } + } + } + else if(n>16 && 0 == strncmp("punchout_tukey(" , specification, 15)) { + FLAC__int32 tukey_parts = (FLAC__int32)strtod(specification+15, 0); + const char *si_1 = strchr(specification, '/'); + FLAC__real overlap = si_1?flac_min((FLAC__real)strtod(si_1+1, 0),0.99f):0.2f; + FLAC__real overlap_units = 1.0f/(1.0f - overlap) - 1.0f; + const char *si_2 = strchr((si_1?(si_1+1):specification), '/'); + FLAC__real tukey_p = si_2?(FLAC__real)strtod(si_2+1, 0):0.2f; + + if (tukey_parts <= 1) { + encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.tukey.p = tukey_p; + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_TUKEY; + }else if (encoder->protected_->num_apodizations + tukey_parts < 32){ + FLAC__int32 m; + for(m = 0; m < tukey_parts; m++){ + encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.multiple_tukey.p = tukey_p; + encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.multiple_tukey.start = m/(tukey_parts+overlap_units); + encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.multiple_tukey.end = (m+1+overlap_units)/(tukey_parts+overlap_units); + encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_PUNCHOUT_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) @@ -2236,8 +2414,8 @@ FLAC__bool resize_buffers_(FLAC__StreamEncoder *encoder, unsigned new_blocksize) ok = true; - /* WATCHOUT: FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx() - * requires that the input arrays (in our case the integer signals) + /* WATCHOUT: FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx() and ..._intrin_sse2() + * require 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. */ @@ -2334,6 +2512,12 @@ FLAC__bool resize_buffers_(FLAC__StreamEncoder *encoder, unsigned new_blocksize) case FLAC__APODIZATION_TUKEY: FLAC__window_tukey(encoder->private_->window[i], new_blocksize, encoder->protected_->apodizations[i].parameters.tukey.p); break; + case FLAC__APODIZATION_PARTIAL_TUKEY: + FLAC__window_partial_tukey(encoder->private_->window[i], new_blocksize, encoder->protected_->apodizations[i].parameters.multiple_tukey.p, encoder->protected_->apodizations[i].parameters.multiple_tukey.start, encoder->protected_->apodizations[i].parameters.multiple_tukey.end); + break; + case FLAC__APODIZATION_PUNCHOUT_TUKEY: + FLAC__window_punchout_tukey(encoder->private_->window[i], new_blocksize, encoder->protected_->apodizations[i].parameters.multiple_tukey.p, encoder->protected_->apodizations[i].parameters.multiple_tukey.start, encoder->protected_->apodizations[i].parameters.multiple_tukey.end); + break; case FLAC__APODIZATION_WELCH: FLAC__window_welch(encoder->private_->window[i], new_blocksize); break; @@ -3165,7 +3349,7 @@ FLAC__bool process_subframe_( #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__real autoc[FLAC__MAX_LPC_ORDER+1]; /* WATCHOUT: the size is important even though encoder->protected_->max_lpc_order might be less; some asm and x86 intrinsic 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; @@ -3318,9 +3502,9 @@ FLAC__bool process_subframe_( } 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); + /* try to keep qlp coeff precision such that only 32-bit math is required for decode of <=16bps streams */ + if(subframe_bps <= 16) { + max_qlp_coeff_precision = flac_min(32 - subframe_bps - FLAC__bitmath_ilog2(lpc_order), FLAC__MAX_QLP_COEFF_PRECISION); max_qlp_coeff_precision = flac_max(max_qlp_coeff_precision, min_qlp_coeff_precision); } else @@ -3556,7 +3740,7 @@ unsigned evaluate_lpc_subframe_( FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents ) { - FLAC__int32 qlp_coeff[FLAC__MAX_LPC_ORDER]; + FLAC__int32 qlp_coeff[FLAC__MAX_LPC_ORDER]; /* WATCHOUT: the size is important; some x86 intrinsic routines need more than lpc order elements */ unsigned i, residual_bits, estimate; int quantization, ret; const unsigned residual_samples = blocksize - order; @@ -3671,7 +3855,7 @@ unsigned find_best_partition_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); + private_->local_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); @@ -3743,17 +3927,6 @@ unsigned find_best_partition_order_( 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[], @@ -3769,21 +3942,12 @@ void precompute_partition_info_sums_( 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) { + /* WATCHOUT: "+ bps + FLAC__MAX_EXTRA_RESIDUAL_BPS" is the maximum + * assumed size of the average residual magnitude */ + if(FLAC__bitmath_ilog2(default_partition_samples) + bps + FLAC__MAX_EXTRA_RESIDUAL_BPS < 32) { FLAC__uint32 abs_residual_partition_sum; for(partition = residual_sample = 0; partition < partitions; partition++) { @@ -4027,8 +4191,35 @@ FLAC__bool set_partitioned_rice_( * in the partition, so the actual mean is * mean/partition_samples */ +#if 0 /* old simple code */ for(rice_parameter = 0, k = partition_samples; k < mean; rice_parameter++, k <<= 1) ; +#else +#if defined FLAC__CPU_X86_64 /* and other 64-bit arch, too */ + if(mean <= 0x80000000/512) { /* 512: more or less optimal for both 16- and 24-bit input */ +#else + if(mean <= 0x80000000/8) { /* 32-bit arch: use 32-bit math if possible */ +#endif + FLAC__uint32 k2, mean2 = (FLAC__uint32) mean; + rice_parameter = 0; k2 = partition_samples; + while(k2*8 < mean2) { /* requires: mean <= (2^31)/8 */ + rice_parameter += 4; k2 <<= 4; /* tuned for 16-bit input */ + } + while(k2 < mean2) { /* requires: mean <= 2^31 */ + rice_parameter++; k2 <<= 1; + } + } + else { + rice_parameter = 0; k = partition_samples; + if(mean <= FLAC__U64L(0x8000000000000000)/128) /* usually mean is _much_ smaller than this value */ + while(k*128 < mean) { /* requires: mean <= (2^63)/128 */ + rice_parameter += 8; k <<= 8; /* tuned for 24-bit input */ + } + while(k < mean) { /* requires: mean <= 2^63 */ + rice_parameter++; k <<= 1; + } + } +#endif if(rice_parameter >= rice_parameter_limit) { #ifdef DEBUG_VERBOSE fprintf(stderr, "clipping rice_parameter (%u -> %u) @6\n", rice_parameter, rice_parameter_limit - 1); diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c index 41efca5..6d57006 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -30,7 +30,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if HAVE_CONFIG_H +#ifdef HAVE_CONFIG_H # include #endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/window_flac.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/window_flac.c index c99d5b4..dc341a6 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/window_flac.c +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/window_flac.c @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2006-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -30,7 +30,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if HAVE_CONFIG_H +#ifdef HAVE_CONFIG_H # include #endif @@ -41,11 +41,6 @@ #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) { @@ -62,7 +57,7 @@ void FLAC__window_bartlett(FLAC__real *window, const FLAC__int32 L) 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; + window[n] = 2.0f - 2.0f * n / (float)N; } } @@ -72,7 +67,7 @@ void FLAC__window_bartlett_hann(FLAC__real *window, const FLAC__int32 L) 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))); + 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))); } void FLAC__window_blackman(FLAC__real *window, const FLAC__int32 L) @@ -177,16 +172,16 @@ 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++) + 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); + 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; + window[n-1] = 2.0f * n / ((float)L + 1.0f); for (; n <= L; n++) - window[n-1] = ((float)(2 * (L - n)) + 1.0f) / (float)L; + window[n-1] = (float)(2 * (L - n + 1)) / ((float)L + 1.0f); } } @@ -211,6 +206,66 @@ void FLAC__window_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__rea } } +void FLAC__window_partial_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p, const FLAC__real start, const FLAC__real end) +{ + const FLAC__int32 start_n = (FLAC__int32)(start * L); + const FLAC__int32 end_n = (FLAC__int32)(end * L); + const FLAC__int32 N = end_n - start_n; + FLAC__int32 Np, n, i; + + if (p <= 0.0f) + FLAC__window_partial_tukey(window, L, 0.05f, start, end); + else if (p >= 1.0f) + FLAC__window_partial_tukey(window, L, 0.95f, start, end); + else { + + Np = (FLAC__int32)(p / 2.0f * N); + + for (n = 0; n < start_n && n < L; n++) + window[n] = 0.0f; + for (i = 1; n < (start_n+Np) && n < L; n++, i++) + window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * i / Np)); + for (; n < (end_n-Np) && n < L; n++) + window[n] = 1.0f; + for (i = Np; n < end_n && n < L; n++, i--) + window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * i / Np)); + for (; n < L; n++) + window[n] = 0.0f; + } +} + +void FLAC__window_punchout_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p, const FLAC__real start, const FLAC__real end) +{ + const FLAC__int32 start_n = (FLAC__int32)(start * L); + const FLAC__int32 end_n = (FLAC__int32)(end * L); + FLAC__int32 Ns, Ne, n, i; + + if (p <= 0.0f) + FLAC__window_punchout_tukey(window, L, 0.05f, start, end); + else if (p >= 1.0f) + FLAC__window_punchout_tukey(window, L, 0.95f, start, end); + else { + + Ns = (FLAC__int32)(p / 2.0f * start_n); + Ne = (FLAC__int32)(p / 2.0f * (L - end_n)); + + for (n = 0, i = 1; n < Ns && n < L; n++, i++) + window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * i / Ns)); + for (; n < start_n-Ns && n < L; n++) + window[n] = 1.0f; + for (i = Ns; n < start_n && n < L; n++, i--) + window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * i / Ns)); + for (; n < end_n && n < L; n++) + window[n] = 0.0f; + for (i = 1; n < end_n+Ne && n < L; n++, i++) + window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * i / Ne)); + for (; n < L - (Ne) && n < L; n++) + window[n] = 1.0f; + for (i = Ne; n < L; n++, i--) + window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * i / Ne)); + } +} + void FLAC__window_welch(FLAC__real *window, const FLAC__int32 L) { const FLAC__int32 N = L - 1; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/metadata.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/metadata.h index 18bf6d1..02cfc32 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/metadata.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/metadata.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -500,7 +500,7 @@ FLAC_API FLAC__MetadataType FLAC__metadata_simple_iterator_get_block_type(const * \retval unsigned * The length of the metadata block at the current iterator position. * The is same length as that in the - * metadata block header, + * 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); diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/ordinals.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/ordinals.h index c9466c5..0bab9c2 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/ordinals.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/ordinals.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_decoder.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_decoder.h index be402c8..50cd754 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_decoder.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_decoder.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_encoder.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_encoder.h index f0fcab5..646efb7 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_encoder.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_encoder.h @@ -1,6 +1,6 @@ /* libFLAC - Free Lossless Audio Codec library * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2013 Xiph.Org Foundation + * Copyright (C) 2011-2014 Xiph.Org Foundation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -830,28 +830,28 @@ FLAC_API FLAC__bool FLAC__stream_encoder_set_sample_rate(FLAC__StreamEncoder *en * 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 + * leveldo mid-side stereoloose mid-side stereoapodizationmax lpc orderqlp coeff precisionqlp coeff prec searchescape codingexhaustive model searchmin residual partition ordermax residual partition orderrice 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
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);partial_tukey(2) 8 0 false false false 0 6 0
7 true false tukey(0.5);partial_tukey(2) 12 0 false false false 0 6 0
8 true false tukey(0.5);partial_tukey(2);punchout_tukey(3) 12 0 false false false 0 6 0
* * \default \c 5 @@ -920,7 +920,8 @@ FLAC_API FLAC__bool FLAC__stream_encoder_set_loose_mid_side_stereo(FLAC__StreamE * 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. + * \c rectangle, \c triangle, \c tukey(P), \c partial_tukey(n[/ov[/P]]), + * \c punchout_tukey(n[/ov[/P]]), \c welch. * * For \c gauss(STDDEV), STDDEV specifies the standard deviation * (0 +#include +#include +#include + +int get_utf8_argv(int *argc, char ***argv); + +int printf_utf8(const char *format, ...); +int fprintf_utf8(FILE *stream, const char *format, ...); +int vfprintf_utf8(FILE *stream, const char *format, va_list argptr); + +FILE *fopen_utf8(const char *filename, const char *mode); +int stat_utf8(const char *path, struct stat *buffer); +int _stat64_utf8(const char *path, struct __stat64 *buffer); +int chmod_utf8(const char *filename, int pmode); +int utime_utf8(const char *filename, struct utimbuf *times); +int unlink_utf8(const char *filename); +int rename_utf8(const char *oldname, const char *newname); +size_t strlen_utf8(const char *str); +int win_get_console_width(void); +int print_console(FILE *stream, const wchar_t *text, size_t len); +HANDLE WINAPI CreateFile_utf8(const char *lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif +#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp index 2029bc8..563a15e 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -193,47 +193,72 @@ namespace AiffFileHelpers #endif //============================================================================== - static String readCATEChunk (InputStream& input, const uint32 length) + namespace CATEChunk { - 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 - }; + static bool isValidTag (const char* d) noexcept + { + return CharacterFunctions::isLetterOrDigit (d[0]) && CharacterFunctions::isUpperCase (d[0]) + && CharacterFunctions::isLetterOrDigit (d[1]) && CharacterFunctions::isLowerCase (d[1]) + && CharacterFunctions::isLetterOrDigit (d[2]) && CharacterFunctions::isLowerCase (d[2]); + } - const StringArray genres (appleGenres); - StringArray tagsArray; + static bool isAppleGenre (const String& tag) noexcept + { + static const char* appleGenres[] = + { + "Rock/Blues", + "Electronic/Dance", + "Jazz", + "Urban", + "World/Ethnic", + "Cinematic/New Age", + "Orchestral", + "Country/Folk", + "Experimental", + "Other Genre" + }; + + for (int i = 0; i < numElementsInArray (appleGenres); ++i) + if (tag == appleGenres[i]) + return true; - int bytesLeft = (int) mb.getSize(); - const char* data = static_cast (mb.getData()); + return false; + } - while (bytesLeft > 0) + static String read (InputStream& input, const uint32 length) { - const String tag (CharPointer_UTF8 (data), - CharPointer_UTF8 (data + bytesLeft)); + MemoryBlock mb; + input.skipNextBytes (4); + input.readIntoMemoryBlock (mb, (ssize_t) length - 4); - if (tag.isNotEmpty()) - tagsArray.add (data); + StringArray tagsArray; - const int numBytesInTag = genres.contains (tag) ? 118 : 50; - data += numBytesInTag; - bytesLeft -= numBytesInTag; - } + const char* data = static_cast (mb.getData()); + const char* dataEnd = data + mb.getSize(); + + while (data < dataEnd) + { + bool isGenre = false; + + if (isValidTag (data)) + { + const String tag = String (CharPointer_UTF8 (data), CharPointer_UTF8 (dataEnd)); + isGenre = isAppleGenre (tag); + tagsArray.add (tag); + } - return tagsArray.joinIntoString (";"); + data += isGenre ? 118 : 50; + + if (data[0] == 0) + { + if (data + 52 < dataEnd && isValidTag (data + 50)) data += 50; + else if (data + 120 < dataEnd && isValidTag (data + 118)) data += 118; + else if (data + 170 < dataEnd && isValidTag (data + 168)) data += 168; + } + } + + return tagsArray.joinIntoString (";"); + } } //============================================================================== @@ -316,10 +341,10 @@ namespace AiffFileHelpers out.writeByte ((char) labelLength + 1); out.write (label.toUTF8(), labelLength); out.writeByte (0); - } - if ((out.getDataSize() & 1) != 0) - out.writeByte (0); + if ((out.getDataSize() & 1) != 0) + out.writeByte (0); + } } } } @@ -518,7 +543,7 @@ public: else if (type == chunkName ("cate")) { metadataValues.set (AiffAudioFormat::appleTag, - AiffFileHelpers::readCATEChunk (*input, length));; + AiffFileHelpers::CATEChunk::read (*input, length)); } else if ((hasGotVer && hasGotData && hasGotType) || chunkEnd < input->getPosition() @@ -821,12 +846,54 @@ public: return true; } - void readMaxLevels (int64 startSampleInFile, int64 numSamples, - float& min0, float& max0, float& min1, float& max1) + void getSample (int64 sample, float* result) const noexcept override + { + const int num = (int) numChannels; + + if (map == nullptr || ! mappedSection.contains (sample)) + { + jassertfalse; // you must make sure that the window contains all the samples you're going to attempt to read. + + zeromem (result, sizeof (float) * (size_t) num); + return; + } + + float** dest = &result; + const void* source = sampleToPointer (sample); + + if (littleEndian) + { + switch (bitsPerSample) + { + case 8: ReadHelper::read (dest, 0, 1, source, 1, num); break; + case 16: ReadHelper::read (dest, 0, 1, source, 1, num); break; + case 24: ReadHelper::read (dest, 0, 1, source, 1, num); break; + case 32: if (usesFloatingPointData) ReadHelper::read (dest, 0, 1, source, 1, num); + else ReadHelper::read (dest, 0, 1, source, 1, num); break; + default: jassertfalse; break; + } + } + else + { + switch (bitsPerSample) + { + case 8: ReadHelper::read (dest, 0, 1, source, 1, num); break; + case 16: ReadHelper::read (dest, 0, 1, source, 1, num); break; + case 24: ReadHelper::read (dest, 0, 1, source, 1, num); break; + case 32: if (usesFloatingPointData) ReadHelper::read (dest, 0, 1, source, 1, num); + else ReadHelper::read (dest, 0, 1, source, 1, num); break; + default: jassertfalse; break; + } + } + } + + void readMaxLevels (int64 startSampleInFile, int64 numSamples, Range* results, int numChannelsToRead) override { if (numSamples <= 0) { - min0 = max0 = min1 = max1 = 0; + for (int i = 0; i < numChannelsToRead; ++i) + results[i] = Range(); + return; } @@ -834,17 +901,19 @@ public: { jassertfalse; // you must make sure that the window contains all the samples you're going to attempt to read. - min0 = max0 = min1 = max1 = 0; + for (int i = 0; i < numChannelsToRead; ++i) + results[i] = Range(); + 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; + case 8: scanMinAndMax (startSampleInFile, numSamples, results, numChannelsToRead); break; + case 16: scanMinAndMax (startSampleInFile, numSamples, results, numChannelsToRead); break; + case 24: scanMinAndMax (startSampleInFile, numSamples, results, numChannelsToRead); break; + case 32: if (usesFloatingPointData) scanMinAndMax (startSampleInFile, numSamples, results, numChannelsToRead); + else scanMinAndMax (startSampleInFile, numSamples, results, numChannelsToRead); break; default: jassertfalse; break; } } @@ -853,24 +922,17 @@ private: const bool littleEndian; template - void scanMinAndMax (int64 startSampleInFile, int64 numSamples, - float& min0, float& max0, float& min1, float& max1) const noexcept + void scanMinAndMax (int64 startSampleInFile, int64 numSamples, Range* results, int numChannelsToRead) const noexcept { - scanMinAndMax2 (0, startSampleInFile, numSamples, min0, max0); - - if (numChannels > 1) - scanMinAndMax2 (1, startSampleInFile, numSamples, min1, max1); - else - min1 = max1 = 0; + for (int i = 0; i < numChannelsToRead; ++i) + results[i] = scanMinAndMaxForChannel (i, startSampleInFile, numSamples); } template - void scanMinAndMax2 (int channel, int64 startSampleInFile, int64 numSamples, float& mn, float& mx) const noexcept + Range scanMinAndMaxForChannel (int channel, int64 startSampleInFile, int64 numSamples) const noexcept { - if (littleEndian) - scanMinAndMaxInterleaved (channel, startSampleInFile, numSamples, mn, mx); - else - scanMinAndMaxInterleaved (channel, startSampleInFile, numSamples, mn, mx); + return littleEndian ? scanMinAndMaxInterleaved (channel, startSampleInFile, numSamples) + : scanMinAndMaxInterleaved (channel, startSampleInFile, numSamples); } JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MemoryMappedAiffReader) diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h index 01d1484..fe475e3 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp index 6d3aafa..9b4d556 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h index 60bace4..8ae56fc 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp index 58fdd8f..34e6a3b 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h index 20bf094..68f1628 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp index 8a5263c..c7468fb 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -30,9 +30,9 @@ 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) + int bitsPerSample, const StringPairArray& metadata) : AudioFormatWriter (destStream, formatName, sampleRate, - numberOfChannels, bitsPerSample), + numberOfChannels, (unsigned int) bitsPerSample), vbrLevel (vbr), cbrBitrate (cbr), tempWav (".wav") { diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h index 92e581b..77e6be6 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp index 219c93f..cf6fad6 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -25,8 +25,8 @@ /* 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. + you are agreeing that ROLI Ltd. 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 @@ -426,9 +426,8 @@ struct VBRTagData if (flags & 4) { - if (toc != nullptr) - for (int i = 0; i < 100; ++i) - toc[i] = data[i]; + for (int i = 0; i < 100; ++i) + toc[i] = data[i]; data += 100; } @@ -607,7 +606,7 @@ private: 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))); + costab[k] = (float) (1.0 / (2.0 * std::cos (double_Pi * (k * 2 + 1) / divv))); } for (i = 0, j = 0; i < 256; ++i, ++j, table += 32) @@ -692,23 +691,23 @@ private: 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)); + win[0][i] = win[1][i] = (float) (0.5 * std::sin (double_Pi / 72.0 * (2 * i + 1)) / std::cos (double_Pi * (2 * i + 19) / 72.0)); + win[0][i + 18] = win[3][i + 18] = (float) (0.5 * std::sin (double_Pi / 72.0 * (2 * (i + 18) + 1)) / std::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 + 18] = (float) (0.5 / std::cos (piOver72 * (2 * (i + 18) + 19))); + win[3][i + 12] = (float) (0.5 / std::cos (piOver72 * (2 * (i + 12) + 19))); + win[1][i + 24] = (float) (0.5 * std::sin (double_Pi / 24.0 * (2 * i + 13)) / std::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))); + win[3][i + 6] = (float) (0.5 * std::sin (double_Pi / 24.0 * (2 * i + 1)) / std::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)); + win[2][i] = (float) (0.5 * std::sin (double_Pi / 24.0 * (2 * i + 1)) / std::cos (double_Pi * (2 * i + 7) / 24.0)); for (j = 0; j < 4; ++j) { @@ -721,7 +720,7 @@ private: for (i = 0; i < 16; ++i) { - const double t = tan (i * double_Pi / 12.0); + const double t = std::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)); diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h index e89c05d..d3cd792 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -30,8 +30,8 @@ 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. + you are agreeing that ROLI Ltd. 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 diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp index 7cc12a4..6d1f92a 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -33,7 +33,7 @@ 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) + #pragma warning (disable: 4267 4127 4244 4996 4100 4701 4702 4013 4133 4206 4305 4189 4706 4995 4365 4456 4457 4459) #endif #if JUCE_CLANG diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h index 03bc3fb..9d575e0 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.cpp b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.cpp index 17a06da..b87c05d 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.cpp +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -194,7 +194,7 @@ public: bufferList->mNumberBuffers = 1; bufferList->mBuffers[0].mNumberChannels = inputStreamDesc.mChannelsPerFrame; - bufferList->mBuffers[0].mDataByteSize = jmax ((UInt32) 4096, (UInt32) (samplesPerFrame * inputStreamDesc.mBytesPerFrame) + 16); + bufferList->mBuffers[0].mDataByteSize = jmax ((UInt32) 4096, (UInt32) (samplesPerFrame * (int) inputStreamDesc.mBytesPerFrame) + 16); dataBuffer.malloc (bufferList->mBuffers[0].mDataByteSize); bufferList->mBuffers[0].mData = dataBuffer; @@ -262,10 +262,10 @@ public: } int framesToDo = jmin (numSamples, (int) (bufferList->mBuffers[0].mDataByteSize / inputStreamDesc.mBytesPerFrame)); - bufferList->mBuffers[0].mDataByteSize = inputStreamDesc.mBytesPerFrame * framesToDo; + bufferList->mBuffers[0].mDataByteSize = inputStreamDesc.mBytesPerFrame * (UInt32) framesToDo; UInt32 outFlags = 0; - UInt32 actualNumFrames = framesToDo; + UInt32 actualNumFrames = (UInt32) framesToDo; OSStatus err = MovieAudioExtractionFillBuffer (extractor, &actualNumFrames, bufferList, &outFlags); if (err != noErr) { @@ -274,7 +274,7 @@ public: } lastSampleRead = startSampleInFile + actualNumFrames; - const int samplesReceived = actualNumFrames; + const int samplesReceived = (int) actualNumFrames; for (int j = numDestChannels; --j >= 0;) { @@ -298,7 +298,7 @@ public: { for (int j = numDestChannels; --j >= 0;) if (destSamples[j] != nullptr) - zeromem (destSamples[j] + startOffsetInDestBuffer, sizeof (int) * numSamples); + zeromem (destSamples[j] + startOffsetInDestBuffer, sizeof (int) * (size_t) numSamples); break; } diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.h index 6ef6a4e..a7cd60b 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp index 473e744..24ad58c 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -609,16 +609,18 @@ namespace WavFileHelpers { static MemoryBlock createFrom (const StringPairArray& values) { - const String s = values[WavAudioFormat::tracktionLoopInfo]; - MemoryBlock data; + MemoryOutputStream out; + const String s (values[WavAudioFormat::tracktionLoopInfo]); if (s.isNotEmpty()) { - MemoryOutputStream os (data, false); - os.writeString (s); + out.writeString (s); + + if ((out.getDataSize() & 1) != 0) + out.writeByte (0); } - return data; + return out.getMemoryBlock(); } }; @@ -1265,8 +1267,8 @@ private: class MemoryMappedWavReader : public MemoryMappedAudioFormatReader { public: - MemoryMappedWavReader (const File& file, const WavAudioFormatReader& reader) - : MemoryMappedAudioFormatReader (file, reader, reader.dataChunkStart, + MemoryMappedWavReader (const File& wavFile, const WavAudioFormatReader& reader) + : MemoryMappedAudioFormatReader (wavFile, reader, reader.dataChunkStart, reader.dataLength, reader.bytesPerFrame) { } @@ -1289,12 +1291,39 @@ public: return true; } - void readMaxLevels (int64 startSampleInFile, int64 numSamples, - float& min0, float& max0, float& min1, float& max1) override + void getSample (int64 sample, float* result) const noexcept override + { + const int num = (int) numChannels; + + if (map == nullptr || ! mappedSection.contains (sample)) + { + jassertfalse; // you must make sure that the window contains all the samples you're going to attempt to read. + + zeromem (result, sizeof (float) * (size_t) num); + return; + } + + float** dest = &result; + const void* source = sampleToPointer (sample); + + switch (bitsPerSample) + { + case 8: ReadHelper::read (dest, 0, 1, source, 1, num); break; + case 16: ReadHelper::read (dest, 0, 1, source, 1, num); break; + case 24: ReadHelper::read (dest, 0, 1, source, 1, num); break; + case 32: if (usesFloatingPointData) ReadHelper::read (dest, 0, 1, source, 1, num); + else ReadHelper::read (dest, 0, 1, source, 1, num); break; + default: jassertfalse; break; + } + } + + void readMaxLevels (int64 startSampleInFile, int64 numSamples, Range* results, int numChannelsToRead) override { if (numSamples <= 0) { - min0 = max0 = min1 = max1 = 0; + for (int i = 0; i < numChannelsToRead; ++i) + results[i] = Range(); + return; } @@ -1302,32 +1331,29 @@ public: { jassertfalse; // you must make sure that the window contains all the samples you're going to attempt to read. - min0 = max0 = min1 = max1 = 0; + for (int i = 0; i < numChannelsToRead; ++i) + results[i] = Range(); + 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; + case 8: scanMinAndMax (startSampleInFile, numSamples, results, numChannelsToRead); break; + case 16: scanMinAndMax (startSampleInFile, numSamples, results, numChannelsToRead); break; + case 24: scanMinAndMax (startSampleInFile, numSamples, results, numChannelsToRead); break; + case 32: if (usesFloatingPointData) scanMinAndMax (startSampleInFile, numSamples, results, numChannelsToRead); + else scanMinAndMax (startSampleInFile, numSamples, results, numChannelsToRead); break; default: jassertfalse; break; } } private: template - void scanMinAndMax (int64 startSampleInFile, int64 numSamples, - float& min0, float& max0, float& min1, float& max1) const noexcept + void scanMinAndMax (int64 startSampleInFile, int64 numSamples, Range* results, int numChannelsToRead) const noexcept { - scanMinAndMaxInterleaved (0, startSampleInFile, numSamples, min0, max0); - - if (numChannels > 1) - scanMinAndMaxInterleaved (1, startSampleInFile, numSamples, min1, max1); - else - min1 = max1 = 0; + for (int i = 0; i < numChannelsToRead; ++i) + results[i] = scanMinAndMaxInterleaved (i, startSampleInFile, numSamples); } JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MemoryMappedWavReader) diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h index 62de05a..ff0ca94 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp index f5f5664..746ce64 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h index 8c10ee1..88cd438 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/bitwise.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/bitwise.c index 710a560..3f5244f 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/bitwise.c +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/bitwise.c @@ -15,6 +15,10 @@ ********************************************************************/ +#ifdef JUCE_MSVC + #pragma warning (disable: 4456 4457 4459) +#endif + /* We're 'LSb' endian; if we write a word but read individual bits, then we'll read the lsb first */ diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor1.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor1.c index 8ea1978..68967f4 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor1.c +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor1.c @@ -15,6 +15,10 @@ ********************************************************************/ +#ifdef JUCE_MSVC + #pragma warning (disable: 4456 4457 4459) +#endif + #include #include #include @@ -850,7 +854,7 @@ int floor1_encode(oggpack_buffer *opb,vorbis_block *vb, /* generate the partition's first stage cascade value */ if(csubbits){ - int maxval[8]; + int maxval[8] = { 0 }; for(k=0;kclass_subbook[classx][k]; if(booknum<0){ diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/sharedbook.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/sharedbook.c index 2f27b86..2b5e76e 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/sharedbook.c +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/sharedbook.c @@ -15,6 +15,10 @@ ********************************************************************/ +#ifdef JUCE_MSVC + #pragma warning (disable: 4456 4457 4459) +#endif + #include #include #include diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisfile.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisfile.c index 79b6688..83af2e8 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisfile.c +++ b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisfile.c @@ -15,6 +15,10 @@ ********************************************************************/ +#ifdef JUCE_MSVC + #pragma warning (disable: 4456 4457 4459) +#endif + #include #include #include diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.cpp b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.cpp index ad87176..fc3f9ff 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.cpp +++ b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h index 196d436..fee1e06 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h +++ b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -119,7 +119,7 @@ public: 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. + here aren't suitable), this will return nullptr. @param streamToWriteTo the stream that the data will go to - this will be deleted by the AudioFormatWriter object when it's no longer diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp index f0196c8..c51ebcb 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp +++ b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.h b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.h index f560347..3ad9213 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.h +++ b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp index 5db3149..498c79e 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp +++ b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -46,6 +46,7 @@ bool AudioFormatReader::read (int* const* destSamples, { jassert (numDestChannels > 0); // you have to actually give this some channels to work with! + const size_t originalNumSamplesToRead = (size_t) numSamplesToRead; int startOffsetInDestBuffer = 0; if (startSampleInSource < 0) @@ -64,7 +65,7 @@ bool AudioFormatReader::read (int* const* destSamples, if (numSamplesToRead <= 0) return true; - if (! readSamples (const_cast (destSamples), + if (! readSamples (const_cast (destSamples), jmin ((int) numChannels, numDestChannels), startOffsetInDestBuffer, startSampleInSource, numSamplesToRead)) return false; @@ -87,13 +88,13 @@ bool AudioFormatReader::read (int* const* destSamples, if (lastFullChannel != nullptr) for (int i = (int) numChannels; i < numDestChannels; ++i) if (destSamples[i] != nullptr) - memcpy (destSamples[i], lastFullChannel, sizeof (int) * (size_t) numSamplesToRead); + memcpy (destSamples[i], lastFullChannel, sizeof (int) * originalNumSamplesToRead); } else { for (int i = (int) numChannels; i < numDestChannels; ++i) if (destSamples[i] != nullptr) - zeromem (destSamples[i], sizeof (int) * (size_t) numSamplesToRead); + zeromem (destSamples[i], sizeof (int) * originalNumSamplesToRead); } } @@ -162,7 +163,7 @@ void AudioFormatReader::read (AudioSampleBuffer* buffer, } else { - HeapBlock chans ((size_t) numTargetChannels); + HeapBlock chans ((size_t) numTargetChannels + 1); readChannels (*this, chans, buffer, startSample, numSamples, readerStartSample, numTargetChannels); } @@ -229,20 +230,21 @@ void AudioFormatReader::readMaxLevels (int64 startSampleInFile, int64 numSamples 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) + if (numChannels < 2) { - lowestRight = levels[1].getStart(); - highestRight = levels[1].getEnd(); + readMaxLevels (startSampleInFile, numSamples, levels, (int) numChannels); + levels[1] = levels[0]; } else { - lowestRight = lowestLeft; - highestRight = highestLeft; + readMaxLevels (startSampleInFile, numSamples, levels, 2); } + + lowestLeft = levels[0].getStart(); + highestLeft = levels[0].getEnd(); + lowestRight = levels[1].getStart(); + highestRight = levels[1].getEnd(); } int64 AudioFormatReader::searchForLevel (int64 startSample, diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.h b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.h index 065388a..9a972cf 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.h +++ b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -44,7 +44,7 @@ protected: @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). + can leave it as nullptr). @param formatName the description that will be returned by the getFormatName() method */ @@ -247,8 +247,8 @@ protected: template struct ReadHelper { - typedef AudioData::Pointer DestType; - typedef AudioData::Pointer SourceType; + typedef AudioData::Pointer DestType; + typedef AudioData::Pointer SourceType; template static void read (TargetType* const* destData, int destOffset, int numDestChannels, diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp index fb086ef..35ddeeb 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp +++ b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h index d7ff5f7..c7f74bb 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h +++ b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -58,10 +58,10 @@ public: @see isLooping */ - void setLooping (bool shouldLoop); + void setLooping (bool shouldLoop) override; /** Returns whether loop-mode is turned on or not. */ - bool isLooping() const { return looping; } + bool isLooping() const override { return looping; } /** Returns the reader that's being used. */ AudioFormatReader* getAudioFormatReader() const noexcept { return reader; } diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp index 065f36a..5082070 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp +++ b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.h b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.h index 9098c75..6e85424 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.h +++ b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp index bbe1ebd..9ca1724 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp +++ b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -57,17 +57,10 @@ bool AudioSubsectionReader::readSamples (int** destSamples, int numDestChannels, startSampleInFile + startSample, numSamples); } -void AudioSubsectionReader::readMaxLevels (int64 startSampleInFile, - int64 numSamples, - float& lowestLeft, - float& highestLeft, - float& lowestRight, - float& highestRight) +void AudioSubsectionReader::readMaxLevels (int64 startSampleInFile, int64 numSamples, Range* results, int numChannelsToRead) { startSampleInFile = jmax ((int64) 0, startSampleInFile); numSamples = jmax ((int64) 0, jmin (numSamples, length - startSampleInFile)); - source->readMaxLevels (startSampleInFile + startSample, numSamples, - lowestLeft, highestLeft, - lowestRight, highestRight); + source->readMaxLevels (startSampleInFile + startSample, numSamples, results, numChannelsToRead); } diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h index fb9e6a0..4293c45 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h +++ b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -68,8 +68,7 @@ public: int64 startSampleInFile, int numSamples) override; void readMaxLevels (int64 startSample, int64 numSamples, - float& lowestLeft, float& highestLeft, - float& lowestRight, float& highestRight) override; + Range* results, int numChannelsToRead) override; private: diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp b/JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp index ecfe1d4..ca1e6d8 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp +++ b/JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -28,7 +28,8 @@ BufferingAudioReader::BufferingAudioReader (AudioFormatReader* sourceReader, : AudioFormatReader (nullptr, sourceReader->getFormatName()), source (sourceReader), thread (timeSliceThread), nextReadPosition (0), - numBlocks (1 + (samplesToBuffer / samplesPerBlock)) + numBlocks (1 + (samplesToBuffer / samplesPerBlock)), + timeoutMs (0) { sampleRate = source->sampleRate; lengthInSamples = source->lengthInSamples; diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h b/JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h index 8f950be..a8f5955 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h +++ b/JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h b/JuceLibraryCode/modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h index 2ec6388..a63869b 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h +++ b/JuceLibraryCode/modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -70,6 +70,12 @@ public: /** Touches the memory for the given sample, to force it to be loaded into active memory. */ void touchSample (int64 sample) const noexcept; + /** Returns the samples for all channels at a given sample position. + The result array must be large enough to hold a value for each channel + that this reader contains. + */ + virtual void getSample (int64 sampleIndex, float* result) const noexcept = 0; + /** Returns the number of bytes currently being mapped */ size_t getNumBytesUsed() const { return map != nullptr ? map->getSize() : 0; } @@ -91,12 +97,12 @@ protected: /** 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 + Range scanMinAndMaxInterleaved (int channel, int64 startSampleInFile, int64 numSamples) const noexcept { typedef AudioData::Pointer SourceType; - SourceType (addBytesToPointer (sampleToPointer (startSampleInFile), ((int) bitsPerSample / 8) * channel), (int) numChannels) - .findMinAndMax ((size_t) numSamples, mn, mx); + return SourceType (addBytesToPointer (sampleToPointer (startSampleInFile), ((int) bitsPerSample / 8) * channel), (int) numChannels) + .findMinAndMax ((size_t) numSamples); } JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MemoryMappedAudioFormatReader) diff --git a/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.cpp b/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.cpp index b68042f..8a157b6 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.cpp +++ b/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.h b/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.h index c15194e..13cc25f 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.h +++ b/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -50,8 +50,8 @@ 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. + that ROLI Ltd. 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 diff --git a/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.mm b/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.mm index 9b32ae5..6f562c0 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.mm +++ b/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_formats/juce_module_info b/JuceLibraryCode/modules/juce_audio_formats/juce_module_info index e355719..78dc367 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/juce_module_info +++ b/JuceLibraryCode/modules/juce_audio_formats/juce_module_info @@ -1,7 +1,7 @@ { "id": "juce_audio_formats", "name": "JUCE audio file format codecs", - "version": "3.0.8", + "version": "3.2.0", "description": "Classes for reading and writing various audio file formats.", "website": "http://www.juce.com/juce", "license": "GPL/Commercial", diff --git a/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.cpp b/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.cpp index 4e7583e..7440c16 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.cpp +++ b/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -119,7 +119,7 @@ void SamplerVoice::startNote (const int midiNoteNumber, if (sound->releaseSamples > 0) releaseDelta = (float) (-pitchRatio / sound->releaseSamples); else - releaseDelta = 0.0f; + releaseDelta = -1.0f; } else { diff --git a/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.h b/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.h index f801bf2..74a8afc 100644 --- a/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.h +++ b/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -126,7 +126,7 @@ public: void startNote (int midiNoteNumber, float velocity, SynthesiserSound*, int pitchWheel) override; void stopNote (float velocity, bool allowTailOff) override; - void pitchWheelMoved (int newValue); + void pitchWheelMoved (int newValue) override; void controllerMoved (int controllerNumber, int newValue) override; void renderNextBlock (AudioSampleBuffer&, int startSample, int numSamples) override; diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp b/JuceLibraryCode/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp index b4a3ea7..127226b 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -329,12 +329,16 @@ struct AAXClasses { if (component != nullptr && component->pluginEditor != nullptr) { - AudioProcessorEditor::ParameterControlHighlightInfo info; - info.parameterIndex = getParamIndexFromID (paramID); - info.isHighlighted = isHighlighted; - info.suggestedColour = getColourFromHighlightEnum (colour); + if (! isBypassParam (paramID)) + { + AudioProcessorEditor::ParameterControlHighlightInfo info; + info.parameterIndex = getParamIndexFromID (paramID); + info.isHighlighted = isHighlighted; + info.suggestedColour = getColourFromHighlightEnum (colour); + + component->pluginEditor->setControlHighlight (info); + } - component->pluginEditor->setControlHighlight (info); return AAX_SUCCESS; } @@ -463,13 +467,28 @@ struct AAXClasses return AAX_SUCCESS; } + juce::MemoryBlock& getTemporaryChunkMemory() const + { + ScopedLock sl (perThreadDataLock); + const Thread::ThreadID currentThread = Thread::getCurrentThreadId(); + + if (ChunkMemoryBlock::Ptr m = perThreadFilterData [currentThread]) + return m->data; + + ChunkMemoryBlock::Ptr m (new ChunkMemoryBlock()); + perThreadFilterData.set (currentThread, m); + return m->data; + } + AAX_Result GetChunkSize (AAX_CTypeID chunkID, uint32_t* oSize) const override { if (chunkID != juceChunkType) return AAX_CEffectParameters::GetChunkSize (chunkID, oSize); + juce::MemoryBlock& tempFilterData = getTemporaryChunkMemory(); tempFilterData.reset(); pluginInstance->getStateInformation (tempFilterData); + *oSize = (uint32_t) tempFilterData.getSize(); return AAX_SUCCESS; } @@ -479,8 +498,10 @@ struct AAXClasses if (chunkID != juceChunkType) return AAX_CEffectParameters::GetChunk (chunkID, oChunk); + juce::MemoryBlock& tempFilterData = getTemporaryChunkMemory(); + if (tempFilterData.getSize() == 0) - pluginInstance->getStateInformation (tempFilterData); + return 20700 /*AAX_ERROR_PLUGIN_API_INVALID_THREAD*/; oChunk->fSize = (int32_t) tempFilterData.getSize(); tempFilterData.copyTo (oChunk->fData, 0, tempFilterData.getSize()); @@ -495,6 +516,18 @@ struct AAXClasses return AAX_CEffectParameters::SetChunk (chunkID, chunk); pluginInstance->setStateInformation ((void*) chunk->fData, chunk->fSize); + + // Notify Pro Tools that the parameters were updated. + // Without it a bug happens in these circumstances: + // * A preset is saved with the RTAS version of the plugin (".tfx" preset format). + // * The preset is loaded in PT 10 using the AAX version. + // * The session is then saved, and closed. + // * The saved session is loaded, but acting as if the preset was never loaded. + const int numParameters = pluginInstance->getNumParameters(); + + for (int i = 0; i < numParameters; ++i) + SetParameterNormalizedValue (IndexAsParamID (i), (double) pluginInstance->getParameter(i)); + return AAX_SUCCESS; } @@ -542,13 +575,41 @@ struct AAXClasses return result; } + AAX_Result GetParameterValueFromString (AAX_CParamID paramID, double* result, const AAX_IString& text) const override + { + if (isBypassParam (paramID)) + { + *result = (text.Get()[0] == 'B') ? 1 : 0; + return AAX_SUCCESS; + } + + if (AudioProcessorParameter* param = pluginInstance->getParameters() [getParamIndexFromID (paramID)]) + { + *result = param->getValueForText (text.Get()); + return AAX_SUCCESS; + } + + return AAX_CEffectParameters::GetParameterValueFromString (paramID, result, text); + } + AAX_Result GetParameterStringFromValue (AAX_CParamID paramID, double value, AAX_IString* result, int32_t maxLen) const override { if (isBypassParam (paramID)) - result->Set (value == 0 ? "Off" - : (maxLen >= 8 ? "Bypassed" : "Byp")); + { + result->Set (value == 0 ? "Off" : (maxLen >= 8 ? "Bypassed" : "Byp")); + } else - result->Set (pluginInstance->getParameterText (getParamIndexFromID (paramID), maxLen).toRawUTF8()); + { + const int paramIndex = getParamIndexFromID (paramID); + juce::String text; + + if (AudioProcessorParameter* param = pluginInstance->getParameters() [paramIndex]) + text = param->getText ((float) value, maxLen); + else + text = pluginInstance->getParameterText (paramIndex, maxLen); + + result->Set (text.toRawUTF8()); + } return AAX_SUCCESS; } @@ -781,10 +842,8 @@ struct AAXClasses for (uint32_t i = 0; i < numMidiEvents; ++i) { - // (This 8-byte alignment is a workaround to a bug in the AAX SDK. Hopefully can be - // removed in future when the packet structure size is fixed) - const AAX_CMidiPacket& m = *addBytesToPointer (midiStream->mBuffer, - i * ((sizeof (AAX_CMidiPacket) + 7) & ~(size_t) 7)); + const AAX_CMidiPacket& m = midiStream->mBuffer[i]; + jassert ((int) m.mTimestamp < bufferSize); midiBuffer.addEvent (m.mData, (int) m.mLength, jlimit (0, (int) bufferSize - 1, (int) m.mTimestamp)); @@ -859,9 +918,11 @@ struct AAXClasses for (int parameterIndex = 0; parameterIndex < numParameters; ++parameterIndex) { + AAX_CString paramName (audioProcessor.getParameterName (parameterIndex, 31).toRawUTF8()); + AAX_IParameter* parameter = new AAX_CParameter (IndexAsParamID (parameterIndex), - audioProcessor.getParameterName (parameterIndex, 31).toRawUTF8(), + paramName, audioProcessor.getParameterDefaultValue (parameterIndex), AAX_CLinearTaperDelegate(), AAX_CNumberDisplayDelegate(), @@ -914,9 +975,21 @@ struct AAXClasses AAX_CSampleRate sampleRate; int lastBufferSize; - // tempFilterData is initialized in GetChunkSize. - // To avoid generating it again in GetChunk, we keep it as a member. - mutable juce::MemoryBlock tempFilterData; + struct ChunkMemoryBlock : public ReferenceCountedObject + { + juce::MemoryBlock data; + + typedef ReferenceCountedObjectPtr Ptr; + }; + + // temporary filter data is generated in GetChunkSize + // and the size of the data returned. To avoid generating + // it again in GetChunk, we need to store it somewhere. + // However, as GetChunkSize and GetChunk can be called + // on different threads, we store it in thread dependant storage + // in a hash map with the thread id as a key. + mutable HashMap perThreadFilterData; + CriticalSection perThreadDataLock; JUCE_DECLARE_NON_COPYABLE (JuceAAX_Processor) }; @@ -1034,7 +1107,12 @@ struct AAXClasses check (descriptor.AddProcPtr ((void*) JuceAAX_GUI::Create, kAAX_ProcPtrID_Create_EffectGUI)); check (descriptor.AddProcPtr ((void*) JuceAAX_Processor::Create, kAAX_ProcPtrID_Create_EffectParameters)); + #ifdef JucePlugin_PreferredChannelConfigurations_AAX + const short channelConfigs[][2] = { JucePlugin_PreferredChannelConfigurations_AAX }; + #else const short channelConfigs[][2] = { JucePlugin_PreferredChannelConfigurations }; + #endif + const int numConfigs = numElementsInArray (channelConfigs); // You need to actually add some configurations to the JucePlugin_PreferredChannelConfigurations diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.mm b/JuceLibraryCode/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.mm index 5c450cb..d01eb7d 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.mm +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/AU/juce_AU_Resources.r b/JuceLibraryCode/modules/juce_audio_plugin_client/AU/juce_AU_Resources.r index e87d74a..2a345b2 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/AU/juce_AU_Resources.r +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/AU/juce_AU_Resources.r @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm b/JuceLibraryCode/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm index 051348d..99dd9e0 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -223,47 +223,57 @@ public: { switch (inID) { - case juceFilterObjectPropertyID: - outWritable = false; - outDataSize = sizeof (void*) * 2; - return noErr; - - case kAudioUnitProperty_OfflineRender: - outWritable = true; - outDataSize = sizeof (UInt32); - return noErr; - - case kMusicDeviceProperty_InstrumentCount: - outDataSize = sizeof (UInt32); - outWritable = false; - return noErr; - - case kAudioUnitProperty_CocoaUI: - #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 - // (On 10.4, there's a random obj-c dispatching crash when trying to load a cocoa UI) - if (SystemStats::getOperatingSystemType() >= SystemStats::MacOSX_10_5) - #endif - { - outDataSize = sizeof (AudioUnitCocoaViewInfo); + case juceFilterObjectPropertyID: + outWritable = false; + outDataSize = sizeof (void*) * 2; + return noErr; + + case kAudioUnitProperty_OfflineRender: outWritable = true; + outDataSize = sizeof (UInt32); return noErr; - } - break; + case kMusicDeviceProperty_InstrumentCount: + outDataSize = sizeof (UInt32); + outWritable = false; + return noErr; - #if JucePlugin_ProducesMidiOutput - case kAudioUnitProperty_MIDIOutputCallbackInfo: - outDataSize = sizeof (CFArrayRef); - outWritable = false; - return noErr; + case kAudioUnitProperty_CocoaUI: + #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + // (On 10.4, there's a random obj-c dispatching crash when trying to load a cocoa UI) + if (SystemStats::getOperatingSystemType() >= SystemStats::MacOSX_10_5) + #endif + { + outDataSize = sizeof (AudioUnitCocoaViewInfo); + outWritable = true; + return noErr; + } - case kAudioUnitProperty_MIDIOutputCallback: - outDataSize = sizeof (AUMIDIOutputCallbackStruct); - outWritable = true; - return noErr; - #endif + break; + + #if JucePlugin_ProducesMidiOutput + case kAudioUnitProperty_MIDIOutputCallbackInfo: + outDataSize = sizeof (CFArrayRef); + outWritable = false; + return noErr; + + case kAudioUnitProperty_MIDIOutputCallback: + outDataSize = sizeof (AUMIDIOutputCallbackStruct); + outWritable = true; + return noErr; + #endif - default: break; + case kAudioUnitProperty_ParameterStringFromValue: + outDataSize = sizeof (AudioUnitParameterStringFromValue); + outWritable = false; + return noErr; + + case kAudioUnitProperty_ParameterValueFromString: + outDataSize = sizeof (AudioUnitParameterValueFromString); + outWritable = false; + return noErr; + + default: break; } } @@ -280,7 +290,7 @@ public: switch (inID) { case juceFilterObjectPropertyID: - ((void**) outData)[0] = (void*) static_cast (juceFilter); + ((void**) outData)[0] = (void*) static_cast (juceFilter); ((void**) outData)[1] = (void*) this; return noErr; @@ -305,7 +315,7 @@ public: // (NB: this may be the host's bundle, not necessarily the component's) NSBundle* bundle = [NSBundle bundleForClass: cls.cls]; - AudioUnitCocoaViewInfo* info = static_cast (outData); + AudioUnitCocoaViewInfo* info = static_cast (outData); info->mCocoaAUViewClass[0] = (CFStringRef) [juceStringToNS (class_getName (cls.cls)) retain]; info->mCocoaAUViewBundleLocation = (CFURLRef) [[NSURL fileURLWithPath: [bundle bundlePath]] retain]; } @@ -327,7 +337,48 @@ public: } #endif - default: break; + case kAudioUnitProperty_ParameterValueFromString: + { + if (AudioUnitParameterValueFromString* pv = (AudioUnitParameterValueFromString*) outData) + { + if (juceFilter != nullptr) + { + const String text (String::fromCFString (pv->inString)); + + if (AudioProcessorParameter* param = juceFilter->getParameters() [(int) pv->inParamID]) + pv->outValue = param->getValueForText (text); + else + pv->outValue = text.getFloatValue(); + + return noErr; + } + } + } + break; + + case kAudioUnitProperty_ParameterStringFromValue: + { + if (AudioUnitParameterStringFromValue* pv = (AudioUnitParameterStringFromValue*) outData) + { + if (juceFilter != nullptr) + { + const float value = (float) *(pv->inValue); + String text; + + if (AudioProcessorParameter* param = juceFilter->getParameters() [(int) pv->inParamID]) + text = param->getText ((float) *(pv->inValue), 0); + else + text = String (value); + + pv->outString = text.toCFString(); + return noErr; + } + } + } + break; + + default: + break; } } @@ -466,7 +517,8 @@ public: { outParameterInfo.flags = (UInt32) (kAudioUnitParameterFlag_IsWritable | kAudioUnitParameterFlag_IsReadable - | kAudioUnitParameterFlag_HasCFNameString); + | kAudioUnitParameterFlag_HasCFNameString + | kAudioUnitParameterFlag_ValuesHaveStrings); const String name (juceFilter->getParameterName (index)); @@ -608,7 +660,7 @@ public: &outCycleStartBeat, &outCycleEndBeat) != noErr) { - // If the host doesn't support this callback, use the sample time from lastTimeStamp: + // If the host doesn't support this callback, then use the sample time from lastTimeStamp: outCurrentSampleInTimeLine = lastTimeStamp.mSampleTime; } @@ -622,12 +674,9 @@ public: void sendAUEvent (const AudioUnitEventType type, const int index) { - if (AUEventListenerNotify != 0) - { - auEvent.mEventType = type; - auEvent.mArgument.mParameter.mParameterID = (AudioUnitParameterID) index; - AUEventListenerNotify (0, 0, &auEvent); - } + auEvent.mEventType = type; + auEvent.mArgument.mParameter.mParameterID = (AudioUnitParameterID) index; + AUEventListenerNotify (0, 0, &auEvent); } void audioProcessorParameterChanged (AudioProcessor*, int index, float /*newValue*/) @@ -647,7 +696,13 @@ public: void audioProcessorChanged (AudioProcessor*) { - PropertyChanged (kAudioUnitProperty_Latency, kAudioUnitScope_Global, 0); + PropertyChanged (kAudioUnitProperty_Latency, kAudioUnitScope_Global, 0); + PropertyChanged (kAudioUnitProperty_ParameterList, kAudioUnitScope_Global, 0); + PropertyChanged (kAudioUnitProperty_ParameterInfo, kAudioUnitScope_Global, 0); + + refreshCurrentPreset(); + + PropertyChanged (kAudioUnitProperty_PresentPreset, kAudioUnitScope_Global, 0); } bool StreamFormatWritable (AudioUnitScope, AudioUnitElement) override @@ -664,9 +719,9 @@ public: ComponentResult Initialize() override { #if ! JucePlugin_IsSynth - const int numIns = GetInput(0) != 0 ? (int) GetInput(0)->GetStreamFormat().mChannelsPerFrame : 0; + const int numIns = findNumInputChannels(); #endif - const int numOuts = GetOutput(0) != 0 ? (int) GetOutput(0)->GetStreamFormat().mChannelsPerFrame : 0; + const int numOuts = findNumOutputChannels(); bool isValidChannelConfig = false; @@ -710,19 +765,32 @@ public: return JuceAUBaseClass::Reset (inScope, inElement); } + int findNumInputChannels() + { + #if ! JucePlugin_IsSynth + if (AUInputElement* e = GetInput(0)) + return (int) e->GetStreamFormat().mChannelsPerFrame; + #endif + + return 0; + } + + int findNumOutputChannels() + { + if (AUOutputElement* e = GetOutput(0)) + return (int) e->GetStreamFormat().mChannelsPerFrame; + + return 0; + } + void prepareToPlay() { if (juceFilter != nullptr) { - juceFilter->setPlayConfigDetails ( - #if ! JucePlugin_IsSynth - (int) GetInput(0)->GetStreamFormat().mChannelsPerFrame, - #else - 0, - #endif - (int) GetOutput(0)->GetStreamFormat().mChannelsPerFrame, - getSampleRate(), - (int) GetMaxFramesPerSlice()); + juceFilter->setPlayConfigDetails (findNumInputChannels(), + findNumOutputChannels(), + getSampleRate(), + (int) GetMaxFramesPerSlice()); bufferSpace.setSize (juceFilter->getNumInputChannels() + juceFilter->getNumOutputChannels(), (int) GetMaxFramesPerSlice() + 32); @@ -937,6 +1005,8 @@ public: #if ! JucePlugin_SilenceInProducesSilenceOut ioActionFlags &= (AudioUnitRenderActionFlags) ~kAudioUnitRenderAction_OutputIsSilence; + #else + ignoreUnused (ioActionFlags); #endif } @@ -1129,9 +1199,9 @@ public: }; //============================================================================== - struct JuceUIViewClass : public ObjCClass + struct JuceUIViewClass : public ObjCClass { - JuceUIViewClass() : ObjCClass ("JUCEAUView_") + JuceUIViewClass() : ObjCClass ("JUCEAUView_") { addIvar ("filter"); addIvar ("au"); @@ -1220,9 +1290,9 @@ public: }; //============================================================================== - struct JuceUICreationClass : public ObjCClass + struct JuceUICreationClass : public ObjCClass { - JuceUICreationClass() : ObjCClass ("JUCE_AUCocoaViewClass_") + JuceUICreationClass() : ObjCClass ("JUCE_AUCocoaViewClass_") { addMethod (@selector (interfaceVersion), interfaceVersion, @encode (unsigned int), "@:"); addMethod (@selector (description), description, @encode (NSString*), "@:"); @@ -1249,9 +1319,9 @@ public: if (AudioUnitGetProperty (inAudioUnit, juceFilterObjectPropertyID, kAudioUnitScope_Global, 0, pointers, &propertySize) == noErr) { - if (AudioProcessor* filter = static_cast (pointers[0])) + if (AudioProcessor* filter = static_cast (pointers[0])) if (AudioProcessorEditor* editorComp = filter->createEditorIfNeeded()) - return EditorCompHolder::createViewFor (filter, static_cast (pointers[1]), editorComp); + return EditorCompHolder::createViewFor (filter, static_cast (pointers[1]), editorComp); } return nil; @@ -1262,7 +1332,7 @@ private: //============================================================================== ScopedPointer juceFilter; AudioSampleBuffer bufferSpace; - HeapBlock channels; + HeapBlock channels; MidiBuffer midiEvents, incomingEvents; bool prepared; AUChannelInfo channelInfo [numChannelConfigs]; @@ -1280,6 +1350,21 @@ private: presetsArray.clear(); } + void refreshCurrentPreset() + { + // this will make the AU host re-read and update the current preset name + // in case it was changed here in the plug-in: + + const int currentProgramNumber = juceFilter->getCurrentProgram(); + const String currentProgramName = juceFilter->getProgramName (currentProgramNumber); + + AUPreset currentPreset; + currentPreset.presetNumber = currentProgramNumber; + currentPreset.presetName = currentProgramName.toCFString(); + + SetAFactoryPresetAsCurrent (currentPreset); + } + JUCE_DECLARE_NON_COPYABLE (JuceAU) }; @@ -1363,8 +1448,8 @@ private: aren't so careful) */ jassert (Component::getCurrentlyModalComponent() == nullptr); - if (JuceAU::EditorCompHolder* editorCompHolder = dynamic_cast (windowComp->getChildComponent(0))) - if (AudioProcessorEditor* audioProcessEditor = dynamic_cast (editorCompHolder->getChildComponent(0))) + if (JuceAU::EditorCompHolder* editorCompHolder = dynamic_cast (windowComp->getChildComponent(0))) + if (AudioProcessorEditor* audioProcessEditor = dynamic_cast (editorCompHolder->getChildComponent(0))) juceFilter->editorBeingDeleted (audioProcessEditor); windowComp = nullptr; diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode1.cpp b/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode1.cpp index dddda73..c3f952c 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode1.cpp +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode1.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode2.cpp b/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode2.cpp index dfdc252..cbb411a 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode2.cpp +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode2.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode3.cpp b/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode3.cpp index 9c6a873..4fe301a 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode3.cpp +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode3.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode_Header.h b/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode_Header.h index 2fe0e20..3325523 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode_Header.h +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode_Header.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacUtilities.mm b/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacUtilities.mm index 22c3575..e438000 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacUtilities.mm +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacUtilities.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinUtilities.cpp b/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinUtilities.cpp index 7395136..e76c430 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinUtilities.cpp +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinUtilities.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp b/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp index 9d1cb97..75703d9 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -413,7 +413,7 @@ public: JuceCustomUIView* const owner; int titleW, titleH; - Component* getEditor() const { return getChildComponent (0); } + juce::Component* getEditor() const { return getChildComponent (0); } JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EditorCompWrapper) }; @@ -446,7 +446,6 @@ public: } //============================================================================== -protected: ComponentResult GetDelaySamplesLong (long* aNumSamples) override { if (aNumSamples != nullptr) @@ -472,7 +471,7 @@ protected: DefineMasterBypassControlIndex (bypassControlIndex); for (int i = 0; i < juceFilter->getNumParameters(); ++i) - AddControl (new JucePluginControl (juceFilter, i)); + AddControl (new JucePluginControl (*juceFilter, i)); // we need to do this midi log-in to get timecode, regardless of whether // the plugin actually uses midi... @@ -664,6 +663,29 @@ protected: return CProcess::UpdateControlValue (controlIndex, value); } + #if JUCE_WINDOWS + Boolean HandleKeystroke (EventRecord* e) override + { + if (juce::Component* modalComp = juce::Component::getCurrentlyModalComponent()) + { + if (juce::Component* focused = modalComp->getCurrentlyFocusedComponent()) + { + switch (e->message & charCodeMask) + { + case kReturnCharCode: + case kEnterCharCode: focused->keyPressed (KeyPress (KeyPress::returnKey)); break; + case kEscapeCharCode: focused->keyPressed (KeyPress (KeyPress::escapeKey)); break; + default: break; + } + + return true; + } + } + + return false; + } + #endif + //============================================================================== bool getCurrentPosition (AudioPlayHead::CurrentPositionInfo& info) override { @@ -785,17 +807,17 @@ private: { public: //============================================================================== - JucePluginControl (AudioProcessor* const juceFilter_, const int index_) - : juceFilter (juceFilter_), - index (index_) + JucePluginControl (AudioProcessor& p, const int i) + : processor (p), index (i) { + CPluginControl::SetValue (GetDefaultValue()); } //============================================================================== OSType GetID() const { return index + 1; } - long GetDefaultValue() const { return floatToLong (juceFilter->getParameterDefaultValue (index)); } + long GetDefaultValue() const { return floatToLong (processor.getParameterDefaultValue (index)); } void SetDefaultValue (long) {} - long GetNumSteps() const { return juceFilter->getParameterNumSteps (index); } + long GetNumSteps() const { return processor.getParameterNumSteps (index); } long ConvertStringToValue (const char* valueString) const { @@ -807,16 +829,16 @@ private: void GetNameOfLength (char* name, int maxLength, OSType inControllerType) const { // Pro-tools expects all your parameters to have valid names! - jassert (juceFilter->getParameterName (index, maxLength).isNotEmpty()); + jassert (processor.getParameterName (index, maxLength).isNotEmpty()); - juceFilter->getParameterName (index, maxLength).copyToUTF8 (name, (size_t) maxLength + 1); + processor.getParameterName (index, maxLength).copyToUTF8 (name, (size_t) maxLength + 1); } long GetPriority() const { return kFicCooperativeTaskPriority; } long GetOrientation() const { - return juceFilter->isParameterOrientationInverted (index) + return processor.isParameterOrientationInverted (index) ? kDAE_RightMinLeftMax | kDAE_TopMinBottomMax | kDAE_RotarySingleDotMode | kDAE_RotaryRightMinLeftMax : kDAE_LeftMinRightMax | kDAE_BottomMinTopMax | kDAE_RotarySingleDotMode | kDAE_RotaryLeftMinRightMax; } @@ -825,17 +847,17 @@ private: void GetValueString (char* valueString, int maxLength, long value) const { - juceFilter->getParameterText (index, maxLength).copyToUTF8 (valueString, (size_t) maxLength + 1); + processor.getParameterText (index, maxLength).copyToUTF8 (valueString, (size_t) maxLength + 1); } Cmn_Bool IsAutomatable() const { - return juceFilter->isParameterAutomatable (index); + return processor.isParameterAutomatable (index); } private: //============================================================================== - AudioProcessor* const juceFilter; + AudioProcessor& processor; const int index; JUCE_DECLARE_NON_COPYABLE (JucePluginControl) diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h b/JuceLibraryCode/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h index bdf7269..92a9dca 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -53,14 +53,14 @@ public: startPlaying(); } - ~StandalonePluginHolder() + virtual ~StandalonePluginHolder() { deletePlugin(); shutDownAudioDevices(); } //============================================================================== - void createPlugin() + virtual void createPlugin() { AudioProcessor::setTypeOfNextNewPlugin (AudioProcessor::wrapperType_Standalone); processor = createPluginFilter(); @@ -72,7 +72,7 @@ public: 44100, 512); } - void deletePlugin() + virtual void deletePlugin() { stopPlaying(); processor = nullptr; @@ -120,9 +120,9 @@ public: processor->getStateInformation (data); if (! fc.getResult().replaceWithData (data.getData(), data.getSize())) - AlertWindow::showMessageBox (AlertWindow::WarningIcon, - TRANS("Error whilst saving"), - TRANS("Couldn't write to the specified file!")); + AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon, + TRANS("Error whilst saving"), + TRANS("Couldn't write to the specified file!")); } } @@ -140,9 +140,9 @@ public: if (fc.getResult().loadFileAsData (data)) processor->setStateInformation (data.getData(), (int) data.getSize()); else - AlertWindow::showMessageBox (AlertWindow::WarningIcon, - TRANS("Error whilst loading"), - TRANS("Couldn't read from the specified file!")); + AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon, + TRANS("Error whilst loading"), + TRANS("Couldn't read from the specified file!")); } } @@ -365,7 +365,13 @@ public: m.addSeparator(); m.addItem (4, TRANS("Reset to default state")); - switch (m.showAt (&optionsButton)) + m.showMenuAsync (PopupMenu::Options(), + ModalCallbackFunction::forComponent (menuCallback, this)); + } + + void handleMenuResult (int result) + { + switch (result) { case 1: pluginHolder->showAudioSettingsDialog(); break; case 2: pluginHolder->askUserToSaveState(); break; @@ -375,6 +381,12 @@ public: } } + static void menuCallback (int result, StandaloneFilterWindow* button) + { + if (button != nullptr && result != 0) + button->handleMenuResult (result); + } + void resized() override { DocumentWindow::resized(); diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp b/JuceLibraryCode/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp index 38c29ee..1a75f0f 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -221,7 +221,7 @@ public: {} } - juce_DeclareSingleton (SharedMessageThread, false); + juce_DeclareSingleton (SharedMessageThread, false) private: bool initialised; @@ -245,8 +245,8 @@ class JuceVSTWrapper : public AudioEffectX, { public: //============================================================================== - JuceVSTWrapper (audioMasterCallback audioMaster, AudioProcessor* const af) - : AudioEffectX (audioMaster, af->getNumPrograms(), af->getNumParameters()), + JuceVSTWrapper (audioMasterCallback audioMasterCB, AudioProcessor* const af) + : AudioEffectX (audioMasterCB, af->getNumPrograms(), af->getNumParameters()), filter (af), chunkMemoryTime (0), speakerIn (kSpeakerArrEmpty), @@ -256,6 +256,7 @@ public: isProcessing (false), isBypassed (false), hasShutdown (false), + isInSizeWindow (false), firstProcessCallback (true), shouldDeleteEditor (false), #if JUCE_64BIT @@ -281,7 +282,6 @@ public: canProcessReplacing (true); isSynth ((JucePlugin_IsSynth) != 0); - noTail (filter->getTailLengthSeconds() <= 0); setInitialDelay (filter->getLatencySamples()); programsAreChunks (true); @@ -409,7 +409,7 @@ public: if (strcmp (text, "hasCockosViewAsConfig") == 0) { useNSView = true; - return 0xbeef0000; + return (VstInt32) 0xbeef0000; } #endif @@ -664,17 +664,17 @@ public: if (rate <= 0.0) rate = 44100.0; - const int blockSize = getBlockSize(); - jassert (blockSize > 0); + const int currentBlockSize = getBlockSize(); + jassert (currentBlockSize > 0); firstProcessCallback = true; filter->setNonRealtime (getCurrentProcessLevel() == 4 /* kVstProcessLevelOffline */); - filter->setPlayConfigDetails (numInChans, numOutChans, rate, blockSize); + filter->setPlayConfigDetails (numInChans, numOutChans, rate, currentBlockSize); deleteTempChannels(); - filter->prepareToPlay (rate, blockSize); + filter->prepareToPlay (rate, currentBlockSize); midiEvents.ensureSize (2048); midiEvents.clear(); @@ -846,6 +846,22 @@ public: } } + bool string2parameter (VstInt32 index, char* text) override + { + if (filter != nullptr) + { + jassert (isPositiveAndBelow (index, filter->getNumParameters())); + + if (AudioProcessorParameter* p = filter->getParameters()[index]) + { + filter->setParameter (index, p->getValueForText (String::fromUTF8 (text))); + return true; + } + } + + return false; + } + void getParameterName (VstInt32 index, char* text) override { if (filter != nullptr) @@ -907,7 +923,7 @@ public: { short channelConfigs[][2] = { JucePlugin_PreferredChannelConfigurations }; - Array channelConfigsSorted; + Array channelConfigsSorted; ChannelConfigComparator comp; for (int i = 0; i < numElementsInArray (channelConfigs); ++i) @@ -1185,6 +1201,8 @@ public: #elif JUCE_LINUX editorComp->addToDesktop (0, ptr); hostWindow = (Window) ptr; + Window editorWnd = (Window) editorComp->getWindowHandle(); + XReparentWindow (display, editorWnd, hostWindow, 0, 0); #else hostWindow = attachComponentToWindowRef (editorComp, ptr, useNSView); #endif @@ -1228,7 +1246,16 @@ public: { if (editorComp != nullptr) { - if (! (canHostDo (const_cast ("sizeWindow")) && sizeWindow (newWidth, newHeight))) + bool sizeWasSuccessful = false; + + if (canHostDo (const_cast ("sizeWindow"))) + { + isInSizeWindow = true; + sizeWasSuccessful = sizeWindow (newWidth, newHeight); + isInSizeWindow = false; + } + + if (! sizeWasSuccessful) { // some hosts don't support the sizeWindow call, so do it manually.. #if JUCE_MAC @@ -1284,7 +1311,10 @@ public: } if (ComponentPeer* peer = editorComp->getPeer()) + { peer->handleMovedOrResized(); + peer->getComponent().repaint(); + } } } @@ -1355,27 +1385,30 @@ public: void childBoundsChanged (Component* child) override { - child->setTopLeftPosition (0, 0); + if (! wrapper.isInSizeWindow) + { + child->setTopLeftPosition (0, 0); - const int cw = child->getWidth(); - const int ch = child->getHeight(); + const int cw = child->getWidth(); + const int ch = child->getHeight(); - #if JUCE_MAC - if (wrapper.useNSView) - setTopLeftPosition (0, getHeight() - ch); - #endif + #if JUCE_MAC + if (wrapper.useNSView) + setTopLeftPosition (0, getHeight() - ch); + #endif - wrapper.resizeHostWindow (cw, ch); + wrapper.resizeHostWindow (cw, ch); - #if ! JUCE_LINUX // setSize() on linux causes renoise and energyxt to fail. - setSize (cw, ch); - #else - XResizeWindow (display, (Window) getWindowHandle(), cw, ch); - #endif + #if ! JUCE_LINUX // setSize() on linux causes renoise and energyxt to fail. + setSize (cw, ch); + #else + XResizeWindow (display, (Window) getWindowHandle(), (unsigned int) cw, (unsigned int) ch); + #endif - #if JUCE_MAC - wrapper.resizeHostWindow (cw, ch); // (doing this a second time seems to be necessary in tracktion) - #endif + #if JUCE_MAC + wrapper.resizeHostWindow (cw, ch); // (doing this a second time seems to be necessary in tracktion) + #endif + } } void handleAsyncUpdate() override @@ -1422,7 +1455,7 @@ private: VSTMidiEventList outgoingEvents; VstSpeakerArrangementType speakerIn, speakerOut; int numInChans, numOutChans; - bool isProcessing, isBypassed, hasShutdown, firstProcessCallback; + bool isProcessing, isBypassed, hasShutdown, isInSizeWindow, firstProcessCallback; bool shouldDeleteEditor, useNSView; HeapBlock channels; Array tempChannels; // see note in processReplacing() diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm b/JuceLibraryCode/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm index e8a31a6..065ff6d 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -86,9 +86,18 @@ void* attachComponentToWindowRef (Component* comp, void* parentWindowOrView, boo if (! isNSView) { NSWindow* hostWindow = [[NSWindow alloc] initWithWindowRef: parentWindowOrView]; - [hostWindow retain]; + + if (getHostType().isCubase7orLater()) + { + [hostWindow setReleasedWhenClosed: NO]; + } + else + { + [hostWindow retain]; + [hostWindow setReleasedWhenClosed: YES]; + } + [hostWindow setCanHide: YES]; - [hostWindow setReleasedWhenClosed: YES]; HIViewRef parentView = 0; @@ -202,8 +211,12 @@ void detachComponentFromWindowRef (Component* comp, void* window, bool isNSView) comp->removeFromDesktop(); [pluginView release]; - [hostWindow release]; + if (getHostType().isCubase7orLater()) + [hostWindow close]; + else + [hostWindow release]; + #if JUCE_MODAL_LOOPS_PERMITTED static bool needToRunMessageLoop = ! getHostType().isReaper(); // The event loop needs to be run between closing the window and deleting the plugin, @@ -214,6 +227,7 @@ void detachComponentFromWindowRef (Component* comp, void* window, bool isNSView) if (needToRunMessageLoop) for (int i = 20; --i >= 0;) MessageManager::getInstance()->runDispatchLoopUntil (1); + #endif return; } diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp b/JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp index cb71927..1fb10ad 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -195,9 +195,29 @@ public: return false; } - void toString (Vst::ParamValue, Vst::String128 result) const override + void toString (Vst::ParamValue value, Vst::String128 result) const override { - toString128 (result, owner.getParameterText (paramIndex, 128)); + if (AudioProcessorParameter* p = owner.getParameters()[paramIndex]) + toString128 (result, p->getText ((float) value, 128)); + else + // remain backward-compatible with old JUCE code + toString128 (result, owner.getParameterText (paramIndex, 128)); + } + + bool fromString (const Vst::TChar* text, Vst::ParamValue& valueNormalized) const override + { + if (AudioProcessorParameter* p = owner.getParameters()[paramIndex]) + { + valueNormalized = p->getValueForText (getStringFromVstTChars (text)); + return true; + } + + return false; + } + + static String getStringFromVstTChars (const Vst::TChar* text) + { + return juce::String (juce::CharPointer_UTF16 (reinterpret_cast (text))); } Vst::ParamValue toPlain (Vst::ParamValue v) const override { return v; } @@ -211,6 +231,18 @@ public: }; //============================================================================== + tresult PLUGIN_API setComponentState (IBStream* stream) override + { + // Cubase and Nuendo need to inform the host of the current parameter values + if (AudioProcessor* const pluginInstance = getPluginInstance()) + { + for (int i = 0; i < pluginInstance->getNumParameters(); ++i) + setParamNormalized ((Vst::ParamID) i, (double) pluginInstance->getParameter (i)); + } + + return Vst::EditController::setComponentState (stream); + } + void setAudioProcessor (JuceAudioProcessor* audioProc) { if (audioProcessor != audioProc) @@ -265,7 +297,14 @@ public: //============================================================================== void audioProcessorParameterChangeGestureBegin (AudioProcessor*, int index) override { beginEdit ((Vst::ParamID) index); } - void audioProcessorParameterChanged (AudioProcessor*, int index, float newValue) override { performEdit ((Vst::ParamID) index, (double) newValue); } + + void audioProcessorParameterChanged (AudioProcessor*, int index, float newValue) override + { + // NB: Cubase has problems if performEdit is called without setParamNormalized + EditController::setParamNormalized ((Vst::ParamID) index, (double) newValue); + performEdit ((Vst::ParamID) index, (double) newValue); + } + void audioProcessorParameterChangeGestureEnd (AudioProcessor*, int index) override { endEdit ((Vst::ParamID) index); } void audioProcessorChanged (AudioProcessor*) override diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.mm b/JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.mm index 73a0d88..75362a2 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.mm +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/juce_audio_plugin_client.h b/JuceLibraryCode/modules/juce_audio_plugin_client/juce_audio_plugin_client.h index 974479c..7264393 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/juce_audio_plugin_client.h +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/juce_audio_plugin_client.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/juce_module_info b/JuceLibraryCode/modules/juce_audio_plugin_client/juce_module_info index e72373d..425670f 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/juce_module_info +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/juce_module_info @@ -1,7 +1,7 @@ { "id": "juce_audio_plugin_client", "name": "JUCE audio plugin wrapper classes", - "version": "3.0.8", + "version": "3.2.0", "description": "Classes for building VST, VST3, RTAS, AAX and AU plugins.", "website": "http://www.juce.com/juce", "license": "GPL/Commercial", @@ -19,12 +19,12 @@ { "file": "RTAS/juce_RTAS_DigiCode1.cpp", "warnings": "disabled", "stdcall": "1", "target": "xcode, msvc" }, { "file": "RTAS/juce_RTAS_DigiCode2.cpp", "warnings": "disabled", "stdcall": "1", "target": "xcode, msvc" }, { "file": "RTAS/juce_RTAS_DigiCode3.cpp", "warnings": "disabled", "stdcall": "1", "target": "xcode, msvc" }, - { "file": "RTAS/juce_RTAS_MacResources.r", "target": "xcode" }, + { "file": "RTAS/juce_RTAS_MacResources.r", "target": "xcode", "RTASOnly": "1" }, { "file": "RTAS/juce_RTAS_MacUtilities.mm", "target": "xcode" }, { "file": "RTAS/juce_RTAS_WinResources.rsr", "target": "msvc" }, { "file": "RTAS/juce_RTAS_WinUtilities.cpp", "target": "msvc", "warnings": "disabled", "stdcall": "1" }, { "file": "RTAS/juce_RTAS_Wrapper.cpp", "warnings": "disabled", "stdcall": "1", "target": "xcode, msvc" }, - { "file": "AU/juce_AU_Resources.r", "target": "xcode" }, + { "file": "AU/juce_AU_Resources.r", "target": "xcode", "AudioUnitOnly": "1" }, { "file": "AU/juce_AU_Wrapper.mm", "target": "xcode" }, { "file": "AAX/juce_AAX_Wrapper.cpp", "target": "xcode, msvc" }, { "file": "AAX/juce_AAX_Wrapper.mm", "target": "xcode" }, diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_CarbonVisibility.h b/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_CarbonVisibility.h index cef7e60..87f85dd 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_CarbonVisibility.h +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_CarbonVisibility.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -46,7 +46,7 @@ static pascal OSStatus windowVisibilityBodge (EventHandlerCallRef, EventRef e, v return eventNotHandledErr; } -static void attachWindowHidingHooks (Component* comp, void* hostWindowRef, NSWindow* nsWindow) +inline void attachWindowHidingHooks (Component* comp, void* hostWindowRef, NSWindow* nsWindow) { const EventTypeSpec eventsToCatch[] = { @@ -64,7 +64,7 @@ static void attachWindowHidingHooks (Component* comp, void* hostWindowRef, NSWin comp->getProperties().set ("carbonEventRef", String::toHexString ((pointer_sized_int) (void*) ref)); } -static void removeWindowHidingHooks (Component* comp) +inline void removeWindowHidingHooks (Component* comp) { if (comp != nullptr) RemoveEventHandler ((EventHandlerRef) (void*) (pointer_sized_int) @@ -72,8 +72,8 @@ static void removeWindowHidingHooks (Component* comp) } #elif JUCE_MAC - static void attachWindowHidingHooks (void*, void*, void*) {} - static void removeWindowHidingHooks (void*) {} + inline void attachWindowHidingHooks (void*, void*, void*) {} + inline void removeWindowHidingHooks (void*) {} #endif #endif // JUCE_CARBONVISIBILITY_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h b/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h index b3f51b5..f9b14ba 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_FakeMouseMoveGenerator.h b/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_FakeMouseMoveGenerator.h index e00cb23..a7336dd 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_FakeMouseMoveGenerator.h +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_FakeMouseMoveGenerator.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_IncludeModuleHeaders.h b/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_IncludeModuleHeaders.h index 32d06d7..f37fe00 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_IncludeModuleHeaders.h +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_IncludeModuleHeaders.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -22,13 +22,16 @@ ============================================================================== */ +#ifndef JUCE_INCLUDEMODULEHEADERS_H_INCLUDED +#define JUCE_INCLUDEMODULEHEADERS_H_INCLUDED + #include "../juce_audio_plugin_client.h" using namespace juce; namespace juce { - #if JUCE_MAC && ! DOXYGEN + #if JUCE_MAC #define Point juce::Point #define Component juce::Component @@ -44,3 +47,5 @@ namespace juce } extern AudioProcessor* JUCE_CALLTYPE createPluginFilterOfType (AudioProcessor::WrapperType); + +#endif // JUCE_INCLUDEMODULEHEADERS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_IncludeSystemHeaders.h b/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_IncludeSystemHeaders.h index 8f76b14..2aaae18 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_IncludeSystemHeaders.h +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_IncludeSystemHeaders.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_PluginHostType.h b/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_PluginHostType.h index c321fc1..f1f1789 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_PluginHostType.h +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_PluginHostType.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -47,6 +47,7 @@ public: CakewalkSonarGeneric, DigidesignProTools, DigitalPerformer, + FinalCut, FruityLoops, MagixSamplitude, MergingPyramix, @@ -57,6 +58,7 @@ public: SteinbergCubase5Bridged, SteinbergCubase6, SteinbergCubase7, + SteinbergCubase8, SteinbergCubaseGeneric, SteinbergNuendo3, SteinbergNuendo4, @@ -71,8 +73,8 @@ public: StudioOne, Tracktion3, TracktionGeneric, - WaveBurner, - VBVSTScanner + VBVSTScanner, + WaveBurner }; HostType type; @@ -82,9 +84,11 @@ public: bool isAdobeAudition() const noexcept { return type == AdobeAudition; } bool isArdour() const noexcept { return type == Ardour; } bool isDigitalPerformer() const noexcept { return type == DigitalPerformer; } - bool isCubase() const noexcept { return type == SteinbergCubase4 || type == SteinbergCubase5 || type == SteinbergCubase5Bridged || type == SteinbergCubase6 || type == SteinbergCubase7 || type == SteinbergCubaseGeneric; } + bool isCubase() const noexcept { return type == SteinbergCubase4 || type == SteinbergCubase5 || type == SteinbergCubase5Bridged || type == SteinbergCubase6 || type == SteinbergCubase7 || type == SteinbergCubase8 || type == SteinbergCubaseGeneric; } + bool isCubase7orLater() const noexcept { return isCubase() && ! (type == SteinbergCubase4 || type == SteinbergCubase5 || type == SteinbergCubase6); } bool isCubaseBridged() const noexcept { return type == SteinbergCubase5Bridged; } bool isLogic() const noexcept { return type == AppleLogic; } + bool isFinalCut() const noexcept { return type == FinalCut; } bool isFruityLoops() const noexcept { return type == FruityLoops; } bool isNuendo() const noexcept { return type == SteinbergNuendo3 || type == SteinbergNuendo4 || type == SteinbergNuendo5 || type == SteinbergNuendoGeneric; } bool isPremiere() const noexcept { return type == AdobePremierePro; } @@ -118,6 +122,7 @@ public: case CakewalkSonarGeneric: return "Cakewalk Sonar"; case DigidesignProTools: return "ProTools"; case DigitalPerformer: return "DigitalPerformer"; + case FinalCut: return "Final Cut"; case FruityLoops: return "FruityLoops"; case MagixSamplitude: return "Magix Samplitude"; case MergingPyramix: return "Pyramix"; @@ -128,6 +133,7 @@ public: case SteinbergCubase5Bridged: return "Steinberg Cubase 5 Bridged"; case SteinbergCubase6: return "Steinberg Cubase 6"; case SteinbergCubase7: return "Steinberg Cubase 7"; + case SteinbergCubase8: return "Steinberg Cubase 8"; case SteinbergCubaseGeneric: return "Steinberg Cubase"; case SteinbergNuendo3: return "Steinberg Nuendo 3"; case SteinbergNuendo4: return "Steinberg Nuendo 4"; @@ -164,6 +170,8 @@ private: const String hostFilename (File (hostPath).getFileName()); #if JUCE_MAC + if (hostPath.containsIgnoreCase ("Final Cut Pro.app")) return FinalCut; + if (hostPath.containsIgnoreCase ("Final Cut Pro Trial.app")) return FinalCut; if (hostPath.containsIgnoreCase ("Live 6.")) return AbletonLive6; if (hostPath.containsIgnoreCase ("Live 7.")) return AbletonLive7; if (hostPath.containsIgnoreCase ("Live 8.")) return AbletonLive8; @@ -179,6 +187,7 @@ private: if (hostFilename.containsIgnoreCase ("Cubase 5")) return SteinbergCubase5; if (hostFilename.containsIgnoreCase ("Cubase 6")) return SteinbergCubase6; if (hostFilename.containsIgnoreCase ("Cubase 7")) return SteinbergCubase7; + if (hostFilename.containsIgnoreCase ("Cubase 8")) return SteinbergCubase8; if (hostFilename.containsIgnoreCase ("Cubase")) return SteinbergCubaseGeneric; if (hostPath.containsIgnoreCase ("Wavelab 7")) return SteinbergWavelab7; if (hostPath.containsIgnoreCase ("Wavelab 8")) return SteinbergWavelab8; @@ -208,6 +217,7 @@ private: if (hostFilename.containsIgnoreCase ("Cubase5")) return SteinbergCubase5; if (hostFilename.containsIgnoreCase ("Cubase6")) return SteinbergCubase6; if (hostFilename.containsIgnoreCase ("Cubase7")) return SteinbergCubase7; + if (hostFilename.containsIgnoreCase ("Cubase8")) return SteinbergCubase8; if (hostFilename.containsIgnoreCase ("Cubase")) return SteinbergCubaseGeneric; if (hostFilename.containsIgnoreCase ("VSTBridgeApp")) return SteinbergCubase5Bridged; if (hostPath.containsIgnoreCase ("Wavelab 5")) return SteinbergWavelab5; @@ -219,6 +229,7 @@ private: if (hostFilename.containsIgnoreCase ("TestHost")) return SteinbergTestHost; if (hostFilename.containsIgnoreCase ("rm-host")) return MuseReceptorGeneric; if (hostFilename.startsWith ("FL")) return FruityLoops; + if (hostFilename.contains ("ilbridge.")) return FruityLoops; if (hostPath.containsIgnoreCase ("Studio One")) return StudioOne; if (hostPath.containsIgnoreCase ("Digital Performer")) return DigitalPerformer; if (hostFilename.containsIgnoreCase ("VST_Scanner")) return VBVSTScanner; diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp b/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp index 82e7e47..19ee6a7 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -22,7 +22,7 @@ ============================================================================== */ -#if _MSC_VER || JUCE_MINGW +#if _MSC_VER || defined (__MINGW32__) || defined (__MINGW64__) #include #endif diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_WindowsHooks.h b/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_WindowsHooks.h index a5cde30..72ff450 100644 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_WindowsHooks.h +++ b/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_WindowsHooks.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp b/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp index cbd2542..9b534a8 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp +++ b/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.h b/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.h index d0af201..8f299a8 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.h +++ b/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp b/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp index 0afa7c7..e27f128 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp +++ b/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h b/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h index a6f1607..f810f32 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h +++ b/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h index 46c2b10..b0738ed 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h +++ b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm index 2877509..035220d 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm +++ b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -184,7 +184,7 @@ namespace AudioUnitFormatHelpers const char* const utf8 = fileOrIdentifier.toUTF8(); if (CFURLRef url = CFURLCreateFromFileSystemRepresentation (0, (const UInt8*) utf8, - strlen (utf8), file.isDirectory())) + (CFIndex) strlen (utf8), file.isDirectory())) { CFBundleRef bundleRef = CFBundleCreate (kCFAllocatorDefault, url); CFRelease (url); @@ -345,8 +345,8 @@ public: refreshParameterList(); updateNumChannels(); producesMidiMessages = canProduceMidiOutput(); - setPlayConfigDetails (numInputBusChannels * numInputBusses, - numOutputBusChannels * numOutputBusses, + setPlayConfigDetails ((int) (numInputBusChannels * numInputBusses), + (int) (numOutputBusChannels * numOutputBusses), rate, blockSize); setLatencySamples (0); @@ -420,7 +420,7 @@ public: UInt32 sampleRateSize = sizeof (sampleRateIn); const Float64 sr = newSampleRate; - for (int i = 0; i < numInputBusses; ++i) + for (AudioUnitElement i = 0; i < numInputBusses; ++i) { AudioUnitGetProperty (audioUnit, kAudioUnitProperty_SampleRate, kAudioUnitScope_Input, i, &sampleRateIn, &sampleRateSize); @@ -428,7 +428,7 @@ public: AudioUnitSetProperty (audioUnit, kAudioUnitProperty_SampleRate, kAudioUnitScope_Input, i, &sr, sizeof (sr)); } - for (int i = 0; i < numOutputBusses; ++i) + for (AudioUnitElement i = 0; i < numOutputBusses; ++i) { AudioUnitGetProperty (audioUnit, kAudioUnitProperty_SampleRate, kAudioUnitScope_Output, i, &sampleRateOut, &sampleRateSize); @@ -440,9 +440,9 @@ public: AudioUnitSetProperty (audioUnit, kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global, 0, &frameSize, sizeof (frameSize)); - setPlayConfigDetails (numInputBusChannels * numInputBusses, - numOutputBusChannels * numOutputBusses, - newSampleRate, estimatedSamplesPerBlock); + setPlayConfigDetails ((int) (numInputBusChannels * numInputBusses), + (int) (numOutputBusChannels * numOutputBusses), + (double) newSampleRate, estimatedSamplesPerBlock); Float64 latencySecs = 0.0; UInt32 latencySize = sizeof (latencySecs); @@ -463,13 +463,13 @@ public: stream.mBitsPerChannel = 32; stream.mChannelsPerFrame = numInputBusChannels; - for (int i = 0; i < numInputBusses; ++i) + for (AudioUnitElement 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) + for (AudioUnitElement i = 0; i < numOutputBusses; ++i) AudioUnitSetProperty (audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, i, &stream, sizeof (stream)); } @@ -518,8 +518,8 @@ public: 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); + for (AudioUnitElement i = 0; i < numInputBusses; ++i) AudioUnitReset (audioUnit, kAudioUnitScope_Input, i); + for (AudioUnitElement i = 0; i < numOutputBusses; ++i) AudioUnitReset (audioUnit, kAudioUnitScope_Output, i); } void processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages) override @@ -530,17 +530,17 @@ public: { timeStamp.mHostTime = AudioGetCurrentHostTime(); - for (int i = 0; i < numOutputBusses; ++i) + for (AudioUnitElement i = 0; i < numOutputBusses; ++i) { if (AudioBufferList* const abl = getAudioBufferListForBus(i)) { abl->mNumberBuffers = numOutputBusChannels; - for (int j = 0; j < numOutputBusChannels; ++j) + for (AudioUnitElement 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); + abl->mBuffers[j].mDataByteSize = sizeof (float) * (size_t) numSamples; + abl->mBuffers[j].mData = buffer.getWritePointer ((int) (i * numOutputBusChannels + j)); } } } @@ -557,19 +557,19 @@ public: if (midiEventSize <= 3) MusicDeviceMIDIEvent (audioUnit, midiEventData[0], midiEventData[1], midiEventData[2], - midiEventPosition); + (UInt32) midiEventPosition); else - MusicDeviceSysEx (audioUnit, midiEventData, midiEventSize); + MusicDeviceSysEx (audioUnit, midiEventData, (UInt32) midiEventSize); } midiMessages.clear(); } - for (int i = 0; i < numOutputBusses; ++i) + for (AudioUnitElement i = 0; i < numOutputBusses; ++i) { AudioUnitRenderActionFlags flags = 0; - AudioUnitRender (audioUnit, &flags, &timeStamp, i, numSamples, getAudioBufferListForBus (i)); + AudioUnitRender (audioUnit, &flags, &timeStamp, i, (UInt32) numSamples, getAudioBufferListForBus (i)); } timeStamp.mSampleTime += numSamples; @@ -796,7 +796,7 @@ public: CFDataRef data = (CFDataRef) CFWriteStreamCopyProperty (stream, kCFStreamPropertyDataWritten); - destData.setSize (bytesWritten); + destData.setSize ((size_t) bytesWritten); destData.copyFrom (CFDataGetBytePtr (data), 0, destData.getSize()); CFRelease (data); @@ -911,7 +911,7 @@ private: HeapBlock outputBufferList; AudioTimeStamp timeStamp; AudioSampleBuffer* currentBuffer; - int numInputBusChannels, numOutputBusChannels, numInputBusses, numOutputBusses; + AudioUnitElement numInputBusChannels, numOutputBusChannels, numInputBusses, numOutputBusses; AudioUnit audioUnit; AUEventListenerRef eventListenerRef; @@ -941,7 +941,7 @@ private: info.inputProcRefCon = this; info.inputProc = renderGetInputCallback; - for (int i = 0; i < numInputBusses; ++i) + for (AudioUnitElement i = 0; i < numInputBusses; ++i) AudioUnitSetProperty (audioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, i, &info, sizeof (info)); } @@ -1028,11 +1028,11 @@ private: break; case kAudioUnitEvent_BeginParameterChangeGesture: - beginParameterChangeGesture (event.mArgument.mParameter.mParameterID); + beginParameterChangeGesture ((int) event.mArgument.mParameter.mParameterID); break; case kAudioUnitEvent_EndParameterChangeGesture: - endParameterChangeGesture (event.mArgument.mParameter.mParameterID); + endParameterChangeGesture ((int) event.mArgument.mParameter.mParameterID); break; default: @@ -1062,7 +1062,7 @@ private: for (UInt32 i = 0; i < ioData->mNumberBuffers; ++i) { - const int bufferChannel = inBusNumber * numInputBusChannels + i; + const int bufferChannel = (int) (inBusNumber * numInputBusChannels + i); if (bufferChannel < currentBuffer->getNumChannels()) { @@ -1131,16 +1131,16 @@ private: if (ph != nullptr && ph->getCurrentPosition (result)) { - setIfNotNull (outTimeSig_Numerator, result.timeSigNumerator); - setIfNotNull (outTimeSig_Denominator, result.timeSigDenominator); - setIfNotNull (outDeltaSampleOffsetToNextBeat, 0); //xxx + setIfNotNull (outTimeSig_Numerator, (UInt32) result.timeSigNumerator); + setIfNotNull (outTimeSig_Denominator, (UInt32) result.timeSigDenominator); + setIfNotNull (outDeltaSampleOffsetToNextBeat, (UInt32) 0); //xxx setIfNotNull (outCurrentMeasureDownBeat, result.ppqPositionOfLastBarStart); //xxx wrong } else { - setIfNotNull (outDeltaSampleOffsetToNextBeat, 0); - setIfNotNull (outTimeSig_Numerator, 4); - setIfNotNull (outTimeSig_Denominator, 4); + setIfNotNull (outDeltaSampleOffsetToNextBeat, (UInt32) 0); + setIfNotNull (outTimeSig_Numerator, (UInt32) 4); + setIfNotNull (outTimeSig_Denominator, (UInt32) 4); setIfNotNull (outCurrentMeasureDownBeat, 0); } @@ -1226,12 +1226,12 @@ private: return offsetof (AudioBufferList, mBuffers) + (sizeof (AudioBuffer) * numOutputBusChannels); } - AudioBufferList* getAudioBufferListForBus (int busIndex) const noexcept + AudioBufferList* getAudioBufferListForBus (AudioUnitElement busIndex) const noexcept { return addBytesToPointer (outputBufferList.getData(), getAudioBufferSizeInBytes() * busIndex); } - int getElementCount (AudioUnitScope scope) const noexcept + AudioUnitElement getElementCount (AudioUnitScope scope) const noexcept { UInt32 count; UInt32 countSize = sizeof (count); @@ -1240,7 +1240,7 @@ private: || countSize == 0) count = 1; - return (int) count; + return count; } void updateNumChannels() @@ -1266,17 +1266,17 @@ private: const int outChannels = (int) supportedChannels[i].outChannels; if (inChannels < 0) - maximumNumIns = jmin (maximumNumIns, inChannels); + maximumNumIns = jmin (maximumNumIns, inChannels); else explicitNumIns = jmax (explicitNumIns, inChannels); if (outChannels < 0) - maximumNumOuts = jmin (maximumNumOuts, outChannels); + 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) + 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)) { @@ -1284,8 +1284,8 @@ private: } else { - numInputBusChannels = explicitNumIns; - numOutputBusChannels = explicitNumOuts; + numInputBusChannels = (AudioUnitElement) explicitNumIns; + numOutputBusChannels = (AudioUnitElement) explicitNumOuts; if (maximumNumIns == -1 || (maximumNumIns < 0 && explicitNumIns <= -maximumNumIns)) numInputBusChannels = 2; diff --git a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp index 1bb2413..d315b07 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp +++ b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h index 21d3167..15c1095 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h +++ b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Common.h b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Common.h index d7e66cd..0017e1c 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Common.h +++ b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Common.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -250,7 +250,7 @@ public: break; case Steinberg::Vst::Event::kDataEvent: - result.addEvent (MidiMessage::createSysExMessage (e.data.bytes, e.data.size), + result.addEvent (MidiMessage::createSysExMessage (e.data.bytes, (int) e.data.size), e.sampleOffset); break; @@ -300,7 +300,7 @@ public: { e.type = Steinberg::Vst::Event::kDataEvent; e.data.bytes = msg.getSysExData(); - e.data.size = msg.getSysExDataSize(); + e.data.size = (uint32) msg.getSysExDataSize(); e.data.type = Steinberg::Vst::DataEvent::kMidiSysEx; } else if (msg.isAftertouch()) diff --git a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Headers.h b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Headers.h index ffb90e8..50b8552 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Headers.h +++ b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Headers.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp index a741626..4de9ec8 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp +++ b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -364,7 +364,6 @@ class VST3HostContext : public Vst::IComponentHandler, // From VST V3.0.0 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: @@ -684,31 +683,6 @@ public: 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 { @@ -736,7 +710,6 @@ public: 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) @@ -837,47 +810,26 @@ private: //============================================================================== 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))); - + addMessageToQueue (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))); - + addMessageToQueue (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))); - + addMessageToQueue (id, toString (string)); 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))); - + jassert (size >= 0 && (data != nullptr || size == 0)); + addMessageToQueue (id, MemoryBlock (data, (size_t) size)); return kResultTrue; } @@ -886,7 +838,7 @@ private: { jassert (id != nullptr); - if (fetchValueForId (id, result)) + if (findMessageOnQueueWithID (id, result)) return kResultTrue; jassertfalse; @@ -897,7 +849,7 @@ private: { jassert (id != nullptr); - if (fetchValueForId (id, result)) + if (findMessageOnQueueWithID (id, result)) return kResultTrue; jassertfalse; @@ -909,7 +861,7 @@ private: jassert (id != nullptr); String stringToFetch; - if (fetchValueForId (id, stringToFetch)) + if (findMessageOnQueueWithID (id, stringToFetch)) { Steinberg::String str (stringToFetch.toRawUTF8()); str.copyTo (result, 0, (Steinberg::int32) jmin (length, (Steinberg::uint32) std::numeric_limits::max())); @@ -949,7 +901,7 @@ private: //============================================================================== template - bool setValueForId (AttrID id, const Type& value) + void addMessageToQueue (AttrID id, const Type& value) { jassert (id != nullptr); @@ -960,15 +912,15 @@ private: if (std::strcmp (message->getMessageID(), id) == 0) { message->value = value; - return true; + return; } } - return false; // No message found with that Id + owner->messageQueue.add (ComSmartPtr (new Message (*owner, this, id, value))); } template - bool fetchValueForId (AttrID id, Type& value) + bool findMessageOnQueueWithID (AttrID id, Type& value) { jassert (id != nullptr); @@ -1631,8 +1583,8 @@ public: : module (handle), numInputAudioBusses (0), numOutputAudioBusses (0), - inputParameterChanges (new ParameterChangeList()), - outputParameterChanges (new ParameterChangeList()), + inputParameterChanges (new ParamValueQueueList()), + outputParameterChanges (new ParamValueQueueList()), midiInputs (new MidiEventList()), midiOutputs (new MidiEventList()), isComponentInitialised (false), @@ -1846,6 +1798,8 @@ public: processor->process (data); MidiEventList::toMidiBuffer (midiMessages, *midiOutputs); + + inputParameterChanges->clearAllQueues(); } } @@ -1976,8 +1930,11 @@ public: { if (editController != nullptr) { - const uint32 id = getParameterInfoForIndex (parameterIndex).id; - editController->setParamNormalized (id, (double) newValue); + const uint32 paramID = getParameterInfoForIndex (parameterIndex).id; + editController->setParamNormalized (paramID, (double) newValue); + + Steinberg::int32 index; + inputParameterChanges->addParameterData (paramID, index)->addPoint (0, newValue, index); } } @@ -2052,6 +2009,115 @@ public: (void) sizeInBytes; } + //============================================================================== + // NB: this class and its subclasses must be public to avoid problems in + // DLL builds under MSVC. + class ParamValueQueueList : public Vst::IParameterChanges + { + public: + ParamValueQueueList() {} + virtual ~ParamValueQueueList() {} + + JUCE_DECLARE_VST3_COM_REF_METHODS + JUCE_DECLARE_VST3_COM_QUERY_METHODS + + Steinberg::int32 PLUGIN_API getParameterCount() override { return (Steinberg::int32) queues.size(); } + Vst::IParamValueQueue* PLUGIN_API getParameterData (Steinberg::int32 index) override { return queues[(int) index]; } + + Vst::IParamValueQueue* PLUGIN_API addParameterData (const Vst::ParamID& id, Steinberg::int32& index) override + { + for (int i = queues.size(); --i >= 0;) + { + if (queues.getUnchecked (i)->getParameterId() == id) + { + index = (Steinberg::int32) i; + return queues.getUnchecked (i); + } + } + + index = getParameterCount(); + return queues.add (new ParamValueQueue (id)); + } + + void clearAllQueues() noexcept + { + for (int i = queues.size(); --i >= 0;) + queues.getUnchecked (i)->clear(); + } + + struct ParamValueQueue : public Vst::IParamValueQueue + { + ParamValueQueue (Vst::ParamID parameterID) : paramID (parameterID) + { + points.ensureStorageAllocated (1024); + } + + virtual ~ParamValueQueue() {} + + JUCE_DECLARE_VST3_COM_REF_METHODS + JUCE_DECLARE_VST3_COM_QUERY_METHODS + + Steinberg::Vst::ParamID PLUGIN_API getParameterId() override { return paramID; } + Steinberg::int32 PLUGIN_API getPointCount() override { return (Steinberg::int32) points.size(); } + + Steinberg::tresult PLUGIN_API getPoint (Steinberg::int32 index, + Steinberg::int32& sampleOffset, + Steinberg::Vst::ParamValue& value) override + { + const ScopedLock sl (pointLock); + + if (isPositiveAndBelow ((int) index, points.size())) + { + ParamPoint e (points.getUnchecked ((int) index)); + sampleOffset = e.sampleOffset; + value = e.value; + return kResultTrue; + } + + sampleOffset = -1; + value = 0.0; + return kResultFalse; + } + + Steinberg::tresult PLUGIN_API addPoint (Steinberg::int32 sampleOffset, + Steinberg::Vst::ParamValue value, + Steinberg::int32& index) override + { + ParamPoint p = { sampleOffset, value }; + + const ScopedLock sl (pointLock); + index = (Steinberg::int32) points.size(); + points.add (p); + return kResultTrue; + } + + void clear() noexcept + { + const ScopedLock sl (pointLock); + points.clearQuick(); + } + + private: + struct ParamPoint + { + Steinberg::int32 sampleOffset; + Steinberg::Vst::ParamValue value; + }; + + Atomic refCount; + const Vst::ParamID paramID; + Array points; + CriticalSection pointLock; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ParamValueQueue) + }; + + Atomic refCount; + OwnedArray queues; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ParamValueQueueList) + }; + private: //============================================================================== VST3ModuleHandle::Ptr module; @@ -2097,7 +2163,7 @@ private: if (object->getState (&stream) == kResultTrue) { - MemoryBlock info (stream.getData(), (std::size_t) stream.getSize()); + MemoryBlock info (stream.getData(), (size_t) stream.getSize()); head.createNewChildElement (identifier)->addTextElement (info.toBase64Encoding()); } } @@ -2122,36 +2188,7 @@ private: 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 inputParameterChanges, outputParameterChanges; ComSmartPtr midiInputs, midiOutputs; Vst::ProcessContext timingInfo; //< Only use this in processBlock()! bool isComponentInitialised, isControllerInitialised, isActive; diff --git a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h index 308ff5a..ceabcbc 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h +++ b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h index f442eab..bf7bc4b 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h +++ b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -184,4 +184,4 @@ private: }; #endif // JUCE_VSTMIDIEVENTLIST_H_INCLUDED -#endif +#endif // JUCE_VSTMIDIEVENTLIST_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp index 5509e2c..0a88d5c 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp +++ b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -135,7 +135,14 @@ namespace char chunk[8]; // variable }; - static VstInt32 fxbName (const char* name) noexcept { return (VstInt32) ByteOrder::bigEndianInt (name); } + // Compares a magic value in either endianness. + static bool compareMagic (VstInt32 magic, const char* name) noexcept + { + return magic == (VstInt32) ByteOrder::littleEndianInt (name) + || magic == (VstInt32) ByteOrder::bigEndianInt (name); + } + + static VstInt32 fxbName (const char* name) noexcept { return (VstInt32) ByteOrder::littleEndianInt (name); } static VstInt32 fxbSwap (const VstInt32 x) noexcept { return (VstInt32) ByteOrder::swapIfLittleEndian ((uint32) x); } static float fxbSwapFloat (const float x) noexcept @@ -311,6 +318,8 @@ namespace static void translateJuceToXMouseWheelModifiers (const MouseEvent& e, const float increment, XEvent& ev) noexcept { + ignoreUnused (e); + if (increment < 0) { ev.xbutton.button = Button5; @@ -481,7 +490,7 @@ public: const char* const utf8 = file.getFullPathName().toRawUTF8(); if (CFURLRef url = CFURLCreateFromFileSystemRepresentation (0, (const UInt8*) utf8, - strlen (utf8), file.isDirectory())) + (CFIndex) strlen (utf8), file.isDirectory())) { bundleRef = CFBundleCreate (kCFAllocatorDefault, url); CFRelease (url); @@ -857,7 +866,7 @@ public: 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; + usesCocoaNSView = (dispatch (effCanDo, 0, 0, (void*) "hasCockosViewAsConfig", 0) & (int) 0xffff0000) == 0xbeef0000; #endif setLatencySamples (effect->initialDelay); @@ -980,27 +989,28 @@ public: 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) + if (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; @@ -1008,17 +1018,18 @@ public: 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; + if (position.isLooping) + { + vstHostTime.cycleStartPos = position.ppqLoopStart; + vstHostTime.cycleEndPos = position.ppqLoopEnd; + vstHostTime.flags |= (kVstCyclePosValid | kVstTransportCycleActive); + } + else + { + vstHostTime.flags &= ~(kVstCyclePosValid | kVstTransportCycleActive); + } } } @@ -1221,8 +1232,8 @@ public: 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 setStateInformation (const void* data, int size) override { loadFromFXBFile (data, (size_t) size); } + void setCurrentProgramStateInformation (const void* data, int size) override { loadFromFXBFile (data, (size_t) size); } //============================================================================== void timerCallback() override @@ -1275,7 +1286,12 @@ public: case audioMasterSizeWindow: if (AudioProcessorEditor* ed = getActiveEditor()) - ed->setSize (index, (int) value); + { + #if JUCE_LINUX + const MessageManagerLock mmLock; + #endif + ed->setSize (index, (int) value); + } return 1; @@ -1349,6 +1365,7 @@ public: "receiveVstEvents", "receiveVstMidiEvent", "supportShell", + "sizeWindow", "shellCategory" }; for (int i = 0; i < numElementsInArray (canDos); ++i) @@ -1432,18 +1449,17 @@ public: const fxSet* const set = (const fxSet*) data; - if ((set->chunkMagic != fxbName ("CcnK") && set->chunkMagic != fxbName ("KncC")) - || fxbSwap (set->version) > fxbVersionNum) + if ((! compareMagic (set->chunkMagic, "CcnK")) || fxbSwap (set->version) > fxbVersionNum) return false; - if (set->fxMagic == fxbName ("FxBk")) + if (compareMagic (set->fxMagic, "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); + const int progLen = (int) sizeof (fxProgram) + (numParams - 1) * (int) sizeof (float); for (int i = 0; i < fxbSwap (set->numPrograms); ++i) { @@ -1472,12 +1488,12 @@ public: return false; } } - else if (set->fxMagic == fxbName ("FxCk")) + else if (compareMagic (set->fxMagic, "FxCk")) { // single program const fxProgram* const prog = (const fxProgram*) data; - if (prog->chunkMagic != fxbName ("CcnK")) + if (! compareMagic (prog->chunkMagic, "CcnK")) return false; changeProgramName (getCurrentProgram(), prog->prgName); @@ -1485,22 +1501,22 @@ public: 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")) + else if (compareMagic (set->fxMagic, "FBCh")) { // non-preset chunk const fxChunkSet* const cset = (const fxChunkSet*) data; - if (fxbSwap (cset->chunkSize) + sizeof (fxChunkSet) - 8 > (unsigned int) dataSize) + if ((size_t) fxbSwap (cset->chunkSize) + sizeof (fxChunkSet) - 8 > (size_t) dataSize) return false; setChunkData (cset->chunk, fxbSwap (cset->chunkSize), false); } - else if (set->fxMagic == fxbName ("FPCh") || set->fxMagic == fxbName ("hCPF")) + else if (compareMagic (set->fxMagic, "FPCh")) { // preset chunk const fxProgramSet* const cset = (const fxProgramSet*) data; - if (fxbSwap (cset->chunkSize) + sizeof (fxProgramSet) - 8 > (unsigned int) dataSize) + if ((size_t) fxbSwap (cset->chunkSize) + sizeof (fxProgramSet) - 8 > (size_t) dataSize) return false; setChunkData (cset->chunk, fxbSwap (cset->chunkSize), true); @@ -1565,8 +1581,8 @@ public: { if (isFXB) { - const int progLen = sizeof (fxProgram) + (numParams - 1) * sizeof (float); - const int len = (sizeof (fxSet) - sizeof (fxProgram)) + progLen * jmax (1, numPrograms); + const int progLen = (int) sizeof (fxProgram) + (numParams - 1) * (int) sizeof (float); + const size_t len = (sizeof (fxSet) - sizeof (fxProgram)) + (size_t) (progLen * jmax (1, numPrograms)); dest.setSize (len, true); fxSet* const set = (fxSet*) dest.getData(); @@ -1578,11 +1594,13 @@ public: set->fxVersion = fxbSwap (getVersionNumber()); set->numPrograms = fxbSwap (numPrograms); - const int oldProgram = getCurrentProgram(); MemoryBlock oldSettings; createTempParameterStore (oldSettings); - setParamsInProgramBlock ((fxProgram*) (((char*) (set->programs)) + oldProgram * progLen)); + const int oldProgram = getCurrentProgram(); + + if (oldProgram >= 0) + setParamsInProgramBlock ((fxProgram*) (((char*) (set->programs)) + oldProgram * progLen)); for (int i = 0; i < numPrograms; ++i) { @@ -1593,14 +1611,14 @@ public: } } - setCurrentProgram (oldProgram); + if (oldProgram >= 0) + setCurrentProgram (oldProgram); + restoreFromTempParameterStore (oldSettings); } else { - const int totalLen = sizeof (fxProgram) + (numParams - 1) * sizeof (float); - dest.setSize (totalLen, true); - + dest.setSize (sizeof (fxProgram) + (size_t) ((numParams - 1) * (int) sizeof (float)), true); setParamsInProgramBlock ((fxProgram*) dest.getData()); } } @@ -1615,9 +1633,9 @@ public: if (usesChunks()) { void* data = nullptr; - const VstIntPtr bytes = dispatch (effGetChunk, isPreset ? 1 : 0, 0, &data, 0.0f); + const size_t bytes = (size_t) dispatch (effGetChunk, isPreset ? 1 : 0, 0, &data, 0.0f); - if (data != nullptr && bytes <= maxSizeMB * 1024 * 1024) + if (data != nullptr && bytes <= (size_t) maxSizeMB * 1024 * 1024) { mb.setSize (bytes); mb.copyFrom (data, 0, bytes); @@ -1671,7 +1689,8 @@ private: bool restoreProgramSettings (const fxProgram* const prog) { - if (prog->chunkMagic == fxbName ("CcnK") && prog->fxMagic == fxbName ("FxCk")) + if (compareMagic (prog->chunkMagic, "CcnK") + && compareMagic (prog->fxMagic, "FxCk")) { changeProgramName (getCurrentProgram(), prog->prgName); @@ -1776,7 +1795,7 @@ private: //============================================================================== void createTempParameterStore (MemoryBlock& dest) { - dest.setSize (64 + 4 * getNumParameters()); + dest.setSize (64 + 4 * (size_t) getNumParameters()); dest.fillWith (0); getCurrentProgramName().copyToUTF8 ((char*) dest.getData(), 63); @@ -1814,21 +1833,21 @@ private: String s; if (v == 0 || (int) v == -1) - v = getVersionNumber(); + v = (unsigned int) getVersionNumber(); if (v != 0) { int versionBits[32]; int n = 0; - for (int vv = v; vv != 0; vv /= 10) + for (unsigned 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) + for (unsigned int vv = v; vv != 0; vv >>= 8) versionBits [n++] = vv & 255; } @@ -1961,9 +1980,13 @@ public: #elif JUCE_LINUX if (pluginWindow != 0) { - XResizeWindow (display, pluginWindow, getWidth(), getHeight()); - XMoveWindow (display, pluginWindow, pos.getX(), pos.getY()); + XMoveResizeWindow (display, pluginWindow, + pos.getX(), pos.getY(), + (unsigned int) getWidth(), + (unsigned int) getHeight()); + XMapRaised (display, pluginWindow); + XFlush (display); } #endif @@ -2074,6 +2097,16 @@ public: plugin.dispatch (effEditIdle, 0, 0, 0, 0); reentrant = false; } + + #if JUCE_LINUX + if (pluginWindow == 0) + { + updatePluginWindowHandle(); + + if (pluginWindow != 0) + componentMovedOrResized (true, true); + } + #endif } } @@ -2259,11 +2292,7 @@ private: } #elif JUCE_LINUX - pluginWindow = getChildWindow ((Window) getWindowHandle()); - - if (pluginWindow != 0) - pluginProc = (EventProcPtr) getPropertyFromXWindow (pluginWindow, - XInternAtom (display, "_XEventProc", False)); + updatePluginWindowHandle(); int w = 250, h = 150; @@ -2491,6 +2520,15 @@ private: sendEventToChild (ev); } } + + void updatePluginWindowHandle() + { + pluginWindow = getChildWindow ((Window) getWindowHandle()); + + if (pluginWindow != 0) + pluginProc = (EventProcPtr) getPropertyFromXWindow (pluginWindow, + XInternAtom (display, "_XEventProc", False)); + } #endif //============================================================================== diff --git a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h index 4e4b744..400d75d 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h +++ b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.cpp b/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.cpp index d1f1679..663fb96 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.cpp +++ b/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h b/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h index 2811656..5ccfe2b 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h +++ b/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.mm b/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.mm index 918e848..f111409 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.mm +++ b/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_processors/juce_module_info b/JuceLibraryCode/modules/juce_audio_processors/juce_module_info index 40a0d87..11fa235 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/juce_module_info +++ b/JuceLibraryCode/modules/juce_audio_processors/juce_module_info @@ -1,7 +1,7 @@ { "id": "juce_audio_processors", "name": "JUCE audio plugin hosting classes", - "version": "3.0.8", + "version": "3.2.0", "description": "Classes for loading and playing VST, AU, or internally-generated audio processors.", "website": "http://www.juce.com/juce", "license": "GPL/Commercial", diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPlayHead.h b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPlayHead.h index b92b802..c54e7c3 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPlayHead.h +++ b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPlayHead.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -128,10 +128,14 @@ public: //============================================================================== /** 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. + position at the start of the current processing block. If this method returns + false then the current play head position is not available and the given + structure will be undefined. + + You can ONLY call this from your processBlock() method! Calling it at other + times will produce undefined behaviour, as the host may not have any context + in which a time would make sense, and some hosts will almost certainly have + multithreading issues if it's not called on the audio thread. */ virtual bool getCurrentPosition (CurrentPositionInfo& result) = 0; }; diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h index b7c7b7d..675cab4 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h +++ b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp index e46dba3..aa4c198 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp +++ b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -48,7 +48,7 @@ AudioProcessor::~AudioProcessor() // that it refers to is deleted.. jassert (activeEditor == nullptr); - #if JUCE_DEBUG + #if JUCE_DEBUG && ! JUCE_DISABLE_AUDIOPROCESSOR_BEGIN_END_GESTURE_CHECKING // 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); @@ -142,7 +142,7 @@ void AudioProcessor::beginParameterChangeGesture (int parameterIndex) { if (isPositiveAndBelow (parameterIndex, getNumParameters())) { - #if JUCE_DEBUG + #if JUCE_DEBUG && ! JUCE_DISABLE_AUDIOPROCESSOR_BEGIN_END_GESTURE_CHECKING // 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]); @@ -163,9 +163,9 @@ void AudioProcessor::endParameterChangeGesture (int parameterIndex) { if (isPositiveAndBelow (parameterIndex, getNumParameters())) { - #if JUCE_DEBUG + #if JUCE_DEBUG && ! JUCE_DISABLE_AUDIOPROCESSOR_BEGIN_END_GESTURE_CHECKING // This means you've called endParameterChangeGesture without having previously called - // endParameterChangeGesture. That might be fine in most hosts, but better to keep the + // beginParameterChangeGesture. That might be fine in most hosts, but better to keep the // calls matched correctly. jassert (changingParams [parameterIndex]); changingParams.clearBit (parameterIndex); diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.h b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.h index aaae9ef..4019149 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.h +++ b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -140,11 +140,17 @@ public: /** 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. + You can ONLY call this from your processBlock() method! Calling it at other + times will produce undefined behaviour, as the host may not have any context + in which a time would make sense, and some hosts will almost certainly have + multithreading issues if it's not called on the audio thread. - If the host hasn't supplied a playhead object, this will return nullptr. + The AudioPlayHead object that is returned can be used to get the details about + the time of the start of the block currently being processed. But do not + store this pointer or use it outside of the current audio callback, because + the host may delete or re-use it. + + If the host can't or won't provide any time info, this will return nullptr. */ AudioPlayHead* getPlayHead() const noexcept { return playHead; } @@ -376,10 +382,17 @@ public: //============================================================================== /** This must return the correct value immediately after the object has been created, and mustn't change the number of parameters later. + + NOTE! This method will eventually be deprecated! It's recommended that you use the + AudioProcessorParameter class instead to manage your parameters. */ virtual int getNumParameters(); - /** Returns the name of a particular parameter. */ + /** Returns the name of a particular parameter. + + NOTE! This method will eventually be deprecated! It's recommended that you use the + AudioProcessorParameter class instead to manage your parameters. + */ virtual const String getParameterName (int parameterIndex); /** Called by the host to find out the value of one of the filter's parameters. @@ -389,27 +402,39 @@ public: 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. + + NOTE! This method will eventually be deprecated! It's recommended that you use the + AudioProcessorParameter class instead to manage your parameters. */ 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. + + NOTE! This method will eventually be deprecated! It's recommended that you use + AudioProcessorParameter::getName() instead. */ virtual String getParameterName (int parameterIndex, int maximumStringLength); + /** Returns the value of a parameter as a text string. + NOTE! This method will eventually be deprecated! It's recommended that you use + AudioProcessorParameter::getText() instead. + */ + virtual const String getParameterText (int parameterIndex); + /** 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. + + NOTE! This method will eventually be deprecated! It's recommended that you use + AudioProcessorParameter::getText() instead. */ virtual String getParameterText (int parameterIndex, int maximumStringLength); @@ -418,10 +443,16 @@ public: 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. + + NOTE! This method will eventually be deprecated! It's recommended that you use + AudioProcessorParameter::getNumSteps() instead. */ virtual int getParameterNumSteps (int parameterIndex); /** Returns the default number of steps for a parameter. + + NOTE! This method will eventually be deprecated! It's recommended that you use + AudioProcessorParameter::getNumSteps() instead. @see getParameterNumSteps */ static int getDefaultNumParameterSteps() noexcept; @@ -429,16 +460,25 @@ public: /** 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. + + NOTE! This method will eventually be deprecated! It's recommended that you use + AudioProcessorParameter::getDefaultValue() instead. */ virtual float getParameterDefaultValue (int parameterIndex); /** Some plugin types may be able to return a label string for a parameter's units. + + NOTE! This method will eventually be deprecated! It's recommended that you use + AudioProcessorParameter::getLabel() instead. */ 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). + + NOTE! This method will eventually be deprecated! It's recommended that you use + AudioProcessorParameter::isOrientationInverted() instead. */ virtual bool isParameterOrientationInverted (int index) const; @@ -454,6 +494,9 @@ public: won't be able to automate your parameters properly. The value passed will be between 0 and 1.0. + + NOTE! This method will eventually be deprecated! It's recommended that you use + AudioProcessorParameter::setValue() instead. */ virtual void setParameter (int parameterIndex, float newValue); @@ -466,11 +509,17 @@ public: 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. + + NOTE! This method will eventually be deprecated! It's recommended that you use + AudioProcessorParameter::setValueNotifyingHost() instead. */ void setParameterNotifyingHost (int parameterIndex, float newValue); /** Returns true if the host can automate this parameter. By default, this returns true for all parameters. + + NOTE! This method will eventually be deprecated! It's recommended that you use + AudioProcessorParameter::isAutomatable() instead. */ virtual bool isParameterAutomatable (int parameterIndex) const; @@ -478,6 +527,9 @@ public: 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. + + NOTE! This method will eventually be deprecated! It's recommended that you use + AudioProcessorParameter::isMetaParameter() instead. */ virtual bool isMetaParameter (int parameterIndex) const; @@ -488,6 +540,9 @@ public: it may use this information to help it record automation. If you call this, it must be matched by a later call to endParameterChangeGesture(). + + NOTE! This method will eventually be deprecated! It's recommended that you use + AudioProcessorParameter::beginChangeGesture() instead. */ void beginParameterChangeGesture (int parameterIndex); @@ -497,6 +552,9 @@ public: it may use this information to help it record automation. A call to this method must follow a call to beginParameterChangeGesture(). + + NOTE! This method will eventually be deprecated! It's recommended that you use + AudioProcessorParameter::endChangeGesture() instead. */ void endParameterChangeGesture (int parameterIndex); @@ -676,7 +734,7 @@ private: OwnedArray managedParameters; AudioProcessorParameter* getParamChecked (int) const noexcept; - #if JUCE_DEBUG + #if JUCE_DEBUG && ! JUCE_DISABLE_AUDIOPROCESSOR_BEGIN_END_GESTURE_CHECKING BigInteger changingParams; #endif diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp index a625411..07f865e 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp +++ b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h index 1755497..e043c37 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h +++ b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp index 9ca46d2..d4a672c 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp +++ b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -29,151 +29,129 @@ namespace GraphRenderingOps { //============================================================================== -class AudioGraphRenderingOp +struct AudioGraphRenderingOp { -public: - AudioGraphRenderingOp() {} - virtual ~AudioGraphRenderingOp() {} + AudioGraphRenderingOp() noexcept {} + virtual ~AudioGraphRenderingOp() {} virtual void perform (AudioSampleBuffer& sharedBufferChans, - const OwnedArray & sharedMidiBuffers, + const OwnedArray& sharedMidiBuffers, const int numSamples) = 0; JUCE_LEAK_DETECTOR (AudioGraphRenderingOp) }; //============================================================================== -class ClearChannelOp : public AudioGraphRenderingOp +struct ClearChannelOp : public AudioGraphRenderingOp { -public: - ClearChannelOp (const int channelNum_) - : channelNum (channelNum_) - {} + ClearChannelOp (const int channel) noexcept : channelNum (channel) {} - void perform (AudioSampleBuffer& sharedBufferChans, const OwnedArray &, const int numSamples) + 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 +struct CopyChannelOp : public AudioGraphRenderingOp { -public: - CopyChannelOp (const int srcChannelNum_, const int dstChannelNum_) - : srcChannelNum (srcChannelNum_), - dstChannelNum (dstChannelNum_) + CopyChannelOp (const int srcChan, const int dstChan) noexcept + : srcChannelNum (srcChan), dstChannelNum (dstChan) {} - void perform (AudioSampleBuffer& sharedBufferChans, const OwnedArray &, const int numSamples) + 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 +struct AddChannelOp : public AudioGraphRenderingOp { -public: - AddChannelOp (const int srcChannelNum_, const int dstChannelNum_) - : srcChannelNum (srcChannelNum_), - dstChannelNum (dstChannelNum_) + AddChannelOp (const int srcChan, const int dstChan) noexcept + : srcChannelNum (srcChan), dstChannelNum (dstChan) {} - void perform (AudioSampleBuffer& sharedBufferChans, const OwnedArray &, const int numSamples) + 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 +struct ClearMidiBufferOp : public AudioGraphRenderingOp { -public: - ClearMidiBufferOp (const int bufferNum_) - : bufferNum (bufferNum_) - {} + ClearMidiBufferOp (const int buffer) noexcept : bufferNum (buffer) {} - void perform (AudioSampleBuffer&, const OwnedArray & sharedMidiBuffers, const int) + 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 +struct CopyMidiBufferOp : public AudioGraphRenderingOp { -public: - CopyMidiBufferOp (const int srcBufferNum_, const int dstBufferNum_) - : srcBufferNum (srcBufferNum_), - dstBufferNum (dstBufferNum_) + CopyMidiBufferOp (const int srcBuffer, const int dstBuffer) noexcept + : srcBufferNum (srcBuffer), dstBufferNum (dstBuffer) {} - void perform (AudioSampleBuffer&, const OwnedArray & sharedMidiBuffers, const int) + 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 +struct AddMidiBufferOp : public AudioGraphRenderingOp { -public: - AddMidiBufferOp (const int srcBufferNum_, const int dstBufferNum_) - : srcBufferNum (srcBufferNum_), - dstBufferNum (dstBufferNum_) + AddMidiBufferOp (const int srcBuffer, const int dstBuffer) + : srcBufferNum (srcBuffer), dstBufferNum (dstBuffer) {} - void perform (AudioSampleBuffer&, const OwnedArray & sharedMidiBuffers, const int numSamples) + 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 +struct DelayChannelOp : public AudioGraphRenderingOp { -public: - DelayChannelOp (const int channel_, const int numSamplesDelay_) - : channel (channel_), - bufferSize (numSamplesDelay_ + 1), - readIndex (0), writeIndex (numSamplesDelay_) + DelayChannelOp (const int chan, const int delaySize) + : channel (chan), + bufferSize (delaySize + 1), + readIndex (0), writeIndex (delaySize) { buffer.calloc ((size_t) bufferSize); } - void perform (AudioSampleBuffer& sharedBufferChans, const OwnedArray &, const int numSamples) + void perform (AudioSampleBuffer& sharedBufferChans, const OwnedArray&, const int numSamples) { float* data = sharedBufferChans.getWritePointer (channel, 0); @@ -197,18 +175,17 @@ private: //============================================================================== -class ProcessBufferOp : public AudioGraphRenderingOp +struct 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_) + ProcessBufferOp (const AudioProcessorGraph::Node::Ptr& n, + const Array& audioChannels, + const int totalNumChans, + const int midiBuffer) + : node (n), + processor (n->getProcessor()), + audioChannelsToUse (audioChannels), + totalChans (jmax (1, totalNumChans)), + midiBufferToUse (midiBuffer) { channels.calloc ((size_t) totalChans); @@ -216,7 +193,7 @@ public: audioChannelsToUse.add (0); } - void perform (AudioSampleBuffer& sharedBufferChans, const OwnedArray & sharedMidiBuffers, const int numSamples) + void perform (AudioSampleBuffer& sharedBufferChans, const OwnedArray& sharedMidiBuffers, const int numSamples) { for (int i = totalChans; --i >= 0;) channels[i] = sharedBufferChans.getWritePointer (audioChannelsToUse.getUnchecked (i), 0); @@ -232,8 +209,8 @@ public: private: Array audioChannelsToUse; HeapBlock channels; - int totalChans; - int midiBufferToUse; + const int totalChans; + const int midiBufferToUse; JUCE_DECLARE_NON_COPYABLE (ProcessBufferOp) }; @@ -242,15 +219,13 @@ private: /** Used to calculate the correct sequence of rendering ops needed, based on the best re-use of shared buffers at each stage. */ -class RenderingOpSequenceCalculator +struct RenderingOpSequenceCalculator { -public: - //============================================================================== - RenderingOpSequenceCalculator (AudioProcessorGraph& graph_, - const Array& orderedNodes_, + RenderingOpSequenceCalculator (AudioProcessorGraph& g, + const Array& nodes, Array& renderingOps) - : graph (graph_), - orderedNodes (orderedNodes_), + : graph (g), + orderedNodes (nodes), totalLatency (0) { nodeIds.add ((uint32) zeroNodeID); // first buffer is read-only zeros @@ -260,34 +235,32 @@ public: for (int i = 0; i < orderedNodes.size(); ++i) { - createRenderingOpsForNode ((AudioProcessorGraph::Node*) orderedNodes.getUnchecked(i), - renderingOps, i); - + createRenderingOpsForNode (*orderedNodes.getUnchecked(i), renderingOps, i); markAnyUnusedBuffersAsFree (i); } graph.setLatencySamples (totalLatency); } - int getNumBuffersNeeded() const { return nodeIds.size(); } - int getNumMidiBuffersNeeded() const { return midiNodeIds.size(); } + int getNumBuffersNeeded() const noexcept { return nodeIds.size(); } + int getNumMidiBuffersNeeded() const noexcept { return midiNodeIds.size(); } private: //============================================================================== AudioProcessorGraph& graph; - const Array& orderedNodes; - Array channels; - Array nodeIds, midiNodeIds; + const Array& orderedNodes; + Array channels; + Array nodeIds, midiNodeIds; enum { freeNodeID = 0xffffffff, zeroNodeID = 0xfffffffe }; - static bool isNodeBusy (uint32 nodeID) noexcept { return nodeID != freeNodeID && nodeID != zeroNodeID; } + static bool isNodeBusy (uint32 nodeID) noexcept { return nodeID != freeNodeID && nodeID != zeroNodeID; } - Array nodeDelayIDs; - Array nodeDelays; + Array nodeDelayIDs; + Array nodeDelays; int totalLatency; - int getNodeDelay (const uint32 nodeID) const { return nodeDelays [nodeDelayIDs.indexOf (nodeID)]; } + int getNodeDelay (const uint32 nodeID) const { return nodeDelays [nodeDelayIDs.indexOf (nodeID)]; } void setNodeDelay (const uint32 nodeID, const int latency) { @@ -320,30 +293,31 @@ private: } //============================================================================== - void createRenderingOpsForNode (AudioProcessorGraph::Node* const node, + void createRenderingOpsForNode (AudioProcessorGraph::Node& node, Array& renderingOps, const int ourRenderingIndex) { - const int numIns = node->getProcessor()->getNumInputChannels(); - const int numOuts = node->getProcessor()->getNumOutputChannels(); + AudioProcessor& processor = *node.getProcessor(); + const int numIns = processor.getNumInputChannels(); + const int numOuts = processor.getNumOutputChannels(); const int totalChans = jmax (numIns, numOuts); - Array audioChannelsToUse; + Array audioChannelsToUse; int midiBufferToUse = -1; - int maxLatency = getInputLatencyForNode (node->nodeId); + 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 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) + if (c->destNodeId == node.nodeId && c->destChannelIndex == inputChan) { sourceNodes.add (c->sourceNodeId); sourceOutputChans.add (c->sourceChannelIndex); @@ -493,7 +467,7 @@ private: audioChannelsToUse.add (bufIndex); if (inputChan < numOuts) - markBufferAsContaining (bufIndex, node->nodeId, inputChan); + markBufferAsContaining (bufIndex, node.nodeId, inputChan); } for (int outputChan = numIns; outputChan < numOuts; ++outputChan) @@ -502,17 +476,17 @@ private: jassert (bufIndex != 0); audioChannelsToUse.add (bufIndex); - markBufferAsContaining (bufIndex, node->nodeId, outputChan); + markBufferAsContaining (bufIndex, node.nodeId, outputChan); } // Now the same thing for midi.. - Array midiSourceNodes; + 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) + if (c->destNodeId == node.nodeId && c->destChannelIndex == AudioProcessorGraph::midiChannelIndex) midiSourceNodes.add (c->sourceNodeId); } @@ -521,7 +495,7 @@ private: // 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()) + if (processor.acceptsMidi() || processor.producesMidi()) renderingOps.add (new ClearMidiBufferOp (midiBufferToUse)); } else if (midiSourceNodes.size() == 1) @@ -601,16 +575,16 @@ private: } } - if (node->getProcessor()->producesMidi()) - markBufferAsContaining (midiBufferToUse, node->nodeId, + if (processor.producesMidi()) + markBufferAsContaining (midiBufferToUse, node.nodeId, AudioProcessorGraph::midiChannelIndex); - setNodeDelay (node->nodeId, maxLatency + node->getProcessor()->getLatencySamples()); + setNodeDelay (node.nodeId, maxLatency + processor.getLatencySamples()); if (numOuts == 0) totalLatency = maxLatency; - renderingOps.add (new ProcessBufferOp (node, audioChannelsToUse, + renderingOps.add (new ProcessBufferOp (&node, audioChannelsToUse, totalChans, midiBufferToUse)); } @@ -872,23 +846,21 @@ struct ConnectionSorter } //============================================================================== -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::Connection::Connection (const uint32 sourceID, const int sourceChannel, + const uint32 destID, const int destChannel) noexcept + : sourceNodeId (sourceID), sourceChannelIndex (sourceChannel), + destNodeId (destID), destChannelIndex (destChannel) { } //============================================================================== -AudioProcessorGraph::Node::Node (const uint32 nodeId_, AudioProcessor* const processor_) noexcept - : nodeId (nodeId_), - processor (processor_), - isPrepared (false) +AudioProcessorGraph::Node::Node (const uint32 nodeID, AudioProcessor* const p) noexcept + : nodeId (nodeID), processor (p), isPrepared (false) { jassert (processor != nullptr); } -void AudioProcessorGraph::Node::prepare (const double sampleRate, const int blockSize, +void AudioProcessorGraph::Node::prepare (const double newSampleRate, const int newBlockSize, AudioProcessorGraph* const graph) { if (! isPrepared) @@ -898,9 +870,9 @@ void AudioProcessorGraph::Node::prepare (const double sampleRate, const int bloc processor->setPlayConfigDetails (processor->getNumInputChannels(), processor->getNumOutputChannels(), - sampleRate, blockSize); + newSampleRate, newBlockSize); - processor->prepareToPlay (sampleRate, blockSize); + processor->prepareToPlay (newSampleRate, newBlockSize); } } @@ -916,7 +888,7 @@ void AudioProcessorGraph::Node::unprepare() void AudioProcessorGraph::Node::setParentGraph (AudioProcessorGraph* const graph) const { if (AudioProcessorGraph::AudioGraphIOProcessor* const ioProc - = dynamic_cast (processor.get())) + = dynamic_cast (processor.get())) ioProc->setParentGraph (graph); } @@ -1005,7 +977,6 @@ bool AudioProcessorGraph::removeNode (const uint32 nodeId) { if (nodes.getUnchecked(i)->nodeId == nodeId) { - nodes.getUnchecked(i)->setParentGraph (nullptr); nodes.remove (i); triggerAsyncUpdate(); @@ -1213,7 +1184,7 @@ void AudioProcessorGraph::buildRenderingSequence() { MessageManagerLock mml; - Array orderedNodes; + Array orderedNodes; { const GraphRenderingOps::ConnectionLookupTable table (connections); @@ -1298,6 +1269,24 @@ void AudioProcessorGraph::reset() nodes.getUnchecked(i)->getProcessor()->reset(); } +void AudioProcessorGraph::setNonRealtime (bool isProcessingNonRealtime) noexcept +{ + const ScopedLock sl (getCallbackLock()); + + for (int i = 0; i < nodes.size(); ++i) + nodes.getUnchecked(i)->getProcessor()->setNonRealtime (isProcessingNonRealtime); +} + +void AudioProcessorGraph::setPlayHead (AudioPlayHead* audioPlayHead) +{ + const ScopedLock sl (getCallbackLock()); + + AudioProcessor::setPlayHead (audioPlayHead); + + for (int i = 0; i < nodes.size(); ++i) + nodes.getUnchecked(i)->getProcessor()->setPlayHead (audioPlayHead); +} + void AudioProcessorGraph::processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages) { const int numSamples = buffer.getNumSamples(); @@ -1333,20 +1322,19 @@ 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*/) {} +bool AudioProcessorGraph::isInputChannelStereoPair (int) const { return true; } +bool AudioProcessorGraph::isOutputChannelStereoPair (int) 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&) {} +void AudioProcessorGraph::setStateInformation (const void*, int) {} //============================================================================== -AudioProcessorGraph::AudioGraphIOProcessor::AudioGraphIOProcessor (const IODeviceType type_) - : type (type_), - graph (nullptr) +AudioProcessorGraph::AudioGraphIOProcessor::AudioGraphIOProcessor (const IODeviceType deviceType) + : type (deviceType), graph (nullptr) { } @@ -1374,7 +1362,7 @@ void AudioProcessorGraph::AudioGraphIOProcessor::fillInPluginDescription (Plugin d.uid = d.name.hashCode(); d.category = "I/O devices"; d.pluginFormatName = "Internal"; - d.manufacturerName = "Raw Material Software"; + d.manufacturerName = "ROLI Ltd."; d.version = "1.0"; d.isInstrument = false; @@ -1492,19 +1480,12 @@ bool AudioProcessorGraph::AudioGraphIOProcessor::isOutputChannelStereoPair (int 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::isInput() const noexcept { return type == audioInputNode || type == midiInputNode; } +bool AudioProcessorGraph::AudioGraphIOProcessor::isOutput() const noexcept { 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) { } @@ -1522,7 +1503,7 @@ void AudioProcessorGraph::AudioGraphIOProcessor::setParentGraph (AudioProcessorG if (graph != nullptr) { setPlayConfigDetails (type == audioOutputNode ? graph->getNumOutputChannels() : 0, - type == audioInputNode ? graph->getNumInputChannels() : 0, + type == audioInputNode ? graph->getNumInputChannels() : 0, getSampleRate(), getBlockSize()); diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h index d944682..5ffba3c 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h +++ b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -80,7 +80,7 @@ public: //============================================================================== /** A convenient typedef for referring to a pointer to a node object. */ - typedef ReferenceCountedObjectPtr Ptr; + typedef ReferenceCountedObjectPtr Ptr; private: //============================================================================== @@ -92,7 +92,7 @@ public: Node (uint32 nodeId, AudioProcessor*) noexcept; void setParentGraph (AudioProcessorGraph*) const; - void prepare (double sampleRate, int blockSize, AudioProcessorGraph*); + void prepare (double newSampleRate, int newBlockSize, AudioProcessorGraph*); void unprepare(); JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Node) @@ -151,13 +151,13 @@ public: void clear(); /** Returns the number of nodes in the graph. */ - int getNumNodes() const { return nodes.size(); } + int getNumNodes() const noexcept { 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]; } + Node* getNode (const int index) const noexcept { 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. @@ -289,54 +289,47 @@ public: //============================================================================== /** Returns the mode of this processor. */ - IODeviceType getType() const { return type; } + IODeviceType getType() const noexcept { 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; } + AudioProcessorGraph* getParentGraph() const noexcept { return graph; } /** True if this is an audio or midi input. */ - bool isInput() const; + bool isInput() const noexcept; /** True if this is an audio or midi output. */ - bool isOutput() const; + bool isOutput() const noexcept; //============================================================================== 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); + const String getName() const override; + void fillInPluginDescription (PluginDescription&) const override; + void prepareToPlay (double newSampleRate, int estimatedSamplesPerBlock) override; + void releaseResources() override; + void processBlock (AudioSampleBuffer&, MidiBuffer&) override; + + const String getInputChannelName (int channelIndex) const override; + const String getOutputChannelName (int channelIndex) const override; + bool isInputChannelStereoPair (int index) const override; + bool isOutputChannelStereoPair (int index) const override; + bool silenceInProducesSilenceOut() const override; + double getTailLengthSeconds() const override; + bool acceptsMidi() const override; + bool producesMidi() const override; + + bool hasEditor() const override; + AudioProcessorEditor* createEditor() override; + + int getNumPrograms() override; + int getCurrentProgram() override; + void setCurrentProgram (int) override; + const String getProgramName (int) override; + void changeProgramName (int, const String&) override; + + void getStateInformation (juce::MemoryBlock& destData) override; + void setStateInformation (const void* data, int sizeInBytes) override; /** @internal */ void setParentGraph (AudioProcessorGraph*); @@ -349,42 +342,34 @@ public: }; //============================================================================== - // 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); + const String getName() const override; + void prepareToPlay (double, int) override; + void releaseResources() override; + void processBlock (AudioSampleBuffer&, MidiBuffer&) override; + + void reset() override; + void setNonRealtime (bool) noexcept override; + void setPlayHead (AudioPlayHead*) override; + + const String getInputChannelName (int) const override; + const String getOutputChannelName (int) const override; + bool isInputChannelStereoPair (int) const override; + bool isOutputChannelStereoPair (int) const override; + + bool silenceInProducesSilenceOut() const override; + double getTailLengthSeconds() const override; + bool acceptsMidi() const override; + bool producesMidi() const override; + + bool hasEditor() const override { return false; } + AudioProcessorEditor* createEditor() override { return nullptr; } + int getNumPrograms() override { return 0; } + int getCurrentProgram() override { return 0; } + void setCurrentProgram (int) override { } + const String getProgramName (int) override { return String(); } + void changeProgramName (int, const String&) override { } + void getStateInformation (juce::MemoryBlock&) override; + void setStateInformation (const void* data, int sizeInBytes) override; private: //============================================================================== diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h index d8ea93c..a2fe16e 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h +++ b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h index 8b4d2cf..0140faf 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h +++ b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -68,7 +68,7 @@ public: /** 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 + a parameter. This method will call the setValue() 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 diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp index c94411d..e1ba865 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp +++ b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -67,7 +67,7 @@ public: if (paramHasChanged) { refresh(); - startTimer (1000 / 50); + startTimerHz (50); } else { diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h index 1189f88..dc5d8fa 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h +++ b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.cpp b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.cpp index 5eafc07..2e647ec 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.cpp +++ b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.h b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.h index 24b17e5..83effce 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.h +++ b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp b/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp index 081ba11..ad37837 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp +++ b/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.h b/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.h index 3c8df25..d04dd89 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.h +++ b/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp b/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp index a7beea7..805f809 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp +++ b/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h b/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h index 762e742..8087c1c 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h +++ b/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp b/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp index a0c2388..8ff304d 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp +++ b/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -85,7 +85,7 @@ public: void deleteKeyPressed (int) override { - owner.removeSelected(); + owner.removeSelectedPlugins(); } void sortOrderChanged (int newSortColumnId, bool isForwards) override @@ -102,14 +102,6 @@ public: } } - 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; @@ -179,6 +171,12 @@ void PluginListComponent::setOptionsButtonText (const String& newText) resized(); } +void PluginListComponent::setScanDialogText (const String& title, const String& content) +{ + dialogTitle = title; + dialogText = content; +} + void PluginListComponent::setNumberOfThreadsForScanning (int num) { numThreads = num; @@ -207,13 +205,24 @@ void PluginListComponent::updateList() table.repaint(); } -void PluginListComponent::removeSelected() +void PluginListComponent::removeSelectedPlugins() { const SparseSet selected (table.getSelectedRows()); for (int i = table.getNumRows(); --i >= 0;) if (selected.contains (i)) - TableModel::removePluginItem (list, i); + removePluginItem (i); +} + +void PluginListComponent::setTableModel (TableListBoxModel* model) +{ + table.setModel (nullptr); + tableModel = model; + table.setModel (tableModel); + + table.getHeader().reSortTable(); + table.updateContent(); + table.repaint(); } bool PluginListComponent::canShowSelectedFolder() const @@ -238,6 +247,14 @@ void PluginListComponent::removeMissingPlugins() list.removeType (i); } +void PluginListComponent::removePluginItem (int index) +{ + if (index < list.getNumTypes()) + list.removeType (index); + else + list.removeFromBlacklist (list.getBlacklistedFiles() [index - list.getNumTypes()]); +} + void PluginListComponent::optionsMenuStaticCallback (int result, PluginListComponent* pluginList) { if (pluginList != nullptr) @@ -250,7 +267,7 @@ void PluginListComponent::optionsMenuCallback (int result) { case 0: break; case 1: list.clear(); break; - case 2: removeSelected(); break; + case 2: removeSelectedPlugins(); break; case 3: showSelectedFolder(); break; case 4: removeMissingPlugins(); break; @@ -293,7 +310,7 @@ bool PluginListComponent::isInterestedInFileDrag (const StringArray& /*files*/) void PluginListComponent::filesDropped (const StringArray& files, int, int) { - OwnedArray typesFound; + OwnedArray typesFound; list.scanAndAddDragAndDroppedFiles (formatManager, files, typesFound); } @@ -313,11 +330,11 @@ void PluginListComponent::setLastSearchPath (PropertiesFile& properties, AudioPl class PluginListComponent::Scanner : private Timer { public: - Scanner (PluginListComponent& plc, AudioPluginFormat& format, PropertiesFile* properties, int threads) + Scanner (PluginListComponent& plc, AudioPluginFormat& format, PropertiesFile* properties, + int threads, const String& title, const String& text) : 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), + progressWindow (title, text, AlertWindow::NoIcon), progress (0.0), numThreads (threads), finished (false) { FileSearchPath path (formatToScan.getDefaultLocationsToSearch()); @@ -528,7 +545,9 @@ private: void PluginListComponent::scanFor (AudioPluginFormat& format) { - currentScanner = new Scanner (*this, format, propertiesToUse, numThreads); + currentScanner = new Scanner (*this, format, propertiesToUse, numThreads, + dialogTitle.isNotEmpty() ? dialogTitle : TRANS("Scanning for plug-ins..."), + dialogText.isNotEmpty() ? dialogText : TRANS("Searching for all possible plug-in files...")); } bool PluginListComponent::isScanning() const noexcept diff --git a/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.h b/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.h index 97751a8..a1d6f1d 100644 --- a/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.h +++ b/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -55,6 +55,10 @@ public: /** Changes the text in the panel's options button. */ void setOptionsButtonText (const String& newText); + /** Changes the text in the progress dialog box that is shown when scanning. */ + void setScanDialogText (const String& textForProgressWindowTitle, + const String& textForProgressWindowDescription); + /** 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) */ @@ -72,6 +76,17 @@ public: /** Returns true if there's currently a scan in progress. */ bool isScanning() const noexcept; + /** Removes the plugins currently selected in the table. */ + void removeSelectedPlugins(); + + /** Sets a custom table model to be used. + This will take ownership of the model and delete it when no longer needed. + */ + void setTableModel (TableListBoxModel* model); + + /** Returns the table used to display the plugin list. */ + TableListBox& getTableListBox() noexcept { return table; } + private: //============================================================================== AudioPluginFormatManager& formatManager; @@ -80,12 +95,11 @@ private: TableListBox table; TextButton optionsButton; PropertiesFile* propertiesToUse; + String dialogTitle, dialogText; int numThreads; class TableModel; - friend class TableModel; - friend struct ContainerDeletePolicy; - ScopedPointer tableModel; + ScopedPointer tableModel; class Scanner; friend class Scanner; @@ -98,8 +112,8 @@ private: void updateList(); void showSelectedFolder(); bool canShowSelectedFolder() const; - void removeSelected(); void removeMissingPlugins(); + void removePluginItem (int index); void resized() override; bool isInterestedInFileDrag (const StringArray&) override; diff --git a/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp b/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp new file mode 100644 index 0000000..8e68375 --- /dev/null +++ b/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp @@ -0,0 +1,50 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2015 - ROLI 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/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioAppComponent.h b/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioAppComponent.h new file mode 100644 index 0000000..eaf43b2 --- /dev/null +++ b/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioAppComponent.h @@ -0,0 +1,117 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2015 - ROLI 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 + getNextAudioBlock(). The base class provides a basic AudioDeviceManager object + and runs audio through the default output device. +*/ +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/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp b/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp index fd437f3..6c39d16 100644 --- a/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp +++ b/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -1087,7 +1087,7 @@ void AudioDeviceSelectorComponent::comboBoxChanged (ComboBox* comboBoxThatHasCha deviceManager.setCurrentAudioDeviceType (type->getTypeName(), true); - updateAllControls(); // needed in case the type hasn't actally changed + updateAllControls(); // needed in case the type hasn't actually changed } } else if (comboBoxThatHasChanged == midiOutputSelector) diff --git a/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h b/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h index b7d4231..f11a640 100644 --- a/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h +++ b/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp b/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp index 589343f..57368d8 100644 --- a/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp +++ b/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -133,7 +133,7 @@ public: if (reader != nullptr) { if (levels.size() < (int) reader->numChannels) - levels.insertMultiple (0, Range(), (int) (reader->numChannels - levels.size())); + levels.insertMultiple (0, Range(), (int) reader->numChannels - levels.size()); reader->readMaxLevels (startSample, numSamples, levels.getRawDataPointer(), (int) reader->numChannels); @@ -240,7 +240,7 @@ private: for (int i = 0; i < numThumbSamps; ++i) { reader->readMaxLevels ((firstThumbIndex + i) * owner.samplesPerThumbSample, - owner.samplesPerThumbSample, levelsRead, numChannels); + owner.samplesPerThumbSample, levelsRead, (int) numChannels); for (int j = 0; j < (int) numChannels; ++j) levels[j][i].setFloat (levelsRead[j]); diff --git a/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.h b/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.h index fd890a6..736f9d7 100644 --- a/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.h +++ b/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnail.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h b/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h index 9145fb1..ed798cc 100644 --- a/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h +++ b/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailBase.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp b/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp index a60ad06..27a522e 100644 --- a/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp +++ b/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h b/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h index 7a9a052..2fa9f7c 100644 --- a/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h +++ b/JuceLibraryCode/modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp b/JuceLibraryCode/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp index fae07b7..626ac58 100644 --- a/JuceLibraryCode/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp +++ b/JuceLibraryCode/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -26,11 +26,8 @@ class MidiKeyboardUpDownButton : public Button { public: MidiKeyboardUpDownButton (MidiKeyboardComponent& comp, const int d) - : Button (String::empty), - owner (comp), - delta (d) + : Button (String::empty), owner (comp), delta (d) { - setOpaque (true); } void clicked() override @@ -60,8 +57,7 @@ private: }; //============================================================================== -MidiKeyboardComponent::MidiKeyboardComponent (MidiKeyboardState& s, - const Orientation o) +MidiKeyboardComponent::MidiKeyboardComponent (MidiKeyboardState& s, Orientation o) : state (s), xOffset (0), blackNoteLength (1), @@ -92,12 +88,12 @@ MidiKeyboardComponent::MidiKeyboardComponent (MidiKeyboardState& s, mouseOverNotes.insertMultiple (0, -1, 32); mouseDownNotes.insertMultiple (0, -1, 32); - setOpaque (true); + colourChanged(); setWantsKeyboardFocus (true); state.addListener (this); - startTimer (1000 / 20); + startTimerHz (20); } MidiKeyboardComponent::~MidiKeyboardComponent() @@ -169,6 +165,7 @@ void MidiKeyboardComponent::setScrollButtonsVisible (const bool newCanScroll) void MidiKeyboardComponent::colourChanged() { + setOpaque (findColour (whiteNoteColourId).isOpaque()); repaint(); } @@ -342,7 +339,7 @@ void MidiKeyboardComponent::repaintNote (const int noteNum) void MidiKeyboardComponent::paint (Graphics& g) { - g.fillAll (Colours::white.overlaidWith (findColour (whiteNoteColourId))); + g.fillAll (findColour (whiteNoteColourId)); const Colour lineColour (findColour (keySeparatorLineColourId)); const Colour textColour (findColour (textLabelColourId)); @@ -683,7 +680,7 @@ void MidiKeyboardComponent::resetAnyKeysInUse() void MidiKeyboardComponent::updateNoteUnderMouse (const MouseEvent& e, bool isDown) { - updateNoteUnderMouse (e.getPosition(), isDown, e.source.getIndex()); + updateNoteUnderMouse (e.getEventRelativeTo (this).getPosition(), isDown, e.source.getIndex()); } void MidiKeyboardComponent::updateNoteUnderMouse (Point pos, bool isDown, int fingerNum) @@ -699,7 +696,7 @@ void MidiKeyboardComponent::updateNoteUnderMouse (Point pos, bool isDown, i mouseOverNotes.set (fingerNum, newNote); } - int oldNoteDown = mouseDownNotes.getUnchecked (fingerNum); + const int oldNoteDown = mouseDownNotes.getUnchecked (fingerNum); if (isDown) { @@ -713,7 +710,7 @@ void MidiKeyboardComponent::updateNoteUnderMouse (Point pos, bool isDown, i state.noteOff (midiChannel, oldNoteDown); } - if (newNote >= 0) + if (newNote >= 0 && ! mouseDownNotes.contains (newNote)) { if (! useMousePositionForVelocity) mousePositionVelocity = 1.0f; @@ -816,7 +813,8 @@ void MidiKeyboardComponent::timerCallback() const Array& mouseSources = Desktop::getInstance().getMouseSources(); for (MouseInputSource* mi = mouseSources.begin(), * const e = mouseSources.end(); mi != e; ++mi) - updateNoteUnderMouse (getLocalPoint (nullptr, mi->getScreenPosition()).roundToInt(), mi->isDragging(), mi->getIndex()); + if (mi->getComponentUnderMouse() == this || isParentOf (mi->getComponentUnderMouse())) + updateNoteUnderMouse (getLocalPoint (nullptr, mi->getScreenPosition()).roundToInt(), mi->isDragging(), mi->getIndex()); } } @@ -828,8 +826,7 @@ void MidiKeyboardComponent::clearKeyMappings() keyPresses.clear(); } -void MidiKeyboardComponent::setKeyPressForNote (const KeyPress& key, - const int midiNoteOffsetFromC) +void MidiKeyboardComponent::setKeyPressForNote (const KeyPress& key, int midiNoteOffsetFromC) { removeKeyPressForNote (midiNoteOffsetFromC); @@ -887,6 +884,11 @@ bool MidiKeyboardComponent::keyStateChanged (const bool /*isKeyDown*/) return keyPressUsed; } +bool MidiKeyboardComponent::keyPressed (const KeyPress& key) +{ + return keyPresses.contains (key); +} + void MidiKeyboardComponent::focusLost (FocusChangeType) { resetAnyKeysInUse(); diff --git a/JuceLibraryCode/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h b/JuceLibraryCode/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h index c53890c..efd84c0 100644 --- a/JuceLibraryCode/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h +++ b/JuceLibraryCode/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -281,6 +281,8 @@ public: /** @internal */ bool keyStateChanged (bool isKeyDown) override; /** @internal */ + bool keyPressed (const KeyPress&) override; + /** @internal */ void focusLost (FocusChangeType) override; /** @internal */ void handleNoteOn (MidiKeyboardState*, int midiChannel, int midiNoteNumber, float velocity) override; diff --git a/JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.cpp b/JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.cpp index f63682b..c53ea7c 100644 --- a/JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.cpp +++ b/JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -45,6 +45,7 @@ namespace juce #include "gui/juce_AudioThumbnail.cpp" #include "gui/juce_AudioThumbnailCache.cpp" #include "gui/juce_MidiKeyboardComponent.cpp" +#include "gui/juce_AudioAppComponent.cpp" #include "players/juce_AudioProcessorPlayer.cpp" } diff --git a/JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.h b/JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.h index b5f38f8..40e9fff 100644 --- a/JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.h +++ b/JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -39,6 +39,7 @@ namespace juce #include "gui/juce_AudioThumbnail.h" #include "gui/juce_AudioThumbnailCache.h" #include "gui/juce_MidiKeyboardComponent.h" +#include "gui/juce_AudioAppComponent.h" #include "players/juce_AudioProcessorPlayer.h" } diff --git a/JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.mm b/JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.mm index b5b7497..edeb063 100644 --- a/JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.mm +++ b/JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_utils/juce_module_info b/JuceLibraryCode/modules/juce_audio_utils/juce_module_info index 47dbf8b..18eb34e 100644 --- a/JuceLibraryCode/modules/juce_audio_utils/juce_module_info +++ b/JuceLibraryCode/modules/juce_audio_utils/juce_module_info @@ -1,7 +1,7 @@ { "id": "juce_audio_utils", "name": "JUCE extra audio utility classes", - "version": "3.0.8", + "version": "3.2.0", "description": "Classes for audio-related GUI and miscellaneous tasks.", "website": "http://www.juce.com/juce", "license": "GPL/Commercial", diff --git a/JuceLibraryCode/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp b/JuceLibraryCode/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp index 721cf01..a8bfc44 100644 --- a/JuceLibraryCode/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp +++ b/JuceLibraryCode/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h b/JuceLibraryCode/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h index 418ceff..ee729fe 100644 --- a/JuceLibraryCode/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h +++ b/JuceLibraryCode/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.cpp b/JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.cpp index 65b1615..d9db76c 100644 --- a/JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.cpp +++ b/JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.h b/JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.h index 02feac7..251a8c2 100644 --- a/JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.h +++ b/JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -69,7 +69,7 @@ void readFromFifo (int* someData, int numItems) { int start1, size1, start2, size2; - abstractFifo.prepareToRead (numSamples, start1, size1, start2, size2); + abstractFifo.prepareToRead (numItems, start1, size1, start2, size2); if (size1 > 0) copySomeData (someData, myBuffer + start1, size1); diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_Array.h b/JuceLibraryCode/modules/juce_core/containers/juce_Array.h index 8e9cf3f..c34b743 100644 --- a/JuceLibraryCode/modules/juce_core/containers/juce_Array.h +++ b/JuceLibraryCode/modules/juce_core/containers/juce_Array.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -96,8 +96,7 @@ public: @param values the array to copy from */ template - explicit Array (const TypeToCreateFrom* values) - : numUsed (0) + explicit Array (const TypeToCreateFrom* values) : numUsed (0) { while (*values != TypeToCreateFrom()) add (*values++); @@ -109,8 +108,7 @@ public: @param numValues the number of values in the array */ template - Array (const TypeToCreateFrom* values, int numValues) - : numUsed (numValues) + Array (const TypeToCreateFrom* values, int numValues) : numUsed (numValues) { data.setAllocatedSize (numValues); @@ -118,6 +116,14 @@ public: new (data.elements + i) ElementType (values[i]); } + #if JUCE_COMPILER_SUPPORTS_INITIALIZER_LISTS + template + Array (const std::initializer_list& items) : numUsed (0) + { + addArray (items); + } + #endif + /** Destructor. */ ~Array() { @@ -474,7 +480,11 @@ public: numUsed += numberOfTimesToInsertIt; while (--numberOfTimesToInsertIt >= 0) - new (insertPos++) ElementType (newElement); + { + new (insertPos) ElementType (newElement); + ++insertPos; // NB: this increment is done separately from the + // new statement to avoid a compiler bug in VS2014 + } } } @@ -600,6 +610,21 @@ public: } } + #if JUCE_COMPILER_SUPPORTS_INITIALIZER_LISTS + template + void addArray (const std::initializer_list& items) + { + const ScopedLockType lock (getLock()); + data.ensureAllocatedSize (numUsed + (int) items.size()); + + for (auto& item : items) + { + new (data.elements + numUsed) ElementType (item); + ++numUsed; + } + } + #endif + /** Adds elements from a null-terminated array of pointers to the end of this array. @param elementsToAdd an array of pointers to some kind of object from which elements @@ -807,8 +832,8 @@ public: /** Removes an item from the array. - This will remove the first occurrence of the given element from the array. - If the item isn't found, no action is taken. + This will remove all occurrences of the given element from the array. + If no such items are found, no action is taken. @param valueToRemove the object to try to remove @see remove, removeRange diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_ArrayAllocationBase.h b/JuceLibraryCode/modules/juce_core/containers/juce_ArrayAllocationBase.h index cfbe464..1a673c9 100644 --- a/JuceLibraryCode/modules/juce_core/containers/juce_ArrayAllocationBase.h +++ b/JuceLibraryCode/modules/juce_core/containers/juce_ArrayAllocationBase.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.cpp b/JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.cpp index 38f5c5f..5a4cae7 100644 --- a/JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.cpp +++ b/JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -45,7 +45,7 @@ bool DynamicObject::hasProperty (const Identifier& propertyName) const return v != nullptr && ! v->isMethod(); } -var DynamicObject::getProperty (const Identifier& propertyName) const +const var& DynamicObject::getProperty (const Identifier& propertyName) const { return properties [propertyName]; } diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.h b/JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.h index 5c624a4..0133676 100644 --- a/JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.h +++ b/JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -60,7 +60,7 @@ public: /** Returns a named property. This returns var::null if no such property exists. */ - virtual var getProperty (const Identifier& propertyName) const; + virtual const var& getProperty (const Identifier& propertyName) const; /** Sets a named property. */ virtual void setProperty (const Identifier& propertyName, const var& newValue); diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_ElementComparator.h b/JuceLibraryCode/modules/juce_core/containers/juce_ElementComparator.h index 01dc5b7..41f63ca 100644 --- a/JuceLibraryCode/modules/juce_core/containers/juce_ElementComparator.h +++ b/JuceLibraryCode/modules/juce_core/containers/juce_ElementComparator.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_HashMap.h b/JuceLibraryCode/modules/juce_core/containers/juce_HashMap.h index 07d02b4..cadfdac 100644 --- a/JuceLibraryCode/modules/juce_core/containers/juce_HashMap.h +++ b/JuceLibraryCode/modules/juce_core/containers/juce_HashMap.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_LinkedListPointer.h b/JuceLibraryCode/modules/juce_core/containers/juce_LinkedListPointer.h index a27e521..53b89b5 100644 --- a/JuceLibraryCode/modules/juce_core/containers/juce_LinkedListPointer.h +++ b/JuceLibraryCode/modules/juce_core/containers/juce_LinkedListPointer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.cpp b/JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.cpp index 504ab78..68ba5f8 100644 --- a/JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.cpp +++ b/JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -29,7 +29,7 @@ struct NamedValueSet::NamedValue { NamedValue() noexcept {} - NamedValue (Identifier n, const var& v) : name (n), value (v) {} + NamedValue (const Identifier& n, const var& v) : name (n), value (v) {} NamedValue (const NamedValue& other) : name (other.name), value (other.value) {} #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS @@ -39,7 +39,9 @@ struct NamedValueSet::NamedValue { } - NamedValue (Identifier n, var&& v) : name (n), value (static_cast (v)) + NamedValue (Identifier&& n, var&& v) + : name (static_cast (n)), + value (static_cast (v)) { } @@ -138,7 +140,7 @@ var* NamedValueSet::getVarPointer (const Identifier& name) const noexcept } #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -bool NamedValueSet::set (Identifier name, var&& newValue) +bool NamedValueSet::set (const Identifier& name, var&& newValue) { if (var* const v = getVarPointer (name)) { @@ -154,7 +156,7 @@ bool NamedValueSet::set (Identifier name, var&& newValue) } #endif -bool NamedValueSet::set (Identifier name, const var& newValue) +bool NamedValueSet::set (const Identifier& name, const var& newValue) { if (var* const v = getVarPointer (name)) { diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.h b/JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.h index e4a98ed..21b75b0 100644 --- a/JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.h +++ b/JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -78,14 +78,14 @@ public: @returns true if a value was changed or added; false if the value was already set the value passed-in. */ - bool set (Identifier name, const var& newValue); + bool set (const Identifier& name, const var& newValue); #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS /** Changes or adds a named value. @returns true if a value was changed or added; false if the value was already set the value passed-in. */ - bool set (Identifier name, var&& newValue); + bool set (const Identifier& name, var&& newValue); #endif /** Returns true if the set contains an item with the specified name. */ diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_OwnedArray.h b/JuceLibraryCode/modules/juce_core/containers/juce_OwnedArray.h index be7448c..aa2f2fb 100644 --- a/JuceLibraryCode/modules/juce_core/containers/juce_OwnedArray.h +++ b/JuceLibraryCode/modules/juce_core/containers/juce_OwnedArray.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.cpp b/JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.cpp index 6b02baf..057ae87 100644 --- a/JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.cpp +++ b/JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.h b/JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.h index 2a4ecb1..88284e6 100644 --- a/JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.h +++ b/JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_ReferenceCountedArray.h b/JuceLibraryCode/modules/juce_core/containers/juce_ReferenceCountedArray.h index 6b02c3e..12a8925 100644 --- a/JuceLibraryCode/modules/juce_core/containers/juce_ReferenceCountedArray.h +++ b/JuceLibraryCode/modules/juce_core/containers/juce_ReferenceCountedArray.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -119,26 +119,30 @@ public: */ ~ReferenceCountedArray() { - clear(); + releaseAllObjects(); } //============================================================================== /** Removes all objects from the array. - - Any objects in the array that are not referenced from elsewhere will be deleted. + Any objects in the array that whose reference counts drop to zero will be deleted. */ void clear() { const ScopedLockType lock (getLock()); - - while (numUsed > 0) - if (ObjectClass* o = data.elements [--numUsed]) - releaseObject (o); - - jassert (numUsed == 0); + releaseAllObjects(); data.setAllocatedSize (0); } + /** Removes all objects from the array without freeing the array's allocated storage. + Any objects in the array that whose reference counts drop to zero will be deleted. + @see clear + */ + void clearQuick() + { + const ScopedLockType lock (getLock()); + releaseAllObjects(); + } + /** Returns the current number of objects in the array. */ inline int size() const noexcept { @@ -886,6 +890,15 @@ private: ArrayAllocationBase data; int numUsed; + void releaseAllObjects() + { + while (numUsed > 0) + if (ObjectClass* o = data.elements [--numUsed]) + releaseObject (o); + + jassert (numUsed == 0); + } + static void releaseObject (ObjectClass* o) { if (o->decReferenceCountWithoutDeleting()) diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_ScopedValueSetter.h b/JuceLibraryCode/modules/juce_core/containers/juce_ScopedValueSetter.h index 13b871e..840ca91 100644 --- a/JuceLibraryCode/modules/juce_core/containers/juce_ScopedValueSetter.h +++ b/JuceLibraryCode/modules/juce_core/containers/juce_ScopedValueSetter.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_SortedSet.h b/JuceLibraryCode/modules/juce_core/containers/juce_SortedSet.h index 62fd923..90a2396 100644 --- a/JuceLibraryCode/modules/juce_core/containers/juce_SortedSet.h +++ b/JuceLibraryCode/modules/juce_core/containers/juce_SortedSet.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_SparseSet.h b/JuceLibraryCode/modules/juce_core/containers/juce_SparseSet.h index 86366fc..573975a 100644 --- a/JuceLibraryCode/modules/juce_core/containers/juce_SparseSet.h +++ b/JuceLibraryCode/modules/juce_core/containers/juce_SparseSet.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_Variant.cpp b/JuceLibraryCode/modules/juce_core/containers/juce_Variant.cpp index db3f2f5..849bd8f 100644 --- a/JuceLibraryCode/modules/juce_core/containers/juce_Variant.cpp +++ b/JuceLibraryCode/modules/juce_core/containers/juce_Variant.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -174,7 +174,7 @@ public: int toInt (const ValueUnion& data) const noexcept override { return (int) data.doubleValue; }; int64 toInt64 (const ValueUnion& data) const noexcept override { return (int64) data.doubleValue; }; double toDouble (const ValueUnion& data) const noexcept override { return data.doubleValue; } - String toString (const ValueUnion& data) const override { return String (data.doubleValue); } + String toString (const ValueUnion& data) const override { return String (data.doubleValue, 20); } bool toBool (const ValueUnion& data) const noexcept override { return data.doubleValue != 0; } bool isDouble() const noexcept override { return true; } @@ -253,8 +253,8 @@ public: } private: - static inline const String* getString (const ValueUnion& data) noexcept { return reinterpret_cast (data.stringValue); } - static inline String* getString (ValueUnion& data) noexcept { return reinterpret_cast (data.stringValue); } + static inline const String* getString (const ValueUnion& data) noexcept { return reinterpret_cast (data.stringValue); } + static inline String* getString (ValueUnion& data) noexcept { return reinterpret_cast (data.stringValue); } }; //============================================================================== @@ -487,7 +487,7 @@ var::operator String() const { return type->toString ReferenceCountedObject* var::getObject() const noexcept { return type->toObject (value); } Array* var::getArray() const noexcept { return type->toArray (value); } MemoryBlock* var::getBinaryData() const noexcept { return type->toBinary (value); } -DynamicObject* var::getDynamicObject() const noexcept { return dynamic_cast (getObject()); } +DynamicObject* var::getDynamicObject() const noexcept { return dynamic_cast (getObject()); } //============================================================================== void var::swapWith (var& other) noexcept @@ -576,20 +576,20 @@ var var::clone() const noexcept } //============================================================================== -var var::operator[] (const Identifier propertyName) const +const var& var::operator[] (const Identifier& propertyName) const { if (DynamicObject* const o = getDynamicObject()) return o->getProperty (propertyName); - return var(); + return var::null; } -var var::operator[] (const char* const propertyName) const +const var& var::operator[] (const char* const propertyName) const { return operator[] (Identifier (propertyName)); } -var var::getProperty (const Identifier propertyName, const var& defaultReturnValue) const +var var::getProperty (const Identifier& propertyName, const var& defaultReturnValue) const { if (DynamicObject* const o = getDynamicObject()) return o->getProperties().getWithDefault (propertyName, defaultReturnValue); @@ -602,7 +602,7 @@ var::NativeFunction var::getNativeFunction() const return isMethod() ? value.methodValue : nullptr; } -var var::invoke (Identifier method, const var* arguments, int numArguments) const +var var::invoke (const Identifier& method, const var* arguments, int numArguments) const { if (DynamicObject* const o = getDynamicObject()) return o->invokeMethod (method, var::NativeFunctionArgs (*this, arguments, numArguments)); @@ -610,35 +610,35 @@ var var::invoke (Identifier method, const var* arguments, int numArguments) cons return var(); } -var var::call (const Identifier method) const +var var::call (const Identifier& method) const { return invoke (method, nullptr, 0); } -var var::call (const Identifier method, const var& arg1) const +var var::call (const Identifier& method, const var& arg1) const { return invoke (method, &arg1, 1); } -var var::call (const Identifier method, const var& arg1, const var& arg2) const +var var::call (const Identifier& method, const var& arg1, const var& arg2) const { var args[] = { arg1, arg2 }; return invoke (method, args, 2); } -var var::call (const Identifier method, const var& arg1, const var& arg2, const var& arg3) +var var::call (const Identifier& method, const var& arg1, const var& arg2, const var& arg3) { var args[] = { arg1, arg2, arg3 }; return invoke (method, args, 3); } -var var::call (const Identifier method, const var& arg1, const var& arg2, const var& arg3, const var& arg4) const +var var::call (const Identifier& method, const var& arg1, const var& arg2, const var& arg3, const var& arg4) const { var args[] = { arg1, arg2, arg3, arg4 }; return invoke (method, args, 4); } -var var::call (const Identifier method, const var& arg1, const var& arg2, const var& arg3, const var& arg4, const var& arg5) const +var var::call (const Identifier& method, const var& arg1, const var& arg2, const var& arg3, const var& arg4, const var& arg5) const { var args[] = { arg1, arg2, arg3, arg4, arg5 }; return invoke (method, args, 5); diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_Variant.h b/JuceLibraryCode/modules/juce_core/containers/juce_Variant.h index 41a4884..25d0dcd 100644 --- a/JuceLibraryCode/modules/juce_core/containers/juce_Variant.h +++ b/JuceLibraryCode/modules/juce_core/containers/juce_Variant.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -62,7 +62,6 @@ public: }; typedef var (*NativeFunction) (const NativeFunctionArgs&); - typedef Identifier identifier; //============================================================================== /** Creates a void variant. */ @@ -242,27 +241,27 @@ public: //============================================================================== /** If this variant is an object, this returns one of its properties. */ - var operator[] (Identifier propertyName) const; + const var& operator[] (const Identifier& propertyName) const; /** If this variant is an object, this returns one of its properties. */ - var operator[] (const char* propertyName) const; + const var& operator[] (const char* propertyName) const; /** If this variant is an object, this returns one of its properties, or a default fallback value if the property is not set. */ - var getProperty (Identifier propertyName, const var& defaultReturnValue) const; + var getProperty (const Identifier& propertyName, const var& defaultReturnValue) const; /** Invokes a named method call with no arguments. */ - var call (Identifier method) const; + var call (const Identifier& method) const; /** Invokes a named method call with one argument. */ - var call (Identifier method, const var& arg1) const; + var call (const Identifier& method, const var& arg1) const; /** Invokes a named method call with 2 arguments. */ - var call (Identifier method, const var& arg1, const var& arg2) const; + var call (const Identifier& method, const var& arg1, const var& arg2) const; /** Invokes a named method call with 3 arguments. */ - var call (Identifier method, const var& arg1, const var& arg2, const var& arg3); + var call (const Identifier& method, const var& arg1, const var& arg2, const var& arg3); /** Invokes a named method call with 4 arguments. */ - var call (Identifier method, const var& arg1, const var& arg2, const var& arg3, const var& arg4) const; + var call (const Identifier& method, const var& arg1, const var& arg2, const var& arg3, const var& arg4) const; /** Invokes a named method call with 5 arguments. */ - var call (Identifier method, const var& arg1, const var& arg2, const var& arg3, const var& arg4, const var& arg5) const; + var call (const Identifier& method, const var& arg1, const var& arg2, const var& arg3, const var& arg4, const var& arg5) const; /** Invokes a named method call with a list of arguments. */ - var invoke (Identifier method, const var* arguments, int numArguments) const; + var invoke (const Identifier& method, const var* arguments, int numArguments) const; /** If this object is a method, this returns the function pointer. */ NativeFunction getNativeFunction() const; diff --git a/JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.cpp b/JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.cpp index 7d6dd4b..76b503b 100644 --- a/JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.cpp +++ b/JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -73,64 +73,71 @@ bool DirectoryIterator::next() bool DirectoryIterator::next (bool* const isDirResult, bool* const isHiddenResult, int64* const fileSize, Time* const modTime, Time* const creationTime, bool* const isReadOnly) { - hasBeenAdvanced = true; - - if (subIterator != nullptr) + for (;;) { - if (subIterator->next (isDirResult, isHiddenResult, fileSize, modTime, creationTime, isReadOnly)) - return true; - - subIterator = nullptr; - } - - String filename; - bool isDirectory, isHidden = false; + hasBeenAdvanced = true; - while (fileFinder.next (filename, &isDirectory, - (isHiddenResult != nullptr || (whatToLookFor & File::ignoreHiddenFiles) != 0) ? &isHidden : nullptr, - fileSize, modTime, creationTime, isReadOnly)) - { - ++index; - - if (! filename.containsOnly (".")) + if (subIterator != nullptr) { - bool matches = false; - - if (isDirectory) - { - if (isRecursive && ((whatToLookFor & File::ignoreHiddenFiles) == 0 || ! isHidden)) - subIterator = new DirectoryIterator (File::createFileWithoutCheckingPath (path + filename), - true, wildCard, whatToLookFor); + if (subIterator->next (isDirResult, isHiddenResult, fileSize, modTime, creationTime, isReadOnly)) + return true; - matches = (whatToLookFor & File::findDirectories) != 0; - } - else - { - matches = (whatToLookFor & File::findFiles) != 0; - } + subIterator = nullptr; + } - // if we're not relying on the OS iterator to do the wildcard match, do it now.. - if (matches && (isRecursive || wildCards.size() > 1)) - matches = fileMatches (wildCards, filename); + String filename; + bool isDirectory, isHidden = false, shouldContinue = false; - if (matches && (whatToLookFor & File::ignoreHiddenFiles) != 0) - matches = ! isHidden; + while (fileFinder.next (filename, &isDirectory, + (isHiddenResult != nullptr || (whatToLookFor & File::ignoreHiddenFiles) != 0) ? &isHidden : nullptr, + fileSize, modTime, creationTime, isReadOnly)) + { + ++index; - if (matches) + if (! filename.containsOnly (".")) { - currentFile = File::createFileWithoutCheckingPath (path + filename); - if (isHiddenResult != nullptr) *isHiddenResult = isHidden; - if (isDirResult != nullptr) *isDirResult = isDirectory; - - return true; + bool matches = false; + + if (isDirectory) + { + if (isRecursive && ((whatToLookFor & File::ignoreHiddenFiles) == 0 || ! isHidden)) + subIterator = new DirectoryIterator (File::createFileWithoutCheckingPath (path + filename), + true, wildCard, whatToLookFor); + + matches = (whatToLookFor & File::findDirectories) != 0; + } + else + { + matches = (whatToLookFor & File::findFiles) != 0; + } + + // if we're not relying on the OS iterator to do the wildcard match, do it now.. + if (matches && (isRecursive || wildCards.size() > 1)) + matches = fileMatches (wildCards, filename); + + if (matches && (whatToLookFor & File::ignoreHiddenFiles) != 0) + matches = ! isHidden; + + if (matches) + { + currentFile = File::createFileWithoutCheckingPath (path + filename); + if (isHiddenResult != nullptr) *isHiddenResult = isHidden; + if (isDirResult != nullptr) *isDirResult = isDirectory; + + return true; + } + + if (subIterator != nullptr) + { + shouldContinue = true; + break; + } } - - if (subIterator != nullptr) - return next (isDirResult, isHiddenResult, fileSize, modTime, creationTime, isReadOnly); } - } - return false; + if (! shouldContinue) + return false; + } } const File& DirectoryIterator::getFile() const diff --git a/JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.h b/JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.h index 3ca2265..bd71697 100644 --- a/JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.h +++ b/JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/files/juce_File.cpp b/JuceLibraryCode/modules/juce_core/files/juce_File.cpp index d5c520a..1b4687e 100644 --- a/JuceLibraryCode/modules/juce_core/files/juce_File.cpp +++ b/JuceLibraryCode/modules/juce_core/files/juce_File.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -219,6 +219,11 @@ bool File::setReadOnly (const bool shouldBeReadOnly, return setFileReadOnlyInternal (shouldBeReadOnly) && worked; } +bool File::setExecutePermission (bool shouldBeExecutable) const +{ + return setFileExecutableInternal (shouldBeExecutable); +} + bool File::deleteRecursively() const { bool worked = true; @@ -911,6 +916,11 @@ public: const File temp (File::getSpecialLocation (File::tempDirectory)); expect (! File::nonexistent.exists()); + expect (! File::nonexistent.existsAsFile()); + expect (! File::nonexistent.isDirectory()); + #if ! JUCE_WINDOWS + expect (File("/").isDirectory()); + #endif expect (home.isDirectory()); expect (home.exists()); expect (! home.existsAsFile()); diff --git a/JuceLibraryCode/modules/juce_core/files/juce_File.h b/JuceLibraryCode/modules/juce_core/files/juce_File.h index 57d970f..8a28d51 100644 --- a/JuceLibraryCode/modules/juce_core/files/juce_File.h +++ b/JuceLibraryCode/modules/juce_core/files/juce_File.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -348,6 +348,13 @@ public: bool setReadOnly (bool shouldBeReadOnly, bool applyRecursively = false) const; + /** Changes the execute-permissions of a file. + + @param shouldBeExecutable whether to add or remove execute-permission + @returns true if it manages to change the file's permissions. + */ + bool setExecutePermission (bool shouldBeExecutable) const; + /** Returns true if this file is a hidden or system file. The criteria for deciding whether a file is hidden are platform-dependent. */ @@ -486,6 +493,9 @@ public: Note that the destination file isn't the directory to put it in, it's the actual filename that you want the new file to have. + Also note that on some OSes (e.g. Windows), moving files between different + volumes may not be possible. + @returns true if the operation succeeds */ bool moveFileTo (const File& targetLocation) const; @@ -968,6 +978,7 @@ private: bool setFileTimesInternal (int64 m, int64 a, int64 c) const; void getFileTimesInternal (int64& m, int64& a, int64& c) const; bool setFileReadOnlyInternal (bool) const; + bool setFileExecutableInternal (bool) const; }; #endif // JUCE_FILE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/files/juce_FileFilter.cpp b/JuceLibraryCode/modules/juce_core/files/juce_FileFilter.cpp index bd0bdf8..118c321 100644 --- a/JuceLibraryCode/modules/juce_core/files/juce_FileFilter.cpp +++ b/JuceLibraryCode/modules/juce_core/files/juce_FileFilter.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/files/juce_FileFilter.h b/JuceLibraryCode/modules/juce_core/files/juce_FileFilter.h index 4c02415..9dae801 100644 --- a/JuceLibraryCode/modules/juce_core/files/juce_FileFilter.h +++ b/JuceLibraryCode/modules/juce_core/files/juce_FileFilter.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.cpp b/JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.cpp index 801ccfa..c6ed3d6 100644 --- a/JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.cpp +++ b/JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -57,7 +57,7 @@ int FileInputStream::read (void* buffer, int bytesToRead) jassert (buffer != nullptr && bytesToRead >= 0); const size_t num = readInternal (buffer, (size_t) bytesToRead); - currentPosition += num; + currentPosition += (int64) num; return (int) num; } diff --git a/JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.h b/JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.h index 35963ba..7c31568 100644 --- a/JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.h +++ b/JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.cpp b/JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.cpp index 961a8d1..d5c25e7 100644 --- a/JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.cpp +++ b/JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -90,7 +90,7 @@ bool FileOutputStream::write (const void* const src, const size_t numBytes) { memcpy (buffer + bytesInBuffer, src, numBytes); bytesInBuffer += numBytes; - currentPosition += numBytes; + currentPosition += (int64) numBytes; } else { @@ -101,7 +101,7 @@ bool FileOutputStream::write (const void* const src, const size_t numBytes) { memcpy (buffer + bytesInBuffer, src, numBytes); bytesInBuffer += numBytes; - currentPosition += numBytes; + currentPosition += (int64) numBytes; } else { @@ -110,7 +110,7 @@ bool FileOutputStream::write (const void* const src, const size_t numBytes) if (bytesWritten < 0) return false; - currentPosition += bytesWritten; + currentPosition += (int64) bytesWritten; return bytesWritten == (ssize_t) numBytes; } } @@ -126,7 +126,7 @@ bool FileOutputStream::writeRepeatedByte (uint8 byte, size_t numBytes) { memset (buffer + bytesInBuffer, byte, numBytes); bytesInBuffer += numBytes; - currentPosition += numBytes; + currentPosition += (int64) numBytes; return true; } diff --git a/JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.h b/JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.h index f80705f..7d1520c 100644 --- a/JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.h +++ b/JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.cpp b/JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.cpp index ce0af7e..5531c62 100644 --- a/JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.cpp +++ b/JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.h b/JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.h index 51baf2e..3744a49 100644 --- a/JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.h +++ b/JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/files/juce_MemoryMappedFile.h b/JuceLibraryCode/modules/juce_core/files/juce_MemoryMappedFile.h index 8a79185..48e0eb6 100644 --- a/JuceLibraryCode/modules/juce_core/files/juce_MemoryMappedFile.h +++ b/JuceLibraryCode/modules/juce_core/files/juce_MemoryMappedFile.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.cpp b/JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.cpp index 50475d5..acb1af0 100644 --- a/JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.cpp +++ b/JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.h b/JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.h index 04561a7..0aad9c9 100644 --- a/JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.h +++ b/JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.cpp b/JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.cpp index f18a2eb..8e51da7 100644 --- a/JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.cpp +++ b/JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.h b/JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.h index fb398ce..af9a757 100644 --- a/JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.h +++ b/JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/javascript/juce_JSON.cpp b/JuceLibraryCode/modules/juce_core/javascript/juce_JSON.cpp index 5a0f7f7..9dbd415 100644 --- a/JuceLibraryCode/modules/juce_core/javascript/juce_JSON.cpp +++ b/JuceLibraryCode/modules/juce_core/javascript/juce_JSON.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -579,7 +579,7 @@ public: case 1: return r.nextInt(); case 2: return r.nextInt64(); case 3: return r.nextBool(); - case 4: return r.nextDouble(); + case 4: return String (r.nextDouble(), 8).getDoubleValue(); case 5: return createRandomWideCharString (r); case 6: diff --git a/JuceLibraryCode/modules/juce_core/javascript/juce_JSON.h b/JuceLibraryCode/modules/juce_core/javascript/juce_JSON.h index 7fb17ee..31a2ff5 100644 --- a/JuceLibraryCode/modules/juce_core/javascript/juce_JSON.h +++ b/JuceLibraryCode/modules/juce_core/javascript/juce_JSON.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.cpp b/JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.cpp index e78bb37..761cbbe 100644 --- a/JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.cpp +++ b/JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -102,7 +102,7 @@ struct JavascriptEngine::RootObject : public DynamicObject static bool isNumericOrUndefined (const var& v) { return v.isInt() || v.isDouble() || v.isInt64() || v.isBool() || v.isUndefined(); } static int64 getOctalValue (const String& s) { BigInteger b; b.parseString (s, 8); return b.toInt64(); } static Identifier getPrototypeIdentifier() { static const Identifier i ("prototype"); return i; } - static var* getPropertyPointer (DynamicObject* o, Identifier i) { return o->getProperties().getVarPointer (i); } + static var* getPropertyPointer (DynamicObject* o, const Identifier& i) { return o->getProperties().getVarPointer (i); } //============================================================================== struct CodeLocation @@ -136,7 +136,7 @@ struct JavascriptEngine::RootObject : public DynamicObject ReferenceCountedObjectPtr root; DynamicObject::Ptr scope; - var findFunctionCall (const CodeLocation& location, const var& targetObject, Identifier functionName) const + var findFunctionCall (const CodeLocation& location, const var& targetObject, const Identifier& functionName) const { if (DynamicObject* o = targetObject.getDynamicObject()) { @@ -149,6 +149,10 @@ struct JavascriptEngine::RootObject : public DynamicObject if (const var* prop = getPropertyPointer (p, functionName)) return *prop; } + + // if there's a class with an overridden DynamicObject::hasMethod, this avoids an error + if (o->hasMethod (functionName)) + return var(); } if (targetObject.isString()) @@ -166,7 +170,7 @@ struct JavascriptEngine::RootObject : public DynamicObject return var(); } - var* findRootClassProperty (Identifier className, Identifier propName) const + var* findRootClassProperty (const Identifier& className, const Identifier& propName) const { if (DynamicObject* cls = root->getProperty (className).getDynamicObject()) return getPropertyPointer (cls, propName); @@ -174,7 +178,7 @@ struct JavascriptEngine::RootObject : public DynamicObject return nullptr; } - var findSymbolInParentScopes (Identifier name) const + var findSymbolInParentScopes (const Identifier& name) const { if (const var* v = getPropertyPointer (scope, name)) return *v; @@ -183,7 +187,7 @@ struct JavascriptEngine::RootObject : public DynamicObject : var::undefined(); } - bool findAndInvokeMethod (Identifier function, const var::NativeFunctionArgs& args, var& result) const + bool findAndInvokeMethod (const Identifier& function, const var::NativeFunctionArgs& args, var& result) const { DynamicObject* target = args.thisObject.getDynamicObject(); @@ -348,7 +352,7 @@ struct JavascriptEngine::RootObject : public DynamicObject struct UnqualifiedName : public Expression { - UnqualifiedName (const CodeLocation& l, Identifier n) noexcept : Expression (l), name (n) {} + UnqualifiedName (const CodeLocation& l, const Identifier& n) noexcept : Expression (l), name (n) {} var getResult (const Scope& s) const override { return s.findSymbolInParentScopes (name); } @@ -365,7 +369,7 @@ struct JavascriptEngine::RootObject : public DynamicObject struct DotOperator : public Expression { - DotOperator (const CodeLocation& l, ExpPtr& p, Identifier c) noexcept : Expression (l), parent (p), child (c) {} + DotOperator (const CodeLocation& l, ExpPtr& p, const Identifier& c) noexcept : Expression (l), parent (p), child (c) {} var getResult (const Scope& s) const override { @@ -699,6 +703,11 @@ struct JavascriptEngine::RootObject : public DynamicObject if (FunctionObject* fo = dynamic_cast (function.getObject())) return fo->invoke (s, args); + if (DotOperator* dot = dynamic_cast (object.get())) + if (DynamicObject* o = thisObject.getDynamicObject()) + if (o->hasMethod (dot->child)) // allow an overridden DynamicObject::invokeMethod to accept a method call. + return o->invokeMethod (dot->child, args); + location.throwError ("This expression is not a function!"); return var(); } @@ -1453,12 +1462,12 @@ struct JavascriptEngine::RootObject : public DynamicObject ObjectClass() { setMethod ("dump", dump); - setMethod ("clone", clone); + setMethod ("clone", cloneFn); } static Identifier getClassName() { static const Identifier i ("Object"); return i; } static var dump (Args a) { DBG (JSON::toString (a.thisObject)); (void) a; return var::undefined(); } - static var clone (Args a) { return a.thisObject.clone(); } + static var cloneFn (Args a) { return a.thisObject.clone(); } }; //============================================================================== @@ -1575,8 +1584,8 @@ struct JavascriptEngine::RootObject : public DynamicObject static var Math_range (Args a) { return isInt (a, 0) ? var (jlimit (getInt (a, 1), getInt (a, 2), getInt (a, 0))) : var (jlimit (getDouble (a, 1), getDouble (a, 2), getDouble (a, 0))); } static var Math_min (Args a) { return (isInt (a, 0) && isInt (a, 1)) ? var (jmin (getInt (a, 0), getInt (a, 1))) : var (jmin (getDouble (a, 0), getDouble (a, 1))); } static var Math_max (Args a) { return (isInt (a, 0) && isInt (a, 1)) ? var (jmax (getInt (a, 0), getInt (a, 1))) : var (jmax (getDouble (a, 0), getDouble (a, 1))); } - static var Math_toDegrees (Args a) { return (180.0 / double_Pi) * getDouble (a, 0); } - static var Math_toRadians (Args a) { return (double_Pi / 180.0) * getDouble (a, 0); } + static var Math_toDegrees (Args a) { return radiansToDegrees (getDouble (a, 0)); } + static var Math_toRadians (Args a) { return degreesToRadians (getDouble (a, 0)); } static var Math_sin (Args a) { return sin (getDouble (a, 0)); } static var Math_asin (Args a) { return asin (getDouble (a, 0)); } static var Math_cos (Args a) { return cos (getDouble (a, 0)); } @@ -1661,7 +1670,7 @@ JavascriptEngine::~JavascriptEngine() {} void JavascriptEngine::prepareTimeout() const noexcept { root->timeout = Time::getCurrentTime() + maximumExecutionTime; } -void JavascriptEngine::registerNativeObject (Identifier name, DynamicObject* object) +void JavascriptEngine::registerNativeObject (const Identifier& name, DynamicObject* object) { root->setProperty (name, object); } @@ -1697,7 +1706,7 @@ var JavascriptEngine::evaluate (const String& code, Result* result) return var::undefined(); } -var JavascriptEngine::callFunction (Identifier function, const var::NativeFunctionArgs& args, Result* result) +var JavascriptEngine::callFunction (const Identifier& function, const var::NativeFunctionArgs& args, Result* result) { var returnVal (var::undefined()); diff --git a/JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.h b/JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.h index eafc3cd..0de35ae 100644 --- a/JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.h +++ b/JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -78,7 +78,7 @@ public: The function arguments are passed in the same format as used by native methods in the var class. */ - var callFunction (Identifier function, + var callFunction (const Identifier& function, const var::NativeFunctionArgs& args, Result* errorMessage = nullptr); @@ -87,7 +87,7 @@ public: engine until the engine is deleted. The name must be a simple JS identifier, without any dots. */ - void registerNativeObject (Identifier objectName, DynamicObject* object); + void registerNativeObject (const Identifier& objectName, DynamicObject* object); /** This value indicates how long a call to one of the evaluate methods is permitted to run before timing-out and failing. diff --git a/JuceLibraryCode/modules/juce_core/juce_core.cpp b/JuceLibraryCode/modules/juce_core/juce_core.cpp index 7cfc664..01d2381 100644 --- a/JuceLibraryCode/modules/juce_core/juce_core.cpp +++ b/JuceLibraryCode/modules/juce_core/juce_core.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -45,9 +45,9 @@ #include #include -#include #if ! JUCE_ANDROID + #include #include #endif @@ -59,7 +59,10 @@ #include #if ! JUCE_MINGW + #pragma warning (push) + #pragma warning (disable: 4091) #include + #pragma warning (pop) #if ! JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES #pragma comment (lib, "DbgHelp.lib") @@ -82,6 +85,10 @@ #if JUCE_LINUX #include #include + + #if JUCE_USE_CURL + #include + #endif #endif #include @@ -107,6 +114,11 @@ #include #endif +//============================================================================== +#ifndef JUCE_STANDALONE_APPLICATION + JUCE_COMPILER_WARNING ("Please re-save your Introjucer project with the latest Introjucer version to avoid this warning") + #define JUCE_STANDALONE_APPLICATION 0 +#endif //============================================================================== namespace juce @@ -205,6 +217,9 @@ namespace juce #include "native/juce_linux_CommonFile.cpp" #include "native/juce_linux_Files.cpp" #include "native/juce_linux_Network.cpp" +#if JUCE_USE_CURL + #include "native/juce_curl_Network.cpp" +#endif #include "native/juce_linux_SystemStats.cpp" #include "native/juce_linux_Threads.cpp" diff --git a/JuceLibraryCode/modules/juce_core/juce_core.h b/JuceLibraryCode/modules/juce_core/juce_core.h index ce5219e..33fd07d 100644 --- a/JuceLibraryCode/modules/juce_core/juce_core.h +++ b/JuceLibraryCode/modules/juce_core/juce_core.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -48,6 +48,15 @@ #endif #endif +#ifdef _MSC_VER + #pragma warning (push) + // Disable warnings for long class names, padding, and undefined preprocessor definitions. + #pragma warning (disable: 4251 4786 4668 4820) + #ifdef __INTEL_COMPILER + #pragma warning (disable: 1125) + #endif +#endif + //============================================================================== #include "system/juce_TargetPlatform.h" @@ -117,6 +126,17 @@ #define JUCE_ZLIB_INCLUDE_PATH #endif +/** Config: JUCE_USE_CURL + Enables http/https support via libcurl (Linux only). Enabling this will add an additional + run-time dynmic dependency to libcurl. + + If you disable this then https/ssl support will not be available on linux. +*/ +#ifndef JUCE_USE_CURL + #define JUCE_USE_CURL 0 +#endif + + /* Config: JUCE_CATCH_UNHANDLED_EXCEPTIONS If enabled, this will add some exception-catching code to forward unhandled exceptions to your JUCEApplicationBase::unhandledException() callback. @@ -131,14 +151,6 @@ //============================================================================= //============================================================================= -#if JUCE_MSVC - #pragma warning (disable: 4251) // (DLL build warning, must be disabled before pushing the warning state) - #pragma warning (push) - #pragma warning (disable: 4786) // (long class name warning) - #ifdef __INTEL_COMPILER - #pragma warning (disable: 1125) - #endif -#endif #include "system/juce_StandardHeader.h" @@ -244,8 +256,6 @@ extern JUCE_API void JUCE_CALLTYPE logAssertion (const char* file, int line) noe #include "maths/juce_Random.h" #include "misc/juce_Uuid.h" #include "misc/juce_WindowsRegistry.h" -#include "system/juce_PlatformDefs.h" -#include "system/juce_CompilerSupport.h" #include "system/juce_SystemStats.h" #include "threads/juce_ChildProcess.h" #include "threads/juce_DynamicLibrary.h" diff --git a/JuceLibraryCode/modules/juce_core/juce_core.mm b/JuceLibraryCode/modules/juce_core/juce_core.mm index 90a2f7c..4f48e15 100644 --- a/JuceLibraryCode/modules/juce_core/juce_core.mm +++ b/JuceLibraryCode/modules/juce_core/juce_core.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/juce_module_info b/JuceLibraryCode/modules/juce_core/juce_module_info index 7fb2073..d98e635 100644 --- a/JuceLibraryCode/modules/juce_core/juce_module_info +++ b/JuceLibraryCode/modules/juce_core/juce_module_info @@ -1,7 +1,7 @@ { "id": "juce_core", "name": "JUCE core classes", - "version": "3.0.8", + "version": "3.2.0", "description": "The essential set of basic JUCE classes, as required by all the other JUCE modules. Includes text, container, memory, threading and i/o functionality.", "website": "http://www.juce.com/juce", "license": "ISC Permissive", diff --git a/JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.cpp b/JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.cpp index 8cadfda..55db2af 100644 --- a/JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.cpp +++ b/JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -32,7 +32,7 @@ FileLogger::FileLogger (const File& file, : logFile (file) { if (maxInitialFileSizeBytes >= 0) - trimFileSize (maxInitialFileSizeBytes); + trimFileSize (logFile, maxInitialFileSizeBytes); if (! file.exists()) file.create(); // (to create the parent directories) @@ -57,23 +57,23 @@ void FileLogger::logMessage (const String& message) out << message << newLine; } -void FileLogger::trimFileSize (int64 maxFileSizeBytes) const +void FileLogger::trimFileSize (const File& file, int64 maxFileSizeBytes) { if (maxFileSizeBytes <= 0) { - logFile.deleteFile(); + file.deleteFile(); } else { - const int64 fileSize = logFile.getSize(); + const int64 fileSize = file.getSize(); if (fileSize > maxFileSizeBytes) { - TemporaryFile tempFile (logFile); + TemporaryFile tempFile (file); { FileOutputStream out (tempFile.getFile()); - FileInputStream in (logFile); + FileInputStream in (file); if (! (out.openedOk() && in.openedOk())) return; diff --git a/JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.h b/JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.h index 6be1668..7f82360 100644 --- a/JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.h +++ b/JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -121,13 +121,17 @@ public: // (implementation of the Logger virtual method) void logMessage (const String&); + //============================================================================== + /** This is a utility function which removes lines from the start of a text + file to make sure that its total size is below the given size. + */ + static void trimFileSize (const File& file, int64 maxFileSize); + private: //============================================================================== File logFile; CriticalSection logLock; - void trimFileSize (int64 maxFileSizeBytes) const; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FileLogger) }; diff --git a/JuceLibraryCode/modules/juce_core/logging/juce_Logger.cpp b/JuceLibraryCode/modules/juce_core/logging/juce_Logger.cpp index 0b1c8d6..00dec72 100644 --- a/JuceLibraryCode/modules/juce_core/logging/juce_Logger.cpp +++ b/JuceLibraryCode/modules/juce_core/logging/juce_Logger.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/logging/juce_Logger.h b/JuceLibraryCode/modules/juce_core/logging/juce_Logger.h index d0d3af5..1af9eb5 100644 --- a/JuceLibraryCode/modules/juce_core/logging/juce_Logger.h +++ b/JuceLibraryCode/modules/juce_core/logging/juce_Logger.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.cpp b/JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.cpp index dd09616..602f2da 100644 --- a/JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.cpp +++ b/JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.h b/JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.h index 4c6c25c..2f99424 100644 --- a/JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.h +++ b/JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/maths/juce_Expression.cpp b/JuceLibraryCode/modules/juce_core/maths/juce_Expression.cpp index a18effa..2a16913 100644 --- a/JuceLibraryCode/modules/juce_core/maths/juce_Expression.cpp +++ b/JuceLibraryCode/modules/juce_core/maths/juce_Expression.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -1162,9 +1162,9 @@ double Expression::Scope::evaluateFunction (const String& functionName, const do if (numParams == 1) { - if (functionName == "sin") return sin (parameters[0]); - if (functionName == "cos") return cos (parameters[0]); - if (functionName == "tan") return tan (parameters[0]); + if (functionName == "sin") return std::sin (parameters[0]); + if (functionName == "cos") return std::cos (parameters[0]); + if (functionName == "tan") return std::tan (parameters[0]); if (functionName == "abs") return std::abs (parameters[0]); } } diff --git a/JuceLibraryCode/modules/juce_core/maths/juce_Expression.h b/JuceLibraryCode/modules/juce_core/maths/juce_Expression.h index 8939129..0f12db2 100644 --- a/JuceLibraryCode/modules/juce_core/maths/juce_Expression.h +++ b/JuceLibraryCode/modules/juce_core/maths/juce_Expression.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/maths/juce_MathsFunctions.h b/JuceLibraryCode/modules/juce_core/maths/juce_MathsFunctions.h index d2d02b9..61ab44d 100644 --- a/JuceLibraryCode/modules/juce_core/maths/juce_MathsFunctions.h +++ b/JuceLibraryCode/modules/juce_core/maths/juce_MathsFunctions.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -119,6 +119,22 @@ inline Type jmin (const Type a, const Type b, const Type c) template inline Type jmin (const Type a, const Type b, const Type c, const Type d) { return jmin (a, jmin (b, c, d)); } +/** Remaps a normalised value (between 0 and 1) to a target range. + This effectively returns (targetRangeMin + value0To1 * (targetRangeMax - targetRangeMin)) +*/ +template +static Type jmap (Type value0To1, Type targetRangeMin, Type targetRangeMax) +{ + return targetRangeMin + value0To1 * (targetRangeMax - targetRangeMin); +} + +/** Remaps a value from a source range to a target range. */ +template +static Type jmap (Type sourceValue, Type sourceRangeMin, Type sourceRangeMax, Type targetRangeMin, Type targetRangeMax) +{ + return targetRangeMin + ((targetRangeMax - targetRangeMin) * (sourceValue - sourceRangeMin)) / (sourceRangeMax - sourceRangeMin); +} + /** Scans an array of values, returning the minimum value that it contains. */ template const Type findMinimum (const Type* data, int numValues) @@ -258,6 +274,19 @@ inline void swapVariables (Type& variable1, Type& variable2) std::swap (variable1, variable2); } +/** Handy function for avoiding unused variables warning. */ +template +void ignoreUnused (const Type1&) noexcept {} + +template +void ignoreUnused (const Type1&, const Type2&) noexcept {} + +template +void ignoreUnused (const Type1&, const Type2&, const Type3&) noexcept {} + +template +void ignoreUnused (const Type1&, const Type2&, const Type3&, const Type4&) noexcept {} + /** Handy function for getting the number of elements in a simple const C array. E.g. @code @@ -283,12 +312,24 @@ template inline Type juce_hypot (Type a, Type b) noexcept { #if JUCE_MSVC - return static_cast (_hypot (a, b)); + return static_cast (_hypot (a, b)); #else - return static_cast (hypot (a, b)); + return static_cast (hypot (a, b)); #endif } +#ifndef DOXYGEN +template <> +inline float juce_hypot (float a, float b) noexcept +{ + #if JUCE_MSVC + return (_hypotf (a, b)); + #else + return (hypotf (a, b)); + #endif +} +#endif + /** 64-bit abs function. */ inline int64 abs64 (const int64 n) noexcept { @@ -313,17 +354,40 @@ const double double_Pi = 3.1415926535897932384626433832795; const float float_Pi = 3.14159265358979323846f; +/** Converts an angle in degrees to radians. */ +template +inline FloatType degreesToRadians (FloatType degrees) noexcept { return degrees * static_cast (double_Pi / 180.0); } + +/** Converts an angle in radians to degrees. */ +template +inline FloatType radiansToDegrees (FloatType radians) noexcept { return radians * static_cast (180.0 / double_Pi); } + + //============================================================================== /** The isfinite() method seems to vary between platforms, so this is a platform-independent function for it. */ -template -inline bool juce_isfinite (FloatingPointType value) +template +inline bool juce_isfinite (NumericType) noexcept +{ + return true; // Integer types are always finite +} + +template <> +inline bool juce_isfinite (float value) noexcept +{ + #if JUCE_WINDOWS + return _finite (value) != 0; + #else + return std::isfinite (value); + #endif +} + +template <> +inline bool juce_isfinite (double value) noexcept { #if JUCE_WINDOWS - return _finite (value); - #elif JUCE_ANDROID - return isfinite (value); + return _finite (value) != 0; #else return std::isfinite (value); #endif @@ -422,16 +486,14 @@ inline int roundFloatToInt (const float value) noexcept } //============================================================================== -/** Returns true if the specified integer is a power-of-two. -*/ +/** Returns true if the specified integer is a power-of-two. */ template bool isPowerOfTwo (IntegerType value) { return (value & (value - 1)) == 0; } -/** Returns the smallest power-of-two which is equal to or greater than the given integer. -*/ +/** Returns the smallest power-of-two which is equal to or greater than the given integer. */ inline int nextPowerOfTwo (int n) noexcept { --n; @@ -478,13 +540,14 @@ NumericType square (NumericType n) noexcept return n * n; } + //============================================================================== -#if (JUCE_INTEL && JUCE_32BIT) || defined (DOXYGEN) +#if JUCE_INTEL || defined (DOXYGEN) /** This macro can be applied to a float variable to check whether it contains a denormalised value, and to normalise it if necessary. On CPUs that aren't vulnerable to denormalisation problems, this will have no effect. */ - #define JUCE_UNDENORMALISE(x) x += 1.0f; x -= 1.0f; + #define JUCE_UNDENORMALISE(x) { (x) += 0.1f; (x) -= 0.1f; } #else #define JUCE_UNDENORMALISE(x) #endif diff --git a/JuceLibraryCode/modules/juce_core/maths/juce_NormalisableRange.h b/JuceLibraryCode/modules/juce_core/maths/juce_NormalisableRange.h index 800c616..f8a9bc8 100644 --- a/JuceLibraryCode/modules/juce_core/maths/juce_NormalisableRange.h +++ b/JuceLibraryCode/modules/juce_core/maths/juce_NormalisableRange.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -104,7 +104,7 @@ public: ValueType proportion = (v - start) / (end - start); if (skew != static_cast (1)) - proportion = pow (proportion, skew); + proportion = std::pow (proportion, skew); return proportion; } @@ -115,7 +115,7 @@ public: ValueType convertFrom0to1 (ValueType proportion) const noexcept { if (skew != static_cast (1) && proportion > ValueType()) - proportion = exp (log (proportion) / skew); + proportion = std::exp (std::log (proportion) / skew); return start + (end - start) * proportion; } diff --git a/JuceLibraryCode/modules/juce_core/maths/juce_Random.cpp b/JuceLibraryCode/modules/juce_core/maths/juce_Random.cpp index a196256..c0a3aaf 100644 --- a/JuceLibraryCode/modules/juce_core/maths/juce_Random.cpp +++ b/JuceLibraryCode/modules/juce_core/maths/juce_Random.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/maths/juce_Random.h b/JuceLibraryCode/modules/juce_core/maths/juce_Random.h index 19e6d6e..9db4534 100644 --- a/JuceLibraryCode/modules/juce_core/maths/juce_Random.h +++ b/JuceLibraryCode/modules/juce_core/maths/juce_Random.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/maths/juce_Range.h b/JuceLibraryCode/modules/juce_core/maths/juce_Range.h index 6add152..d1b1e45 100644 --- a/JuceLibraryCode/modules/juce_core/maths/juce_Range.h +++ b/JuceLibraryCode/modules/juce_core/maths/juce_Range.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_Atomic.h b/JuceLibraryCode/modules/juce_core/memory/juce_Atomic.h index 5e9d30c..5942094 100644 --- a/JuceLibraryCode/modules/juce_core/memory/juce_Atomic.h +++ b/JuceLibraryCode/modules/juce_core/memory/juce_Atomic.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_ByteOrder.h b/JuceLibraryCode/modules/juce_core/memory/juce_ByteOrder.h index fcd56bc..b4f7df6 100644 --- a/JuceLibraryCode/modules/juce_core/memory/juce_ByteOrder.h +++ b/JuceLibraryCode/modules/juce_core/memory/juce_ByteOrder.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -153,7 +153,7 @@ inline uint64 ByteOrder::swap (uint64 value) noexcept #elif JUCE_USE_MSVC_INTRINSICS return _byteswap_uint64 (value); #else - return (((int64) swap ((uint32) value)) << 32) | swap ((uint32) (value >> 32)); + return (((uint64) swap ((uint32) value)) << 32) | swap ((uint32) (value >> 32)); #endif } diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_ContainerDeletePolicy.h b/JuceLibraryCode/modules/juce_core/memory/juce_ContainerDeletePolicy.h index 60cddaa..7ea2884 100644 --- a/JuceLibraryCode/modules/juce_core/memory/juce_ContainerDeletePolicy.h +++ b/JuceLibraryCode/modules/juce_core/memory/juce_ContainerDeletePolicy.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -45,6 +45,16 @@ struct ContainerDeletePolicy { static void destroy (ObjectType* object) { + // If the line below triggers a compiler error, it means that you are using + // an incomplete type for ObjectType (for example, a type that is declared + // but not defined). This is a problem because then the following delete is + // undefined behaviour. The purpose of the sizeof is to capture this situation. + // If this was caused by a ScopedPointer to a forward-declared type, move the + // implementation of all methods trying to use the ScopedPointer (e.g. the destructor + // of the class owning it) into cpp files where they can see to the definition + // of ObjectType. This should fix the error. + ignoreUnused (sizeof (ObjectType)); + delete object; } }; diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_HeapBlock.h b/JuceLibraryCode/modules/juce_core/memory/juce_HeapBlock.h index 3731f0b..5672d37 100644 --- a/JuceLibraryCode/modules/juce_core/memory/juce_HeapBlock.h +++ b/JuceLibraryCode/modules/juce_core/memory/juce_HeapBlock.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -36,7 +36,7 @@ namespace HeapBlockHelper struct ThrowOnFail { static void check (void*) {} }; template<> - struct ThrowOnFail { static void check (void* data) { if (data == nullptr) throw std::bad_alloc(); } }; + struct ThrowOnFail { static void check (void* data) { if (data == nullptr) throw std::bad_alloc(); } }; } #endif @@ -67,7 +67,7 @@ namespace HeapBlockHelper ..you could just write this: @code - HeapBlock temp (1024); + HeapBlock temp (1024); memcpy (temp, xyz, 1024 * sizeof (int)); temp.calloc (2048); temp[0] = 1234; @@ -109,7 +109,7 @@ public: other constructor that takes an InitialisationState parameter. */ explicit HeapBlock (const size_t numElements) - : data (static_cast (std::malloc (numElements * sizeof (ElementType)))) + : data (static_cast (std::malloc (numElements * sizeof (ElementType)))) { throwOnAllocationFailure(); } @@ -120,7 +120,7 @@ public: or left uninitialised. */ HeapBlock (const size_t numElements, const bool initialiseToZero) - : data (static_cast (initialiseToZero + : data (static_cast (initialiseToZero ? std::calloc (numElements, sizeof (ElementType)) : std::malloc (numElements * sizeof (ElementType)))) { @@ -166,13 +166,13 @@ public: This may be a null pointer if the data hasn't yet been allocated, or if it has been freed by calling the free() method. */ - inline operator void*() const noexcept { return static_cast (data); } + inline operator void*() const noexcept { return static_cast (data); } /** Returns a void pointer to the allocated data. This may be a null pointer if the data hasn't yet been allocated, or if it has been freed by calling the free() method. */ - inline operator const void*() const noexcept { return static_cast (data); } + inline operator const void*() const noexcept { return static_cast (data); } /** Lets you use indirect calls to the first element in the array. Obviously this will cause problems if the array hasn't been initialised, because it'll @@ -220,7 +220,7 @@ public: void malloc (const size_t newNumElements, const size_t elementSize = sizeof (ElementType)) { std::free (data); - data = static_cast (std::malloc (newNumElements * elementSize)); + data = static_cast (std::malloc (newNumElements * elementSize)); throwOnAllocationFailure(); } @@ -230,7 +230,7 @@ public: void calloc (const size_t newNumElements, const size_t elementSize = sizeof (ElementType)) { std::free (data); - data = static_cast (std::calloc (newNumElements, elementSize)); + data = static_cast (std::calloc (newNumElements, elementSize)); throwOnAllocationFailure(); } @@ -241,7 +241,7 @@ public: void allocate (const size_t newNumElements, bool initialiseToZero) { std::free (data); - data = static_cast (initialiseToZero + data = static_cast (initialiseToZero ? std::calloc (newNumElements, sizeof (ElementType)) : std::malloc (newNumElements * sizeof (ElementType))); throwOnAllocationFailure(); @@ -254,15 +254,15 @@ public: */ void realloc (const size_t newNumElements, const size_t elementSize = sizeof (ElementType)) { - data = static_cast (data == nullptr ? std::malloc (newNumElements * elementSize) - : std::realloc (data, newNumElements * elementSize)); + data = static_cast (data == nullptr ? std::malloc (newNumElements * elementSize) + : std::realloc (data, newNumElements * elementSize)); throwOnAllocationFailure(); } /** Frees any currently-allocated data. This will free the data and reset this object to be a null pointer. */ - void free() + void free() noexcept { std::free (data); data = nullptr; @@ -272,7 +272,7 @@ public: The two objects simply exchange their data pointers. */ template - void swapWith (HeapBlock & other) noexcept + void swapWith (HeapBlock& other) noexcept { std::swap (data, other.data); } diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_LeakedObjectDetector.h b/JuceLibraryCode/modules/juce_core/memory/juce_LeakedObjectDetector.h index 248e7bc..9a12e93 100644 --- a/JuceLibraryCode/modules/juce_core/memory/juce_LeakedObjectDetector.h +++ b/JuceLibraryCode/modules/juce_core/memory/juce_LeakedObjectDetector.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_Memory.h b/JuceLibraryCode/modules/juce_core/memory/juce_Memory.h index 57d1644..61c7731 100644 --- a/JuceLibraryCode/modules/juce_core/memory/juce_Memory.h +++ b/JuceLibraryCode/modules/juce_core/memory/juce_Memory.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -50,7 +50,7 @@ inline void deleteAndZero (Type& pointer) { delete poi a specific number of bytes, */ template -inline Type* addBytesToPointer (Type* pointer, IntegerType bytes) noexcept { return (Type*) (((char*) pointer) + bytes); } +inline Type* addBytesToPointer (Type* basePointer, IntegerType bytes) noexcept { return (Type*) (((char*) basePointer) + bytes); } /** A handy function which returns the difference between any two pointers, in bytes. The address of the second pointer is subtracted from the first, and the difference in bytes is returned. @@ -62,7 +62,25 @@ inline int getAddressDifference (Type1* pointer1, Type2* pointer2) noexcept { r nullptr if the pointer is null. */ template -inline Type* createCopyIfNotNull (const Type* pointer) { return pointer != nullptr ? new Type (*pointer) : nullptr; } +inline Type* createCopyIfNotNull (const Type* objectToCopy) { return objectToCopy != nullptr ? new Type (*objectToCopy) : nullptr; } + +//============================================================================== +/** A handy function to read un-aligned memory without a performance penalty or bus-error. */ +template +inline Type readUnaligned (const void* srcPtr) noexcept +{ + Type value; + memcpy (&value, srcPtr, sizeof (Type)); + + return value; +} + +/** A handy function to write un-aligned memory without a performance penalty or bus-error. */ +template +inline void writeUnaligned (void* dstPtr, Type value) noexcept +{ + memcpy (dstPtr, &value, sizeof(Type)); +} //============================================================================== #if JUCE_MAC || JUCE_IOS || DOXYGEN diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.cpp b/JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.cpp index 6097c7e..0efd21b 100644 --- a/JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.cpp +++ b/JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -259,7 +259,7 @@ void MemoryBlock::copyTo (void* const dst, int offset, size_t num) const noexcep if ((size_t) offset + num > size) { - const size_t newNum = size - (size_t) offset; + const size_t newNum = (size_t) size - (size_t) offset; zeromem (d + newNum, num - newNum); num = newNum; } diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.h b/JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.h index 30bb3ca..cbe025c 100644 --- a/JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.h +++ b/JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_OptionalScopedPointer.h b/JuceLibraryCode/modules/juce_core/memory/juce_OptionalScopedPointer.h index a633dca..fd0d5f6 100644 --- a/JuceLibraryCode/modules/juce_core/memory/juce_OptionalScopedPointer.h +++ b/JuceLibraryCode/modules/juce_core/memory/juce_OptionalScopedPointer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_ReferenceCountedObject.h b/JuceLibraryCode/modules/juce_core/memory/juce_ReferenceCountedObject.h index 36ac5c3..3dac3c4 100644 --- a/JuceLibraryCode/modules/juce_core/memory/juce_ReferenceCountedObject.h +++ b/JuceLibraryCode/modules/juce_core/memory/juce_ReferenceCountedObject.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_ScopedPointer.h b/JuceLibraryCode/modules/juce_core/memory/juce_ScopedPointer.h index 1aa8031..557104e 100644 --- a/JuceLibraryCode/modules/juce_core/memory/juce_ScopedPointer.h +++ b/JuceLibraryCode/modules/juce_core/memory/juce_ScopedPointer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_SharedResourcePointer.h b/JuceLibraryCode/modules/juce_core/memory/juce_SharedResourcePointer.h index 53d314b..307b559 100644 --- a/JuceLibraryCode/modules/juce_core/memory/juce_SharedResourcePointer.h +++ b/JuceLibraryCode/modules/juce_core/memory/juce_SharedResourcePointer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -94,13 +94,12 @@ public: */ SharedResourcePointer() { - SharedObjectHolder& holder = getSharedObjectHolder(); - const SpinLock::ScopedLockType sl (holder.lock); - - if (++(holder.refCount) == 1) - holder.sharedInstance = new SharedObjectType(); + initialise(); + } - sharedObject = holder.sharedInstance; + SharedResourcePointer (const SharedResourcePointer&) + { + initialise(); } /** Destructor. @@ -145,7 +144,22 @@ private: SharedObjectType* sharedObject; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SharedResourcePointer) + void initialise() + { + SharedObjectHolder& holder = getSharedObjectHolder(); + const SpinLock::ScopedLockType sl (holder.lock); + + if (++(holder.refCount) == 1) + holder.sharedInstance = new SharedObjectType(); + + sharedObject = holder.sharedInstance; + } + + // There's no need to assign to a SharedResourcePointer because every + // instance of the class is exactly the same! + SharedResourcePointer& operator= (const SharedResourcePointer&) JUCE_DELETED_FUNCTION; + + JUCE_LEAK_DETECTOR (SharedResourcePointer) }; diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_Singleton.h b/JuceLibraryCode/modules/juce_core/memory/juce_Singleton.h index 00ea0af..d424784 100644 --- a/JuceLibraryCode/modules/juce_core/memory/juce_Singleton.h +++ b/JuceLibraryCode/modules/juce_core/memory/juce_Singleton.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -44,7 +44,7 @@ destructor, in case it is deleted by other means than deleteInstance() Clients can then call the static method MyClass::getInstance() to get a pointer - to the singleton, or MyClass::getInstanceWithoutCreating() which will return 0 if + to the singleton, or MyClass::getInstanceWithoutCreating() which will return nullptr if no instance currently exists. e.g. @code diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_WeakReference.h b/JuceLibraryCode/modules/juce_core/memory/juce_WeakReference.h index c11b19f..ff23d99 100644 --- a/JuceLibraryCode/modules/juce_core/memory/juce_WeakReference.h +++ b/JuceLibraryCode/modules/juce_core/memory/juce_WeakReference.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/misc/juce_Result.cpp b/JuceLibraryCode/modules/juce_core/misc/juce_Result.cpp index 1734907..0999531 100644 --- a/JuceLibraryCode/modules/juce_core/misc/juce_Result.cpp +++ b/JuceLibraryCode/modules/juce_core/misc/juce_Result.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/misc/juce_Result.h b/JuceLibraryCode/modules/juce_core/misc/juce_Result.h index 7c320ac..218ffb6 100644 --- a/JuceLibraryCode/modules/juce_core/misc/juce_Result.h +++ b/JuceLibraryCode/modules/juce_core/misc/juce_Result.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/misc/juce_Uuid.cpp b/JuceLibraryCode/modules/juce_core/misc/juce_Uuid.cpp index eb74964..e0d0c15 100644 --- a/JuceLibraryCode/modules/juce_core/misc/juce_Uuid.cpp +++ b/JuceLibraryCode/modules/juce_core/misc/juce_Uuid.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/misc/juce_Uuid.h b/JuceLibraryCode/modules/juce_core/misc/juce_Uuid.h index cd7af0d..2a0ff05 100644 --- a/JuceLibraryCode/modules/juce_core/misc/juce_Uuid.h +++ b/JuceLibraryCode/modules/juce_core/misc/juce_Uuid.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/misc/juce_WindowsRegistry.h b/JuceLibraryCode/modules/juce_core/misc/juce_WindowsRegistry.h index a1fb2a2..987d87c 100644 --- a/JuceLibraryCode/modules/juce_core/misc/juce_WindowsRegistry.h +++ b/JuceLibraryCode/modules/juce_core/misc/juce_WindowsRegistry.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/native/java/JuceAppActivity.java b/JuceLibraryCode/modules/juce_core/native/java/JuceAppActivity.java index 882d0e0..5145319 100644 --- a/JuceLibraryCode/modules/juce_core/native/java/JuceAppActivity.java +++ b/JuceLibraryCode/modules/juce_core/native/java/JuceAppActivity.java @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -42,10 +42,8 @@ import android.opengl.*; import android.text.ClipboardManager; import android.text.InputType; import android.util.DisplayMetrics; -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; +import android.util.Log; +import java.io.*; import java.net.URL; import java.net.HttpURLConnection; import javax.microedition.khronos.egl.EGLConfig; @@ -55,7 +53,7 @@ import android.media.MediaScannerConnection; import android.media.MediaScannerConnection.MediaScannerConnectionClient; //============================================================================== -public final class JuceAppActivity extends Activity +public class JuceAppActivity extends Activity { //============================================================================== static @@ -64,7 +62,7 @@ public final class JuceAppActivity extends Activity } @Override - public final void onCreate (Bundle savedInstanceState) + public void onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); @@ -75,14 +73,16 @@ public final class JuceAppActivity extends Activity } @Override - protected final void onDestroy() + protected void onDestroy() { quitApp(); super.onDestroy(); + + clearDataCache(); } @Override - protected final void onPause() + protected void onPause() { if (viewHolder != null) viewHolder.onPause(); @@ -92,7 +92,7 @@ public final class JuceAppActivity extends Activity } @Override - protected final void onResume() + protected void onResume() { super.onResume(); @@ -157,6 +157,14 @@ public final class JuceAppActivity extends Activity group.removeView (view); } + public final void deleteOpenGLView (OpenGLView view) + { + ViewGroup group = (ViewGroup) (view.getParent()); + + if (group != null) + group.removeView (view); + } + final class ViewHolder extends ViewGroup { public ViewHolder (Context context) @@ -323,15 +331,26 @@ public final class JuceAppActivity extends Activity setFocusableInTouchMode (true); setOnFocusChangeListener (this); requestFocus(); + + // swap red and blue colours to match internal opengl texture format + ColorMatrix colorMatrix = new ColorMatrix(); + + float[] colorTransform = { 0, 0, 1.0f, 0, 0, + 0, 1.0f, 0, 0, 0, + 1.0f, 0, 0, 0, 0, + 0, 0, 0, 1.0f, 0 }; + + colorMatrix.set (colorTransform); + paint.setColorFilter (new ColorMatrixColorFilter (colorMatrix)); } //============================================================================== - private native void handlePaint (long host, Canvas canvas); + private native void handlePaint (long host, Canvas canvas, Paint paint); @Override public void onDraw (Canvas canvas) { - handlePaint (host, canvas); + handlePaint (host, canvas, paint); } @Override @@ -342,6 +361,7 @@ public final class JuceAppActivity extends Activity private boolean opaque; private long host; + private Paint paint = new Paint(); //============================================================================== private native void handleMouseDown (long host, int index, float x, float y, long time); @@ -440,6 +460,22 @@ public final class JuceAppActivity extends Activity return true; } + @Override + public boolean onKeyMultiple (int keyCode, int count, KeyEvent event) + { + if (keyCode != KeyEvent.KEYCODE_UNKNOWN || event.getAction() != KeyEvent.ACTION_MULTIPLE) + return super.onKeyMultiple (keyCode, count, event); + + if (event.getCharacters() != null) + { + int utf8Char = event.getCharacters().codePointAt (0); + handleKeyDown (host, utf8Char, utf8Char); + return true; + } + + return false; + } + // this is here to make keyboard entry work on a Galaxy Tab2 10.1 @Override public InputConnection onCreateInputConnection (EditorInfo outAttrs) @@ -666,38 +702,103 @@ public final class JuceAppActivity extends Activity public static final HTTPStream createHTTPStream (String address, boolean isPost, byte[] postData, String headers, int timeOutMs, int[] statusCode, - StringBuffer responseHeaders) + StringBuffer responseHeaders, + int numRedirectsToFollow) { - try + // timeout parameter of zero for HttpUrlConnection is a blocking connect (negative value for juce::URL) + if (timeOutMs < 0) + timeOutMs = 0; + else if (timeOutMs == 0) + timeOutMs = 30000; + + // headers - if not empty, this string is appended onto the headers that are used for the request. It must therefore be a valid set of HTML header directives, separated by newlines. + // So convert headers string to an array, with an element for each line + String headerLines[] = headers.split("\\n"); + + for (;;) { - HttpURLConnection connection = (HttpURLConnection) (new URL(address) - .openConnection()); - if (connection != null) + try { - try + HttpURLConnection connection = (HttpURLConnection) (new URL(address).openConnection()); + + if (connection != null) { - if (isPost) + try { - connection.setRequestMethod("POST"); - connection.setConnectTimeout(timeOutMs); - connection.setDoOutput(true); - connection.setChunkedStreamingMode(0); - OutputStream out = connection.getOutputStream(); - out.write(postData); - out.flush(); - } + connection.setInstanceFollowRedirects (false); + connection.setConnectTimeout (timeOutMs); + connection.setReadTimeout (timeOutMs); - return new HTTPStream (connection, statusCode, responseHeaders); - } - catch (Throwable e) - { - connection.disconnect(); + // Set request headers + for (int i = 0; i < headerLines.length; ++i) + { + int pos = headerLines[i].indexOf (":"); + + if (pos > 0 && pos < headerLines[i].length()) + { + String field = headerLines[i].substring (0, pos); + String value = headerLines[i].substring (pos + 1); + + if (value.length() > 0) + connection.setRequestProperty (field, value); + } + } + + if (isPost) + { + connection.setRequestMethod ("POST"); + connection.setDoOutput (true); + + if (postData != null) + { + OutputStream out = connection.getOutputStream(); + out.write(postData); + out.flush(); + } + } + + HTTPStream httpStream = new HTTPStream (connection, statusCode, responseHeaders); + + // Process redirect & continue as necessary + int status = statusCode[0]; + + if (--numRedirectsToFollow >= 0 + && (status == 301 || status == 302 || status == 303 || status == 307)) + { + // Assumes only one occurrence of "Location" + int pos1 = responseHeaders.indexOf ("Location:") + 10; + int pos2 = responseHeaders.indexOf ("\n", pos1); + + if (pos2 > pos1) + { + String newLocation = responseHeaders.substring(pos1, pos2); + // Handle newLocation whether it's absolute or relative + URL baseUrl = new URL (address); + URL newUrl = new URL (baseUrl, newLocation); + String transformedNewLocation = newUrl.toString(); + + if (transformedNewLocation != address) + { + address = transformedNewLocation; + // Clear responseHeaders before next iteration + responseHeaders.delete (0, responseHeaders.length()); + continue; + } + } + } + + return httpStream; + } + catch (Throwable e) + { + connection.disconnect(); + } } } - } - catch (Throwable e) {} + catch (Throwable e) {} - return null; + return null; + } } public final void launchURL (String url) @@ -743,4 +844,85 @@ public final class JuceAppActivity extends Activity { new SingleMediaScanner (this, filename); } + + public final Typeface getTypeFaceFromAsset (String assetName) + { + try + { + return Typeface.createFromAsset (this.getResources().getAssets(), assetName); + } + catch (Throwable e) {} + + return null; + } + + final protected static char[] hexArray = "0123456789ABCDEF".toCharArray(); + + public static String bytesToHex (byte[] bytes) + { + char[] hexChars = new char[bytes.length * 2]; + + for (int j = 0; j < bytes.length; ++j) + { + int v = bytes[j] & 0xff; + hexChars[j * 2] = hexArray[v >>> 4]; + hexChars[j * 2 + 1] = hexArray[v & 0x0f]; + } + + return new String (hexChars); + } + + final private java.util.Map dataCache = new java.util.HashMap(); + + synchronized private final File getDataCacheFile (byte[] data) + { + try + { + java.security.MessageDigest digest = java.security.MessageDigest.getInstance ("MD5"); + digest.update (data); + + String key = bytesToHex (digest.digest()); + + if (dataCache.containsKey (key)) + return (File) dataCache.get (key); + + File f = new File (this.getCacheDir(), "bindata_" + key); + f.delete(); + FileOutputStream os = new FileOutputStream (f); + os.write (data, 0, data.length); + dataCache.put (key, f); + return f; + } + catch (Throwable e) {} + + return null; + } + + private final void clearDataCache() + { + java.util.Iterator it = dataCache.values().iterator(); + + while (it.hasNext()) + { + File f = (File) it.next(); + f.delete(); + } + } + + public final Typeface getTypeFaceFromByteArray (byte[] data) + { + try + { + File f = getDataCacheFile (data); + + if (f != null) + return Typeface.createFromFile (f); + } + catch (Exception e) + { + Log.e ("JUCE", e.toString()); + } + + return null; + } } diff --git a/JuceLibraryCode/modules/juce_core/native/juce_BasicNativeHeaders.h b/JuceLibraryCode/modules/juce_core/native/juce_BasicNativeHeaders.h index cdaa0ef..9e0b140 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_BasicNativeHeaders.h +++ b/JuceLibraryCode/modules/juce_core/native/juce_BasicNativeHeaders.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -80,8 +80,7 @@ #error "You're compiling without exceptions enabled! This is needed for a lot of JUCE classes, please update your compiler settings!" #endif - #pragma warning (push) - #pragma warning (disable : 4100 4201 4514 4312 4995) + #pragma warning (push, 0) // disable all warnings whilst including system headers #endif #define STRICT 1 diff --git a/JuceLibraryCode/modules/juce_core/native/juce_android_Files.cpp b/JuceLibraryCode/modules/juce_core/native/juce_android_Files.cpp index 45903b1..591c4dc 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_android_Files.cpp +++ b/JuceLibraryCode/modules/juce_core/native/juce_android_Files.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/native/juce_android_JNIHelpers.h b/JuceLibraryCode/modules/juce_core/native/juce_android_JNIHelpers.h index 8e8b07d..9149441 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_android_JNIHelpers.h +++ b/JuceLibraryCode/modules/juce_core/native/juce_android_JNIHelpers.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -227,8 +227,14 @@ private: //============================================================================== +#if defined (__arm__) + #define JUCE_ARM_SOFT_FLOAT_ABI __attribute__ ((pcs("aapcs"))) +#else + #define JUCE_ARM_SOFT_FLOAT_ABI +#endif + #define JUCE_JNI_CALLBACK(className, methodName, returnType, params) \ - extern "C" __attribute__ ((visibility("default"))) returnType JUCE_JOIN_MACRO (JUCE_JOIN_MACRO (Java_, className), _ ## methodName) params + extern "C" __attribute__ ((visibility("default"))) JUCE_ARM_SOFT_FLOAT_ABI returnType JUCE_JOIN_MACRO (JUCE_JOIN_MACRO (Java_, className), _ ## methodName) params //============================================================================== class AndroidSystem @@ -290,13 +296,23 @@ public: if (android.activity != nullptr) { jvm->DetachCurrentThread(); + removeCurrentThreadFromCache(); + } + } - const pthread_t thisThread = pthread_self(); + void removeCurrentThreadFromCache() + { + const pthread_t thisThread = pthread_self(); - SpinLock::ScopedLockType sl (addRemoveLock); - for (int i = 0; i < maxThreads; ++i) - if (threads[i] == thisThread) - threads[i] = 0; + SpinLock::ScopedLockType sl (addRemoveLock); + + for (int i = 0; i < maxThreads; ++i) + { + if (threads[i] == thisThread) + { + threads[i] = 0; + envs[i] = nullptr; + } } } @@ -372,19 +388,22 @@ struct AndroidThreadScope #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \ METHOD (createNewView, "createNewView", "(ZJ)L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$ComponentPeerView;") \ METHOD (deleteView, "deleteView", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$ComponentPeerView;)V") \ + METHOD (deleteOpenGLView, "deleteOpenGLView", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$OpenGLView;)V") \ METHOD (postMessage, "postMessage", "(J)V") \ METHOD (finish, "finish", "()V") \ METHOD (getClipboardContent, "getClipboardContent", "()Ljava/lang/String;") \ METHOD (setClipboardContent, "setClipboardContent", "(Ljava/lang/String;)V") \ METHOD (excludeClipRegion, "excludeClipRegion", "(Landroid/graphics/Canvas;FFFF)V") \ METHOD (renderGlyph, "renderGlyph", "(CLandroid/graphics/Paint;Landroid/graphics/Matrix;Landroid/graphics/Rect;)[I") \ - STATICMETHOD (createHTTPStream, "createHTTPStream", "(Ljava/lang/String;Z[BLjava/lang/String;I[ILjava/lang/StringBuffer;)L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$HTTPStream;") \ + STATICMETHOD (createHTTPStream, "createHTTPStream", "(Ljava/lang/String;Z[BLjava/lang/String;I[ILjava/lang/StringBuffer;I)L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$HTTPStream;") \ METHOD (launchURL, "launchURL", "(Ljava/lang/String;)V") \ METHOD (showMessageBox, "showMessageBox", "(Ljava/lang/String;Ljava/lang/String;J)V") \ METHOD (showOkCancelBox, "showOkCancelBox", "(Ljava/lang/String;Ljava/lang/String;J)V") \ METHOD (showYesNoCancelBox, "showYesNoCancelBox", "(Ljava/lang/String;Ljava/lang/String;J)V") \ STATICMETHOD (getLocaleValue, "getLocaleValue", "(Z)Ljava/lang/String;") \ - METHOD (scanFile, "scanFile", "(Ljava/lang/String;)V") + METHOD (scanFile, "scanFile", "(Ljava/lang/String;)V") \ + METHOD (getTypeFaceFromAsset, "getTypeFaceFromAsset", "(Ljava/lang/String;)Landroid/graphics/Typeface;") \ + METHOD (getTypeFaceFromByteArray,"getTypeFaceFromByteArray","([B)Landroid/graphics/Typeface;") DECLARE_JNI_CLASS (JuceAppActivity, JUCE_ANDROID_ACTIVITY_CLASSPATH); #undef JNI_CLASS_MEMBERS diff --git a/JuceLibraryCode/modules/juce_core/native/juce_android_Misc.cpp b/JuceLibraryCode/modules/juce_core/native/juce_android_Misc.cpp index d26adc1..3333112 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_android_Misc.cpp +++ b/JuceLibraryCode/modules/juce_core/native/juce_android_Misc.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/native/juce_android_Network.cpp b/JuceLibraryCode/modules/juce_core/native/juce_android_Network.cpp index 29a8cb5..dd2278c 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_android_Network.cpp +++ b/JuceLibraryCode/modules/juce_core/native/juce_android_Network.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -70,7 +70,7 @@ class WebInputStream : public InputStream public: WebInputStream (String address, bool isPost, const MemoryBlock& postData, URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, - const String& headers, int timeOutMs, StringPairArray* responseHeaders) + const String& headers, int timeOutMs, StringPairArray* responseHeaders, const int numRedirectsToFollow) : statusCode (0) { if (! address.contains ("://")) @@ -103,7 +103,8 @@ public: javaString (headers).get(), (jint) timeOutMs, statusCodeArray, - responseHeaderBuffer.get())); + responseHeaderBuffer.get(), + (jint) numRedirectsToFollow)); jint* const statusCodeElements = env->GetIntArrayElements (statusCodeArray, 0); statusCode = statusCodeElements[0]; diff --git a/JuceLibraryCode/modules/juce_core/native/juce_android_SystemStats.cpp b/JuceLibraryCode/modules/juce_core/native/juce_android_SystemStats.cpp index 8223b89..07facfc 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_android_SystemStats.cpp +++ b/JuceLibraryCode/modules/juce_core/native/juce_android_SystemStats.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -278,7 +278,7 @@ String SystemStats::getDisplayLanguage() { return getUserLanguage() + "-" + getU //============================================================================== void CPUInformation::initialise() noexcept { - numCpus = jmax (1, sysconf (_SC_NPROCESSORS_ONLN)); + numCpus = jmax ((int) 1, (int) sysconf (_SC_NPROCESSORS_ONLN)); } //============================================================================== diff --git a/JuceLibraryCode/modules/juce_core/native/juce_android_Threads.cpp b/JuceLibraryCode/modules/juce_core/native/juce_android_Threads.cpp index 981be9a..b601e97 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_android_Threads.cpp +++ b/JuceLibraryCode/modules/juce_core/native/juce_android_Threads.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/native/juce_curl_Network.cpp b/JuceLibraryCode/modules/juce_core/native/juce_curl_Network.cpp new file mode 100644 index 0000000..fce4440 --- /dev/null +++ b/JuceLibraryCode/modules/juce_core/native/juce_curl_Network.cpp @@ -0,0 +1,471 @@ +/* + ============================================================================== + + This file is part of the juce_core module of the JUCE library. + Copyright (c) 2015 - ROLI Ltd. + + Permission to use, copy, modify, and/or distribute this software for any purpose with + or without fee is hereby granted, provided that the above copyright notice and this + permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + ------------------------------------------------------------------------------ + + NOTE! This permissive ISC license applies ONLY to files within the juce_core module! + All other JUCE modules are covered by a dual GPL/commercial license, so if you are + using any other modules, be sure to check that you also comply with their license. + + For more details, visit www.juce.com + + ============================================================================== +*/ + +class WebInputStream : public InputStream +{ +public: + WebInputStream (const String& address, bool isPost, const MemoryBlock& postData, + URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, + const String& headers, int timeOutMs, StringPairArray* responseHeaders, + const int maxRedirects) + : multi (nullptr), curl (nullptr), headerList (nullptr), lastError (CURLE_OK), + contentLength (-1), streamPos (0), + finished (false), skipBytes (0), + postBuffer (nullptr), postPosition (0) + { + statusCode = -1; + + if (init() && setOptions (address, timeOutMs, (responseHeaders != nullptr), + maxRedirects, headers, isPost, postData.getSize())) + { + connect (responseHeaders, isPost, postData, progressCallback, progressCallbackContext); + } + else + { + cleanup(); + } + } + + ~WebInputStream() + { + cleanup(); + } + + //============================================================================== + // Input Stream overrides + bool isError() const { return curl == nullptr || lastError != CURLE_OK; } + bool isExhausted() override { return (isError() || finished) && curlBuffer.getSize() == 0; } + int64 getPosition() override { return streamPos; } + int64 getTotalLength() override { return contentLength; } + + int read (void* buffer, int bytesToRead) override + { + return readOrSkip (buffer, bytesToRead, false); + } + + bool setPosition (int64 wantedPos) override + { + const int amountToSkip = static_cast (wantedPos - getPosition()); + + if (amountToSkip < 0) + return false; + + if (amountToSkip == 0) + return true; + + const int actuallySkipped = readOrSkip (nullptr, amountToSkip, true); + + return actuallySkipped == amountToSkip; + } + + //============================================================================== + int statusCode; + +private: + //============================================================================== + bool init() + { + multi = curl_multi_init(); + + if (multi != nullptr) + { + curl = curl_easy_init(); + + if (curl != nullptr) + if (curl_multi_add_handle (multi, curl) == CURLM_OK) + return true; + } + + cleanup(); + return false; + } + + void cleanup() + { + if (curl != nullptr) + { + curl_multi_remove_handle (multi, curl); + + if (headerList != nullptr) + { + curl_slist_free_all (headerList); + headerList = nullptr; + } + + curl_easy_cleanup (curl); + curl = nullptr; + } + + if (multi != nullptr) + { + curl_multi_cleanup (multi); + multi = nullptr; + } + } + + //============================================================================== + bool setOptions (const String& address, int timeOutMs, bool wantsHeaders, + const int maxRedirects, const String& headers, + bool isPost, size_t postSize) + { + if (curl_easy_setopt (curl, CURLOPT_URL, address.toRawUTF8()) == CURLE_OK + && curl_easy_setopt (curl, CURLOPT_WRITEDATA, this) == CURLE_OK + && curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, StaticCurlWrite) == CURLE_OK + && curl_easy_setopt (curl, CURLOPT_MAXREDIRS, static_cast (maxRedirects)) == CURLE_OK) + { + if (isPost) + { + if (curl_easy_setopt (curl, CURLOPT_READDATA, this) != CURLE_OK + || curl_easy_setopt (curl, CURLOPT_READFUNCTION, StaticCurlRead) != CURLE_OK) + return false; + + if (curl_easy_setopt (curl, CURLOPT_POST, 1) != CURLE_OK + || curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE_LARGE, static_cast (postSize)) != CURLE_OK) + return false; + } + + // do we want to parse the headers + if (wantsHeaders) + { + if (curl_easy_setopt (curl, CURLOPT_HEADERDATA, this) != CURLE_OK + || curl_easy_setopt (curl, CURLOPT_HEADERFUNCTION, StaticCurlHeader) != CURLE_OK) + return false; + } + + if (headers.isNotEmpty()) + { + const StringArray headerLines = StringArray::fromLines (headers); + + // fromLines will always return at least one line if the string is not empty + jassert (headerLines.size() > 0); + headerList = curl_slist_append (headerList, headerLines [0].toRawUTF8()); + + for (int i = 1; (i < headerLines.size() && headerList != nullptr); ++i) + headerList = curl_slist_append (headerList, headerLines [i].toRawUTF8()); + + if (headerList == nullptr) + return false; + + if (curl_easy_setopt (curl, CURLOPT_HTTPHEADER, headerList) != CURLE_OK) + return false; + } + + if (timeOutMs > 0) + { + long timeOutSecs = static_cast (ceil (static_cast (timeOutMs) / 1000.0)); + + if (curl_easy_setopt (curl, CURLOPT_CONNECTTIMEOUT, timeOutSecs) != CURLE_OK) + return false; + } + + return true; + } + + return false; + } + + void connect (StringPairArray* responseHeaders, bool isPost, const MemoryBlock& postData, + URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext) + { + if (isPost) + postBuffer = &postData; + + size_t lastPos = static_cast (-1); + + // step until either: 1) there is an error 2) the transaction is complete + // or 3) data is in the in buffer + while ((! finished) && curlBuffer.getSize() == 0 && curl != nullptr) + { + singleStep(); + + // call callbacks if this is a post request + if (isPost && progressCallback != nullptr && lastPos != postPosition) + { + lastPos = postPosition; + + if (! progressCallback (progressCallbackContext, + static_cast (lastPos), + static_cast (postData.getSize()))) + { + // user has decided to abort the transaction + cleanup(); + return; + } + } + } + + long responseCode; + if (curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &responseCode) == CURLE_OK) + statusCode = static_cast (responseCode); + + // parse headers + if (responseHeaders != nullptr) + parseHttpHeaders (*responseHeaders); + + // get content length size + double curlLength; + if (curl_easy_getinfo (curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &curlLength) == CURLE_OK) + contentLength = static_cast (curlLength); + } + + void finish() + { + if (curl == nullptr) + return; + + for (;;) + { + int cnt = 0; + + if (CURLMsg* msg = curl_multi_info_read (multi, &cnt)) + { + if (msg->msg == CURLMSG_DONE && msg->easy_handle == curl) + { + lastError = msg->data.result; // this is the error that stopped our process from continuing + break; + } + } + else + { + break; + } + } + + finished = true; + } + + //============================================================================== + void singleStep() + { + if (curl == nullptr || lastError != CURLE_OK) + return; + + fd_set fdread, fdwrite, fdexcep; + int maxfd = -1; + long curl_timeo; + + if ((lastError = (int) curl_multi_timeout (multi, &curl_timeo)) != CURLM_OK) + return; + + // why 980? see http://curl.haxx.se/libcurl/c/curl_multi_timeout.html + if (curl_timeo < 0) + curl_timeo = 980; + + struct timeval tv; + tv.tv_sec = curl_timeo / 1000; + tv.tv_usec = (curl_timeo % 1000) * 1000; + + FD_ZERO (&fdread); + FD_ZERO (&fdwrite); + FD_ZERO (&fdexcep); + + + if ((lastError = (int) curl_multi_fdset (multi, &fdread, &fdwrite, &fdexcep, &maxfd)) != CURLM_OK) + return; + + if (maxfd != -1) + { + if (select (maxfd + 1, &fdread, &fdwrite, &fdexcep, &tv) < 0) + { + lastError = -1; + return; + } + } + else + { + // if curl does not return any sockets for to wait on, then the doc says to wait 100 ms + Thread::sleep (100); + } + + int still_running = 0; + int curlRet; + + while ((curlRet = (int) curl_multi_perform (multi, &still_running)) == CURLM_CALL_MULTI_PERFORM) + {} + + if ((lastError = curlRet) != CURLM_OK) + return; + + if (still_running <= 0) + finish(); + } + + int readOrSkip (void* buffer, int bytesToRead, bool skip) + { + if (bytesToRead <= 0) + return 0; + + size_t pos = 0; + size_t len = static_cast (bytesToRead); + + while (len > 0) + { + size_t bufferBytes = curlBuffer.getSize(); + bool removeSection = true; + + if (bufferBytes == 0) + { + // do not call curl again if we are finished + if (finished || curl == nullptr) + return static_cast (pos); + + skipBytes = skip ? len : 0; + singleStep(); + + // update the amount that was read/skipped from curl + bufferBytes = skip ? len - skipBytes : curlBuffer.getSize(); + removeSection = ! skip; + } + + // can we copy data from the internal buffer? + if (bufferBytes > 0) + { + size_t max = jmin (len, bufferBytes); + + if (! skip) + memcpy (addBytesToPointer (buffer, pos), curlBuffer.getData(), max); + + pos += max; + streamPos += static_cast (max); + len -= max; + + if (removeSection) + curlBuffer.removeSection (0, max); + } + } + + return static_cast (pos); + } + + + //============================================================================== + void parseHttpHeaders (StringPairArray& responseHeaders) + { + StringArray headerLines = StringArray::fromLines (curlHeaders); + + // ignore the first line as this is the status line + for (int i = 1; i < headerLines.size(); ++i) + { + const String& headersEntry = headerLines[i]; + + if (headersEntry.isNotEmpty()) + { + const String key (headersEntry.upToFirstOccurrenceOf (": ", false, false)); + const String value (headersEntry.fromFirstOccurrenceOf (": ", false, false)); + const String previousValue (responseHeaders [key]); + responseHeaders.set (key, previousValue.isEmpty() ? value : (previousValue + "," + value)); + } + } + } + + + //============================================================================== + // CURL callbacks + size_t curlWriteCallback (char* ptr, size_t size, size_t nmemb) + { + if (curl == nullptr || lastError != CURLE_OK) + return 0; + + const size_t len = size * nmemb; + + // skip bytes if necessary + size_t max = jmin (skipBytes, len); + skipBytes -= max; + + if (len > max) + curlBuffer.append (ptr + max, len - max); + + return len; + } + + size_t curlReadCallback (char* ptr, size_t size, size_t nmemb) + { + if (curl == nullptr || postBuffer == nullptr || lastError != CURLE_OK) + return 0; + + const size_t len = size * nmemb; + + size_t max = jmin (postBuffer->getSize() - postPosition, len); + memcpy (ptr, (char*)postBuffer->getData() + postPosition, max); + postPosition += max; + + return max; + } + + size_t curlHeaderCallback (char* ptr, size_t size, size_t nmemb) + { + if (curl == nullptr || lastError != CURLE_OK) + return 0; + + size_t len = size * nmemb; + + curlHeaders += String (ptr, len); + return len; + } + + //============================================================================== + // Static method wrappers + static size_t StaticCurlWrite (char* ptr, size_t size, size_t nmemb, void* userdata) + { + WebInputStream* wi = reinterpret_cast (userdata); + return wi->curlWriteCallback (ptr, size, nmemb); + } + + static size_t StaticCurlRead (char* ptr, size_t size, size_t nmemb, void* userdata) + { + WebInputStream* wi = reinterpret_cast (userdata); + return wi->curlReadCallback (ptr, size, nmemb); + } + + static size_t StaticCurlHeader (char* ptr, size_t size, size_t nmemb, void* userdata) + { + WebInputStream* wi = reinterpret_cast (userdata); + return wi->curlHeaderCallback (ptr, size, nmemb); + } + +private: + CURLM* multi; + CURL* curl; + struct curl_slist* headerList; + int lastError; + + //============================================================================== + // internal buffers and buffer positions + int64 contentLength, streamPos; + MemoryBlock curlBuffer; + String curlHeaders; + bool finished; + size_t skipBytes; + + //============================================================================== + // Http POST variables + const MemoryBlock* postBuffer; + size_t postPosition; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WebInputStream) +}; diff --git a/JuceLibraryCode/modules/juce_core/native/juce_linux_CommonFile.cpp b/JuceLibraryCode/modules/juce_core/native/juce_linux_CommonFile.cpp index 2ce98b3..924d5e9 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_linux_CommonFile.cpp +++ b/JuceLibraryCode/modules/juce_core/native/juce_linux_CommonFile.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -138,8 +138,8 @@ private: JUCE_DECLARE_NON_COPYABLE (Pimpl) }; -DirectoryIterator::NativeIterator::NativeIterator (const File& directory, const String& wildCard) - : pimpl (new DirectoryIterator::NativeIterator::Pimpl (directory, wildCard)) +DirectoryIterator::NativeIterator::NativeIterator (const File& directory, const String& wildCardStr) + : pimpl (new DirectoryIterator::NativeIterator::Pimpl (directory, wildCardStr)) { } diff --git a/JuceLibraryCode/modules/juce_core/native/juce_linux_Files.cpp b/JuceLibraryCode/modules/juce_core/native/juce_linux_Files.cpp index d0dd54d..ede4e5e 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_linux_Files.cpp +++ b/JuceLibraryCode/modules/juce_core/native/juce_linux_Files.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -150,7 +150,10 @@ File File::getSpecialLocation (const SpecialLocationType type) case currentExecutableFile: case currentApplicationFile: + #if ! JUCE_STANDALONE_APPLICATION return juce_getExecutableFile(); + #endif + // deliberate fall-through if this is not a shared-library case hostApplicationPath: { diff --git a/JuceLibraryCode/modules/juce_core/native/juce_linux_Network.cpp b/JuceLibraryCode/modules/juce_core/native/juce_linux_Network.cpp index 6871aa5..951ef9f 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_linux_Network.cpp +++ b/JuceLibraryCode/modules/juce_core/native/juce_linux_Network.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -67,19 +67,21 @@ bool JUCE_CALLTYPE Process::openEmailWithAttachments (const String& /* targetEma return false; } - //============================================================================== +#if ! JUCE_USE_CURL class WebInputStream : public InputStream { public: WebInputStream (const String& address_, bool isPost_, const MemoryBlock& postData_, URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, - const String& headers_, int timeOutMs_, StringPairArray* responseHeaders) + const String& headers_, int timeOutMs_, StringPairArray* responseHeaders, + const int maxRedirects) : statusCode (0), socketHandle (-1), levelsOfRedirection (0), - address (address_), headers (headers_), postData (postData_), position (0), - finished (false), isPost (isPost_), timeOutMs (timeOutMs_) + address (address_), headers (headers_), postData (postData_), contentLength (-1), position (0), + finished (false), isPost (isPost_), timeOutMs (timeOutMs_), numRedirectsToFollow (maxRedirects), + chunkEnd (0), isChunked (false), readingChunk (false) { - statusCode = createConnection (progressCallback, progressCallbackContext); + statusCode = createConnection (progressCallback, progressCallbackContext, numRedirectsToFollow); if (responseHeaders != nullptr && ! isError()) { @@ -103,18 +105,63 @@ public: bool isError() const { return socketHandle < 0; } bool isExhausted() override { return finished; } int64 getPosition() override { return position; } - - int64 getTotalLength() override - { - //xxx to do - return -1; - } + int64 getTotalLength() override { return contentLength; } int read (void* buffer, int bytesToRead) override { if (finished || isError()) return 0; + if (isChunked && ! readingChunk) + { + if (position >= chunkEnd) + { + const ScopedValueSetter setter (readingChunk, true, false); + MemoryOutputStream chunkLengthBuffer; + char c = 0; + + if (chunkEnd > 0) + { + if (read (&c, 1) != 1 || c != '\r' + || read (&c, 1) != 1 || c != '\n') + { + finished = true; + return 0; + } + } + + while (chunkLengthBuffer.getDataSize() < 512 && ! (finished || isError())) + { + if (read (&c, 1) != 1) + { + finished = true; + return 0; + } + + if (c == '\r') + continue; + + if (c == '\n') + break; + + chunkLengthBuffer.writeByte (c); + } + + const int64 chunkSize = chunkLengthBuffer.toString().trimStart().getHexValue64(); + + if (chunkSize == 0) + { + finished = true; + return 0; + } + + chunkEnd += chunkSize; + } + + if (bytesToRead > chunkEnd - position) + bytesToRead = chunkEnd - position; + } + fd_set readbits; FD_ZERO (&readbits); FD_SET (socketHandle, &readbits); @@ -126,11 +173,13 @@ public: if (select (socketHandle + 1, &readbits, 0, 0, &tv) <= 0) return 0; // (timeout) - const int bytesRead = jmax (0, (int) recv (socketHandle, buffer, bytesToRead, MSG_WAITALL)); + const int bytesRead = jmax (0, (int) recv (socketHandle, buffer, (size_t) bytesToRead, MSG_WAITALL)); if (bytesRead == 0) finished = true; - position += bytesRead; + if (! readingChunk) + position += bytesRead; + return bytesRead; } @@ -147,7 +196,7 @@ public: { closeSocket(); position = 0; - statusCode = createConnection (0, 0); + statusCode = createConnection (0, 0, numRedirectsToFollow); } skipNextBytes (wantedPos - position); @@ -164,32 +213,37 @@ private: StringArray headerLines; String address, headers; MemoryBlock postData; - int64 position; + int64 contentLength, position; bool finished; const bool isPost; const int timeOutMs; + const int numRedirectsToFollow; + int64 chunkEnd; + bool isChunked, readingChunk; - void closeSocket() + void closeSocket (bool resetLevelsOfRedirection = true) { if (socketHandle >= 0) close (socketHandle); socketHandle = -1; - levelsOfRedirection = 0; + if (resetLevelsOfRedirection) + levelsOfRedirection = 0; } - int createConnection (URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext) + int createConnection (URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, + const int numRedirects) { - closeSocket(); + closeSocket (false); uint32 timeOutTime = Time::getMillisecondCounter(); if (timeOutMs == 0) - timeOutTime += 60000; + timeOutTime += 30000; else if (timeOutMs < 0) timeOutTime = 0xffffffff; else - timeOutTime += timeOutMs; + timeOutTime += (uint32) timeOutMs; String hostName, hostPath; int hostPort; @@ -273,28 +327,35 @@ private: const int status = responseHeader.fromFirstOccurrenceOf (" ", false, false) .substring (0, 3).getIntValue(); - //int contentLength = findHeaderItem (lines, "Content-Length:").getIntValue(); - //bool isChunked = findHeaderItem (lines, "Transfer-Encoding:").equalsIgnoreCase ("chunked"); - String location (findHeaderItem (headerLines, "Location:")); - if (status >= 300 && status < 400 + if (++levelsOfRedirection <= numRedirects + && status >= 300 && status < 400 && location.isNotEmpty() && location != address) { - if (! location.startsWithIgnoreCase ("http://")) - location = "http://" + location; - - if (++levelsOfRedirection <= 3) + if (! (location.startsWithIgnoreCase ("http://") + || location.startsWithIgnoreCase ("https://") + || location.startsWithIgnoreCase ("ftp://"))) { - address = location; - return createConnection (progressCallback, progressCallbackContext); + // The following is a bit dodgy. Ideally, we should do a proper transform of the relative URI to a target URI + if (location.startsWithChar ('/')) + location = URL (address).withNewSubPath (location).toString (true); + else + location = address + "/" + location; } + + address = location; + return createConnection (progressCallback, progressCallbackContext, numRedirects); } - else - { - levelsOfRedirection = 0; - return status; - } + + String contentLengthString (findHeaderItem (headerLines, "Content-Length:")); + + if (contentLengthString.isNotEmpty()) + contentLength = contentLengthString.getLargeIntValue(); + + isChunked = (findHeaderItem (headerLines, "Transfer-Encoding:") == "chunked"); + + return status; } closeSocket(); @@ -339,9 +400,13 @@ private: } static void writeHost (MemoryOutputStream& dest, const bool isPost, - const String& path, const String& host, int /*port*/) + const String& path, const String& host, int port) { - dest << (isPost ? "POST " : "GET ") << path << " HTTP/1.0\r\nHost: " << host; + dest << (isPost ? "POST " : "GET ") << path << " HTTP/1.1\r\nHost: " << host; + + /* HTTP spec 14.23 says that the port number must be included in the header if it is not 80 */ + if (port != 80) + dest << ':' << port; } static MemoryBlock createRequestHeader (const String& hostName, const int hostPort, @@ -363,10 +428,14 @@ private: writeValueIfNotPresent (header, userHeaders, "Connection:", "close"); if (isPost) + { writeValueIfNotPresent (header, userHeaders, "Content-Length:", String ((int) postData.getSize())); - - header << "\r\n" << userHeaders - << "\r\n" << postData; + header << userHeaders << "\r\n" << postData; + } + else + { + header << "\r\n" << userHeaders << "\r\n"; + } return header.getMemoryBlock(); } @@ -383,12 +452,12 @@ private: const int numToSend = jmin (1024, (int) (requestHeader.getSize() - totalHeaderSent)); - if (send (socketHandle, static_cast (requestHeader.getData()) + totalHeaderSent, numToSend, 0) != numToSend) + if (send (socketHandle, static_cast (requestHeader.getData()) + totalHeaderSent, (size_t) numToSend, 0) != numToSend) return false; - totalHeaderSent += numToSend; + totalHeaderSent += (size_t) numToSend; - if (progressCallback != nullptr && ! progressCallback (progressCallbackContext, totalHeaderSent, requestHeader.getSize())) + if (progressCallback != nullptr && ! progressCallback (progressCallbackContext, (int) totalHeaderSent, (int) requestHeader.getSize())) return false; } @@ -443,3 +512,4 @@ private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WebInputStream) }; +#endif diff --git a/JuceLibraryCode/modules/juce_core/native/juce_linux_SystemStats.cpp b/JuceLibraryCode/modules/juce_core/native/juce_linux_SystemStats.cpp index 939edb4..9ac6901 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_linux_SystemStats.cpp +++ b/JuceLibraryCode/modules/juce_core/native/juce_linux_SystemStats.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -55,10 +55,10 @@ bool SystemStats::isOperatingSystem64Bit() //============================================================================== namespace LinuxStatsHelpers { - String getCpuInfo (const char* const key) + String getConfigFileValue (const char* file, const char* const key) { StringArray lines; - File ("/proc/cpuinfo").readLines (lines); + File (file).readLines (lines); for (int i = lines.size(); --i >= 0;) // (NB - it's important that this runs in reverse order) if (lines[i].upToFirstOccurrenceOf (":", false, false).trim().equalsIgnoreCase (key)) @@ -66,6 +66,11 @@ namespace LinuxStatsHelpers return String(); } + + String getCpuInfo (const char* key) + { + return getConfigFileValue ("/proc/cpuinfo", key); + } } String SystemStats::getDeviceDescription() @@ -93,14 +98,14 @@ int SystemStats::getMemorySizeInMegabytes() struct sysinfo sysi; if (sysinfo (&sysi) == 0) - return sysi.totalram * sysi.mem_unit / (1024 * 1024); + return (int) (sysi.totalram * sysi.mem_unit / (1024 * 1024)); return 0; } int SystemStats::getPageSize() { - return sysconf (_SC_PAGESIZE); + return (int) sysconf (_SC_PAGESIZE); } //============================================================================== @@ -150,6 +155,8 @@ void CPUInformation::initialise() noexcept hasSSE2 = flags.contains ("sse2"); hasSSE3 = flags.contains ("sse3"); has3DNow = flags.contains ("3dnow"); + hasSSSE3 = flags.contains ("ssse3"); + hasAVX = flags.contains ("avx"); numCpus = LinuxStatsHelpers::getCpuInfo ("processor").getIntValue() + 1; } @@ -160,7 +167,7 @@ uint32 juce_millisecondsSinceStartup() noexcept timespec t; clock_gettime (CLOCK_MONOTONIC, &t); - return t.tv_sec * 1000 + t.tv_nsec / 1000000; + return (uint32) (t.tv_sec * 1000 + t.tv_nsec / 1000000); } int64 Time::getHighResolutionTicks() noexcept @@ -189,3 +196,13 @@ bool Time::setSystemTimeToThisTime() const return settimeofday (&t, 0) == 0; } + +JUCE_API bool JUCE_CALLTYPE juce_isRunningUnderDebugger() +{ + #if JUCE_BSD + return false; + #else + return LinuxStatsHelpers::getConfigFileValue ("/proc/self/status", "TracerPid") + .getIntValue() > 0; + #endif +} diff --git a/JuceLibraryCode/modules/juce_core/native/juce_linux_Threads.cpp b/JuceLibraryCode/modules/juce_core/native/juce_linux_Threads.cpp index 659fbd9..b9d3d45 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_linux_Threads.cpp +++ b/JuceLibraryCode/modules/juce_core/native/juce_linux_Threads.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -52,28 +52,6 @@ JUCE_API void JUCE_CALLTYPE Process::setPriority (const ProcessPriority prior) pthread_setschedparam (pthread_self(), policy, ¶m); } -JUCE_API bool JUCE_CALLTYPE juce_isRunningUnderDebugger() -{ - #if JUCE_BSD - return false; - #else - static char testResult = 0; - - if (testResult == 0) - { - testResult = (char) ptrace (PT_TRACE_ME, 0, 0, 0); - - if (testResult >= 0) - { - ptrace (PT_DETACH, 0, (caddr_t) 1, 0); - testResult = 1; - } - } - - return testResult < 0; - #endif -} - JUCE_API bool JUCE_CALLTYPE Process::isRunningUnderDebugger() { return juce_isRunningUnderDebugger(); diff --git a/JuceLibraryCode/modules/juce_core/native/juce_mac_Files.mm b/JuceLibraryCode/modules/juce_core/native/juce_mac_Files.mm index 0a00e92..afe4e7b 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_mac_Files.mm +++ b/JuceLibraryCode/modules/juce_core/native/juce_mac_Files.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/native/juce_mac_Network.mm b/JuceLibraryCode/modules/juce_core/native/juce_mac_Network.mm index 130759e..d4da1cf 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_mac_Network.mm +++ b/JuceLibraryCode/modules/juce_core/native/juce_mac_Network.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -115,7 +115,7 @@ bool JUCE_CALLTYPE Process::openEmailWithAttachments (const String& targetEmailA class URLConnectionState : public Thread { public: - URLConnectionState (NSURLRequest* req) + URLConnectionState (NSURLRequest* req, const int maxRedirects) : Thread ("http connection"), contentLength (-1), delegate (nil), @@ -126,7 +126,10 @@ public: statusCode (0), initialised (false), hasFailed (false), - hasFinished (false) + hasFinished (false), + numRedirectsToFollow (maxRedirects), + numRedirects (0), + latestTotalBytes (0) { static DelegateClass cls; delegate = [cls.createInstance() init]; @@ -150,7 +153,7 @@ public: while (isThreadRunning() && ! initialised) { if (callback != nullptr) - callback (context, -1, (int) [[request HTTPBody] length]); + callback (context, latestTotalBytes, (int) [[request HTTPBody] length]); Thread::sleep (1); } @@ -201,7 +204,6 @@ public: [data setLength: 0]; } - initialised = true; contentLength = [response expectedContentLength]; [headers release]; @@ -213,6 +215,21 @@ public: headers = [[httpResponse allHeaderFields] retain]; statusCode = (int) [httpResponse statusCode]; } + + initialised = true; + } + + NSURLRequest* willSendRequest (NSURLRequest* newRequest, NSURLResponse* redirectResponse) + { + if (redirectResponse != nullptr) + { + if (numRedirects >= numRedirectsToFollow) + return nil; // Cancel redirect and allow connection to continue + + ++numRedirects; + } + + return newRequest; } void didFailWithError (NSError* error) @@ -230,8 +247,9 @@ public: initialised = true; } - void didSendBodyData (NSInteger /*totalBytesWritten*/, NSInteger /*totalBytesExpected*/) + void didSendBodyData (NSInteger totalBytesWritten, NSInteger /*totalBytesExpected*/) { + latestTotalBytes = static_cast (totalBytesWritten); } void finishedLoading() @@ -263,6 +281,9 @@ public: NSDictionary* headers; int statusCode; bool initialised, hasFailed, hasFinished; + const int numRedirectsToFollow; + int numRedirects; + int latestTotalBytes; private: //============================================================================== @@ -278,7 +299,7 @@ private: addMethod (@selector (connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:), connectionDidSendBodyData, "v@:@iii"); addMethod (@selector (connectionDidFinishLoading:), connectionDidFinishLoading, "v@:@"); - addMethod (@selector (connection:willSendRequest:redirectResponse:), willSendRequest, "@@:@@"); + addMethod (@selector (connection:willSendRequest:redirectResponse:), willSendRequest, "@@:@@@"); registerClass(); } @@ -302,9 +323,9 @@ private: getState (self)->didReceiveData (newData); } - static NSURLRequest* willSendRequest (id, SEL, NSURLConnection*, NSURLRequest* request, NSURLResponse*) + static NSURLRequest* willSendRequest (id self, SEL, NSURLConnection*, NSURLRequest* request, NSURLResponse* response) { - return request; + return getState (self)->willSendRequest (request, response); } static void connectionDidSendBodyData (id self, SEL, NSURLConnection*, NSInteger, NSInteger totalBytesWritten, NSInteger totalBytesExpected) @@ -328,23 +349,27 @@ class WebInputStream : public InputStream public: WebInputStream (const String& address_, bool isPost_, const MemoryBlock& postData_, URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, - const String& headers_, int timeOutMs_, StringPairArray* responseHeaders) + const String& headers_, int timeOutMs_, StringPairArray* responseHeaders, + const int numRedirectsToFollow_) : statusCode (0), address (address_), headers (headers_), postData (postData_), position (0), - finished (false), isPost (isPost_), timeOutMs (timeOutMs_) + finished (false), isPost (isPost_), timeOutMs (timeOutMs_), numRedirectsToFollow (numRedirectsToFollow_) { JUCE_AUTORELEASEPOOL { createConnection (progressCallback, progressCallbackContext); - if (responseHeaders != nullptr && connection != nullptr && connection->headers != nil) + if (connection != nullptr && connection->headers != nil) { statusCode = connection->statusCode; - NSEnumerator* enumerator = [connection->headers keyEnumerator]; + if (responseHeaders != nullptr) + { + NSEnumerator* enumerator = [connection->headers keyEnumerator]; - while (NSString* key = [enumerator nextObject]) - responseHeaders->set (nsStringToJuce (key), - nsStringToJuce ((NSString*) [connection->headers objectForKey: key])); + while (NSString* key = [enumerator nextObject]) + responseHeaders->set (nsStringToJuce (key), + nsStringToJuce ((NSString*) [connection->headers objectForKey: key])); + } } } } @@ -403,6 +428,7 @@ private: bool finished; const bool isPost; const int timeOutMs; + const int numRedirectsToFollow; void createConnection (URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext) { @@ -434,7 +460,7 @@ private: [req setHTTPBody: [NSData dataWithBytes: postData.getData() length: postData.getSize()]]; - connection = new URLConnectionState (req); + connection = new URLConnectionState (req, numRedirectsToFollow); if (! connection->start (progressCallback, progressCallbackContext)) connection = nullptr; diff --git a/JuceLibraryCode/modules/juce_core/native/juce_mac_Strings.mm b/JuceLibraryCode/modules/juce_core/native/juce_mac_Strings.mm index 862eb53..53341e0 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_mac_Strings.mm +++ b/JuceLibraryCode/modules/juce_core/native/juce_mac_Strings.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -32,17 +32,21 @@ String String::fromCFString (CFStringRef cfString) return String(); CFRange range = { 0, CFStringGetLength (cfString) }; - HeapBlock u ((size_t) range.length + 1); - CFStringGetCharacters (cfString, range, u); - u[range.length] = 0; + CFIndex bytesNeeded = 0; + CFStringGetBytes (cfString, range, kCFStringEncodingUTF8, 0, false, nullptr, 0, &bytesNeeded); - return String (CharPointer_UTF16 ((const CharPointer_UTF16::CharType*) u.getData())); + HeapBlock utf8 ((size_t) bytesNeeded + 1); + CFStringGetBytes (cfString, range, kCFStringEncodingUTF8, 0, false, utf8, bytesNeeded + 1, nullptr); + + return String (CharPointer_UTF8 ((const CharPointer_UTF8::CharType*) utf8.getData()), + CharPointer_UTF8 ((const CharPointer_UTF8::CharType*) utf8.getData() + bytesNeeded)); } CFStringRef String::toCFString() const { - CharPointer_UTF16 utf16 (toUTF16()); - return CFStringCreateWithCharacters (kCFAllocatorDefault, (const UniChar*) utf16.getAddress(), (CFIndex) utf16.length()); + const char* const utf8 = toRawUTF8(); + return CFStringCreateWithBytes (kCFAllocatorDefault, (const UInt8*) utf8, + (CFIndex) strlen (utf8), kCFStringEncodingUTF8, false); } String String::convertToPrecomposedUnicode() const @@ -72,7 +76,7 @@ String String::convertToPrecomposedUnicode() const { const size_t bytesNeeded = CharPointer_UTF16::getBytesRequiredFor (getCharPointer()); - HeapBlock tempOut; + HeapBlock tempOut; tempOut.calloc (bytesNeeded + 4); ByteCount bytesRead = 0; diff --git a/JuceLibraryCode/modules/juce_core/native/juce_mac_SystemStats.mm b/JuceLibraryCode/modules/juce_core/native/juce_mac_SystemStats.mm index 2d49ae6..c1b4371 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_mac_SystemStats.mm +++ b/JuceLibraryCode/modules/juce_core/native/juce_mac_SystemStats.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -80,6 +80,8 @@ void CPUInformation::initialise() noexcept hasSSE2 = (d & (1u << 26)) != 0; has3DNow = (b & (1u << 31)) != 0; hasSSE3 = (c & (1u << 0)) != 0; + hasSSSE3 = (c & (1u << 9)) != 0; + hasAVX = (c & (1u << 28)) != 0; #endif #if JUCE_IOS || (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) diff --git a/JuceLibraryCode/modules/juce_core/native/juce_mac_Threads.mm b/JuceLibraryCode/modules/juce_core/native/juce_mac_Threads.mm index 004baeb..8150a15 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_mac_Threads.mm +++ b/JuceLibraryCode/modules/juce_core/native/juce_mac_Threads.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/native/juce_osx_ObjCHelpers.h b/JuceLibraryCode/modules/juce_core/native/juce_osx_ObjCHelpers.h index 10878d0..cc7c56a 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_osx_ObjCHelpers.h +++ b/JuceLibraryCode/modules/juce_core/native/juce_osx_ObjCHelpers.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -65,6 +65,15 @@ namespace static_cast (r.getWidth()), static_cast (r.getHeight())); } + + // These hacks are a workaround for newer Xcode builds which by default prevent calls to these objc functions.. + typedef id (*MsgSendSuperFn) (struct objc_super*, SEL, ...); + static inline MsgSendSuperFn getMsgSendSuperFn() noexcept { return (MsgSendSuperFn) (void*) objc_msgSendSuper; } + + #if ! JUCE_PPC + typedef double (*MsgSendFPRetFn) (id, SEL op, ...); + static inline MsgSendFPRetFn getMsgSendFPRetFn() noexcept { return (MsgSendFPRetFn) (void*) objc_msgSend_fpret; } + #endif #endif } @@ -140,11 +149,13 @@ struct ObjCClass jassert (b); (void) b; } + #if JUCE_MAC static id sendSuperclassMessage (id self, SEL selector) { objc_super s = { self, [SuperclassType class] }; - return objc_msgSendSuper (&s, selector); + return getMsgSendSuperFn() (&s, selector); } + #endif template static Type getIvar (id self, const char* name) diff --git a/JuceLibraryCode/modules/juce_core/native/juce_posix_NamedPipe.cpp b/JuceLibraryCode/modules/juce_core/native/juce_posix_NamedPipe.cpp index d0c0b09..e0ca302 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_posix_NamedPipe.cpp +++ b/JuceLibraryCode/modules/juce_core/native/juce_posix_NamedPipe.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/native/juce_posix_SharedCode.h b/JuceLibraryCode/modules/juce_core/native/juce_posix_SharedCode.h index 91785d6..b6fff48 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_posix_SharedCode.h +++ b/JuceLibraryCode/modules/juce_core/native/juce_posix_SharedCode.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -265,8 +265,8 @@ bool File::isDirectory() const { juce_statStruct info; - return fullPath.isEmpty() - || (juce_stat (fullPath, info) && ((info.st_mode & S_IFDIR) != 0)); + return fullPath.isNotEmpty() + && (juce_stat (fullPath, info) && ((info.st_mode & S_IFDIR) != 0)); } bool File::exists() const @@ -304,23 +304,33 @@ bool File::hasWriteAccess() const return false; } -bool File::setFileReadOnlyInternal (const bool shouldBeReadOnly) const +static bool setFileModeFlags (const String& fullPath, mode_t flags, bool shouldSet) noexcept { juce_statStruct info; if (! juce_stat (fullPath, info)) return false; - info.st_mode &= 0777; // Just permissions + info.st_mode &= 0777; - if (shouldBeReadOnly) - info.st_mode &= ~(S_IWUSR | S_IWGRP | S_IWOTH); + if (shouldSet) + info.st_mode |= flags; else - // Give everybody write permission? - info.st_mode |= S_IWUSR | S_IWGRP | S_IWOTH; + info.st_mode &= ~flags; return chmod (fullPath.toUTF8(), info.st_mode) == 0; } +bool File::setFileReadOnlyInternal (bool shouldBeReadOnly) const +{ + // Hmm.. should we give global write permission or just the current user? + return setFileModeFlags (fullPath, S_IWUSR | S_IWGRP | S_IWOTH, ! shouldBeReadOnly); +} + +bool File::setFileExecutableInternal (bool shouldBeExecutable) const +{ + return setFileModeFlags (fullPath, S_IXUSR | S_IXGRP | S_IXOTH, shouldBeExecutable); +} + void File::getFileTimesInternal (int64& modificationTime, int64& accessTime, int64& creationTime) const { modificationTime = 0; @@ -328,11 +338,12 @@ void File::getFileTimesInternal (int64& modificationTime, int64& accessTime, int creationTime = 0; juce_statStruct info; + if (juce_stat (fullPath, info)) { - modificationTime = (int64) info.st_mtime * 1000; - accessTime = (int64) info.st_atime * 1000; - creationTime = (int64) info.st_ctime * 1000; + modificationTime = (int64) info.st_mtime * 1000; + accessTime = (int64) info.st_atime * 1000; + creationTime = (int64) info.st_ctime * 1000; } } @@ -950,22 +961,22 @@ void JUCE_CALLTYPE Thread::setCurrentThreadAffinityMask (const uint32 affinityMa if ((affinityMask & (1 << i)) != 0) CPU_SET (i, &affinity); - /* - N.B. If this line causes a compile error, then you've probably not got the latest - version of glibc installed. - - If you don't want to update your copy of glibc and don't care about cpu affinities, - then you can just disable all this stuff by setting the SUPPORT_AFFINITIES macro to 0. - */ + #if (! JUCE_ANDROID) && ((! JUCE_LINUX) || ((__GLIBC__ * 1000 + __GLIBC_MINOR__) >= 2004)) + pthread_setaffinity_np (pthread_self(), sizeof (cpu_set_t), &affinity); + #else + // NB: this call isn't really correct because it sets the affinity of the process, + // not the thread. But it's included here as a fallback for people who are using + // ridiculously old versions of glibc sched_setaffinity (getpid(), sizeof (cpu_set_t), &affinity); + #endif + sched_yield(); #else - /* affinities aren't supported because either the appropriate header files weren't found, - or the SUPPORT_AFFINITIES macro was turned off - */ + // affinities aren't supported because either the appropriate header files weren't found, + // or the SUPPORT_AFFINITIES macro was turned off jassertfalse; - (void) affinityMask; + ignoreUnused (affinityMask); #endif } @@ -1263,7 +1274,7 @@ private: { struct timespec t; clock_gettime (CLOCK_MONOTONIC, &t); - time = 1000000000 * (int64) t.tv_sec + t.tv_nsec; + time = (uint64) (1000000000 * (int64) t.tv_sec + (int64) t.tv_nsec); } void wait() noexcept diff --git a/JuceLibraryCode/modules/juce_core/native/juce_win32_ComSmartPtr.h b/JuceLibraryCode/modules/juce_core/native/juce_win32_ComSmartPtr.h index 0dc0efc..10d5d20 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_win32_ComSmartPtr.h +++ b/JuceLibraryCode/modules/juce_core/native/juce_win32_ComSmartPtr.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/native/juce_win32_Files.cpp b/JuceLibraryCode/modules/juce_core/native/juce_win32_Files.cpp index a77aa5a..c3684f1 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_win32_Files.cpp +++ b/JuceLibraryCode/modules/juce_core/native/juce_win32_Files.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -137,17 +137,22 @@ bool File::existsAsFile() const bool File::isDirectory() const { const DWORD attr = WindowsFileHelpers::getAtts (fullPath); - return ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) && (attr != INVALID_FILE_ATTRIBUTES); + return (attr & FILE_ATTRIBUTE_DIRECTORY) != 0 && attr != INVALID_FILE_ATTRIBUTES; } bool File::hasWriteAccess() const { - if (exists()) - return (WindowsFileHelpers::getAtts (fullPath) & FILE_ATTRIBUTE_READONLY) == 0; + if (fullPath.isEmpty()) + return true; - // on windows, it seems that even read-only directories can still be written into, - // so checking the parent directory's permissions would return the wrong result.. - return true; + const DWORD attr = WindowsFileHelpers::getAtts (fullPath); + + // NB: According to MS, the FILE_ATTRIBUTE_READONLY attribute doesn't work for + // folders, and can be incorrectly set for some special folders, so we'll just say + // that folders are always writable. + return attr == INVALID_FILE_ATTRIBUTES + || (attr & FILE_ATTRIBUTE_DIRECTORY) != 0 + || (attr & FILE_ATTRIBUTE_READONLY) == 0; } bool File::setFileReadOnlyInternal (const bool shouldBeReadOnly) const @@ -163,6 +168,12 @@ bool File::setFileReadOnlyInternal (const bool shouldBeReadOnly) const || SetFileAttributes (fullPath.toWideCharPointer(), newAtts) != FALSE; } +bool File::setFileExecutableInternal (bool /*shouldBeExecutable*/) const +{ + // XXX is this possible? + return false; +} + bool File::isHidden() const { return (WindowsFileHelpers::getAtts (fullPath) & FILE_ATTRIBUTE_HIDDEN) != 0; @@ -281,12 +292,12 @@ void FileOutputStream::closeHandle() CloseHandle ((HANDLE) fileHandle); } -ssize_t FileOutputStream::writeInternal (const void* buffer, size_t numBytes) +ssize_t FileOutputStream::writeInternal (const void* bufferToWrite, size_t numBytes) { if (fileHandle != nullptr) { DWORD actualNum = 0; - if (! WriteFile ((HANDLE) fileHandle, buffer, (DWORD) numBytes, &actualNum, 0)) + if (! WriteFile ((HANDLE) fileHandle, bufferToWrite, (DWORD) numBytes, &actualNum, 0)) status = WindowsFileHelpers::getResultForLastError(); return (ssize_t) actualNum; @@ -784,18 +795,19 @@ public: connected (false), ownsPipe (createPipe), shouldStop (false) { if (createPipe) + { pipeH = CreateNamedPipe (filename.toWideCharPointer(), PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, 0, PIPE_UNLIMITED_INSTANCES, 4096, 4096, 0, 0); + + if (GetLastError() == ERROR_ALREADY_EXISTS) + closePipeHandle(); + } } ~Pimpl() { - disconnectPipe(); - - if (pipeH != INVALID_HANDLE_VALUE) - CloseHandle (pipeH); - + closePipeHandle(); CloseHandle (cancelEvent); } @@ -857,6 +869,16 @@ public: } } + void closePipeHandle() + { + if (pipeH != INVALID_HANDLE_VALUE) + { + disconnectPipe(); + CloseHandle (pipeH); + pipeH = INVALID_HANDLE_VALUE; + } + } + int read (void* destBuffer, const int maxBytesToRead, const int timeOutMilliseconds) { while (connect (timeOutMilliseconds)) diff --git a/JuceLibraryCode/modules/juce_core/native/juce_win32_Network.cpp b/JuceLibraryCode/modules/juce_core/native/juce_win32_Network.cpp index f0b6061..d471e11 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_win32_Network.cpp +++ b/JuceLibraryCode/modules/juce_core/native/juce_win32_Network.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -40,19 +40,19 @@ class WebInputStream : public InputStream public: WebInputStream (const String& address_, bool isPost_, const MemoryBlock& postData_, URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, - const String& headers_, int timeOutMs_, StringPairArray* responseHeaders) + const String& headers_, int timeOutMs_, StringPairArray* responseHeaders, int numRedirectsToFollow) : statusCode (0), connection (0), request (0), address (address_), headers (headers_), postData (postData_), position (0), finished (false), isPost (isPost_), timeOutMs (timeOutMs_) { - for (int maxRedirects = 10; --maxRedirects >= 0;) + while (numRedirectsToFollow-- >= 0) { createConnection (progressCallback, progressCallbackContext); if (! isError()) { DWORD bufferSizeBytes = 4096; - StringPairArray headers (false); + StringPairArray dataHeaders (false); for (;;) { @@ -68,8 +68,8 @@ public: const String& header = headersArray[i]; const String key (header.upToFirstOccurrenceOf (": ", false, false)); const String value (header.fromFirstOccurrenceOf (": ", false, false)); - const String previousValue (headers[key]); - headers.set (key, previousValue.isEmpty() ? value : (previousValue + "," + value)); + const String previousValue (dataHeaders[key]); + dataHeaders.set (key, previousValue.isEmpty() ? value : (previousValue + "," + value)); } break; @@ -88,9 +88,22 @@ public: { statusCode = (int) status; - if (status == 301 || status == 302 || status == 303 || status == 307) + if (numRedirectsToFollow >= 0 + && (statusCode == 301 || statusCode == 302 || statusCode == 303 || statusCode == 307)) { - const String newLocation (headers["Location"]); + String newLocation (dataHeaders["Location"]); + + // Check whether location is a relative URI - this is an incomplete test for relative path, + // but we'll use it for now (valid protocols for this implementation are http, https & ftp) + if (! (newLocation.startsWithIgnoreCase ("http://") + || newLocation.startsWithIgnoreCase ("https://") + || newLocation.startsWithIgnoreCase ("ftp://"))) + { + if (newLocation.startsWithChar ('/')) + newLocation = URL (address).withNewSubPath (newLocation).toString (true); + else + newLocation = address + "/" + newLocation; + } if (newLocation.isNotEmpty() && newLocation != address) { @@ -101,7 +114,7 @@ public: } if (responseHeaders != nullptr) - responseHeaders->addArray (headers); + responseHeaders->addArray (dataHeaders); } break; diff --git a/JuceLibraryCode/modules/juce_core/native/juce_win32_Registry.cpp b/JuceLibraryCode/modules/juce_core/native/juce_win32_Registry.cpp index 8119474..164f2e2 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_win32_Registry.cpp +++ b/JuceLibraryCode/modules/juce_core/native/juce_win32_Registry.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/native/juce_win32_SystemStats.cpp b/JuceLibraryCode/modules/juce_core/native/juce_win32_SystemStats.cpp index d98e323..b9007d3 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_win32_SystemStats.cpp +++ b/JuceLibraryCode/modules/juce_core/native/juce_win32_SystemStats.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -105,6 +105,8 @@ void CPUInformation::initialise() noexcept hasSSE = (info[3] & (1 << 25)) != 0; hasSSE2 = (info[3] & (1 << 26)) != 0; hasSSE3 = (info[2] & (1 << 0)) != 0; + hasAVX = (info[2] & (1 << 28)) != 0; + hasSSSE3 = (info[2] & (1 << 9)) != 0; has3DNow = (info[1] & (1 << 31)) != 0; SYSTEM_INFO systemInfo; @@ -131,7 +133,12 @@ static bool isWindowsVersionOrLater (SystemStats::OperatingSystemType target) zerostruct (info); info.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEX); - if (target >= SystemStats::WinVista) + if (target >= SystemStats::Windows10) + { + info.dwMajorVersion = 10; + info.dwMinorVersion = 0; + } + else if (target >= SystemStats::WinVista) { info.dwMajorVersion = 6; @@ -166,7 +173,7 @@ static bool isWindowsVersionOrLater (SystemStats::OperatingSystemType target) SystemStats::OperatingSystemType SystemStats::getOperatingSystemType() { const SystemStats::OperatingSystemType types[] - = { Windows8_1, Windows8_0, Windows7, WinVista, WinXP, Win2000 }; + = { Windows10, Windows8_1, Windows8_0, Windows7, WinVista, WinXP, Win2000 }; for (int i = 0; i < numElementsInArray (types); ++i) if (isWindowsVersionOrLater (types[i])) @@ -182,6 +189,7 @@ String SystemStats::getOperatingSystemName() switch (getOperatingSystemType()) { + case Windows10: name = "Windows 10"; break; case Windows8_1: name = "Windows 8.1"; break; case Windows8_0: name = "Windows 8.0"; break; case Windows7: name = "Windows 7"; break; diff --git a/JuceLibraryCode/modules/juce_core/native/juce_win32_Threads.cpp b/JuceLibraryCode/modules/juce_core/native/juce_win32_Threads.cpp index 1421c10..03ed62c 100644 --- a/JuceLibraryCode/modules/juce_core/native/juce_win32_Threads.cpp +++ b/JuceLibraryCode/modules/juce_core/native/juce_win32_Threads.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -110,7 +110,7 @@ void Thread::launchThread() { unsigned int newThreadId; threadHandle = (void*) _beginthreadex (0, 0, &threadEntryProc, this, 0, &newThreadId); - threadId = (ThreadID) newThreadId; + threadId = (ThreadID) (pointer_sized_int) newThreadId; } void Thread::closeThreadHandle() diff --git a/JuceLibraryCode/modules/juce_core/network/juce_IPAddress.cpp b/JuceLibraryCode/modules/juce_core/network/juce_IPAddress.cpp index 6c4d087..5f137fc 100644 --- a/JuceLibraryCode/modules/juce_core/network/juce_IPAddress.cpp +++ b/JuceLibraryCode/modules/juce_core/network/juce_IPAddress.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -126,7 +126,7 @@ static void findIPAddresses (int sock, Array& result) cfg.ifc_buf += IFNAMSIZ + cfg.ifc_req->ifr_addr.sa_len; } #else - for (size_t i = 0; i < cfg.ifc_len / sizeof (struct ifreq); ++i) + for (size_t i = 0; i < (size_t) cfg.ifc_len / (size_t) sizeof (struct ifreq); ++i) { const ifreq& item = cfg.ifc_req[i]; diff --git a/JuceLibraryCode/modules/juce_core/network/juce_IPAddress.h b/JuceLibraryCode/modules/juce_core/network/juce_IPAddress.h index 1f2f0e8..eb82e3f 100644 --- a/JuceLibraryCode/modules/juce_core/network/juce_IPAddress.h +++ b/JuceLibraryCode/modules/juce_core/network/juce_IPAddress.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/network/juce_MACAddress.cpp b/JuceLibraryCode/modules/juce_core/network/juce_MACAddress.cpp index b7cb3c1..78391f8 100644 --- a/JuceLibraryCode/modules/juce_core/network/juce_MACAddress.cpp +++ b/JuceLibraryCode/modules/juce_core/network/juce_MACAddress.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/network/juce_MACAddress.h b/JuceLibraryCode/modules/juce_core/network/juce_MACAddress.h index 67e119e..10a55f7 100644 --- a/JuceLibraryCode/modules/juce_core/network/juce_MACAddress.h +++ b/JuceLibraryCode/modules/juce_core/network/juce_MACAddress.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.cpp b/JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.cpp index 488e63f..bb580f7 100644 --- a/JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.cpp +++ b/JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.h b/JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.h index d2029bd..9b957c3 100644 --- a/JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.h +++ b/JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/network/juce_Socket.cpp b/JuceLibraryCode/modules/juce_core/network/juce_Socket.cpp index 50da39c..6753694 100644 --- a/JuceLibraryCode/modules/juce_core/network/juce_Socket.cpp +++ b/JuceLibraryCode/modules/juce_core/network/juce_Socket.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -75,9 +75,59 @@ namespace SocketHelpers : (setsockopt (handle, IPPROTO_TCP, TCP_NODELAY, (const char*) &one, sizeof (one)) == 0)); } - static bool bindSocketToPort (const SocketHandle handle, const int port) noexcept + static void closeSocket (volatile int& handle, CriticalSection& readLock, + const bool isListener, int portNumber, bool& connected) noexcept { - if (handle <= 0 || port <= 0) + const SocketHandle h = handle; + handle = -1; + + #if JUCE_WINDOWS + ignoreUnused (portNumber, isListener, readLock); + + if (h != SOCKET_ERROR || connected) + closesocket (h); + + // make sure any read process finishes before we delete the socket + CriticalSection::ScopedLockType lock(readLock); + connected = false; + #else + if (connected) + { + connected = false; + + if (isListener) + { + // need to do this to interrupt the accept() function.. + StreamingSocket temp; + temp.connect (IPAddress::local().toString(), portNumber, 1000); + } + } + + if (h != -1) + { + // unblock any pending read requests + ::shutdown (h, SHUT_RDWR); + { + // see man-page of recv on linux about a race condition where the + // shutdown command is lost if the receiving thread does not have + // a chance to process before close is called. On Mac OS X shutdown + // does not unblock a select call, so using a lock here will dead-lock + // both threads. + #if JUCE_LINUX + CriticalSection::ScopedLockType lock (readLock); + ::close (h); + #else + ::close (h); + CriticalSection::ScopedLockType lock (readLock); + #endif + } + } + #endif + } + + static bool bindSocket (const SocketHandle handle, const int port, const String& address) noexcept + { + if (handle <= 0 || port < 0) return false; struct sockaddr_in servTmpAddr; @@ -86,30 +136,64 @@ namespace SocketHelpers servTmpAddr.sin_addr.s_addr = htonl (INADDR_ANY); servTmpAddr.sin_port = htons ((uint16) port); + if (address.isNotEmpty()) + servTmpAddr.sin_addr.s_addr = ::inet_addr (address.toUTF8()); + return bind (handle, (struct sockaddr*) &servTmpAddr, sizeof (struct sockaddr_in)) >= 0; } + static int getBoundPort (const SocketHandle handle) noexcept + { + if (handle <= 0) + return -1; + + struct sockaddr_in sin_addr; + socklen_t len = sizeof (sin_addr); + + if (getsockname (handle, (struct sockaddr*) &sin_addr, &len) == 0) + return ntohs (sin_addr.sin_port); + + return -1; + } + static int readSocket (const SocketHandle handle, void* const destBuffer, const int maxBytesToRead, bool volatile& connected, - const bool blockUntilSpecifiedAmountHasArrived) noexcept + const bool blockUntilSpecifiedAmountHasArrived, + CriticalSection& readLock, + String* senderIP = nullptr, + int* senderPort = nullptr) noexcept { int bytesRead = 0; while (bytesRead < maxBytesToRead) { - int bytesThisTime; + long bytesThisTime = -1; + char* const buffer = static_cast (destBuffer) + bytesRead; + const juce_socklen_t numToRead = (juce_socklen_t) (maxBytesToRead - bytesRead); - #if JUCE_WINDOWS - bytesThisTime = recv (handle, static_cast (destBuffer) + bytesRead, maxBytesToRead - bytesRead, 0); - #else - while ((bytesThisTime = (int) ::read (handle, addBytesToPointer (destBuffer, bytesRead), - (size_t) (maxBytesToRead - bytesRead))) < 0 - && errno == EINTR - && connected) { + // avoid race-condition + CriticalSection::ScopedTryLockType lock (readLock); + + if (lock.isLocked()) + { + if (senderIP == nullptr || senderPort == nullptr) + { + bytesThisTime = ::recv (handle, buffer, numToRead, 0); + } + else + { + sockaddr_in client; + socklen_t clientLen = sizeof (sockaddr); + + bytesThisTime = ::recvfrom (handle, buffer, numToRead, 0, (sockaddr*) &client, &clientLen); + + *senderIP = String::fromUTF8 (inet_ntoa (client.sin_addr), 16); + *senderPort = ntohs (client.sin_port); + } + } } - #endif if (bytesThisTime <= 0 || ! connected) { @@ -125,11 +209,20 @@ namespace SocketHelpers break; } - return bytesRead; + return (int) bytesRead; } - static int waitForReadiness (const SocketHandle handle, const bool forReading, const int timeoutMsecs) noexcept + static int waitForReadiness (const volatile int& handle, CriticalSection& readLock, + const bool forReading, const int timeoutMsecs) noexcept { + // avoid race-condition + CriticalSection::ScopedTryLockType lock (readLock); + + if (! lock.isLocked()) + return -1; + + int h = handle; + struct timeval timeout; struct timeval* timeoutp; @@ -146,20 +239,20 @@ namespace SocketHelpers fd_set rset, wset; FD_ZERO (&rset); - FD_SET (handle, &rset); + FD_SET (h, &rset); FD_ZERO (&wset); - FD_SET (handle, &wset); + FD_SET (h, &wset); fd_set* const prset = forReading ? &rset : nullptr; fd_set* const pwset = forReading ? nullptr : &wset; #if JUCE_WINDOWS - if (select ((int) handle + 1, prset, pwset, 0, timeoutp) < 0) + if (select ((int) h + 1, prset, pwset, 0, timeoutp) < 0) return -1; #else { int result; - while ((result = select (handle + 1, prset, pwset, 0, timeoutp)) < 0 + while ((result = select (h + 1, prset, pwset, 0, timeoutp)) < 0 && errno == EINTR) { } @@ -169,16 +262,20 @@ namespace SocketHelpers } #endif + // we are closing + if (handle < 0) + return -1; + { int opt; juce_socklen_t len = sizeof (opt); - if (getsockopt (handle, SOL_SOCKET, SO_ERROR, (char*) &opt, &len) < 0 + if (getsockopt (h, SOL_SOCKET, SO_ERROR, (char*) &opt, &len) < 0 || opt != 0) return -1; } - return FD_ISSET (handle, forReading ? &rset : &wset) ? 1 : 0; + return FD_ISSET (h, forReading ? &rset : &wset) ? 1 : 0; } static bool setSocketBlockingState (const SocketHandle handle, const bool shouldBlock) noexcept @@ -201,12 +298,7 @@ namespace SocketHelpers #endif } - static bool connectSocket (int volatile& handle, - const bool isDatagram, - struct addrinfo** const serverAddress, - const String& hostName, - const int portNumber, - const int timeOutMillisecs) noexcept + static addrinfo* getAddressInfo (const bool isDatagram, const String& hostName, int portNumber) { struct addrinfo hints; zerostruct (hints); @@ -216,8 +308,22 @@ namespace SocketHelpers hints.ai_flags = AI_NUMERICSERV; struct addrinfo* info = nullptr; - if (getaddrinfo (hostName.toUTF8(), String (portNumber).toUTF8(), &hints, &info) != 0 - || info == nullptr) + if (getaddrinfo (hostName.toUTF8(), String (portNumber).toUTF8(), &hints, &info) == 0 + && info != nullptr) + return info; + + return nullptr; + } + + static bool connectSocket (int volatile& handle, + CriticalSection& readLock, + const String& hostName, + const int portNumber, + const int timeOutMillisecs) noexcept + { + struct addrinfo* info = getAddressInfo (false, hostName, portNumber); + + if (info == nullptr) return false; if (handle < 0) @@ -229,19 +335,12 @@ namespace SocketHelpers return false; } - if (isDatagram) - { - if (*serverAddress != nullptr) - freeaddrinfo (*serverAddress); - - *serverAddress = info; - return true; - } - setSocketBlockingState (handle, false); const int result = ::connect (handle, info->ai_addr, (socklen_t) info->ai_addrlen); freeaddrinfo (info); + bool retval = (result >= 0); + if (result < 0) { #if JUCE_WINDOWS @@ -250,18 +349,17 @@ namespace SocketHelpers if (errno == EINPROGRESS) #endif { - if (waitForReadiness (handle, false, timeOutMillisecs) != 1) - { - setSocketBlockingState (handle, true); - return false; - } + if (waitForReadiness (handle, readLock, false, timeOutMillisecs) == 1) + retval = true; } } setSocketBlockingState (handle, true); - resetSocketOptions (handle, false, false); - return true; + if (retval) + resetSocketOptions (handle, false, false); + + return retval; } static void makeReusable (int handle) noexcept @@ -269,6 +367,23 @@ namespace SocketHelpers const int reuse = 1; setsockopt (handle, SOL_SOCKET, SO_REUSEADDR, (const char*) &reuse, sizeof (reuse)); } + + static bool multicast (int handle, const String& multicastIPAddress, + const String& interfaceIPAddress, bool join) noexcept + { + struct ip_mreq mreq; + + zerostruct (mreq); + mreq.imr_multiaddr.s_addr = inet_addr (multicastIPAddress.toUTF8()); + mreq.imr_interface.s_addr = INADDR_ANY; + + if (interfaceIPAddress.isNotEmpty()) + mreq.imr_interface.s_addr = inet_addr (interfaceIPAddress.toUTF8()); + + int joinCmd = join ? IP_ADD_MEMBERSHIP : IP_DROP_MEMBERSHIP; + + return setsockopt (handle, IPPROTO_IP, joinCmd, (const char*) &mreq, sizeof (mreq)) == 0; + } } //============================================================================== @@ -298,11 +413,10 @@ StreamingSocket::~StreamingSocket() } //============================================================================== -int StreamingSocket::read (void* destBuffer, const int maxBytesToRead, - const bool blockUntilSpecifiedAmountHasArrived) +int StreamingSocket::read (void* destBuffer, const int maxBytesToRead, bool shouldBlock) { return (connected && ! isListener) ? SocketHelpers::readSocket (handle, destBuffer, maxBytesToRead, - connected, blockUntilSpecifiedAmountHasArrived) + connected, shouldBlock, readLock) : -1; } @@ -311,32 +425,31 @@ int StreamingSocket::write (const void* sourceBuffer, const int numBytesToWrite) if (isListener || ! connected) return -1; - #if JUCE_WINDOWS - return send (handle, (const char*) sourceBuffer, numBytesToWrite, 0); - #else - int result; - - while ((result = (int) ::write (handle, sourceBuffer, (size_t) numBytesToWrite)) < 0 - && errno == EINTR) - { - } - - return result; - #endif + return (int) ::send (handle, (const char*) sourceBuffer, (juce_socklen_t) numBytesToWrite, 0); } //============================================================================== int StreamingSocket::waitUntilReady (const bool readyForReading, const int timeoutMsecs) const { - return connected ? SocketHelpers::waitForReadiness (handle, readyForReading, timeoutMsecs) + return connected ? SocketHelpers::waitForReadiness (handle, readLock, readyForReading, timeoutMsecs) : -1; } //============================================================================== bool StreamingSocket::bindToPort (const int port) { - return SocketHelpers::bindSocketToPort (handle, port); + return bindToPort (port, String()); +} + +bool StreamingSocket::bindToPort (const int port, const String& addr) +{ + return SocketHelpers::bindSocket (handle, port, addr); +} + +int StreamingSocket::getBoundPort() const noexcept +{ + return SocketHelpers::getBoundPort (handle); } bool StreamingSocket::connect (const String& remoteHostName, @@ -356,7 +469,7 @@ bool StreamingSocket::connect (const String& remoteHostName, portNumber = remotePortNumber; isListener = false; - connected = SocketHelpers::connectSocket (handle, false, nullptr, remoteHostName, + connected = SocketHelpers::connectSocket (handle, readLock, remoteHostName, remotePortNumber, timeOutMillisecs); if (! (connected && SocketHelpers::resetSocketOptions (handle, false, false))) @@ -370,27 +483,7 @@ bool StreamingSocket::connect (const String& remoteHostName, void StreamingSocket::close() { - #if JUCE_WINDOWS - if (handle != SOCKET_ERROR || connected) - closesocket (handle); - - connected = false; - #else - if (connected) - { - connected = false; - - if (isListener) - { - // need to do this to interrupt the accept() function.. - StreamingSocket temp; - temp.connect (IPAddress::local().toString(), portNumber, 1000); - } - } - - if (handle != -1) - ::close (handle); - #endif + SocketHelpers::closeSocket (handle, readLock, isListener, portNumber, connected); hostName.clear(); portNumber = 0; @@ -467,133 +560,109 @@ bool StreamingSocket::isLocal() const noexcept //============================================================================== //============================================================================== -DatagramSocket::DatagramSocket (const int localPortNumber, const bool canBroadcast) - : portNumber (0), - handle (-1), - connected (true), - allowBroadcast (canBroadcast), - serverAddress (nullptr) +DatagramSocket::DatagramSocket (const bool canBroadcast) + : handle (-1), + isBound (false), + lastServerPort (-1), + lastServerAddress (nullptr) { SocketHelpers::initSockets(); handle = (int) socket (AF_INET, SOCK_DGRAM, 0); + SocketHelpers::resetSocketOptions (handle, true, canBroadcast); SocketHelpers::makeReusable (handle); - bindToPort (localPortNumber); -} - -DatagramSocket::DatagramSocket (const String& host, const int portNum, - const int h, const int localPortNumber) - : hostName (host), - portNumber (portNum), - handle (h), - connected (true), - allowBroadcast (false), - serverAddress (nullptr) -{ - SocketHelpers::initSockets(); - - SocketHelpers::resetSocketOptions (h, true, allowBroadcast); - bindToPort (localPortNumber); } DatagramSocket::~DatagramSocket() { - close(); + if (lastServerAddress != nullptr) + freeaddrinfo (static_cast (lastServerAddress)); - if (serverAddress != nullptr) - freeaddrinfo (static_cast (serverAddress)); -} - -void DatagramSocket::close() -{ - #if JUCE_WINDOWS - closesocket (handle); - connected = false; - #else - connected = false; - ::close (handle); - #endif - - hostName.clear(); - portNumber = 0; - handle = -1; + bool connected = false; + SocketHelpers::closeSocket (handle, readLock, false, 0, connected); } bool DatagramSocket::bindToPort (const int port) { - return SocketHelpers::bindSocketToPort (handle, port); + return bindToPort (port, String()); } -bool DatagramSocket::connect (const String& remoteHostName, - const int remotePortNumber, - const int timeOutMillisecs) +bool DatagramSocket::bindToPort (const int port, const String& addr) { - if (connected) - close(); - - hostName = remoteHostName; - portNumber = remotePortNumber; - - connected = SocketHelpers::connectSocket (handle, true, (struct addrinfo**) &serverAddress, - remoteHostName, remotePortNumber, - timeOutMillisecs); - - if (! (connected && SocketHelpers::resetSocketOptions (handle, true, allowBroadcast))) + if (SocketHelpers::bindSocket (handle, port, addr)) { - close(); - return false; + isBound = true; + lastBindAddress = addr; + + return true; } - return true; + return false; } -DatagramSocket* DatagramSocket::waitForNextConnection() const +int DatagramSocket::getBoundPort() const noexcept { - while (waitUntilReady (true, -1) == 1) - { - struct sockaddr_storage address; - juce_socklen_t len = sizeof (address); - char buf[1]; - - if (recvfrom (handle, buf, 0, 0, (struct sockaddr*) &address, &len) > 0) - return new DatagramSocket (inet_ntoa (((struct sockaddr_in*) &address)->sin_addr), - ntohs (((struct sockaddr_in*) &address)->sin_port), - -1, -1); - } - - return nullptr; + return isBound ? SocketHelpers::getBoundPort (handle) : -1; } //============================================================================== int DatagramSocket::waitUntilReady (const bool readyForReading, const int timeoutMsecs) const { - return connected ? SocketHelpers::waitForReadiness (handle, readyForReading, timeoutMsecs) - : -1; + return SocketHelpers::waitForReadiness (handle, readLock, readyForReading, timeoutMsecs); } -int DatagramSocket::read (void* destBuffer, const int maxBytesToRead, const bool blockUntilSpecifiedAmountHasArrived) +int DatagramSocket::read (void* destBuffer, int maxBytesToRead, bool shouldBlock) { - return connected ? SocketHelpers::readSocket (handle, destBuffer, maxBytesToRead, - connected, blockUntilSpecifiedAmountHasArrived) - : -1; + bool connected = true; + return isBound ? SocketHelpers::readSocket (handle, destBuffer, maxBytesToRead, + connected, shouldBlock, readLock) : -1; } -int DatagramSocket::write (const void* sourceBuffer, const int numBytesToWrite) +int DatagramSocket::read (void* destBuffer, int maxBytesToRead, bool shouldBlock, String& senderIPAddress, int& senderPort) { - // You need to call connect() first to set the server address.. - jassert (serverAddress != nullptr && connected); + bool connected = true; + return isBound ? SocketHelpers::readSocket (handle, destBuffer, maxBytesToRead, connected, + shouldBlock, readLock, &senderIPAddress, &senderPort) : -1; +} - return connected ? (int) sendto (handle, (const char*) sourceBuffer, - (size_t) numBytesToWrite, 0, - static_cast (serverAddress)->ai_addr, - (juce_socklen_t) static_cast (serverAddress)->ai_addrlen) - : -1; +int DatagramSocket::write (const String& remoteHostname, int remotePortNumber, + const void* sourceBuffer, int numBytesToWrite) +{ + struct addrinfo*& info = reinterpret_cast (lastServerAddress); + + // getaddrinfo can be quite slow so cache the result of the address lookup + if (info == nullptr || remoteHostname != lastServerHost || remotePortNumber != lastServerPort) + { + if (info != nullptr) + freeaddrinfo (info); + + if ((info = SocketHelpers::getAddressInfo (true, remoteHostname, remotePortNumber)) == nullptr) + return -1; + + lastServerHost = remoteHostname; + lastServerPort = remotePortNumber; + } + + return (int) ::sendto (handle, (const char*) sourceBuffer, + (juce_socklen_t) numBytesToWrite, 0, + info->ai_addr, (socklen_t) info->ai_addrlen); } -bool DatagramSocket::isLocal() const noexcept +bool DatagramSocket::joinMulticast (const String& multicastIPAddress) { - return hostName == "127.0.0.1"; + if (! isBound) + return false; + + return SocketHelpers::multicast (handle, multicastIPAddress, lastBindAddress, true); +} + +bool DatagramSocket::leaveMulticast (const String& multicastIPAddress) +{ + if (! isBound) + return false; + + return SocketHelpers::multicast (handle, multicastIPAddress, lastBindAddress, false); } #if JUCE_MSVC diff --git a/JuceLibraryCode/modules/juce_core/network/juce_Socket.h b/JuceLibraryCode/modules/juce_core/network/juce_Socket.h index 73795c9..56e9b8d 100644 --- a/JuceLibraryCode/modules/juce_core/network/juce_Socket.h +++ b/JuceLibraryCode/modules/juce_core/network/juce_Socket.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -65,6 +65,25 @@ public: */ bool bindToPort (int localPortNumber); + /** Binds the socket to the specified local port and local address. + + If localAddress is not an empty string then the socket will be bound to localAddress + as well. This is useful if you would like to bind your socket to a specific network + adapter. Note that localAddress must be an IP address assigned to one of your + network address otherwise this function will fail. + @returns true on success; false may indicate that another socket is already bound + on the same port + @see bindToPort(int localPortNumber), IPAddress::findAllAddresses + */ + bool bindToPort (int localPortNumber, const String& localAddress); + + /** Returns the local port number to which this socket is currently bound. + + This is useful if you need to know to which port the OS has actually bound your + socket when calling the constructor or bindToPort with zero as the + localPortNumber argument. Returns -1 if the function fails. */ + int getBoundPort() const noexcept; + /** Tries to connect the socket to hostname:port. If timeOutMillisecs is 0, then this method will block until the operating system @@ -164,6 +183,7 @@ private: String hostName; int volatile portNumber, handle; bool connected, isListener; + mutable CriticalSection readLock; StreamingSocket (const String& hostname, int portNumber, int handle); @@ -185,22 +205,16 @@ class JUCE_API DatagramSocket public: //============================================================================== /** - Creates an (uninitialised) datagram socket. + Creates a datagram socket. - The localPortNumber is the port on which to bind this socket. If this value is 0, - the port number is assigned by the operating system. - - To use the socket for sending, call the connect() method. This will not immediately - make a connection, but will save the destination you've provided. After this, you can - call read() or write(). + You first need to bind this socket to a port with bindToPort if you intend to read + from this socket. If enableBroadcasting is true, the socket will be allowed to send broadcast messages (may require extra privileges on linux) - - To wait for other sockets to connect to this one, call waitForNextConnection(). */ - DatagramSocket (int localPortNumber, - bool enableBroadcasting = false); + DatagramSocket (bool enableBroadcasting = false); + /** Destructor. */ ~DatagramSocket(); @@ -208,37 +222,33 @@ public: //============================================================================== /** Binds the socket to the specified local port. + The localPortNumber is the port on which to bind this socket. If this value is 0, + the port number is assigned by the operating system. + @returns true on success; false may indicate that another socket is already bound on the same port */ bool bindToPort (int localPortNumber); - /** Tries to connect the socket to hostname:port. - - If timeOutMillisecs is 0, then this method will block until the operating system - rejects the connection (which could take a long time). + /** Binds the socket to the specified local port and local address. - @returns true if it succeeds. - @see isConnected + If localAddress is not an empty string then the socket will be bound to localAddress + as well. This is useful if you would like to bind your socket to a specific network + adapter. Note that localAddress must be an IP address assigned to one of your + network address otherwise this function will fail. + @returns true on success; false may indicate that another socket is already bound + on the same port + @see bindToPort(int localPortNumber), IPAddress::findAllAddresses */ - bool connect (const String& remoteHostname, - int remotePortNumber, - int timeOutMillisecs = 3000); + bool bindToPort (int localPortNumber, const String& localAddress); - /** True if the socket is currently connected. */ - bool isConnected() const noexcept { return connected; } + /** Returns the local port number to which this socket is currently bound. - /** Closes the connection. */ - void close(); - - /** Returns the name of the currently connected host. */ - const String& getHostName() const noexcept { return hostName; } - - /** Returns the port number that's currently open. */ - int getPort() const noexcept { return portNumber; } + This is useful if you need to know to which port the OS has actually bound your + socket when bindToPort was called with zero. - /** True if the socket is connected to this machine rather than over the network. */ - bool isLocal() const noexcept; + Returns -1 if the socket didn't bind to any port yet or an error occured. */ + int getBoundPort() const noexcept; /** Returns the OS's socket handle that's currently open. */ int getRawSocketHandle() const noexcept { return handle; } @@ -271,6 +281,21 @@ public: int read (void* destBuffer, int maxBytesToRead, bool blockUntilSpecifiedAmountHasArrived); + /** Reads bytes from the socket and return the IP address of the sender. + + If blockUntilSpecifiedAmountHasArrived is true, the method will block until + maxBytesToRead bytes have been read, (or until an error occurs). If this + flag is false, the method will return as much data as is currently available + without blocking. + + @returns the number of bytes read, or -1 if there was an error. On a successful + result, the senderIPAddress value will be set to the IP of the sender. + @see waitUntilReady + */ + int read (void* destBuffer, int maxBytesToRead, + bool blockUntilSpecifiedAmountHasArrived, + String& senderIPAddress, int& senderPortNumber); + /** Writes bytes to the socket from a buffer. Note that this method will block unless you have checked the socket is ready @@ -278,25 +303,30 @@ public: @returns the number of bytes written, or -1 if there was an error. */ - int write (const void* sourceBuffer, int numBytesToWrite); + int write (const String& remoteHostname, int remotePortNumber, + const void* sourceBuffer, int numBytesToWrite); //============================================================================== - /** This waits for incoming data to be sent, and returns a socket that can be used - to read it. + /** Join a multicast group + + @returns true if it succeeds. + */ + bool joinMulticast (const String& multicastIPAddress); - The object that gets returned is owned by the caller, and can't be used for - sending, but can be used to read the data. + /** Leave a multicast group + + @returns true if it succeeds. */ - DatagramSocket* waitForNextConnection() const; + bool leaveMulticast (const String& multicastIPAddress); private: //============================================================================== - String hostName; - int volatile portNumber, handle; - bool connected, allowBroadcast; - void* serverAddress; - - DatagramSocket (const String& hostname, int portNumber, int handle, int localPortNumber); + int handle; + bool isBound; + String lastBindAddress, lastServerHost; + int lastServerPort; + void* lastServerAddress; + mutable CriticalSection readLock; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DatagramSocket) }; diff --git a/JuceLibraryCode/modules/juce_core/network/juce_URL.cpp b/JuceLibraryCode/modules/juce_core/network/juce_URL.cpp index 76d2b1e..200a82b 100644 --- a/JuceLibraryCode/modules/juce_core/network/juce_URL.cpp +++ b/JuceLibraryCode/modules/juce_core/network/juce_URL.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -334,7 +334,8 @@ InputStream* URL::createInputStream (const bool usePostCommand, String headers, const int timeOutMs, StringPairArray* const responseHeaders, - int* statusCode) const + int* statusCode, + const int numRedirectsToFollow) const { MemoryBlock headersAndPostData; @@ -350,7 +351,8 @@ InputStream* URL::createInputStream (const bool usePostCommand, ScopedPointer wi (new WebInputStream (toString (! usePostCommand), usePostCommand, headersAndPostData, progressCallback, progressCallbackContext, - headers, timeOutMs, responseHeaders)); + headers, timeOutMs, responseHeaders, + numRedirectsToFollow)); if (statusCode != nullptr) *statusCode = wi->statusCode; @@ -397,6 +399,17 @@ URL URL::withParameter (const String& parameterName, return u; } +URL URL::withParameters (const StringPairArray& parametersToAdd) const +{ + URL u (*this); + + for (int i = 0; i < parametersToAdd.size(); ++i) + u.addParameter (parametersToAdd.getAllKeys()[i], + parametersToAdd.getAllValues()[i]); + + return u; +} + URL URL::withPOSTData (const String& newPostData) const { URL u (*this); @@ -482,8 +495,8 @@ String URL::addEscapeChars (const String& s, const bool isParameter) || legalChars.indexOf ((juce_wchar) c) >= 0)) { utf8.set (i, '%'); - utf8.insert (++i, "0123456789abcdef" [((uint8) c) >> 4]); - utf8.insert (++i, "0123456789abcdef" [c & 15]); + utf8.insert (++i, "0123456789ABCDEF" [((uint8) c) >> 4]); + utf8.insert (++i, "0123456789ABCDEF" [c & 15]); } } diff --git a/JuceLibraryCode/modules/juce_core/network/juce_URL.h b/JuceLibraryCode/modules/juce_core/network/juce_URL.h index 06d8fb7..722b69f 100644 --- a/JuceLibraryCode/modules/juce_core/network/juce_URL.h +++ b/JuceLibraryCode/modules/juce_core/network/juce_URL.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -140,6 +140,12 @@ public: URL withParameter (const String& parameterName, const String& parameterValue) const; + /** Returns a copy of this URL, with a set of GET or POST parameters added. + This is a convenience method, equivalent to calling withParameter for each value. + @see withParameter + */ + URL withParameters (const StringPairArray& parametersToAdd) const; + /** Returns a copy of this URL, with a file-upload type parameter added to it. When performing a POST where one of your parameters is a binary file, this @@ -242,6 +248,9 @@ public: /** Attempts to open a stream that can read from this URL. + Note that on some platforms (Android, for example) it's not permitted to do any network + action from the message thread, so you must only call it from a background thread. + @param usePostCommand if true, it will try to do use a http 'POST' to pass the parameters, otherwise it'll encode them into the URL and do a 'GET'. @@ -260,6 +269,8 @@ public: in the response will be stored in this array @param statusCode if this is non-null, it will get set to the http status code, if one is known, or 0 if a code isn't available + @param numRedirectsToFollow specifies the number of redirects that will be followed before + returning a response (ignored for Android which follows up to 5 redirects) @returns an input stream that the caller must delete, or a null pointer if there was an error trying to open it. */ @@ -269,7 +280,8 @@ public: String extraHeaders = String(), int connectionTimeOutMs = 0, StringPairArray* responseHeaders = nullptr, - int* statusCode = nullptr) const; + int* statusCode = nullptr, + int numRedirectsToFollow = 5) const; //============================================================================== @@ -278,6 +290,9 @@ public: If it succeeds, this will return true and append the data it read onto the end of the memory block. + Note that on some platforms (Android, for example) it's not permitted to do any network + action from the message thread, so you must only call it from a background thread. + @param destData the memory block to append the new data to @param usePostCommand whether to use a POST command to get the data (uses a GET command if this is false) @@ -293,6 +308,9 @@ public: operation that fails and one that returns an empty string, you'll need to use a different method, such as readEntireBinaryStream(). + Note that on some platforms (Android, for example) it's not permitted to do any network + action from the message thread, so you must only call it from a background thread. + @param usePostCommand whether to use a POST command to get the data (uses a GET command if this is false) @see readEntireBinaryStream, readEntireXmlStream @@ -307,6 +325,9 @@ public: When it returns a valid XmlElement object, the caller is responsibile for deleting this object when no longer needed. + Note that on some platforms (Android, for example) it's not permitted to do any network + action from the message thread, so you must only call it from a background thread. + @param usePostCommand whether to use a POST command to get the data (uses a GET command if this is false) diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.cpp b/JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.cpp index ec01f8e..ea91f64 100644 --- a/JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.cpp +++ b/JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.h b/JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.h index 8f1e633..e0e74a2 100644 --- a/JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.h +++ b/JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.cpp b/JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.cpp index 51b9db9..9cbeaf1 100644 --- a/JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.cpp +++ b/JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.h b/JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.h index d2e6d86..5a58c77 100644 --- a/JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.h +++ b/JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_InputSource.h b/JuceLibraryCode/modules/juce_core/streams/juce_InputSource.h index 0e13ac5..a571ed0 100644 --- a/JuceLibraryCode/modules/juce_core/streams/juce_InputSource.h +++ b/JuceLibraryCode/modules/juce_core/streams/juce_InputSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_InputStream.cpp b/JuceLibraryCode/modules/juce_core/streams/juce_InputStream.cpp index 07b9976..2cf3e00 100644 --- a/JuceLibraryCode/modules/juce_core/streams/juce_InputStream.cpp +++ b/JuceLibraryCode/modules/juce_core/streams/juce_InputStream.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_InputStream.h b/JuceLibraryCode/modules/juce_core/streams/juce_InputStream.h index ebdc795..0149f0b 100644 --- a/JuceLibraryCode/modules/juce_core/streams/juce_InputStream.h +++ b/JuceLibraryCode/modules/juce_core/streams/juce_InputStream.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.cpp b/JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.cpp index 82b2d14..2621e4f 100644 --- a/JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.cpp +++ b/JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.h b/JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.h index 013bc39..6350f65 100644 --- a/JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.h +++ b/JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.cpp b/JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.cpp index adbaed2..9c02670 100644 --- a/JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.cpp +++ b/JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -89,14 +89,14 @@ char* MemoryOutputStream::prepareToWrite (size_t numBytes) if (storageNeeded >= blockToUse->getSize()) blockToUse->ensureSize ((storageNeeded + jmin (storageNeeded / 2, (size_t) (1024 * 1024)) + 32) & ~31u); - data = static_cast (blockToUse->getData()); + data = static_cast (blockToUse->getData()); } else { if (storageNeeded > availableSize) return nullptr; - data = static_cast (externalData); + data = static_cast (externalData); } char* const writePointer = data + position; @@ -157,7 +157,7 @@ const void* MemoryOutputStream::getData() const noexcept return externalData; if (blockToUse->getSize() > size) - static_cast (blockToUse->getData()) [size] = 0; + static_cast (blockToUse->getData()) [size] = 0; return blockToUse->getData(); } @@ -194,7 +194,7 @@ int64 MemoryOutputStream::writeFromInputStream (InputStream& source, int64 maxNu String MemoryOutputStream::toUTF8() const { - const char* const d = static_cast (getData()); + const char* const d = static_cast (getData()); return String (CharPointer_UTF8 (d), CharPointer_UTF8 (d + getDataSize())); } diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.h b/JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.h index 2e764ef..6109444 100644 --- a/JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.h +++ b/JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -111,7 +111,7 @@ public: capacity off the block, so that its length matches the amount of actual data that has been written so far. */ - void flush(); + void flush() override; bool write (const void*, size_t) override; int64 getPosition() override { return (int64) position; } diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.cpp b/JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.cpp index c67e3fb..8b5585f 100644 --- a/JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.cpp +++ b/JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.h b/JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.h index 102ab5a..407d342 100644 --- a/JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.h +++ b/JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.cpp b/JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.cpp index c998c79..4398ab7 100644 --- a/JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.cpp +++ b/JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.h b/JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.h index d291a03..55e4ccc 100644 --- a/JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.h +++ b/JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/system/juce_CompilerSupport.h b/JuceLibraryCode/modules/juce_core/system/juce_CompilerSupport.h index d090956..b25b1f2 100644 --- a/JuceLibraryCode/modules/juce_core/system/juce_CompilerSupport.h +++ b/JuceLibraryCode/modules/juce_core/system/juce_CompilerSupport.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -40,6 +40,8 @@ #define JUCE_COMPILER_SUPPORTS_NOEXCEPT 1 #define JUCE_COMPILER_SUPPORTS_NULLPTR 1 #define JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS 1 + #define JUCE_COMPILER_SUPPORTS_INITIALIZER_LISTS 1 + #define JUCE_COMPILER_SUPPORTS_VARIADIC_TEMPLATES 1 #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && ! defined (JUCE_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL) #define JUCE_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL 1 @@ -73,13 +75,18 @@ #define JUCE_DELETED_FUNCTION = delete #endif - #if __has_feature (cxx_lambdas) \ - && ((JUCE_MAC && defined (MAC_OS_X_VERSION_10_8) && MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_8) \ - || (JUCE_IOS && defined (__IPHONE_7_0) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0) \ - || ! (JUCE_MAC || JUCE_IOS)) + #if __has_feature (cxx_lambdas) && (defined (_LIBCPP_VERSION) || ! (JUCE_MAC || JUCE_IOS)) #define JUCE_COMPILER_SUPPORTS_LAMBDAS 1 #endif + #if __has_feature (cxx_generalized_initializers) && (defined (_LIBCPP_VERSION) || ! (JUCE_MAC || JUCE_IOS)) + #define JUCE_COMPILER_SUPPORTS_INITIALIZER_LISTS 1 + #endif + + #if __has_feature (cxx_variadic_templates) + #define JUCE_COMPILER_SUPPORTS_VARIADIC_TEMPLATES 1 + #endif + #ifndef JUCE_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL #define JUCE_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL 1 #endif @@ -87,6 +94,7 @@ #ifndef JUCE_COMPILER_SUPPORTS_ARC #define JUCE_COMPILER_SUPPORTS_ARC 1 #endif + #endif //============================================================================== @@ -102,9 +110,14 @@ #define JUCE_COMPILER_SUPPORTS_LAMBDAS 1 #endif + #if _MSC_VER >= 1800 + #define JUCE_COMPILER_SUPPORTS_INITIALIZER_LISTS 1 + #define JUCE_COMPILER_SUPPORTS_VARIADIC_TEMPLATES 1 + #define JUCE_DELETED_FUNCTION = delete + #endif + #if _MSC_VER >= 1900 #define JUCE_COMPILER_SUPPORTS_NOEXCEPT 1 - #define JUCE_DELETED_FUNCTION = delete #endif #endif diff --git a/JuceLibraryCode/modules/juce_core/system/juce_PlatformDefs.h b/JuceLibraryCode/modules/juce_core/system/juce_PlatformDefs.h index 3252fdb..bac29ac 100644 --- a/JuceLibraryCode/modules/juce_core/system/juce_PlatformDefs.h +++ b/JuceLibraryCode/modules/juce_core/system/juce_PlatformDefs.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -63,8 +63,8 @@ //============================================================================== #if JUCE_IOS || JUCE_LINUX || JUCE_ANDROID || JUCE_PPC /** This will try to break into the debugger if the app is currently being debugged. - If called by an app that's not being debugged, the behaiour isn't defined - it may crash or not, depending - on the platform. + If called by an app that's not being debugged, the behaviour isn't defined - it may + crash or not, depending on the platform. @see jassert() */ #define juce_breakDebugger { ::kill (0, SIGTRAP); } diff --git a/JuceLibraryCode/modules/juce_core/system/juce_StandardHeader.h b/JuceLibraryCode/modules/juce_core/system/juce_StandardHeader.h index 35d9b87..46b7610 100644 --- a/JuceLibraryCode/modules/juce_core/system/juce_StandardHeader.h +++ b/JuceLibraryCode/modules/juce_core/system/juce_StandardHeader.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -35,8 +35,8 @@ See also SystemStats::getJUCEVersion() for a string version. */ #define JUCE_MAJOR_VERSION 3 -#define JUCE_MINOR_VERSION 0 -#define JUCE_BUILDNUMBER 8 +#define JUCE_MINOR_VERSION 2 +#define JUCE_BUILDNUMBER 0 /** Current Juce version number. @@ -50,6 +50,8 @@ //============================================================================== +#include // included before platform defs to provide a definition of _LIBCPP_VERSION + #include "juce_PlatformDefs.h" #include "juce_CompilerSupport.h" @@ -71,7 +73,6 @@ #include #include #include -#include #include #include @@ -104,7 +105,7 @@ #endif #if JUCE_ANDROID - #include + #include #include #endif @@ -113,6 +114,8 @@ #undef TYPE_BOOL #undef max #undef min +#undef major +#undef minor //============================================================================== // DLL building settings on Windows diff --git a/JuceLibraryCode/modules/juce_core/system/juce_SystemStats.cpp b/JuceLibraryCode/modules/juce_core/system/juce_SystemStats.cpp index 365e94d..65bb117 100644 --- a/JuceLibraryCode/modules/juce_core/system/juce_SystemStats.cpp +++ b/JuceLibraryCode/modules/juce_core/system/juce_SystemStats.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -67,7 +67,8 @@ struct CPUInformation { CPUInformation() noexcept : numCpus (0), hasMMX (false), hasSSE (false), - hasSSE2 (false), hasSSE3 (false), has3DNow (false) + hasSSE2 (false), hasSSE3 (false), has3DNow (false), + hasSSSE3 (false), hasAVX (false) { initialise(); } @@ -75,7 +76,7 @@ struct CPUInformation void initialise() noexcept; int numCpus; - bool hasMMX, hasSSE, hasSSE2, hasSSE3, has3DNow; + bool hasMMX, hasSSE, hasSSE2, hasSSE3, has3DNow, hasSSSE3, hasAVX; }; static const CPUInformation& getCPUInformation() noexcept @@ -86,10 +87,12 @@ static const CPUInformation& getCPUInformation() noexcept int SystemStats::getNumCpus() noexcept { return getCPUInformation().numCpus; } bool SystemStats::hasMMX() noexcept { return getCPUInformation().hasMMX; } +bool SystemStats::has3DNow() noexcept { return getCPUInformation().has3DNow; } bool SystemStats::hasSSE() noexcept { return getCPUInformation().hasSSE; } bool SystemStats::hasSSE2() noexcept { return getCPUInformation().hasSSE2; } bool SystemStats::hasSSE3() noexcept { return getCPUInformation().hasSSE3; } -bool SystemStats::has3DNow() noexcept { return getCPUInformation().has3DNow; } +bool SystemStats::hasSSSE3() noexcept { return getCPUInformation().hasSSSE3; } +bool SystemStats::hasAVX() noexcept { return getCPUInformation().hasAVX; } //============================================================================== diff --git a/JuceLibraryCode/modules/juce_core/system/juce_SystemStats.h b/JuceLibraryCode/modules/juce_core/system/juce_SystemStats.h index 835e6e6..540bf73 100644 --- a/JuceLibraryCode/modules/juce_core/system/juce_SystemStats.h +++ b/JuceLibraryCode/modules/juce_core/system/juce_SystemStats.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -47,28 +47,31 @@ public: /** The set of possible results of the getOperatingSystemType() method. */ enum OperatingSystemType { - UnknownOS = 0, - - Linux = 0x2000, - Android = 0x3000, - iOS = 0x8000, - - MacOSX_10_4 = 0x1004, - MacOSX_10_5 = 0x1005, - MacOSX_10_6 = 0x1006, - MacOSX_10_7 = 0x1007, - MacOSX_10_8 = 0x1008, - MacOSX_10_9 = 0x1009, - - Win2000 = 0x4105, - WinXP = 0x4106, - WinVista = 0x4107, - Windows7 = 0x4108, - Windows8_0 = 0x4109, - Windows8_1 = 0x410a, - - Windows = 0x4000, /**< To test whether any version of Windows is running, - you can use the expression ((getOperatingSystemType() & Windows) != 0). */ + UnknownOS = 0, + + MacOSX = 0x0100, /**< To test whether any version of OSX is running, + you can use the expression ((getOperatingSystemType() & MacOSX) != 0). */ + Windows = 0x0200, /**< To test whether any version of Windows is running, + you can use the expression ((getOperatingSystemType() & Windows) != 0). */ + Linux = 0x0400, + Android = 0x0800, + iOS = 0x1000, + + MacOSX_10_4 = MacOSX | 4, + MacOSX_10_5 = MacOSX | 5, + MacOSX_10_6 = MacOSX | 6, + MacOSX_10_7 = MacOSX | 7, + MacOSX_10_8 = MacOSX | 8, + MacOSX_10_9 = MacOSX | 9, + MacOSX_10_10 = MacOSX | 10, + + Win2000 = Windows | 1, + WinXP = Windows | 2, + WinVista = Windows | 3, + Windows7 = Windows | 4, + Windows8_0 = Windows | 5, + Windows8_1 = Windows | 6, + Windows10 = Windows | 7 }; /** Returns the type of operating system we're running on. @@ -149,10 +152,12 @@ public: static String getCpuVendor(); static bool hasMMX() noexcept; /**< Returns true if Intel MMX instructions are available. */ + static bool has3DNow() noexcept; /**< Returns true if AMD 3DNOW instructions are available. */ static bool hasSSE() noexcept; /**< Returns true if Intel SSE instructions are available. */ static bool hasSSE2() noexcept; /**< Returns true if Intel SSE2 instructions are available. */ static bool hasSSE3() noexcept; /**< Returns true if Intel SSE2 instructions are available. */ - static bool has3DNow() noexcept; /**< Returns true if AMD 3DNOW instructions are available. */ + static bool hasSSSE3() noexcept; /**< Returns true if Intel SSSE3 instructions are available. */ + static bool hasAVX() noexcept; /**< Returns true if Intel AVX instructions are available. */ //============================================================================== /** Finds out how much RAM is in the machine. diff --git a/JuceLibraryCode/modules/juce_core/system/juce_TargetPlatform.h b/JuceLibraryCode/modules/juce_core/system/juce_TargetPlatform.h index 63470b6..75e363f 100644 --- a/JuceLibraryCode/modules/juce_core/system/juce_TargetPlatform.h +++ b/JuceLibraryCode/modules/juce_core/system/juce_TargetPlatform.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_ASCII.h b/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_ASCII.h index a966543..3b68e4c 100644 --- a/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_ASCII.h +++ b/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_ASCII.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -276,8 +276,10 @@ public: int compareIgnoreCase (const CharPointer_ASCII other) const { - #if JUCE_WINDOWS + #if JUCE_MSVC return stricmp (data, other.data); + #elif JUCE_MINGW + return CharacterFunctions::compareIgnoreCase (*this, other); #else return strcasecmp (data, other.data); #endif @@ -344,7 +346,7 @@ public: /** Parses this string as a 64-bit integer. */ int64 getIntValue64() const noexcept { - #if JUCE_LINUX || JUCE_ANDROID + #if JUCE_LINUX || JUCE_ANDROID || JUCE_MINGW return atoll (data); #elif JUCE_WINDOWS return _atoi64 (data); diff --git a/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF16.h b/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF16.h index d0eba5c..7a245e1 100644 --- a/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF16.h +++ b/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF16.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -349,7 +349,7 @@ public: return CharacterFunctions::compareIgnoreCaseUpTo (*this, other, maxChars); } - #if JUCE_WINDOWS && ! DOXYGEN + #if JUCE_MSVC && ! DOXYGEN int compareIgnoreCase (const CharPointer_UTF16 other) const noexcept { return _wcsicmp (data, other.data); @@ -408,7 +408,7 @@ public: /** Parses this string as a 32-bit integer. */ int getIntValue32() const noexcept { - #if JUCE_WINDOWS + #if JUCE_MSVC return _wtoi (data); #else return CharacterFunctions::getIntValue (*this); @@ -418,7 +418,7 @@ public: /** Parses this string as a 64-bit integer. */ int64 getIntValue64() const noexcept { - #if JUCE_WINDOWS + #if JUCE_MSVC return _wtoi64 (data); #else return CharacterFunctions::getIntValue (*this); diff --git a/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF32.h b/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF32.h index 42cfe48..9e96d70 100644 --- a/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF32.h +++ b/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF32.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF8.h b/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF8.h index 78d9a97..9c466f3 100644 --- a/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF8.h +++ b/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF8.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -421,8 +421,10 @@ public: /** Compares this string with another one. */ int compareIgnoreCase (const CharPointer_UTF8 other) const noexcept { - #if JUCE_WINDOWS + #if JUCE_MSVC return stricmp (data, other.data); + #elif JUCE_MINGW + return CharacterFunctions::compareIgnoreCase (*this, other); #else return strcasecmp (data, other.data); #endif @@ -456,9 +458,9 @@ public: } /** Returns true if the first character of this string is whitespace. */ - bool isWhitespace() const noexcept { return *data == ' ' || (*data <= 13 && *data >= 9); } + bool isWhitespace() const noexcept { const CharType c = *data; return c == ' ' || (c <= 13 && c >= 9); } /** Returns true if the first character of this string is a digit. */ - bool isDigit() const noexcept { return *data >= '0' && *data <= '9'; } + bool isDigit() const noexcept { const CharType c = *data; return c >= '0' && c <= '9'; } /** Returns true if the first character of this string is a letter. */ bool isLetter() const noexcept { return CharacterFunctions::isLetter (operator*()) != 0; } /** Returns true if the first character of this string is a letter or digit. */ @@ -479,7 +481,7 @@ public: /** Parses this string as a 64-bit integer. */ int64 getIntValue64() const noexcept { - #if JUCE_LINUX || JUCE_ANDROID + #if JUCE_LINUX || JUCE_ANDROID || JUCE_MINGW return atoll (data); #elif JUCE_WINDOWS return _atoi64 (data); @@ -509,7 +511,7 @@ public: if (byte < 0) { - uint8 bit = 0x40; + int bit = 0x40; int numExtraValues = 0; while ((byte & bit) != 0) diff --git a/JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.cpp b/JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.cpp index 11eaa18..9b9d7a9 100644 --- a/JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.cpp +++ b/JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -34,18 +34,18 @@ juce_wchar CharacterFunctions::toUpperCase (const juce_wchar character) noexcept { - return towupper ((wchar_t) character); + return (juce_wchar) towupper ((wint_t) character); } juce_wchar CharacterFunctions::toLowerCase (const juce_wchar character) noexcept { - return towlower ((wchar_t) character); + return (juce_wchar) towlower ((wint_t) character); } bool CharacterFunctions::isUpperCase (const juce_wchar character) noexcept { #if JUCE_WINDOWS - return iswupper ((wchar_t) character) != 0; + return iswupper ((wint_t) character) != 0; #else return toLowerCase (character) != character; #endif @@ -54,7 +54,7 @@ bool CharacterFunctions::isUpperCase (const juce_wchar character) noexcept bool CharacterFunctions::isLowerCase (const juce_wchar character) noexcept { #if JUCE_WINDOWS - return iswlower ((wchar_t) character) != 0; + return iswlower ((wint_t) character) != 0; #else return toUpperCase (character) != character; #endif @@ -72,7 +72,7 @@ bool CharacterFunctions::isWhitespace (const char character) noexcept bool CharacterFunctions::isWhitespace (const juce_wchar character) noexcept { - return iswspace ((wchar_t) character) != 0; + return iswspace ((wint_t) character) != 0; } bool CharacterFunctions::isDigit (const char character) noexcept @@ -82,7 +82,7 @@ bool CharacterFunctions::isDigit (const char character) noexcept bool CharacterFunctions::isDigit (const juce_wchar character) noexcept { - return iswdigit ((wchar_t) character) != 0; + return iswdigit ((wint_t) character) != 0; } bool CharacterFunctions::isLetter (const char character) noexcept @@ -93,7 +93,7 @@ bool CharacterFunctions::isLetter (const char character) noexcept bool CharacterFunctions::isLetter (const juce_wchar character) noexcept { - return iswalpha ((wchar_t) character) != 0; + return iswalpha ((wint_t) character) != 0; } bool CharacterFunctions::isLetterOrDigit (const char character) noexcept @@ -105,7 +105,7 @@ bool CharacterFunctions::isLetterOrDigit (const char character) noexcept bool CharacterFunctions::isLetterOrDigit (const juce_wchar character) noexcept { - return iswalnum ((wchar_t) character) != 0; + return iswalnum ((wint_t) character) != 0; } int CharacterFunctions::getHexDigitValue (const juce_wchar digit) noexcept diff --git a/JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.h b/JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.h index bade0dd..82adf54 100644 --- a/JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.h +++ b/JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/text/juce_Identifier.cpp b/JuceLibraryCode/modules/juce_core/text/juce_Identifier.cpp index bac4dd5..13821b6 100644 --- a/JuceLibraryCode/modules/juce_core/text/juce_Identifier.cpp +++ b/JuceLibraryCode/modules/juce_core/text/juce_Identifier.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -31,7 +31,17 @@ Identifier::~Identifier() noexcept {} Identifier::Identifier (const Identifier& other) noexcept : name (other.name) {} -Identifier& Identifier::operator= (const Identifier other) noexcept +#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS +Identifier::Identifier (Identifier&& other) noexcept : name (static_cast (other.name)) {} + +Identifier& Identifier::operator= (Identifier&& other) noexcept +{ + name = static_cast (other.name); + return *this; +} +#endif + +Identifier& Identifier::operator= (const Identifier& other) noexcept { name = other.name; return *this; @@ -40,25 +50,22 @@ Identifier& Identifier::operator= (const Identifier other) noexcept Identifier::Identifier (const String& nm) : name (StringPool::getGlobalPool().getPooledString (nm)) { - /* An Identifier string must be suitable for use as a script variable or XML - attribute, so it can only contain this limited set of characters.. */ - jassert (isValidIdentifier (toString())); + // An Identifier cannot be created from an empty string! + jassert (nm.isNotEmpty()); } Identifier::Identifier (const char* nm) : name (StringPool::getGlobalPool().getPooledString (nm)) { - /* An Identifier string must be suitable for use as a script variable or XML - attribute, so it can only contain this limited set of characters.. */ - jassert (isValidIdentifier (toString())); + // An Identifier cannot be created from an empty string! + jassert (nm != nullptr && nm[0] != 0); } Identifier::Identifier (String::CharPointerType start, String::CharPointerType end) : name (StringPool::getGlobalPool().getPooledString (start, end)) { - /* An Identifier string must be suitable for use as a script variable or XML - attribute, so it can only contain this limited set of characters.. */ - jassert (isValidIdentifier (toString())); + // An Identifier cannot be created from an empty string! + jassert (start < end); } Identifier Identifier::null; diff --git a/JuceLibraryCode/modules/juce_core/text/juce_Identifier.h b/JuceLibraryCode/modules/juce_core/text/juce_Identifier.h index f60eec8..7891443 100644 --- a/JuceLibraryCode/modules/juce_core/text/juce_Identifier.h +++ b/JuceLibraryCode/modules/juce_core/text/juce_Identifier.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -68,16 +68,24 @@ public: Identifier (const Identifier& other) noexcept; /** Creates a copy of another identifier. */ - Identifier& operator= (const Identifier other) noexcept; + Identifier& operator= (const Identifier& other) noexcept; + + #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS + /** Creates a copy of another identifier. */ + Identifier (Identifier&& other) noexcept; + + /** Creates a copy of another identifier. */ + Identifier& operator= (Identifier&& other) noexcept; + #endif /** Destructor */ ~Identifier() noexcept; /** Compares two identifiers. This is a very fast operation. */ - inline bool operator== (Identifier other) const noexcept { return name.getCharPointer() == other.name.getCharPointer(); } + inline bool operator== (const Identifier& other) const noexcept { return name.getCharPointer() == other.name.getCharPointer(); } /** Compares two identifiers. This is a very fast operation. */ - inline bool operator!= (Identifier other) const noexcept { return name.getCharPointer() != other.name.getCharPointer(); } + inline bool operator!= (const Identifier& other) const noexcept { return name.getCharPointer() != other.name.getCharPointer(); } /** Compares the identifier with a string. */ inline bool operator== (StringRef other) const noexcept { return name == other; } diff --git a/JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.cpp b/JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.cpp index e6118d3..3671fe0 100644 --- a/JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.cpp +++ b/JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.h b/JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.h index a594919..8eb7998 100644 --- a/JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.h +++ b/JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/text/juce_NewLine.h b/JuceLibraryCode/modules/juce_core/text/juce_NewLine.h index 980ac23..0d310cd 100644 --- a/JuceLibraryCode/modules/juce_core/text/juce_NewLine.h +++ b/JuceLibraryCode/modules/juce_core/text/juce_NewLine.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/text/juce_String.cpp b/JuceLibraryCode/modules/juce_core/text/juce_String.cpp index 1dce723..39e2843 100644 --- a/JuceLibraryCode/modules/juce_core/text/juce_String.cpp +++ b/JuceLibraryCode/modules/juce_core/text/juce_String.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -566,9 +566,9 @@ struct HashGenerator enum { multiplier = sizeof (Type) > 4 ? 101 : 31 }; }; -int String::hashCode() const noexcept { return HashGenerator ::calculate (text); } -int64 String::hashCode64() const noexcept { return HashGenerator ::calculate (text); } -std::size_t String::hash() const noexcept { return HashGenerator::calculate (text); } +int String::hashCode() const noexcept { return HashGenerator ::calculate (text); } +int64 String::hashCode64() const noexcept { return HashGenerator ::calculate (text); } +size_t String::hash() const noexcept { return HashGenerator ::calculate (text); } //============================================================================== JUCE_API bool JUCE_CALLTYPE operator== (const String& s1, const String& s2) noexcept { return s1.compare (s2) == 0; } @@ -720,7 +720,8 @@ int String::compareNatural (StringRef other) const noexcept //============================================================================== void String::append (const String& textToAppend, size_t maxCharsToTake) { - appendCharPointer (textToAppend.text, maxCharsToTake); + appendCharPointer (this == &textToAppend ? String (textToAppend).text + : textToAppend.text, maxCharsToTake); } void String::appendCharPointer (const CharPointerType textToAppend) @@ -765,6 +766,9 @@ String& String::operator+= (const String& other) if (isEmpty()) return operator= (other); + if (this == &other) + return operator+= (String (*this)); + appendCharPointer (other.text); return *this; } @@ -1613,10 +1617,10 @@ String String::upToLastOccurrenceOf (StringRef sub, bool String::isQuotedString() const { - const String trimmed (trimStart()); + const juce_wchar trimmedStart = trimStart()[0]; - return trimmed[0] == '"' - || trimmed[0] == '\''; + return trimmedStart == '"' + || trimmedStart == '\''; } String String::unquoted() const @@ -2518,14 +2522,13 @@ public: beginTest ("var"); var v1 = 0; - var v2 = 0.1; - var v3 = "0.1"; + var v2 = 0.16; + var v3 = "0.16"; var v4 = (int64) 0; var v5 = 0.0; expect (! v2.equals (v1)); expect (! v1.equals (v2)); expect (v2.equals (v3)); - expect (v3.equals (v2)); expect (! v3.equals (v1)); expect (! v1.equals (v3)); expect (v1.equals (v4)); diff --git a/JuceLibraryCode/modules/juce_core/text/juce_String.h b/JuceLibraryCode/modules/juce_core/text/juce_String.h index 6a51107..5c2a89f 100644 --- a/JuceLibraryCode/modules/juce_core/text/juce_String.h +++ b/JuceLibraryCode/modules/juce_core/text/juce_String.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -89,12 +89,12 @@ public: */ String (const char* text, size_t maxChars); - /** Creates a string from a whcar_t character string. + /** Creates a string from a wchar_t character string. Depending on the platform, this may be treated as either UTF-32 or UTF-16. */ String (const wchar_t* text); - /** Creates a string from a whcar_t character string. + /** Creates a string from a wchar_t character string. Depending on the platform, this may be treated as either UTF-32 or UTF-16. */ String (const wchar_t* text, size_t maxChars); @@ -181,7 +181,7 @@ public: int64 hashCode64() const noexcept; /** Generates a probably-unique hashcode from this string. */ - std::size_t hash() const noexcept; + size_t hash() const noexcept; /** Returns the number of characters in the string. */ int length() const noexcept; @@ -299,13 +299,13 @@ public: Note that there's also an isNotEmpty() method to help write readable code. @see containsNonWhitespaceChars() */ - inline bool isEmpty() const noexcept { return text[0] == 0; } + inline bool isEmpty() const noexcept { return text.isEmpty(); } /** Returns true if the string contains at least one character. Note that there's also an isEmpty() method to help write readable code. @see containsNonWhitespaceChars() */ - inline bool isNotEmpty() const noexcept { return text[0] != 0; } + inline bool isNotEmpty() const noexcept { return ! text.isEmpty(); } /** Resets this string to be empty. */ void clear() noexcept; diff --git a/JuceLibraryCode/modules/juce_core/text/juce_StringArray.cpp b/JuceLibraryCode/modules/juce_core/text/juce_StringArray.cpp index 6c49138..de6ac3e 100644 --- a/JuceLibraryCode/modules/juce_core/text/juce_StringArray.cpp +++ b/JuceLibraryCode/modules/juce_core/text/juce_StringArray.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -86,6 +86,13 @@ StringArray& StringArray::operator= (StringArray&& other) noexcept } #endif +#if JUCE_COMPILER_SUPPORTS_INITIALIZER_LISTS +StringArray::StringArray (const std::initializer_list& stringList) +{ + strings.addArray (stringList); +} +#endif + StringArray::~StringArray() { } diff --git a/JuceLibraryCode/modules/juce_core/text/juce_StringArray.h b/JuceLibraryCode/modules/juce_core/text/juce_StringArray.h index 52335e1..4108c0d 100644 --- a/JuceLibraryCode/modules/juce_core/text/juce_StringArray.h +++ b/JuceLibraryCode/modules/juce_core/text/juce_StringArray.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -86,6 +86,10 @@ public: */ StringArray (const wchar_t* const* strings, int numberOfStrings); + #if JUCE_COMPILER_SUPPORTS_INITIALIZER_LISTS + StringArray (const std::initializer_list& strings); + #endif + /** Destructor. */ ~StringArray(); diff --git a/JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.cpp b/JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.cpp index 3275d2d..d6bf37f 100644 --- a/JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.cpp +++ b/JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.h b/JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.h index e1c774d..81367fd 100644 --- a/JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.h +++ b/JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/text/juce_StringPool.cpp b/JuceLibraryCode/modules/juce_core/text/juce_StringPool.cpp index 039a30b..e9d295c 100644 --- a/JuceLibraryCode/modules/juce_core/text/juce_StringPool.cpp +++ b/JuceLibraryCode/modules/juce_core/text/juce_StringPool.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/text/juce_StringPool.h b/JuceLibraryCode/modules/juce_core/text/juce_StringPool.h index 4de2186..047af53 100644 --- a/JuceLibraryCode/modules/juce_core/text/juce_StringPool.h +++ b/JuceLibraryCode/modules/juce_core/text/juce_StringPool.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -88,6 +88,8 @@ private: uint32 lastGarbageCollectionTime; void garbageCollectIfNeeded(); + + JUCE_DECLARE_NON_COPYABLE (StringPool) }; diff --git a/JuceLibraryCode/modules/juce_core/text/juce_StringRef.h b/JuceLibraryCode/modules/juce_core/text/juce_StringRef.h index 434bf4a..3c17600 100644 --- a/JuceLibraryCode/modules/juce_core/text/juce_StringRef.h +++ b/JuceLibraryCode/modules/juce_core/text/juce_StringRef.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/text/juce_TextDiff.cpp b/JuceLibraryCode/modules/juce_core/text/juce_TextDiff.cpp index 6b4c807..be805d0 100644 --- a/JuceLibraryCode/modules/juce_core/text/juce_TextDiff.cpp +++ b/JuceLibraryCode/modules/juce_core/text/juce_TextDiff.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/text/juce_TextDiff.h b/JuceLibraryCode/modules/juce_core/text/juce_TextDiff.h index d420c3d..2d1c6cb 100644 --- a/JuceLibraryCode/modules/juce_core/text/juce_TextDiff.h +++ b/JuceLibraryCode/modules/juce_core/text/juce_TextDiff.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.cpp b/JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.cpp index 4566b13..916c03b 100644 --- a/JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.cpp +++ b/JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.h b/JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.h index 0adcb57..028d6fe 100644 --- a/JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.h +++ b/JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_CriticalSection.h b/JuceLibraryCode/modules/juce_core/threads/juce_CriticalSection.h index 60e61dd..d19e945 100644 --- a/JuceLibraryCode/modules/juce_core/threads/juce_CriticalSection.h +++ b/JuceLibraryCode/modules/juce_core/threads/juce_CriticalSection.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_DynamicLibrary.h b/JuceLibraryCode/modules/juce_core/threads/juce_DynamicLibrary.h index df6625b..ec2fcd1 100644 --- a/JuceLibraryCode/modules/juce_core/threads/juce_DynamicLibrary.h +++ b/JuceLibraryCode/modules/juce_core/threads/juce_DynamicLibrary.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.cpp b/JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.cpp index 3475b74..791255b 100644 --- a/JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.cpp +++ b/JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.h b/JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.h index 21022ad..7c840af 100644 --- a/JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.h +++ b/JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_InterProcessLock.h b/JuceLibraryCode/modules/juce_core/threads/juce_InterProcessLock.h index dc903b0..447dc88 100644 --- a/JuceLibraryCode/modules/juce_core/threads/juce_InterProcessLock.h +++ b/JuceLibraryCode/modules/juce_core/threads/juce_InterProcessLock.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_Process.h b/JuceLibraryCode/modules/juce_core/threads/juce_Process.h index f3efd66..eb5d59d 100644 --- a/JuceLibraryCode/modules/juce_core/threads/juce_Process.h +++ b/JuceLibraryCode/modules/juce_core/threads/juce_Process.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.cpp b/JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.cpp index a0821b4..e05c427 100644 --- a/JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.cpp +++ b/JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.h b/JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.h index c41d258..5193782 100644 --- a/JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.h +++ b/JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_ScopedLock.h b/JuceLibraryCode/modules/juce_core/threads/juce_ScopedLock.h index 442551a..f359d9d 100644 --- a/JuceLibraryCode/modules/juce_core/threads/juce_ScopedLock.h +++ b/JuceLibraryCode/modules/juce_core/threads/juce_ScopedLock.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_ScopedReadLock.h b/JuceLibraryCode/modules/juce_core/threads/juce_ScopedReadLock.h index 107e838..37cf14c 100644 --- a/JuceLibraryCode/modules/juce_core/threads/juce_ScopedReadLock.h +++ b/JuceLibraryCode/modules/juce_core/threads/juce_ScopedReadLock.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_ScopedWriteLock.h b/JuceLibraryCode/modules/juce_core/threads/juce_ScopedWriteLock.h index 44e3198..04072df 100644 --- a/JuceLibraryCode/modules/juce_core/threads/juce_ScopedWriteLock.h +++ b/JuceLibraryCode/modules/juce_core/threads/juce_ScopedWriteLock.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_SpinLock.h b/JuceLibraryCode/modules/juce_core/threads/juce_SpinLock.h index 664cc3c..0d42a26 100644 --- a/JuceLibraryCode/modules/juce_core/threads/juce_SpinLock.h +++ b/JuceLibraryCode/modules/juce_core/threads/juce_SpinLock.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_Thread.cpp b/JuceLibraryCode/modules/juce_core/threads/juce_Thread.cpp index 3d1ff0a..6189ca5 100644 --- a/JuceLibraryCode/modules/juce_core/threads/juce_Thread.cpp +++ b/JuceLibraryCode/modules/juce_core/threads/juce_Thread.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_Thread.h b/JuceLibraryCode/modules/juce_core/threads/juce_Thread.h index aef96b7..89a0c50 100644 --- a/JuceLibraryCode/modules/juce_core/threads/juce_Thread.h +++ b/JuceLibraryCode/modules/juce_core/threads/juce_Thread.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -235,7 +235,7 @@ public: /** Finds the thread object that is currently running. Note that the main UI thread (or other non-Juce threads) don't have a Thread - object associated with them, so this will return 0. + object associated with them, so this will return nullptr. */ static Thread* JUCE_CALLTYPE getCurrentThread(); diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_ThreadLocalValue.h b/JuceLibraryCode/modules/juce_core/threads/juce_ThreadLocalValue.h index bd5c808..19107fd 100644 --- a/JuceLibraryCode/modules/juce_core/threads/juce_ThreadLocalValue.h +++ b/JuceLibraryCode/modules/juce_core/threads/juce_ThreadLocalValue.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.cpp b/JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.cpp index e6b0b9f..4051610 100644 --- a/JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.cpp +++ b/JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.h b/JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.h index 3d5f762..3934215 100644 --- a/JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.h +++ b/JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.cpp b/JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.cpp index f055a15..63d537c 100644 --- a/JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.cpp +++ b/JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.h b/JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.h index 8c30567..5db4b41 100644 --- a/JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.h +++ b/JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_WaitableEvent.h b/JuceLibraryCode/modules/juce_core/threads/juce_WaitableEvent.h index 83f6f06..ce10b46 100644 --- a/JuceLibraryCode/modules/juce_core/threads/juce_WaitableEvent.h +++ b/JuceLibraryCode/modules/juce_core/threads/juce_WaitableEvent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.cpp b/JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.cpp index b22d5e4..12fac64 100644 --- a/JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.cpp +++ b/JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.h b/JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.h index aac50d2..5426636 100644 --- a/JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.h +++ b/JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.cpp b/JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.cpp index 6fca4fe..913cc6e 100644 --- a/JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.cpp +++ b/JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.h b/JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.h index 7e39d21..76d8df5 100644 --- a/JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.h +++ b/JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/time/juce_Time.cpp b/JuceLibraryCode/modules/juce_core/time/juce_Time.cpp index fabcfde..4952139 100644 --- a/JuceLibraryCode/modules/juce_core/time/juce_Time.cpp +++ b/JuceLibraryCode/modules/juce_core/time/juce_Time.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -64,19 +64,14 @@ namespace TimeHelpers { time_t now = static_cast (seconds); - #if JUCE_WINDOWS - #ifdef _INC_TIME_INL + #if JUCE_WINDOWS if (now >= 0 && now <= 0x793406fff) localtime_s (&result, &now); else zerostruct (result); #else - result = *localtime (&now); - #endif - #else - localtime_r (&now, &result); // more thread-safe - #endif + #endif } return result; @@ -195,19 +190,15 @@ Time& Time::operator= (const Time& other) noexcept //============================================================================== int64 Time::currentTimeMillis() noexcept { - #if JUCE_WINDOWS + #if JUCE_WINDOWS struct _timeb t; - #ifdef _INC_TIME_INL _ftime_s (&t); - #else - _ftime (&t); - #endif return ((int64) t.time) * 1000 + t.millitm; - #else + #else struct timeval tv; gettimeofday (&tv, nullptr); return ((int64) tv.tv_sec) * 1000 + tv.tv_usec / 1000; - #endif + #endif } Time JUCE_CALLTYPE Time::getCurrentTime() noexcept @@ -361,10 +352,9 @@ String Time::getTimeZone() const noexcept { String zone[2]; - #if JUCE_WINDOWS + #if JUCE_MSVC _tzset(); - #ifdef _INC_TIME_INL for (int i = 0; i < 2; ++i) { char name[128] = { 0 }; @@ -372,13 +362,12 @@ String Time::getTimeZone() const noexcept _get_tzname (&length, name, 127, i); zone[i] = name; } - #else - const char** const zonePtr = (const char**) _tzname; - zone[0] = zonePtr[0]; - zone[1] = zonePtr[1]; - #endif #else + #if JUCE_MINGW + #warning "Can't find a replacement for tzset on mingw - ideas welcome!" + #else tzset(); + #endif const char** const zonePtr = (const char**) tzname; zone[0] = zonePtr[0]; zone[1] = zonePtr[1]; diff --git a/JuceLibraryCode/modules/juce_core/time/juce_Time.h b/JuceLibraryCode/modules/juce_core/time/juce_Time.h index 4a35e08..b51ed07 100644 --- a/JuceLibraryCode/modules/juce_core/time/juce_Time.h +++ b/JuceLibraryCode/modules/juce_core/time/juce_Time.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.cpp b/JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.cpp index f5a60c1..249374b 100644 --- a/JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.cpp +++ b/JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.h b/JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.h index f5908c1..02ad9f9 100644 --- a/JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.h +++ b/JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.cpp b/JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.cpp index 2eab527..de77013 100644 --- a/JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.cpp +++ b/JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -555,7 +555,8 @@ void XmlDocument::readChildElements (XmlElement& parent) else // must be a character block { input = preWhitespaceInput; // roll back to include the leading whitespace - String textElementContent; + MemoryOutputStream textElementContent; + bool contentShouldBeUsed = ! ignoreEmptyTextElements; for (;;) { @@ -602,28 +603,20 @@ void XmlDocument::readChildElements (XmlElement& parent) input = entity.getCharPointer(); outOfData = false; - for (;;) - { - XmlElement* const n = readNextElement (true); - - if (n == nullptr) - break; - + while (XmlElement* n = readNextElement (true)) childAppender.append (n); - } input = oldInput; outOfData = oldOutOfData; } else { - textElementContent += entity; + textElementContent << entity; + contentShouldBeUsed = contentShouldBeUsed || entity.containsNonWhitespaceChars(); } } else { - const String::CharPointerType start (input); - for (;;) { const juce_wchar nextChar = *input; @@ -638,15 +631,15 @@ void XmlDocument::readChildElements (XmlElement& parent) return; } + textElementContent.appendUTF8Char (nextChar); + contentShouldBeUsed = contentShouldBeUsed || ! CharacterFunctions::isWhitespace (nextChar); ++input; } - - textElementContent.appendCharPointer (start, input); } } - if ((! ignoreEmptyTextElements) || textElementContent.containsNonWhitespaceChars()) - childAppender.append (XmlElement::createTextElement (textElementContent)); + if (contentShouldBeUsed) + childAppender.append (XmlElement::createTextElement (textElementContent.toUTF8())); } } } diff --git a/JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.h b/JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.h index d2a5b49..84d0871 100644 --- a/JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.h +++ b/JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -41,7 +41,7 @@ @code XmlDocument myDocument (File ("myfile.xml")); - XmlElement* mainElement = myDocument.getDocumentElement(); + ScopedPointer mainElement (myDocument.getDocumentElement()); if (mainElement == nullptr) { @@ -57,7 +57,7 @@ Or you can use the static helper methods for quick parsing.. @code - XmlElement* xml = XmlDocument::parse (myXmlFile); + ScopedPointer xml (XmlDocument::parse (myXmlFile)); if (xml != nullptr && xml->hasTagName ("foobar")) { diff --git a/JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.cpp b/JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.cpp index 866d10a..d0fd99d 100644 --- a/JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.cpp +++ b/JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.h b/JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.h index 2f03e93..b410165 100644 --- a/JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.h +++ b/JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -352,7 +352,7 @@ public: /** Returns the value of a named attribute as floating-point. - This will try to find the attribute and convert it to an integer (using + This will try to find the attribute and convert it to a double (using the String::getDoubleValue() method). @param attributeName the name of the attribute to look up diff --git a/JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp b/JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp index cb9a577..f1db2b4 100644 --- a/JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp +++ b/JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this diff --git a/JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h b/JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h index 3309486..5ce8c56 100644 --- a/JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h +++ b/JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -72,7 +72,7 @@ public: the stream is closed - this means that no more data can be written to it, and any subsequent attempts to call write() will cause an assertion. */ - void flush(); + void flush() override; int64 getPosition() override; bool setPosition (int64) override; diff --git a/JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp b/JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp index 71e0850..88d49a3 100644 --- a/JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp +++ b/JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -90,7 +90,7 @@ namespace zlibNamespace class GZIPDecompressorInputStream::GZIPDecompressHelper { public: - GZIPDecompressHelper (const bool dontWrap) + GZIPDecompressHelper (Format f) : finished (true), needsDictionary (false), error (true), @@ -100,7 +100,7 @@ public: { using namespace zlibNamespace; zerostruct (stream); - streamIsValid = (inflateInit2 (&stream, dontWrap ? -MAX_WBITS : MAX_WBITS) == Z_OK); + streamIsValid = (inflateInit2 (&stream, getBitsForFormat (f)) == Z_OK); finished = error = ! streamIsValid; } @@ -157,6 +157,19 @@ public: return 0; } + static int getBitsForFormat (Format f) noexcept + { + switch (f) + { + case zlibFormat: return MAX_WBITS; + case deflateFormat: return -MAX_WBITS; + case gzipFormat: return MAX_WBITS | 16; + default: jassertfalse; break; + } + + return MAX_WBITS; + } + bool finished, needsDictionary, error, streamIsValid; enum { gzipDecompBufferSize = 32768 }; @@ -170,32 +183,30 @@ private: }; //============================================================================== -GZIPDecompressorInputStream::GZIPDecompressorInputStream (InputStream* const source, - const bool deleteSourceWhenDestroyed, - const bool noWrap_, - const int64 uncompressedStreamLength_) +GZIPDecompressorInputStream::GZIPDecompressorInputStream (InputStream* source, bool deleteSourceWhenDestroyed, + Format f, int64 uncompressedLength) : sourceStream (source, deleteSourceWhenDestroyed), - uncompressedStreamLength (uncompressedStreamLength_), - noWrap (noWrap_), + uncompressedStreamLength (uncompressedLength), + format (f), isEof (false), activeBufferSize (0), originalSourcePos (source->getPosition()), currentPos (0), buffer ((size_t) GZIPDecompressHelper::gzipDecompBufferSize), - helper (new GZIPDecompressHelper (noWrap_)) + helper (new GZIPDecompressHelper (f)) { } GZIPDecompressorInputStream::GZIPDecompressorInputStream (InputStream& source) : sourceStream (&source, false), uncompressedStreamLength (-1), - noWrap (false), + format (zlibFormat), isEof (false), activeBufferSize (0), originalSourcePos (source.getPosition()), currentPos (0), buffer ((size_t) GZIPDecompressHelper::gzipDecompBufferSize), - helper (new GZIPDecompressHelper (false)) + helper (new GZIPDecompressHelper (zlibFormat)) { } @@ -278,7 +289,7 @@ bool GZIPDecompressorInputStream::setPosition (int64 newPos) isEof = false; activeBufferSize = 0; currentPos = 0; - helper = new GZIPDecompressHelper (noWrap); + helper = new GZIPDecompressHelper (format); sourceStream->setPosition (originalSourcePos); } diff --git a/JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h b/JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h index 78a0b77..cdd9fd2 100644 --- a/JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h +++ b/JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -43,21 +43,28 @@ class JUCE_API GZIPDecompressorInputStream : public InputStream { public: + enum Format + { + zlibFormat = 0, + deflateFormat, + gzipFormat + }; + //============================================================================== /** Creates a decompressor stream. @param sourceStream the stream to read from @param deleteSourceWhenDestroyed whether or not to delete the source stream when this object is destroyed - @param noWrap this is used internally by the ZipFile class - and should be ignored by user applications + @param sourceFormat can be used to select which of the supported + formats the data is expected to be in @param uncompressedStreamLength if the creator knows the length that the uncompressed stream will be, then it can supply this value, which will be returned by getTotalLength() */ GZIPDecompressorInputStream (InputStream* sourceStream, bool deleteSourceWhenDestroyed, - bool noWrap = false, + Format sourceFormat = zlibFormat, int64 uncompressedStreamLength = -1); /** Creates a decompressor stream. @@ -81,7 +88,7 @@ private: //============================================================================== OptionalScopedPointer sourceStream; const int64 uncompressedStreamLength; - const bool noWrap; + const Format format; bool isEof; int activeBufferSize; int64 originalSourcePos, currentPos; @@ -91,6 +98,11 @@ private: friend struct ContainerDeletePolicy; ScopedPointer helper; + #if JUCE_CATCH_DEPRECATED_CODE_MISUSE + // The arguments to this method have changed! Please pass a Format enum instead of the old dontWrap bool. + GZIPDecompressorInputStream (InputStream*, bool, bool, int64 x = -1); + #endif + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GZIPDecompressorInputStream) }; diff --git a/JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.cpp b/JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.cpp index a76d8b8..c7ae45d 100644 --- a/JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.cpp +++ b/JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -298,7 +298,9 @@ InputStream* ZipFile::createStreamForEntry (const int index) if (zei->compressed) { - stream = new GZIPDecompressorInputStream (stream, true, true, (int64) zei->entry.uncompressedSize); + stream = new GZIPDecompressorInputStream (stream, true, + GZIPDecompressorInputStream::deflateFormat, + (int64) zei->entry.uncompressedSize); // (much faster to unzip in big blocks using a buffer..) stream = new BufferedInputStream (stream, 32768, true); @@ -326,7 +328,7 @@ void ZipFile::sortEntriesByFilename() //============================================================================== void ZipFile::init() { - ScopedPointer toDelete; + ScopedPointer toDelete; InputStream* in = inputStream; if (inputSource != nullptr) @@ -356,7 +358,7 @@ void ZipFile::init() if (pos + 46 > size) break; - const char* const buffer = static_cast (headerData.getData()) + pos; + const char* const buffer = static_cast (headerData.getData()) + pos; const int fileNameLen = ByteOrder::littleEndianShort (buffer + 28); diff --git a/JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.h b/JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.h index ccf9064..43f3c10 100644 --- a/JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.h +++ b/JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this @@ -40,7 +40,7 @@ class JUCE_API ZipFile { public: - /** Creates a ZipFile based for a file. */ + /** Creates a ZipFile to read a specific file. */ explicit ZipFile (const File& file); //============================================================================== @@ -91,15 +91,12 @@ public: int getNumEntries() const noexcept; /** Returns a structure that describes one of the entries in the zip file. - This may return zero if the index is out of range. - @see ZipFile::ZipEntry */ const ZipEntry* getEntry (int index) const noexcept; /** Returns the index of the first entry with a given filename. - This uses a case-sensitive comparison to look for a filename in the list of entries. It might return -1 if no match is found. @@ -116,8 +113,7 @@ public: */ const ZipEntry* getEntry (const String& fileName) const noexcept; - /** Sorts the list of entries, based on the filename. - */ + /** Sorts the list of entries, based on the filename. */ void sortEntriesByFilename(); //============================================================================== @@ -128,6 +124,11 @@ public: The stream must not be used after the ZipFile object that created has been deleted. + + Note that if the ZipFile was created with a user-supplied InputStream object, + then all the streams which are created by this method will by trying to share + the same source stream, so cannot be safely used on multiple threads! (But if + you create the ZipFile from a File or InputSource, then it is safe to do this). */ InputStream* createStreamForEntry (int index); @@ -138,6 +139,11 @@ public: The stream must not be used after the ZipFile object that created has been deleted. + + Note that if the ZipFile was created with a user-supplied InputStream object, + then all the streams which are created by this method will by trying to share + the same source stream, so cannot be safely used on multiple threads! (But if + you create the ZipFile from a File or InputSource, then it is safe to do this). */ InputStream* createStreamForEntry (const ZipEntry& entry); @@ -194,7 +200,7 @@ public: will be stored for this file. */ void addFile (const File& fileToAdd, int compressionLevel, - const String& storedPathName = String::empty); + const String& storedPathName = String()); /** Adds a file while should be added to the archive. @@ -233,11 +239,11 @@ private: friend class ZipInputStream; friend class ZipEntryHolder; - OwnedArray entries; + OwnedArray entries; CriticalSection lock; InputStream* inputStream; - ScopedPointer streamToDelete; - ScopedPointer inputSource; + ScopedPointer streamToDelete; + ScopedPointer inputSource; #if JUCE_DEBUG struct OpenStreamCounter diff --git a/JuceLibraryCode/modules/juce_core/zip/zlib/trees.c b/JuceLibraryCode/modules/juce_core/zip/zlib/trees.c index 36a124d..463bfc2 100644 --- a/JuceLibraryCode/modules/juce_core/zip/zlib/trees.c +++ b/JuceLibraryCode/modules/juce_core/zip/zlib/trees.c @@ -571,7 +571,7 @@ local void gen_codes (ct_data *tree, /* the tree to decorate */ ushf *bl_count) /* number of codes at each bit length */ { ush next_code[MAX_BITS+1]; /* next code value for each bit length */ - ush code = 0; /* running code value */ + ush code_ = 0; /* running code value */ int bits; /* bit index */ int n; /* code index */ @@ -579,12 +579,12 @@ local void gen_codes (ct_data *tree, /* the tree to decorate */ * without bit reversal. */ for (bits = 1; bits <= MAX_BITS; bits++) { - next_code[bits] = code = (code + bl_count[bits-1]) << 1; + next_code[bits] = code_ = (code_ + bl_count[bits-1]) << 1; } /* Check that the bit counts in bl_count are consistent. The last code * must be all ones. */ - Assert (code + bl_count[MAX_BITS]-1 == (1<last_lit != 0) do { @@ -1066,21 +1066,21 @@ local void compress_block (deflate_state *s, Tracecv(isgraph(lc), (stderr," '%c' ", lc)); } else { /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code+LITERALS+1, ltree); /* send the length code */ - extra = extra_lbits[code]; + code_ = _length_code[lc]; + send_code(s, code_+LITERALS+1, ltree); /* send the length code */ + extra = extra_lbits[code_]; if (extra != 0) { - lc -= base_length[code]; + lc -= base_length[code_]; send_bits(s, lc, extra); /* send the extra length bits */ } dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - Assert (code < D_CODES, "bad d_code"); + code_ = d_code(dist); + Assert (code_ < D_CODES, "bad d_code"); - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; + send_code(s, code_, dtree); /* send the distance code */ + extra = extra_dbits[code_]; if (extra != 0) { - dist -= base_dist[code]; + dist -= base_dist[code_]; send_bits(s, dist, extra); /* send the extra distance bits */ } } /* literal or match pair ? */ @@ -1120,12 +1120,12 @@ local void set_data_type (deflate_state *s) * method would use a table) * IN assertion: 1 <= len <= 15 */ -local unsigned bi_reverse (unsigned code, int len) +local unsigned bi_reverse (unsigned code_, int len) { register unsigned res = 0; do { - res |= code & 1; - code >>= 1, res <<= 1; + res |= code_ & 1; + code_ >>= 1, res <<= 1; } while (--len > 0); return res >> 1; } diff --git a/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp b/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp index 6db825e..53ff453 100644 --- a/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp +++ b/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h b/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h index 21edbc2..a047de8 100644 --- a/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h +++ b/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp b/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp index ece2121..bd14b66 100644 --- a/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp +++ b/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.h b/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.h index f3d9551..c91d61c 100644 --- a/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.h +++ b/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -223,7 +223,7 @@ public: protected: /** @internal */ - virtual void propertyChanged(); + void propertyChanged() override; private: //============================================================================== diff --git a/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.cpp b/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.cpp index fd1d12a..0d2b875 100644 --- a/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.cpp +++ b/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -42,6 +42,7 @@ namespace juce #include "values/juce_Value.cpp" #include "values/juce_ValueTree.cpp" +#include "values/juce_ValueTreeSynchroniser.cpp" #include "undomanager/juce_UndoManager.cpp" #include "app_properties/juce_ApplicationProperties.cpp" #include "app_properties/juce_PropertiesFile.cpp" diff --git a/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.h b/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.h index 629b88d..c130d57 100644 --- a/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.h +++ b/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -35,6 +35,7 @@ namespace juce #include "undomanager/juce_UndoManager.h" #include "values/juce_Value.h" #include "values/juce_ValueTree.h" +#include "values/juce_ValueTreeSynchroniser.h" #include "app_properties/juce_PropertiesFile.h" #include "app_properties/juce_ApplicationProperties.h" diff --git a/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.mm b/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.mm index 2eb4fb4..003a585 100644 --- a/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.mm +++ b/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_data_structures/juce_module_info b/JuceLibraryCode/modules/juce_data_structures/juce_module_info index 09b96f8..b66b876 100644 --- a/JuceLibraryCode/modules/juce_data_structures/juce_module_info +++ b/JuceLibraryCode/modules/juce_data_structures/juce_module_info @@ -1,7 +1,7 @@ { "id": "juce_data_structures", "name": "JUCE data model helper classes", - "version": "3.0.8", + "version": "3.2.0", "description": "Classes for undo/redo management, and smart data structures.", "website": "http://www.juce.com/juce", "license": "GPL/Commercial", diff --git a/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.cpp b/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.cpp index 07948c6..4dc27b8 100644 --- a/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.cpp +++ b/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -203,6 +203,14 @@ void UndoManager::setCurrentTransactionName (const String& newName) noexcept action->name = newName; } +String UndoManager::getCurrentTransactionName() const noexcept +{ + if (ActionSet* action = getCurrentSet()) + return action->name; + + return newTransactionName; +} + //============================================================================== UndoManager::ActionSet* UndoManager::getCurrentSet() const noexcept { return transactions [nextIndex - 1]; } UndoManager::ActionSet* UndoManager::getNextSet() const noexcept { return transactions [nextIndex]; } diff --git a/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.h b/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.h index a3b691b..1e740ee 100644 --- a/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.h +++ b/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -144,6 +144,11 @@ public: */ void setCurrentTransactionName (const String& newName) noexcept; + /** Returns the name of the current transaction. + @see setCurrentTransactionName + */ + String getCurrentTransactionName() const noexcept; + //============================================================================== /** Returns true if there's at least one action in the list to undo. @see getUndoDescription, undo, canRedo diff --git a/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoableAction.h b/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoableAction.h index 866d488..ff22895 100644 --- a/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoableAction.h +++ b/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoableAction.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_data_structures/values/juce_Value.cpp b/JuceLibraryCode/modules/juce_data_structures/values/juce_Value.cpp index 55b37fe..1034381 100644 --- a/JuceLibraryCode/modules/juce_data_structures/values/juce_Value.cpp +++ b/JuceLibraryCode/modules/juce_data_structures/values/juce_Value.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -72,12 +72,12 @@ public: { } - var getValue() const + var getValue() const override { return value; } - void setValue (const var& newValue) + void setValue (const var& newValue) override { if (! newValue.equalsWithSameType (value)) { @@ -111,12 +111,6 @@ Value::Value (const Value& other) : value (other.value) { } -Value& Value::operator= (const Value& other) -{ - value = other.value; - return *this; -} - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS Value::Value (Value&& other) noexcept { diff --git a/JuceLibraryCode/modules/juce_data_structures/values/juce_Value.h b/JuceLibraryCode/modules/juce_data_structures/values/juce_Value.h index f8fc631..632a383 100644 --- a/JuceLibraryCode/modules/juce_data_structures/values/juce_Value.h +++ b/JuceLibraryCode/modules/juce_data_structures/values/juce_Value.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -221,7 +221,11 @@ private: // This is disallowed to avoid confusion about whether it should // do a by-value or by-reference copy. - Value& operator= (const Value&); + Value& operator= (const Value&) JUCE_DELETED_FUNCTION; + + // This declaration prevents accidental construction from an integer of 0, + // which is possible in some compilers via an implicit cast to a pointer. + explicit Value (void*) JUCE_DELETED_FUNCTION; }; /** Writes a Value to an OutputStream as a UTF8 string. */ diff --git a/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.cpp b/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.cpp index ee13400..1d63817 100644 --- a/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.cpp +++ b/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -27,7 +27,7 @@ class ValueTree::SharedObject : public ReferenceCountedObject public: typedef ReferenceCountedObjectPtr Ptr; - explicit SharedObject (Identifier t) noexcept + explicit SharedObject (const Identifier& t) noexcept : type (t), parent (nullptr) { } @@ -62,23 +62,20 @@ public: { const int numListeners = valueTreesWithListeners.size(); - if (numListeners > 0) + if (numListeners == 1) { - if (numListeners == 1) - { - valueTreesWithListeners.getUnchecked(0)->listeners.call (method, tree); - } - else - { - const SortedSet listenersCopy (valueTreesWithListeners); + valueTreesWithListeners.getUnchecked(0)->listeners.call (method, tree); + } + else if (numListeners > 0) + { + const SortedSet listenersCopy (valueTreesWithListeners); - for (int i = 0; i < numListeners; ++i) - { - ValueTree* const v = listenersCopy.getUnchecked(i); + for (int i = 0; i < numListeners; ++i) + { + ValueTree* const v = listenersCopy.getUnchecked(i); - if (i == 0 || valueTreesWithListeners.contains (v)) - v->listeners.call (method, tree); - } + if (i == 0 || valueTreesWithListeners.contains (v)) + v->listeners.call (method, tree); } } } @@ -88,28 +85,48 @@ public: { const int numListeners = valueTreesWithListeners.size(); - if (numListeners > 0) + if (numListeners == 1) + { + valueTreesWithListeners.getUnchecked(0)->listeners.call (method, tree, param2); + } + else if (numListeners > 0) { - if (numListeners == 1) + const SortedSet listenersCopy (valueTreesWithListeners); + + for (int i = 0; i < numListeners; ++i) { - valueTreesWithListeners.getUnchecked(0)->listeners.call (method, tree, param2); + ValueTree* const v = listenersCopy.getUnchecked(i); + + if (i == 0 || valueTreesWithListeners.contains (v)) + v->listeners.call (method, tree, param2); } - else - { - const SortedSet listenersCopy (valueTreesWithListeners); + } + } - for (int i = 0; i < numListeners; ++i) - { - ValueTree* const v = listenersCopy.getUnchecked(i); + template + void callListeners (Method method, ValueTree& tree, ParamType1& param2, ParamType2& param3) const + { + const int numListeners = valueTreesWithListeners.size(); - if (i == 0 || valueTreesWithListeners.contains (v)) - v->listeners.call (method, tree, param2); - } + if (numListeners == 1) + { + valueTreesWithListeners.getUnchecked(0)->listeners.call (method, tree, param2, param3); + } + else if (numListeners > 0) + { + const SortedSet listenersCopy (valueTreesWithListeners); + + for (int i = 0; i < numListeners; ++i) + { + ValueTree* const v = listenersCopy.getUnchecked(i); + + if (i == 0 || valueTreesWithListeners.contains (v)) + v->listeners.call (method, tree, param2, param3); } } } - void sendPropertyChangeMessage (const Identifier property) + void sendPropertyChangeMessage (const Identifier& property) { ValueTree tree (this); @@ -125,20 +142,20 @@ public: t->callListeners (&ValueTree::Listener::valueTreeChildAdded, tree, child); } - void sendChildRemovedMessage (ValueTree child) + void sendChildRemovedMessage (ValueTree child, int index) { ValueTree tree (this); for (ValueTree::SharedObject* t = this; t != nullptr; t = t->parent) - t->callListeners (&ValueTree::Listener::valueTreeChildRemoved, tree, child); + t->callListeners (&ValueTree::Listener::valueTreeChildRemoved, tree, child, index); } - void sendChildOrderChangedMessage() + void sendChildOrderChangedMessage (int oldIndex, int newIndex) { ValueTree tree (this); for (ValueTree::SharedObject* t = this; t != nullptr; t = t->parent) - t->callListeners (&ValueTree::Listener::valueTreeChildOrderChanged, tree); + t->callListeners (&ValueTree::Listener::valueTreeChildOrderChanged, tree, oldIndex, newIndex); } void sendParentChangeMessage() @@ -152,7 +169,7 @@ public: callListeners (&ValueTree::Listener::valueTreeParentChanged, tree); } - void setProperty (const Identifier name, const var& newValue, UndoManager* const undoManager) + void setProperty (const Identifier& name, const var& newValue, UndoManager* const undoManager) { if (undoManager == nullptr) { @@ -173,12 +190,12 @@ public: } } - bool hasProperty (const Identifier name) const noexcept + bool hasProperty (const Identifier& name) const noexcept { return properties.contains (name); } - void removeProperty (const Identifier name, UndoManager* const undoManager) + void removeProperty (const Identifier& name, UndoManager* const undoManager) { if (undoManager == nullptr) { @@ -221,7 +238,7 @@ public: setProperty (source.properties.getName(i), source.properties.getValueAt(i), undoManager); } - ValueTree getChildWithName (const Identifier typeToMatch) const + ValueTree getChildWithName (const Identifier& typeToMatch) const { for (int i = 0; i < children.size(); ++i) { @@ -233,7 +250,7 @@ public: return ValueTree(); } - ValueTree getOrCreateChildWithName (const Identifier typeToMatch, UndoManager* undoManager) + ValueTree getOrCreateChildWithName (const Identifier& typeToMatch, UndoManager* undoManager) { for (int i = 0; i < children.size(); ++i) { @@ -248,7 +265,7 @@ public: } - ValueTree getChildWithProperty (const Identifier propertyName, const var& propertyValue) const + ValueTree getChildWithProperty (const Identifier& propertyName, const var& propertyValue) const { for (int i = 0; i < children.size(); ++i) { @@ -323,7 +340,7 @@ public: { children.remove (childIndex); child->parent = nullptr; - sendChildRemovedMessage (ValueTree (child)); + sendChildRemovedMessage (ValueTree (child), childIndex); child->sendParentChangeMessage(); } else @@ -350,7 +367,7 @@ public: if (undoManager == nullptr) { children.move (currentIndex, newIndex); - sendChildOrderChangedMessage(); + sendChildOrderChangedMessage (currentIndex, newIndex); } else { @@ -366,28 +383,15 @@ public: { jassert (newOrder.size() == children.size()); - if (undoManager == nullptr) + for (int i = 0; i < children.size(); ++i) { - children.clear(); - children.ensureStorageAllocated (newOrder.size()); - - for (int i = 0; i < newOrder.size(); ++i) - children.add (newOrder.getUnchecked(i)->object); + SharedObject* const child = newOrder.getUnchecked(i)->object; - sendChildOrderChangedMessage(); - } - else - { - for (int i = 0; i < children.size(); ++i) + if (children.getObjectPointerUnchecked (i) != child) { - SharedObject* const child = newOrder.getUnchecked(i)->object; - - if (children.getObjectPointerUnchecked (i) != child) - { - const int oldIndex = children.indexOf (child); - jassert (oldIndex >= 0); - moveChild (oldIndex, i, undoManager); - } + const int oldIndex = children.indexOf (child); + jassert (oldIndex >= 0); + moveChild (oldIndex, i, undoManager); } } } @@ -454,7 +458,7 @@ public: class SetPropertyAction : public UndoableAction { public: - SetPropertyAction (SharedObject* const so, const Identifier propertyName, + SetPropertyAction (SharedObject* const so, const Identifier& propertyName, const var& newVal, const var& oldVal, bool isAdding, bool isDeleting) : target (so), name (propertyName), newValue (newVal), oldValue (oldVal), isAddingNewProperty (isAdding), isDeletingProperty (isDeleting) @@ -492,7 +496,7 @@ public: { if (! (isAddingNewProperty || isDeletingProperty)) { - if (SetPropertyAction* const next = dynamic_cast (nextAction)) + if (SetPropertyAction* const next = dynamic_cast (nextAction)) if (next->target == target && next->name == name && ! (next->isAddingNewProperty || next->isDeletingProperty)) return new SetPropertyAction (target, name, next->newValue, oldValue, false, false); @@ -592,7 +596,7 @@ public: UndoableAction* createCoalescedAction (UndoableAction* nextAction) { - if (MoveChildAction* next = dynamic_cast (nextAction)) + if (MoveChildAction* next = dynamic_cast (nextAction)) if (next->parent == parent && next->startIndex == endIndex) return new MoveChildAction (parent, startIndex, next->endIndex); @@ -625,7 +629,7 @@ ValueTree::ValueTree() noexcept const ValueTree ValueTree::invalid; -ValueTree::ValueTree (Identifier type) : object (new ValueTree::SharedObject (type)) +ValueTree::ValueTree (const Identifier& type) : object (new ValueTree::SharedObject (type)) { jassert (type.toString().isNotEmpty()); // All objects must be given a sensible type name! } @@ -698,7 +702,7 @@ ValueTree ValueTree::createCopy() const return ValueTree (createCopyIfNotNull (object.get())); } -bool ValueTree::hasType (const Identifier typeName) const +bool ValueTree::hasType (const Identifier& typeName) const { return object != nullptr && object->type == typeName; } @@ -711,7 +715,7 @@ Identifier ValueTree::getType() const ValueTree ValueTree::getParent() const { return ValueTree (object != nullptr ? object->parent - : static_cast (nullptr)); + : static_cast (nullptr)); } ValueTree ValueTree::getSibling (const int delta) const @@ -723,24 +727,23 @@ ValueTree ValueTree::getSibling (const int delta) const return ValueTree (object->parent->children.getObjectPointer (index)); } -const var& ValueTree::operator[] (const Identifier name) const +const var& ValueTree::operator[] (const Identifier& name) const { return object == nullptr ? var::null : object->properties[name]; } -const var& ValueTree::getProperty (const Identifier name) const +const var& ValueTree::getProperty (const Identifier& name) const { return object == nullptr ? var::null : object->properties[name]; } -var ValueTree::getProperty (const Identifier name, const var& defaultReturnValue) const +var ValueTree::getProperty (const Identifier& name, const var& defaultReturnValue) const { return object == nullptr ? defaultReturnValue : object->properties.getWithDefault (name, defaultReturnValue); } -ValueTree& ValueTree::setProperty (const Identifier name, const var& newValue, - UndoManager* const undoManager) +ValueTree& ValueTree::setProperty (const Identifier& name, const var& newValue, UndoManager* undoManager) { jassert (name.toString().isNotEmpty()); // Must have a valid property name! jassert (object != nullptr); // Trying to add a property to a null ValueTree will fail! @@ -751,12 +754,12 @@ ValueTree& ValueTree::setProperty (const Identifier name, const var& newValue, return *this; } -bool ValueTree::hasProperty (const Identifier name) const +bool ValueTree::hasProperty (const Identifier& name) const { return object != nullptr && object->hasProperty (name); } -void ValueTree::removeProperty (const Identifier name, UndoManager* const undoManager) +void ValueTree::removeProperty (const Identifier& name, UndoManager* const undoManager) { if (object != nullptr) object->removeProperty (name, undoManager); @@ -799,7 +802,7 @@ class ValueTreePropertyValueSource : public Value::ValueSource, private ValueTree::Listener { public: - ValueTreePropertyValueSource (const ValueTree& vt, const Identifier prop, UndoManager* um) + ValueTreePropertyValueSource (const ValueTree& vt, const Identifier& prop, UndoManager* um) : tree (vt), property (prop), undoManager (um) { tree.addListener (this); @@ -810,8 +813,8 @@ public: tree.removeListener (this); } - var getValue() const { return tree [property]; } - void setValue (const var& newValue) { tree.setProperty (property, newValue, undoManager); } + var getValue() const override { return tree [property]; } + void setValue (const var& newValue) override { tree.setProperty (property, newValue, undoManager); } private: ValueTree tree; @@ -825,14 +828,14 @@ private: } void valueTreeChildAdded (ValueTree&, ValueTree&) override {} - void valueTreeChildRemoved (ValueTree&, ValueTree&) override {} - void valueTreeChildOrderChanged (ValueTree&) override {} + void valueTreeChildRemoved (ValueTree&, ValueTree&, int) override {} + void valueTreeChildOrderChanged (ValueTree&, int, int) override {} void valueTreeParentChanged (ValueTree&) override {} JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ValueTreePropertyValueSource) }; -Value ValueTree::getPropertyAsValue (const Identifier name, UndoManager* const undoManager) +Value ValueTree::getPropertyAsValue (const Identifier& name, UndoManager* const undoManager) { return Value (new ValueTreePropertyValueSource (*this, name, undoManager)); } @@ -846,20 +849,20 @@ int ValueTree::getNumChildren() const ValueTree ValueTree::getChild (int index) const { return ValueTree (object != nullptr ? object->children.getObjectPointer (index) - : static_cast (nullptr)); + : static_cast (nullptr)); } -ValueTree ValueTree::getChildWithName (const Identifier type) const +ValueTree ValueTree::getChildWithName (const Identifier& type) const { return object != nullptr ? object->getChildWithName (type) : ValueTree(); } -ValueTree ValueTree::getOrCreateChildWithName (const Identifier type, UndoManager* undoManager) +ValueTree ValueTree::getOrCreateChildWithName (const Identifier& type, UndoManager* undoManager) { return object != nullptr ? object->getOrCreateChildWithName (type, undoManager) : ValueTree(); } -ValueTree ValueTree::getChildWithProperty (const Identifier propertyName, const var& propertyValue) const +ValueTree ValueTree::getChildWithProperty (const Identifier& propertyName, const var& propertyValue) const { return object != nullptr ? object->getChildWithProperty (propertyName, propertyValue) : ValueTree(); } @@ -941,7 +944,7 @@ void ValueTree::removeListener (Listener* listener) object->valueTreesWithListeners.removeValue (this); } -void ValueTree::sendPropertyChangeMessage (const Identifier property) +void ValueTree::sendPropertyChangeMessage (const Identifier& property) { if (object != nullptr) object->sendPropertyChangeMessage (property); @@ -999,9 +1002,16 @@ ValueTree ValueTree::readFromStream (InputStream& input) for (int i = 0; i < numProps; ++i) { const String name (input.readString()); - jassert (name.isNotEmpty()); - const var value (var::readFromStream (input)); - v.object->properties.set (name, value); + + if (name.isNotEmpty()) + { + const var value (var::readFromStream (input)); + v.object->properties.set (name, value); + } + else + { + jassertfalse; // trying to read corrupted data! + } } const int numChildren = input.readCompressedInt(); @@ -1011,6 +1021,9 @@ ValueTree ValueTree::readFromStream (InputStream& input) { ValueTree child (readFromStream (input)); + if (! child.isValid()) + return v; + v.object->children.add (child.object); child.object->parent = v.object; } @@ -1108,8 +1121,8 @@ public: ValueTree v2 = ValueTree::readFromStream (mi); expect (v1.isEquivalentTo (v2)); - ScopedPointer xml1 (v1.createXml()); - ScopedPointer xml2 (v2.createCopy().createXml()); + ScopedPointer xml1 (v1.createXml()); + ScopedPointer xml2 (v2.createCopy().createXml()); expect (xml1->isEquivalentTo (xml2, false)); ValueTree v4 = v2.createCopy(); diff --git a/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.h b/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.h index 42dd778..892f302 100644 --- a/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.h +++ b/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -79,7 +79,7 @@ public: Like an XmlElement, each ValueTree node has a type, which you can access with getType() and hasType(). */ - explicit ValueTree (Identifier type); + explicit ValueTree (const Identifier& type); /** Creates a reference to another ValueTree. */ ValueTree (const ValueTree&); @@ -134,7 +134,7 @@ public: /** Returns true if the node has this type. The comparison is case-sensitive. */ - bool hasType (const Identifier typeName) const; + bool hasType (const Identifier& typeName) const; //============================================================================== /** Returns the value of a named property. @@ -142,21 +142,21 @@ public: You can also use operator[] to get a property. @see var, setProperty, hasProperty */ - const var& getProperty (const Identifier name) const; + const var& getProperty (const Identifier& name) const; /** Returns the value of a named property, or a user-specified default if the property doesn't exist. If no such property has been set, this will return the value of defaultReturnValue. You can also use operator[] and getProperty to get a property. @see var, getProperty, setProperty, hasProperty */ - var getProperty (const Identifier name, const var& defaultReturnValue) const; + var getProperty (const Identifier& name, const var& defaultReturnValue) const; /** Returns the value of a named property. If no such property has been set, this will return a void variant. This is the same as calling getProperty(). @see getProperty */ - const var& operator[] (const Identifier name) const; + const var& operator[] (const Identifier& name) const; /** Changes a named property of the node. The name identifier must not be an empty string. @@ -165,16 +165,16 @@ public: @see var, getProperty, removeProperty @returns a reference to the value tree, so that you can daisy-chain calls to this method. */ - ValueTree& setProperty (const Identifier name, const var& newValue, UndoManager* undoManager); + ValueTree& setProperty (const Identifier& name, const var& newValue, UndoManager* undoManager); /** Returns true if the node contains a named property. */ - bool hasProperty (const Identifier name) const; + bool hasProperty (const Identifier& name) const; /** Removes a property from the node. If the undoManager parameter is non-null, its UndoManager::perform() method will be used, so that this change can be undone. */ - void removeProperty (const Identifier name, UndoManager* undoManager); + void removeProperty (const Identifier& name, UndoManager* undoManager); /** Removes all properties from the node. If the undoManager parameter is non-null, its UndoManager::perform() method will be used, @@ -198,7 +198,7 @@ public: it needs to change the value. Attaching a Value::Listener to the value object will provide callbacks whenever the property changes. */ - Value getPropertyAsValue (const Identifier name, UndoManager* undoManager); + Value getPropertyAsValue (const Identifier& name, UndoManager* undoManager); /** Overwrites all the properties in this tree with the properties of the source tree. Any properties that already exist will be updated; and new ones will be added, and @@ -223,7 +223,7 @@ public: whether a node is valid). @see getOrCreateChildWithName */ - ValueTree getChildWithName (const Identifier type) const; + ValueTree getChildWithName (const Identifier& type) const; /** Returns the first child node with the speficied type name, creating and adding a child with this name if there wasn't already one there. @@ -232,7 +232,7 @@ public: the method on is itself invalid. @see getChildWithName */ - ValueTree getOrCreateChildWithName (const Identifier type, UndoManager* undoManager); + ValueTree getOrCreateChildWithName (const Identifier& type, UndoManager* undoManager); /** Looks for the first child node that has the speficied property value. @@ -242,7 +242,7 @@ public: If no such node is found, it'll return an invalid node. (See isValid() to find out whether a node is valid). */ - ValueTree getChildWithProperty (const Identifier propertyName, const var& propertyValue) const; + ValueTree getChildWithProperty (const Identifier& propertyName, const var& propertyValue) const; /** Adds a child to this node. @@ -403,7 +403,8 @@ public: just check the parentTree parameter to make sure it's the one that you're interested in. */ virtual void valueTreeChildRemoved (ValueTree& parentTree, - ValueTree& childWhichHasBeenRemoved) = 0; + ValueTree& childWhichHasBeenRemoved, + int indexFromWhichChildWasRemoved) = 0; /** This method is called when a tree's children have been re-shuffled. @@ -412,7 +413,8 @@ public: If your tree has sub-trees but you only want to know about changes to the top level tree, just check the parameter to make sure it's the tree that you're interested in. */ - virtual void valueTreeChildOrderChanged (ValueTree& parentTreeWhoseChildrenHaveMoved) = 0; + virtual void valueTreeChildOrderChanged (ValueTree& parentTreeWhoseChildrenHaveMoved, + int oldIndex, int newIndex) = 0; /** This method is called when a tree has been added or removed from a parent node. @@ -451,7 +453,7 @@ public: /** Causes a property-change callback to be triggered for the specified property, calling any listeners that are registered. */ - void sendPropertyChangeMessage (const Identifier property); + void sendPropertyChangeMessage (const Identifier& property); //============================================================================== /** This method uses a comparator object to sort the tree's children into order. @@ -482,7 +484,7 @@ public: { OwnedArray sortedList; createListOfChildren (sortedList); - ComparatorAdapter adapter (comparator); + ComparatorAdapter adapter (comparator); sortedList.sort (adapter, retainOrderOfEquivalentItems); reorderChildren (sortedList, undoManager); } diff --git a/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp b/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp new file mode 100644 index 0000000..e0d2b21 --- /dev/null +++ b/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.cpp @@ -0,0 +1,217 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2015 - ROLI 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 ValueTreeSynchroniserHelpers +{ + enum ChangeType + { + propertyChanged = 1, + fullSync = 2, + childAdded = 3, + childRemoved = 4, + childMoved = 5 + }; + + static void getValueTreePath (ValueTree v, const ValueTree& topLevelTree, Array& path) + { + while (v != topLevelTree) + { + ValueTree parent (v.getParent()); + + if (! parent.isValid()) + break; + + path.add (parent.indexOf (v)); + v = parent; + } + } + + static void writeHeader (MemoryOutputStream& stream, ChangeType type) + { + stream.writeByte ((char) type); + } + + static void writeHeader (ValueTreeSynchroniser& target, MemoryOutputStream& stream, + ChangeType type, ValueTree v) + { + writeHeader (stream, type); + + Array path; + getValueTreePath (v, target.getRoot(), path); + + stream.writeCompressedInt (path.size()); + + for (int i = path.size(); --i >= 0;) + stream.writeCompressedInt (path.getUnchecked(i)); + } + + static ValueTree readSubTreeLocation (MemoryInputStream& input, ValueTree v) + { + const int numLevels = input.readCompressedInt(); + + if (! isPositiveAndBelow (numLevels, 65536)) // sanity-check + return ValueTree(); + + for (int i = numLevels; --i >= 0;) + { + const int index = input.readCompressedInt(); + + if (! isPositiveAndBelow (index, v.getNumChildren())) + return ValueTree(); + + v = v.getChild (index); + } + + return v; + } +} + +ValueTreeSynchroniser::ValueTreeSynchroniser (const ValueTree& tree) : valueTree (tree) +{ + valueTree.addListener (this); +} + +ValueTreeSynchroniser::~ValueTreeSynchroniser() +{ + valueTree.removeListener (this); +} + +void ValueTreeSynchroniser::sendFullSyncCallback() +{ + MemoryOutputStream m; + writeHeader (m, ValueTreeSynchroniserHelpers::fullSync); + valueTree.writeToStream (m); + stateChanged (m.getData(), m.getDataSize()); +} + +void ValueTreeSynchroniser::valueTreePropertyChanged (ValueTree& vt, const Identifier& property) +{ + MemoryOutputStream m; + ValueTreeSynchroniserHelpers::writeHeader (*this, m, ValueTreeSynchroniserHelpers::propertyChanged, vt); + m.writeString (property.toString()); + vt.getProperty (property).writeToStream (m); + stateChanged (m.getData(), m.getDataSize()); +} + +void ValueTreeSynchroniser::valueTreeChildAdded (ValueTree& parentTree, ValueTree& childTree) +{ + const int index = parentTree.indexOf (childTree); + jassert (index >= 0); + + MemoryOutputStream m; + ValueTreeSynchroniserHelpers::writeHeader (*this, m, ValueTreeSynchroniserHelpers::childAdded, parentTree); + m.writeCompressedInt (index); + childTree.writeToStream (m); + stateChanged (m.getData(), m.getDataSize()); +} + +void ValueTreeSynchroniser::valueTreeChildRemoved (ValueTree& parentTree, ValueTree&, int oldIndex) +{ + MemoryOutputStream m; + ValueTreeSynchroniserHelpers::writeHeader (*this, m, ValueTreeSynchroniserHelpers::childRemoved, parentTree); + m.writeCompressedInt (oldIndex); + stateChanged (m.getData(), m.getDataSize()); +} + +void ValueTreeSynchroniser::valueTreeChildOrderChanged (ValueTree& parent, int oldIndex, int newIndex) +{ + MemoryOutputStream m; + ValueTreeSynchroniserHelpers::writeHeader (*this, m, ValueTreeSynchroniserHelpers::childMoved, parent); + m.writeCompressedInt (oldIndex); + m.writeCompressedInt (newIndex); + stateChanged (m.getData(), m.getDataSize()); +} + +void ValueTreeSynchroniser::valueTreeParentChanged (ValueTree&) {} // (No action needed here) + +bool ValueTreeSynchroniser::applyChange (ValueTree& root, const void* data, size_t dataSize, UndoManager* undoManager) +{ + MemoryInputStream input (data, dataSize, false); + + const ValueTreeSynchroniserHelpers::ChangeType type = (ValueTreeSynchroniserHelpers::ChangeType) input.readByte(); + + if (type == ValueTreeSynchroniserHelpers::fullSync) + { + root = ValueTree::readFromStream (input); + return true; + } + + ValueTree v (ValueTreeSynchroniserHelpers::readSubTreeLocation (input, root)); + + if (! v.isValid()) + return false; + + switch (type) + { + case ValueTreeSynchroniserHelpers::propertyChanged: + { + Identifier property (input.readString()); + v.setProperty (property, var::readFromStream (input), undoManager); + return true; + } + + case ValueTreeSynchroniserHelpers::childAdded: + { + const int index = input.readCompressedInt(); + v.addChild (ValueTree::readFromStream (input), index, undoManager); + return true; + } + + case ValueTreeSynchroniserHelpers::childRemoved: + { + const int index = input.readCompressedInt(); + + if (isPositiveAndBelow (index, v.getNumChildren())) + { + v.removeChild (index, undoManager); + return true; + } + + jassertfalse; // Either received some corrupt data, or the trees have drifted out of sync + break; + } + + case ValueTreeSynchroniserHelpers::childMoved: + { + const int oldIndex = input.readCompressedInt(); + const int newIndex = input.readCompressedInt(); + + if (isPositiveAndBelow (oldIndex, v.getNumChildren()) + && isPositiveAndBelow (newIndex, v.getNumChildren())) + { + v.moveChild (oldIndex, newIndex, undoManager); + return true; + } + + jassertfalse; // Either received some corrupt data, or the trees have drifted out of sync + break; + } + + default: + jassertfalse; // Seem to have received some corrupt data? + break; + } + + return false; +} diff --git a/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h b/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h new file mode 100644 index 0000000..3773faf --- /dev/null +++ b/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h @@ -0,0 +1,98 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2015 - ROLI 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_VALUETREESYNCHRONISER_H_INCLUDED +#define JUCE_VALUETREESYNCHRONISER_H_INCLUDED + + +//============================================================================== +/** + This class can be used to watch for all changes to the state of a ValueTree, + and to convert them to a transmittable binary encoding. + + The purpose of this class is to allow two or more ValueTrees to be remotely + synchronised by transmitting encoded changes over some kind of transport + mechanism. + + To use it, you'll need to implement a subclass of ValueTreeSynchroniser + and implement the stateChanged() method to transmit the encoded change (maybe + via a network or other means) to a remote destination, where it can be + applied to a target tree. +*/ +class JUCE_API ValueTreeSynchroniser : private ValueTree::Listener +{ +public: + /** Creates a ValueTreeSynchroniser that watches the given tree. + + After creating an instance of this class and somehow attaching it to + a target tree, you probably want to call sendFullSyncCallback() to + get them into a common starting state. + */ + ValueTreeSynchroniser (const ValueTree& tree); + + /** Destructor. */ + virtual ~ValueTreeSynchroniser(); + + /** This callback happens when the ValueTree changes and the given state-change message + needs to be applied to any other trees that need to stay in sync with it. + The data is an opaque blob of binary that you should transmit to wherever your + target tree lives, and use applyChange() to apply this to the target tree. + */ + virtual void stateChanged (const void* encodedChange, size_t encodedChangeSize) = 0; + + /** Forces the sending of a full state message, which may be large, as it + encodes the entire ValueTree. + + This will internally invoke stateChanged() with the encoded version of the state. + */ + void sendFullSyncCallback(); + + /** Applies an encoded change to the given destination tree. + + When you implement a receiver for changes that were sent by the stateChanged() + message, this is the function that you'll need to call to apply them to the + target tree that you want to be synced. + */ + static bool applyChange (ValueTree& target, + const void* encodedChangeData, size_t encodedChangeDataSize, + UndoManager* undoManager); + + /** Returns the root ValueTree that is being observed. */ + const ValueTree& getRoot() noexcept { return valueTree; } + +private: + ValueTree valueTree; + + void valueTreePropertyChanged (ValueTree&, const Identifier&) override; + void valueTreeChildAdded (ValueTree&, ValueTree&) override; + void valueTreeChildRemoved (ValueTree&, ValueTree&, int) override; + void valueTreeChildOrderChanged (ValueTree&, int, int) override; + void valueTreeParentChanged (ValueTree&) override; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ValueTreeSynchroniser) +}; + + + +#endif // JUCE_VALUETREESYNCHRONISER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp b/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp index 33f232d..a1ff975 100644 --- a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp +++ b/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.h b/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.h index 8052bed..5926eef 100644 --- a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.h +++ b/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionListener.h b/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionListener.h index 12257f9..8f1d5cd 100644 --- a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionListener.h +++ b/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionListener.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp b/JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp index 980eb41..64acb79 100644 --- a/JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp +++ b/JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.h b/JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.h index 79ab6e1..d0c343b 100644 --- a/JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.h +++ b/JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp b/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp index bff1f1a..a17c673 100644 --- a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp +++ b/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -24,7 +24,7 @@ ChangeBroadcaster::ChangeBroadcaster() noexcept { - callback.owner = this; + broadcastCallback.owner = this; } ChangeBroadcaster::~ChangeBroadcaster() @@ -61,7 +61,7 @@ void ChangeBroadcaster::removeAllChangeListeners() void ChangeBroadcaster::sendChangeMessage() { if (changeListeners.size() > 0) - callback.triggerAsyncUpdate(); + broadcastCallback.triggerAsyncUpdate(); } void ChangeBroadcaster::sendSynchronousChangeMessage() @@ -69,13 +69,13 @@ void ChangeBroadcaster::sendSynchronousChangeMessage() // This can only be called by the event thread. jassert (MessageManager::getInstance()->isThisTheMessageThread()); - callback.cancelPendingUpdate(); + broadcastCallback.cancelPendingUpdate(); callListeners(); } void ChangeBroadcaster::dispatchPendingMessages() { - callback.handleUpdateNowIfNeeded(); + broadcastCallback.handleUpdateNowIfNeeded(); } void ChangeBroadcaster::callListeners() diff --git a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h b/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h index 8d9aca9..a740708 100644 --- a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h +++ b/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -93,7 +93,7 @@ private: }; friend class ChangeBroadcasterCallback; - ChangeBroadcasterCallback callback; + ChangeBroadcasterCallback broadcastCallback; ListenerList changeListeners; void callListeners(); diff --git a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeListener.h b/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeListener.h index 59e3025..3e61948 100644 --- a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeListener.h +++ b/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeListener.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ListenerList.h b/JuceLibraryCode/modules/juce_events/broadcasters/juce_ListenerList.h index 853e252..c68858f 100644 --- a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ListenerList.h +++ b/JuceLibraryCode/modules/juce_events/broadcasters/juce_ListenerList.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp b/JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp index 2c36c2c..74b6d88 100644 --- a/JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp +++ b/JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.h b/JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.h index 60e3b71..7c91ed5 100644 --- a/JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.h +++ b/JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.cpp b/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.cpp index f008cd1..34f5c5d 100644 --- a/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.cpp +++ b/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.h b/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.h index a88e8fd..d2fdcd6 100644 --- a/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.h +++ b/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp b/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp index e9b5426..b422a1c 100644 --- a/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp +++ b/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h b/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h index 8de7b8f..2bf0a22 100644 --- a/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h +++ b/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/juce_events.cpp b/JuceLibraryCode/modules/juce_events/juce_events.cpp index 2110d0a..53069c4 100644 --- a/JuceLibraryCode/modules/juce_events/juce_events.cpp +++ b/JuceLibraryCode/modules/juce_events/juce_events.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/juce_events.h b/JuceLibraryCode/modules/juce_events/juce_events.h index 7af9c9c..0ef1070 100644 --- a/JuceLibraryCode/modules/juce_events/juce_events.h +++ b/JuceLibraryCode/modules/juce_events/juce_events.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/juce_events.mm b/JuceLibraryCode/modules/juce_events/juce_events.mm index 45263f1..a1db9d4 100644 --- a/JuceLibraryCode/modules/juce_events/juce_events.mm +++ b/JuceLibraryCode/modules/juce_events/juce_events.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/juce_module_info b/JuceLibraryCode/modules/juce_events/juce_module_info index 69e90c9..3db2401 100644 --- a/JuceLibraryCode/modules/juce_events/juce_module_info +++ b/JuceLibraryCode/modules/juce_events/juce_module_info @@ -1,7 +1,7 @@ { "id": "juce_events", "name": "JUCE message and event handling classes", - "version": "3.0.8", + "version": "3.2.0", "description": "Classes for running an application's main event loop and sending/receiving messages, timers, etc.", "website": "http://www.juce.com/juce", "license": "GPL/Commercial", diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.cpp b/JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.cpp index dafc27e..66cd07f 100644 --- a/JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.cpp +++ b/JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -232,7 +232,7 @@ int JUCEApplicationBase::main() jassert (app != nullptr); if (! app->initialiseApp()) - return app->getApplicationReturnValue(); + return app->shutdownApp(); JUCE_TRY { diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.h b/JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.h index 073e5d6..bde123b 100644 --- a/JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.h +++ b/JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -259,6 +259,7 @@ public: static CreateInstanceFunction createInstance; virtual bool initialiseApp(); + int shutdownApp(); static void JUCE_CALLTYPE sendUnhandledException (const std::exception*, const char* sourceFile, int lineNumber); bool sendCommandLineToPreexistingInstance(); #endif @@ -274,8 +275,6 @@ private: friend struct ContainerDeletePolicy; ScopedPointer multipleInstanceHandler; - int shutdownApp(); - JUCE_DECLARE_NON_COPYABLE (JUCEApplicationBase) }; diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_CallbackMessage.h b/JuceLibraryCode/modules/juce_events/messages/juce_CallbackMessage.h index 799defd..17ddbea 100644 --- a/JuceLibraryCode/modules/juce_events/messages/juce_CallbackMessage.h +++ b/JuceLibraryCode/modules/juce_events/messages/juce_CallbackMessage.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.cpp b/JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.cpp index d3c6e97..c3357af 100644 --- a/JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.cpp +++ b/JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.h b/JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.h index ce1f10e..b3215eb 100644 --- a/JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.h +++ b/JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_Initialisation.h b/JuceLibraryCode/modules/juce_events/messages/juce_Initialisation.h index d3302dd..d358d0d 100644 --- a/JuceLibraryCode/modules/juce_events/messages/juce_Initialisation.h +++ b/JuceLibraryCode/modules/juce_events/messages/juce_Initialisation.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_Message.h b/JuceLibraryCode/modules/juce_events/messages/juce_Message.h index 4ae55f6..dab10a4 100644 --- a/JuceLibraryCode/modules/juce_events/messages/juce_Message.h +++ b/JuceLibraryCode/modules/juce_events/messages/juce_Message.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.cpp b/JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.cpp index b398ffa..6bcd25e 100644 --- a/JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.cpp +++ b/JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.h b/JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.h index ddd51e2..96edc1b 100644 --- a/JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.h +++ b/JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.cpp b/JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.cpp index 44c2adc..b7a1d81 100644 --- a/JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.cpp +++ b/JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -81,11 +81,6 @@ bool MessageManager::MessageBase::post() //============================================================================== #if JUCE_MODAL_LOOPS_PERMITTED && ! (JUCE_MAC || JUCE_IOS) -void MessageManager::runDispatchLoop() -{ - runDispatchLoopUntil (-1); -} - bool MessageManager::runDispatchLoopUntil (int millisecondsToRunFor) { jassert (isThisTheMessageThread()); // must only be called by the message thread @@ -107,7 +102,9 @@ bool MessageManager::runDispatchLoopUntil (int millisecondsToRunFor) return ! quitMessageReceived; } +#endif +#if ! (JUCE_MAC || JUCE_IOS || JUCE_ANDROID) class MessageManager::QuitMessage : public MessageManager::MessageBase { public: @@ -122,6 +119,21 @@ public: JUCE_DECLARE_NON_COPYABLE (QuitMessage) }; +void MessageManager::runDispatchLoop() +{ + jassert (isThisTheMessageThread()); // must only be called by the message thread + + while (! quitMessageReceived) + { + JUCE_TRY + { + if (! dispatchNextMessageOnSystemQueue (false)) + Thread::sleep (1); + } + JUCE_CATCH_EXCEPTION + } +} + void MessageManager::stopDispatchLoop() { (new QuitMessage())->post(); diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.h b/JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.h index 0901b29..23b8a62 100644 --- a/JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.h +++ b/JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h b/JuceLibraryCode/modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h index fe62875..b987905 100644 --- a/JuceLibraryCode/modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h +++ b/JuceLibraryCode/modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_NotificationType.h b/JuceLibraryCode/modules/juce_events/messages/juce_NotificationType.h index c3ecccc..9fb0c3a 100644 --- a/JuceLibraryCode/modules/juce_events/messages/juce_NotificationType.h +++ b/JuceLibraryCode/modules/juce_events/messages/juce_NotificationType.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/native/juce_ScopedXLock.h b/JuceLibraryCode/modules/juce_events/native/juce_ScopedXLock.h index d2136c7..1234207 100644 --- a/JuceLibraryCode/modules/juce_events/native/juce_ScopedXLock.h +++ b/JuceLibraryCode/modules/juce_events/native/juce_ScopedXLock.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/native/juce_android_Messaging.cpp b/JuceLibraryCode/modules/juce_events/native/juce_android_Messaging.cpp index 733994a..73cc3a4 100644 --- a/JuceLibraryCode/modules/juce_events/native/juce_android_Messaging.cpp +++ b/JuceLibraryCode/modules/juce_events/native/juce_android_Messaging.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -42,7 +42,7 @@ bool MessageManager::postMessageToSystemQueue (MessageManager::MessageBase* cons return true; } -JUCE_JNI_CALLBACK (JUCE_ANDROID_ACTIVITY_CLASSNAME, deliverMessage, void, (jobject activity, jlong value)) +JUCE_JNI_CALLBACK (JUCE_ANDROID_ACTIVITY_CLASSNAME, deliverMessage, void, (JNIEnv* env, jobject activity, jlong value)) { JUCE_TRY { diff --git a/JuceLibraryCode/modules/juce_events/native/juce_ios_MessageManager.mm b/JuceLibraryCode/modules/juce_events/native/juce_ios_MessageManager.mm index bdfed65..998cace 100644 --- a/JuceLibraryCode/modules/juce_events/native/juce_ios_MessageManager.mm +++ b/JuceLibraryCode/modules/juce_events/native/juce_ios_MessageManager.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -25,7 +25,15 @@ void MessageManager::runDispatchLoop() { jassert (isThisTheMessageThread()); // must only be called by the message thread - runDispatchLoopUntil (-1); + + while (! quitMessagePosted) + { + JUCE_AUTORELEASEPOOL + { + [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode + beforeDate: [NSDate dateWithTimeIntervalSinceNow: 0.001]]; + } + } } void MessageManager::stopDispatchLoop() @@ -34,6 +42,7 @@ void MessageManager::stopDispatchLoop() exit (0); // iOS apps get no mercy.. } +#if JUCE_MODAL_LOOPS_PERMITTED bool MessageManager::runDispatchLoopUntil (int millisecondsToRunFor) { JUCE_AUTORELEASEPOOL @@ -59,6 +68,7 @@ bool MessageManager::runDispatchLoopUntil (int millisecondsToRunFor) return ! quitMessagePosted; } } +#endif //============================================================================== static ScopedPointer messageQueue; diff --git a/JuceLibraryCode/modules/juce_events/native/juce_linux_Messaging.cpp b/JuceLibraryCode/modules/juce_events/native/juce_linux_Messaging.cpp index 48e28a7..62f8e4a 100644 --- a/JuceLibraryCode/modules/juce_events/native/juce_linux_Messaging.cpp +++ b/JuceLibraryCode/modules/juce_events/native/juce_linux_Messaging.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -37,8 +37,8 @@ typedef void (*SelectionRequestCallback) (XSelectionRequestEvent&); SelectionRequestCallback handleSelectionRequest = nullptr; //============================================================================== -ScopedXLock::ScopedXLock() { XLockDisplay (display); } -ScopedXLock::~ScopedXLock() { XUnlockDisplay (display); } +ScopedXLock::ScopedXLock() { if (display != nullptr) XLockDisplay (display); } +ScopedXLock::~ScopedXLock() { if (display != nullptr) XUnlockDisplay (display); } //============================================================================== class InternalMessageQueue @@ -74,7 +74,7 @@ public: ScopedUnlock ul (lock); const unsigned char x = 0xff; - size_t bytesWritten = write (fd[0], &x, 1); + ssize_t bytesWritten = write (fd[0], &x, 1); (void) bytesWritten; } } @@ -101,7 +101,7 @@ public: if (! isEmpty()) return true; - if (display != 0) + if (display != nullptr) { ScopedXLock xlock; if (XPending (display)) @@ -118,7 +118,7 @@ public: FD_ZERO (&readset); FD_SET (fd0, &readset); - if (display != 0) + if (display != nullptr) { ScopedXLock xlock; int fd1 = XConnectionNumber (display); @@ -131,7 +131,7 @@ public: } //============================================================================== - juce_DeclareSingleton_SingleThreaded_Minimal (InternalMessageQueue); + juce_DeclareSingleton_SingleThreaded_Minimal (InternalMessageQueue) private: CriticalSection lock; @@ -154,7 +154,7 @@ private: static bool dispatchNextXEvent() { - if (display == 0) + if (display == nullptr) return false; XEvent evt; @@ -186,7 +186,7 @@ private: const ScopedUnlock ul (lock); unsigned char x; - size_t numBytes = read (fd[1], &x, 1); + ssize_t numBytes = read (fd[1], &x, 1); (void) numBytes; } @@ -209,7 +209,7 @@ private: } }; -juce_ImplementSingleton_SingleThreaded (InternalMessageQueue); +juce_ImplementSingleton_SingleThreaded (InternalMessageQueue) //============================================================================== @@ -235,6 +235,8 @@ namespace LinuxErrorHandling int errorHandler (Display* display, XErrorEvent* event) { + (void) display; (void) event; + #if JUCE_DEBUG_XERRORS char errorStr[64] = { 0 }; char requestStr[64] = { 0 }; @@ -319,7 +321,7 @@ void MessageManager::doPlatformSpecificInitialisation() display = XOpenDisplay (displayName.toUTF8()); - if (display != 0) // This is not fatal! we can run headless. + if (display != nullptr) // This is not fatal! we can run headless. { // Create a context to store user data associated with Windows we create windowHandleXContext = XUniqueContext(); @@ -341,7 +343,7 @@ void MessageManager::doPlatformSpecificShutdown() { InternalMessageQueue::deleteInstance(); - if (display != 0 && ! LinuxErrorHandling::errorOccurred) + if (display != nullptr && ! LinuxErrorHandling::errorOccurred) { XDestroyWindow (display, juce_messageWindowHandle); XCloseDisplay (display); diff --git a/JuceLibraryCode/modules/juce_events/native/juce_mac_MessageManager.mm b/JuceLibraryCode/modules/juce_events/native/juce_mac_MessageManager.mm index 7b2068e..e1f6d87 100644 --- a/JuceLibraryCode/modules/juce_events/native/juce_mac_MessageManager.mm +++ b/JuceLibraryCode/modules/juce_events/native/juce_mac_MessageManager.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -53,7 +53,7 @@ public: [[NSDistributedNotificationCenter defaultCenter] addObserver: delegate selector: @selector (broadcastMessageCallback:) - name: getBroacastEventName() + name: getBroadcastEventName() object: nil]; } else @@ -79,14 +79,14 @@ public: [NSApp setDelegate: nil]; [[NSDistributedNotificationCenter defaultCenter] removeObserver: delegate - name: getBroacastEventName() + name: getBroadcastEventName() object: nil]; } [delegate release]; } - static NSString* getBroacastEventName() + static NSString* getBroadcastEventName() { return juceStringToNS ("juce_" + String::toHexString (File::getSpecialLocation (File::currentExecutableFile).hashCode64())); } @@ -96,26 +96,36 @@ public: private: //============================================================================== - struct AppDelegateClass : public ObjCClass + struct AppDelegateClass : public ObjCClass { - AppDelegateClass() : ObjCClass ("JUCEAppDelegate_") + AppDelegateClass() : ObjCClass ("JUCEAppDelegate_") { - addMethod (@selector (applicationShouldTerminate:), applicationShouldTerminate, "I@:@"); - addMethod (@selector (applicationWillTerminate:), applicationWillTerminate, "v@:@"); - addMethod (@selector (application:openFile:), application_openFile, "c@:@@"); - addMethod (@selector (application:openFiles:), application_openFiles, "v@:@@"); - addMethod (@selector (applicationDidBecomeActive:), applicationDidBecomeActive, "v@:@"); - addMethod (@selector (applicationDidResignActive:), applicationDidResignActive, "v@:@"); - addMethod (@selector (applicationWillUnhide:), applicationWillUnhide, "v@:@"); - addMethod (@selector (broadcastMessageCallback:), broadcastMessageCallback, "v@:@"); - addMethod (@selector (mainMenuTrackingBegan:), mainMenuTrackingBegan, "v@:@"); - addMethod (@selector (mainMenuTrackingEnded:), mainMenuTrackingEnded, "v@:@"); - addMethod (@selector (dummyMethod), dummyMethod, "v@:"); + addMethod (@selector (applicationWillFinishLaunching:), applicationWillFinishLaunching, "v@:@@"); + addMethod (@selector (getUrl:withReplyEvent:), getUrl_withReplyEvent, "v@:@@"); + addMethod (@selector (applicationShouldTerminate:), applicationShouldTerminate, "I@:@"); + addMethod (@selector (applicationWillTerminate:), applicationWillTerminate, "v@:@"); + addMethod (@selector (application:openFile:), application_openFile, "c@:@@"); + addMethod (@selector (application:openFiles:), application_openFiles, "v@:@@"); + addMethod (@selector (applicationDidBecomeActive:), applicationDidBecomeActive, "v@:@"); + addMethod (@selector (applicationDidResignActive:), applicationDidResignActive, "v@:@"); + addMethod (@selector (applicationWillUnhide:), applicationWillUnhide, "v@:@"); + addMethod (@selector (broadcastMessageCallback:), broadcastMessageCallback, "v@:@"); + addMethod (@selector (mainMenuTrackingBegan:), mainMenuTrackingBegan, "v@:@"); + addMethod (@selector (mainMenuTrackingEnded:), mainMenuTrackingEnded, "v@:@"); + addMethod (@selector (dummyMethod), dummyMethod, "v@:"); registerClass(); } private: + static void applicationWillFinishLaunching (id self, SEL, NSApplication*, NSNotification*) + { + [[NSAppleEventManager sharedAppleEventManager] setEventHandler: self + andSelector: @selector (getUrl:withReplyEvent:) + forEventClass: kInternetEventClass + andEventID: kAEGetURL]; + } + static NSApplicationTerminateReply applicationShouldTerminate (id /*self*/, SEL, NSApplication*) { if (JUCEApplicationBase* const app = JUCEApplicationBase::getInstance()) @@ -184,13 +194,18 @@ private: static void dummyMethod (id /*self*/, SEL) {} // (used as a way of running a dummy thread) - private: static void focusChanged() { if (appFocusChangeCallback != nullptr) (*appFocusChangeCallback)(); } + static void getUrl_withReplyEvent (id /*self*/, SEL, NSAppleEventDescriptor* event, NSAppleEventDescriptor*) + { + if (JUCEApplicationBase* const app = JUCEApplicationBase::getInstance()) + app->anotherInstanceStarted (quotedIfContainsSpaces ([[event paramDescriptorForKeyword: keyDirectObject] stringValue])); + } + static String quotedIfContainsSpaces (NSString* file) { String s (nsStringToJuce (file)); @@ -246,11 +261,13 @@ static void shutdownNSApp() void MessageManager::stopDispatchLoop() { + #if JUCE_PROJUCER_LIVE_BUILD quitMessagePosted = true; + #else - #if ! JUCE_PROJUCER_LIVE_BUILD if (isThisTheMessageThread()) { + quitMessagePosted = true; shutdownNSApp(); } else @@ -258,7 +275,7 @@ void MessageManager::stopDispatchLoop() struct QuitCallback : public CallbackMessage { QuitCallback() {} - void messageCallback() override { shutdownNSApp(); } + void messageCallback() override { MessageManager::getInstance()->stopDispatchLoop(); } }; (new QuitCallback())->post(); @@ -341,7 +358,7 @@ void MessageManager::broadcastMessage (const String& message) NSDictionary* info = [NSDictionary dictionaryWithObject: juceStringToNS (message) forKey: nsStringLiteral ("message")]; - [[NSDistributedNotificationCenter defaultCenter] postNotificationName: AppDelegate::getBroacastEventName() + [[NSDistributedNotificationCenter defaultCenter] postNotificationName: AppDelegate::getBroadcastEventName() object: nil userInfo: info]; } diff --git a/JuceLibraryCode/modules/juce_events/native/juce_osx_MessageQueue.h b/JuceLibraryCode/modules/juce_events/native/juce_osx_MessageQueue.h index 6ffbefe..4b36564 100644 --- a/JuceLibraryCode/modules/juce_events/native/juce_osx_MessageQueue.h +++ b/JuceLibraryCode/modules/juce_events/native/juce_osx_MessageQueue.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/native/juce_win32_HiddenMessageWindow.h b/JuceLibraryCode/modules/juce_events/native/juce_win32_HiddenMessageWindow.h index e0df59a..b629eba 100644 --- a/JuceLibraryCode/modules/juce_events/native/juce_win32_HiddenMessageWindow.h +++ b/JuceLibraryCode/modules/juce_events/native/juce_win32_HiddenMessageWindow.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -63,7 +63,7 @@ private: ATOM atom; HWND hwnd; - LPCTSTR getClassNameFromAtom() noexcept { return (LPCTSTR) MAKELONG (atom, 0); } + LPCTSTR getClassNameFromAtom() noexcept { return (LPCTSTR) atom; } }; //============================================================================== diff --git a/JuceLibraryCode/modules/juce_events/native/juce_win32_Messaging.cpp b/JuceLibraryCode/modules/juce_events/native/juce_win32_Messaging.cpp index 853f54d..7c02752 100644 --- a/JuceLibraryCode/modules/juce_events/native/juce_win32_Messaging.cpp +++ b/JuceLibraryCode/modules/juce_events/native/juce_win32_Messaging.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -38,7 +38,7 @@ namespace WindowsMessageHelpers void dispatchMessageFromLParam (LPARAM lParam) { - MessageManager::MessageBase* const message = reinterpret_cast (lParam); + MessageManager::MessageBase* const message = reinterpret_cast (lParam); JUCE_TRY { @@ -61,15 +61,17 @@ namespace WindowsMessageHelpers dispatchMessageFromLParam (lParam); return 0; } - else if (message == broadcastId) + + if (message == broadcastId) { const ScopedPointer messageString ((String*) lParam); MessageManager::getInstance()->deliverBroadcastMessage (*messageString); return 0; } - else if (message == WM_COPYDATA) + + if (message == WM_COPYDATA) { - const COPYDATASTRUCT* const data = reinterpret_cast (lParam); + const COPYDATASTRUCT* const data = reinterpret_cast (lParam); if (data->dwData == broadcastId) { @@ -88,7 +90,7 @@ namespace WindowsMessageHelpers BOOL CALLBACK broadcastEnumWindowProc (HWND hwnd, LPARAM lParam) { if (hwnd != juce_messageWindowHandle) - reinterpret_cast *> (lParam)->add (hwnd); + reinterpret_cast*> (lParam)->add (hwnd); return TRUE; } @@ -157,9 +159,8 @@ void MessageManager::broadcastMessage (const String& value) { HWND hwnd = windows.getUnchecked(i); - TCHAR windowName [64]; // no need to read longer strings than this - GetWindowText (hwnd, windowName, 64); - windowName [63] = 0; + TCHAR windowName[64] = { 0 }; // no need to read longer strings than this + GetWindowText (hwnd, windowName, 63); if (String (windowName) == WindowsMessageHelpers::messageWindowName) { diff --git a/JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.cpp b/JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.cpp index 4885e7b..7941cf3 100644 --- a/JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.cpp +++ b/JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.h b/JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.h index c7fe0e4..d32a0dd 100644 --- a/JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.h +++ b/JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_events/timers/juce_Timer.cpp b/JuceLibraryCode/modules/juce_events/timers/juce_Timer.cpp index 6b7343a..284e1ce 100644 --- a/JuceLibraryCode/modules/juce_events/timers/juce_Timer.cpp +++ b/JuceLibraryCode/modules/juce_events/timers/juce_Timer.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -112,10 +112,10 @@ public: { const LockType::ScopedLockType sl (lock); - while (firstTimer != nullptr && firstTimer->countdownMs <= 0) + while (firstTimer != nullptr && firstTimer->timerCountdownMs <= 0) { Timer* const t = firstTimer; - t->countdownMs = t->periodMs; + t->timerCountdownMs = t->timerPeriodMs; removeTimer (t); addTimer (t); @@ -169,11 +169,11 @@ public: { if (instance != nullptr) { - tim->countdownMs = newCounter; - tim->periodMs = newCounter; + tim->timerCountdownMs = newCounter; + tim->timerPeriodMs = newCounter; - if ((tim->next != nullptr && tim->next->countdownMs < tim->countdownMs) - || (tim->previous != nullptr && tim->previous->countdownMs > tim->countdownMs)) + if ((tim->nextTimer != nullptr && tim->nextTimer->timerCountdownMs < tim->timerCountdownMs) + || (tim->previousTimer != nullptr && tim->previousTimer->timerCountdownMs > tim->timerCountdownMs)) { instance->removeTimer (tim); instance->addTimer (tim); @@ -186,7 +186,7 @@ public: private: Timer* volatile firstTimer; - Atomic callbackNeeded; + Atomic callbackNeeded; struct CallTimersMessage : public MessageManager::MessageBase { @@ -210,28 +210,28 @@ private: Timer* i = firstTimer; - if (i == nullptr || i->countdownMs > t->countdownMs) + if (i == nullptr || i->timerCountdownMs > t->timerCountdownMs) { - t->next = firstTimer; + t->nextTimer = firstTimer; firstTimer = t; } else { - while (i->next != nullptr && i->next->countdownMs <= t->countdownMs) - i = i->next; + while (i->nextTimer != nullptr && i->nextTimer->timerCountdownMs <= t->timerCountdownMs) + i = i->nextTimer; jassert (i != nullptr); - t->next = i->next; - t->previous = i; - i->next = t; + t->nextTimer = i->nextTimer; + t->previousTimer = i; + i->nextTimer = t; } - if (t->next != nullptr) - t->next->previous = t; + if (t->nextTimer != nullptr) + t->nextTimer->previousTimer = t; - jassert ((t->next == nullptr || t->next->countdownMs >= t->countdownMs) - && (t->previous == nullptr || t->previous->countdownMs <= t->countdownMs)); + jassert ((t->nextTimer == nullptr || t->nextTimer->timerCountdownMs >= t->timerCountdownMs) + && (t->previousTimer == nullptr || t->previousTimer->timerCountdownMs <= t->timerCountdownMs)); notify(); } @@ -244,32 +244,32 @@ private: jassert (timerExists (t)); #endif - if (t->previous != nullptr) + if (t->previousTimer != nullptr) { jassert (firstTimer != t); - t->previous->next = t->next; + t->previousTimer->nextTimer = t->nextTimer; } else { jassert (firstTimer == t); - firstTimer = t->next; + firstTimer = t->nextTimer; } - if (t->next != nullptr) - t->next->previous = t->previous; + if (t->nextTimer != nullptr) + t->nextTimer->previousTimer = t->previousTimer; - t->next = nullptr; - t->previous = nullptr; + t->nextTimer = nullptr; + t->previousTimer = nullptr; } int getTimeUntilFirstTimer (const int numMillisecsElapsed) const { const LockType::ScopedLockType sl (lock); - for (Timer* t = firstTimer; t != nullptr; t = t->next) - t->countdownMs -= numMillisecsElapsed; + for (Timer* t = firstTimer; t != nullptr; t = t->nextTimer) + t->timerCountdownMs -= numMillisecsElapsed; - return firstTimer != nullptr ? firstTimer->countdownMs : 1000; + return firstTimer != nullptr ? firstTimer->timerCountdownMs : 1000; } void handleAsyncUpdate() override @@ -280,7 +280,7 @@ private: #if JUCE_DEBUG bool timerExists (Timer* const t) const noexcept { - for (Timer* tt = firstTimer; tt != nullptr; tt = tt->next) + for (Timer* tt = firstTimer; tt != nullptr; tt = tt->nextTimer) if (tt == t) return true; @@ -296,18 +296,18 @@ Timer::TimerThread::LockType Timer::TimerThread::lock; //============================================================================== Timer::Timer() noexcept - : countdownMs (0), - periodMs (0), - previous (nullptr), - next (nullptr) + : timerCountdownMs (0), + timerPeriodMs (0), + previousTimer (nullptr), + nextTimer (nullptr) { } Timer::Timer (const Timer&) noexcept - : countdownMs (0), - periodMs (0), - previous (nullptr), - next (nullptr) + : timerCountdownMs (0), + timerPeriodMs (0), + previousTimer (nullptr), + nextTimer (nullptr) { } @@ -320,10 +320,10 @@ void Timer::startTimer (const int interval) noexcept { const TimerThread::LockType::ScopedLockType sl (TimerThread::lock); - if (periodMs == 0) + if (timerPeriodMs == 0) { - countdownMs = interval; - periodMs = jmax (1, interval); + timerCountdownMs = interval; + timerPeriodMs = jmax (1, interval); TimerThread::add (this); } else @@ -332,14 +332,22 @@ void Timer::startTimer (const int interval) noexcept } } +void Timer::startTimerHz (int timerFrequencyHz) noexcept +{ + if (timerFrequencyHz > 0) + startTimer (1000 / timerFrequencyHz); + else + stopTimer(); +} + void Timer::stopTimer() noexcept { const TimerThread::LockType::ScopedLockType sl (TimerThread::lock); - if (periodMs > 0) + if (timerPeriodMs > 0) { TimerThread::remove (this); - periodMs = 0; + timerPeriodMs = 0; } } diff --git a/JuceLibraryCode/modules/juce_events/timers/juce_Timer.h b/JuceLibraryCode/modules/juce_events/timers/juce_Timer.h index a2f823a..a6670e3 100644 --- a/JuceLibraryCode/modules/juce_events/timers/juce_Timer.h +++ b/JuceLibraryCode/modules/juce_events/timers/juce_Timer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -54,7 +54,6 @@ class JUCE_API Timer protected: //============================================================================== /** Creates a Timer. - When created, the timer is stopped, so use startTimer() to get it going. */ Timer() noexcept; @@ -64,7 +63,7 @@ protected: Note that this timer won't be started, even if the one you're copying is running. */ - Timer (const Timer& other) noexcept; + Timer (const Timer&) noexcept; public: //============================================================================== @@ -86,11 +85,16 @@ public: time between calling this method and the next timer callback will not be less than the interval length passed in. - @param intervalInMilliseconds the interval to use (any values less than 1 will be - rounded up to 1) + @param intervalInMilliseconds the interval to use (any value less + than 1 will be rounded up to 1) */ void startTimer (int intervalInMilliseconds) noexcept; + /** Starts the timer with an interval specified in Hertz. + This is effectively the same as calling startTimer (1000 / timerFrequencyHz). + */ + void startTimerHz (int timerFrequencyHz) noexcept; + /** Stops the timer. No more callbacks will be made after this method returns. @@ -102,17 +106,13 @@ public: void stopTimer() noexcept; //============================================================================== - /** Checks if the timer has been started. - - @returns true if the timer is running. - */ - bool isTimerRunning() const noexcept { return periodMs > 0; } + /** Returns true if the timer is currently running. */ + bool isTimerRunning() const noexcept { return timerPeriodMs > 0; } /** Returns the timer's interval. - @returns the timer's interval in milliseconds if it's running, or 0 if it's not. */ - int getTimerInterval() const noexcept { return periodMs; } + int getTimerInterval() const noexcept { return timerPeriodMs; } //============================================================================== @@ -124,11 +124,10 @@ public: private: class TimerThread; friend class TimerThread; - int countdownMs, periodMs; - Timer* previous; - Timer* next; + int timerCountdownMs, timerPeriodMs; // NB: these member variable names are a little verbose + Timer* previousTimer, *nextTimer; // to reduce risk of name-clashes with user subclasses - Timer& operator= (const Timer&); + Timer& operator= (const Timer&) JUCE_DELETED_FUNCTION; }; #endif // JUCE_TIMER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.cpp b/JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.cpp index aaf9468..43d99e7 100644 --- a/JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.cpp +++ b/JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -136,7 +136,7 @@ namespace ColourHelpers //============================================================================== Colour::Colour() noexcept - : argb (0) + : argb (0, 0, 0, 0) { } @@ -151,11 +151,12 @@ Colour& Colour::operator= (const Colour& other) noexcept return *this; } -bool Colour::operator== (const Colour& other) const noexcept { return argb.getARGB() == other.argb.getARGB(); } -bool Colour::operator!= (const Colour& other) const noexcept { return argb.getARGB() != other.argb.getARGB(); } +bool Colour::operator== (const Colour& other) const noexcept { return argb.getNativeARGB() == other.argb.getNativeARGB(); } +bool Colour::operator!= (const Colour& other) const noexcept { return argb.getNativeARGB() != other.argb.getNativeARGB(); } //============================================================================== -Colour::Colour (const uint32 col) noexcept : argb (col) +Colour::Colour (const uint32 col) noexcept + : argb ((col >> 24) & 0xff, (col >> 16) & 0xff, (col >> 8) & 0xff, col & 0xff) { } @@ -206,10 +207,26 @@ Colour::Colour (const float hue, const float saturation, const float brightness, { } +Colour::Colour (PixelARGB argb_) noexcept + : argb (argb_) +{ +} + +Colour::Colour (PixelRGB rgb) noexcept + : argb (Colour (rgb.getInARGBMaskOrder()).argb) +{ +} + +Colour::Colour (PixelAlpha alpha) noexcept + : argb (Colour (alpha.getInARGBMaskOrder()).argb) +{ +} + Colour::~Colour() noexcept { } + //============================================================================== const PixelARGB Colour::getPixelARGB() const noexcept { @@ -220,7 +237,7 @@ const PixelARGB Colour::getPixelARGB() const noexcept uint32 Colour::getARGB() const noexcept { - return argb.getARGB(); + return argb.getInARGBMaskOrder(); } //============================================================================== @@ -238,7 +255,7 @@ Colour Colour::withAlpha (const uint8 newAlpha) const noexcept { PixelARGB newCol (argb); newCol.setAlpha (newAlpha); - return Colour (newCol.getARGB()); + return Colour (newCol); } Colour Colour::withAlpha (const float newAlpha) const noexcept @@ -247,7 +264,7 @@ Colour Colour::withAlpha (const float newAlpha) const noexcept PixelARGB newCol (argb); newCol.setAlpha (ColourHelpers::floatToUInt8 (newAlpha)); - return Colour (newCol.getARGB()); + return Colour (newCol); } Colour Colour::withMultipliedAlpha (const float alphaMultiplier) const noexcept @@ -256,7 +273,7 @@ Colour Colour::withMultipliedAlpha (const float alphaMultiplier) const noexcept PixelARGB newCol (argb); newCol.setAlpha ((uint8) jmin (0xff, roundToInt (alphaMultiplier * newCol.getAlpha()))); - return Colour (newCol.getARGB()); + return Colour (newCol); } //============================================================================== @@ -294,7 +311,7 @@ Colour Colour::interpolatedWith (Colour other, float proportionOfOther) const no c1.tween (c2, (uint32) roundToInt (proportionOfOther * 255.0f)); c1.unpremultiply(); - return Colour (c1.getARGB()); + return Colour (c1); } //============================================================================== @@ -428,7 +445,7 @@ Colour Colour::contrasting (Colour colour1, //============================================================================== String Colour::toString() const { - return String::toHexString ((int) argb.getARGB()); + return String::toHexString ((int) argb.getInARGBMaskOrder()); } Colour Colour::fromString (StringRef encodedColourString) @@ -438,7 +455,7 @@ Colour Colour::fromString (StringRef encodedColourString) String Colour::toDisplayString (const bool includeAlphaValue) const { - return String::toHexString ((int) (argb.getARGB() & (includeAlphaValue ? 0xffffffff : 0xffffff))) + return String::toHexString ((int) (argb.getInARGBMaskOrder() & (includeAlphaValue ? 0xffffffff : 0xffffff))) .paddedLeft ('0', includeAlphaValue ? 8 : 6) .toUpperCase(); } diff --git a/JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.h b/JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.h index 4d84504..885eaa3 100644 --- a/JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.h +++ b/JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -115,6 +115,19 @@ public: float brightness, float alpha) noexcept; + /** Creates a colour using a PixelARGB object. This function assumes that the argb pixel is + not premultiplied. + */ + Colour (PixelARGB argb) noexcept; + + /** Creates a colour using a PixelRGB object. + */ + Colour (PixelRGB rgb) noexcept; + + /** Creates a colour using a PixelAlpha object. + */ + Colour (PixelAlpha alpha) noexcept; + /** Creates a colour using floating point hue, saturation and brightness values, and an 8-bit alpha. The floating point values must be between 0.0 and 1.0. diff --git a/JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.cpp b/JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.cpp index 75d1712..87ccb56 100644 --- a/JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.cpp +++ b/JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -32,12 +32,12 @@ ColourGradient::ColourGradient() noexcept #endif } -ColourGradient::ColourGradient (Colour colour1, const float x1_, const float y1_, - Colour colour2, const float x2_, const float y2_, - const bool isRadial_) - : point1 (x1_, y1_), - point2 (x2_, y2_), - isRadial (isRadial_) +ColourGradient::ColourGradient (Colour colour1, const float x1, const float y1, + Colour colour2, const float x2, const float y2, + const bool radial) + : point1 (x1, y1), + point2 (x2, y2), + isRadial (radial) { colours.add (ColourPoint (0.0, colour1)); colours.add (ColourPoint (1.0, colour2)); diff --git a/JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.h b/JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.h index 73e6631..9349d82 100644 --- a/JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.h +++ b/JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.cpp b/JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.cpp index fbde0ba..f79d528 100644 --- a/JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.cpp +++ b/JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.h b/JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.h index 90e4aa5..86f3828 100644 --- a/JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.h +++ b/JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.cpp b/JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.cpp index 5e5db56..c477f71 100644 --- a/JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.cpp +++ b/JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.h b/JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.h index 19401d6..3cf037d 100644 --- a/JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.h +++ b/JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/colour/juce_PixelFormats.h b/JuceLibraryCode/modules/juce_graphics/colour/juce_PixelFormats.h index 2715cb2..0df5987 100644 --- a/JuceLibraryCode/modules/juce_graphics/colour/juce_PixelFormats.h +++ b/JuceLibraryCode/modules/juce_graphics/colour/juce_PixelFormats.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -46,7 +46,7 @@ inline uint32 clampPixelComponents (uint32 x) noexcept //============================================================================== /** - Represents a 32-bit ARGB pixel with premultiplied alpha, and can perform compositing + Represents a 32-bit INTERNAL pixel with premultiplied alpha, and can perform compositing operations with it. This is used internally by the imaging classes. @@ -60,13 +60,6 @@ public: PixelARGB() noexcept {} ~PixelARGB() noexcept {} - /** Creates a pixel from a 32-bit argb value. - */ - PixelARGB (const uint32 argbValue) noexcept - : argb (argbValue) - { - } - PixelARGB (const uint8 a, const uint8 r, const uint8 g, const uint8 b) noexcept { components.b = b; @@ -75,30 +68,81 @@ public: components.a = a; } - forcedinline uint32 getARGB() const noexcept { return argb; } - forcedinline uint32 getUnpremultipliedARGB() const noexcept { PixelARGB p (argb); p.unpremultiply(); return p.getARGB(); } + //============================================================================== + /** Returns a uint32 which represents the pixel in a platform dependent format. */ + forcedinline uint32 getNativeARGB() const noexcept { return internal; } + + /** Returns a uint32 which will be in argb order as if constructed with the following mask operation + ((alpha << 24) | (red << 16) | (green << 8) | blue). */ + forcedinline uint32 getInARGBMaskOrder() const noexcept + { + #if JUCE_ANDROID + return (uint32) ((components.a << 24) | (components.r << 16) | (components.g << 8) | (components.b << 0)); + #else + return getNativeARGB(); + #endif + } + + /** Returns a uint32 which when written to memory, will be in the order a, r, g, b. In other words, + if the return-value is read as a uint8 array then the elements will be in the order of a, r, g, b*/ + inline uint32 getInARGBMemoryOrder() const noexcept + { + #if JUCE_BIG_ENDIAN + return getInARGBMaskOrder(); + #else + return (uint32) ((components.b << 24) | (components.g << 16) | (components.r << 8) | components.a); + #endif + } + + /** Return channels with an even index and insert zero bytes between them. This is useful for blending + operations. The exact channels which are returned is platform dependent. */ + forcedinline uint32 getEvenBytes() const noexcept { return 0x00ff00ff & internal; } - forcedinline uint32 getRB() const noexcept { return 0x00ff00ff & argb; } - forcedinline uint32 getAG() const noexcept { return 0x00ff00ff & (argb >> 8); } + /** Return channels with an odd index and insert zero bytes between them. This is useful for blending + operations. The exact channels which are returned is platform dependent. */ + forcedinline uint32 getOddBytes() const noexcept { return 0x00ff00ff & (internal >> 8); } - forcedinline uint8 getAlpha() const noexcept { return components.a; } - forcedinline uint8 getRed() const noexcept { return components.r; } - forcedinline uint8 getGreen() const noexcept { return components.g; } - forcedinline uint8 getBlue() const noexcept { return components.b; } + //============================================================================== + forcedinline uint8 getAlpha() const noexcept { return components.a; } + forcedinline uint8 getRed() const noexcept { return components.r; } + forcedinline uint8 getGreen() const noexcept { return components.g; } + forcedinline uint8 getBlue() const noexcept { return components.b; } #if JUCE_GCC && ! JUCE_CLANG // NB these are here as a workaround because GCC refuses to bind to packed values. - forcedinline uint8& getAlpha() noexcept { return comps [indexA]; } - forcedinline uint8& getRed() noexcept { return comps [indexR]; } - forcedinline uint8& getGreen() noexcept { return comps [indexG]; } - forcedinline uint8& getBlue() noexcept { return comps [indexB]; } + forcedinline uint8& getAlpha() noexcept { return comps [indexA]; } + forcedinline uint8& getRed() noexcept { return comps [indexR]; } + forcedinline uint8& getGreen() noexcept { return comps [indexG]; } + forcedinline uint8& getBlue() noexcept { return comps [indexB]; } #else - forcedinline uint8& getAlpha() noexcept { return components.a; } - forcedinline uint8& getRed() noexcept { return components.r; } - forcedinline uint8& getGreen() noexcept { return components.g; } - forcedinline uint8& getBlue() noexcept { return components.b; } + forcedinline uint8& getAlpha() noexcept { return components.a; } + forcedinline uint8& getRed() noexcept { return components.r; } + forcedinline uint8& getGreen() noexcept { return components.g; } + forcedinline uint8& getBlue() noexcept { return components.b; } #endif + //============================================================================== + /** Copies another pixel colour over this one. + + This doesn't blend it - this colour is simply replaced by the other one. + */ + template + forcedinline void set (const Pixel& src) noexcept + { + internal = src.getNativeARGB(); + } + + //============================================================================== + /** Sets the pixel's colour from individual components. */ + void setARGB (const uint8 a, const uint8 r, const uint8 g, const uint8 b) noexcept + { + components.b = b; + components.g = g; + components.r = r; + components.a = a; + } + + //============================================================================== /** Blends another pixel onto this one. This takes into account the opacity of the pixel being overlaid, and blends @@ -107,10 +151,15 @@ public: template forcedinline void blend (const Pixel& src) noexcept { - const uint32 alpha = 0x100 - src.getAlpha(); - uint32 rb = src.getRB() + maskPixelComponents (getRB() * alpha); - uint32 ag = src.getAG() + maskPixelComponents (getAG() * alpha); - argb = clampPixelComponents (rb) + (clampPixelComponents (ag) << 8); + uint32 rb = src.getEvenBytes(); + uint32 ag = src.getOddBytes(); + + const uint32 alpha = 0x100 - (ag >> 16); + + rb += maskPixelComponents (getEvenBytes() * alpha); + ag += maskPixelComponents (getOddBytes() * alpha); + + internal = clampPixelComponents (rb) | (clampPixelComponents (ag) << 8); } /** Blends another pixel onto this one. @@ -129,14 +178,15 @@ public: template forcedinline void blend (const Pixel& src, uint32 extraAlpha) noexcept { - uint32 ag = maskPixelComponents (extraAlpha * src.getAG()); + uint32 rb = maskPixelComponents (extraAlpha * src.getEvenBytes()); + uint32 ag = maskPixelComponents (extraAlpha * src.getOddBytes()); + const uint32 alpha = 0x100 - (ag >> 16); - ag += maskPixelComponents (getAG() * alpha); - uint32 rb = maskPixelComponents (extraAlpha * src.getRB()) - + maskPixelComponents (getRB() * alpha); + rb += maskPixelComponents (getEvenBytes() * alpha); + ag += maskPixelComponents (getOddBytes() * alpha); - argb = clampPixelComponents(rb) + (clampPixelComponents (ag) << 8); + internal = clampPixelComponents (rb) | (clampPixelComponents (ag) << 8); } /** Blends another pixel with this one, creating a colour that is somewhere @@ -145,29 +195,20 @@ public: template forcedinline void tween (const Pixel& src, const uint32 amount) noexcept { - uint32 drb = getRB(); - drb += (((src.getRB() - drb) * amount) >> 8); - drb &= 0x00ff00ff; - - uint32 dag = getAG(); - dag += (((src.getAG() - dag) * amount) >> 8); - dag &= 0x00ff00ff; - dag <<= 8; + uint32 dEvenBytes = getEvenBytes(); + dEvenBytes += (((src.getEvenBytes() - dEvenBytes) * amount) >> 8); + dEvenBytes &= 0x00ff00ff; - dag |= drb; - argb = dag; - } + uint32 dOddBytes = getOddBytes(); + dOddBytes += (((src.getOddBytes() - dOddBytes) * amount) >> 8); + dOddBytes &= 0x00ff00ff; + dOddBytes <<= 8; - /** Copies another pixel colour over this one. - - This doesn't blend it - this colour is simply replaced by the other one. - */ - template - forcedinline void set (const Pixel& src) noexcept - { - argb = src.getARGB(); + dOddBytes |= dEvenBytes; + internal = dOddBytes; } + //============================================================================== /** Replaces the colour's alpha value with another one. */ forcedinline void setAlpha (const uint8 newAlpha) noexcept { @@ -177,10 +218,12 @@ public: /** Multiplies the colour's alpha value with another one. */ forcedinline void multiplyAlpha (int multiplier) noexcept { + // increment alpha by 1, so that if multiplier == 255 (full alpha), + // this function will not change the values. ++multiplier; - argb = ((((uint32) multiplier) * getAG()) & 0xff00ff00) - | (((((uint32) multiplier) * getRB()) >> 8) & 0x00ff00ff); + internal = ((((uint32) multiplier) * getOddBytes()) & 0xff00ff00) + | (((((uint32) multiplier) * getEvenBytes()) >> 8) & 0x00ff00ff); } forcedinline void multiplyAlpha (const float multiplier) noexcept @@ -188,14 +231,8 @@ public: multiplyAlpha ((int) (multiplier * 255.0f)); } - /** Sets the pixel's colour from individual components. */ - void setARGB (const uint8 a, const uint8 r, const uint8 g, const uint8 b) noexcept - { - components.b = b; - components.g = g; - components.r = r; - components.a = a; - } + + inline PixelARGB getUnpremultiplied() const noexcept { PixelARGB p (internal); p.unpremultiply(); return p; } /** Premultiplies the pixel's RGB values by its alpha. */ forcedinline void premultiply() noexcept @@ -234,9 +271,9 @@ public: } else { - components.b = (uint8) jmin ((uint32) 0xff, (components.b * 0xff) / alpha); - components.g = (uint8) jmin ((uint32) 0xff, (components.g * 0xff) / alpha); - components.r = (uint8) jmin ((uint32) 0xff, (components.r * 0xff) / alpha); + components.b = (uint8) jmin ((uint32) 0xffu, (components.b * 0xffu) / alpha); + components.g = (uint8) jmin ((uint32) 0xffu, (components.g * 0xffu) / alpha); + components.r = (uint8) jmin ((uint32) 0xffu, (components.r * 0xffu) / alpha); } } } @@ -257,41 +294,53 @@ public: } } - /** Returns a uint32 which when written to memory, will be in the order r, g, b, a. */ - inline uint32 getInRGBAMemoryOrder() const noexcept - { - #if JUCE_BIG_ENDIAN - return (((uint32) components.r) << 24) | (((uint32) components.g) << 16) | (((uint32) components.b) << 8) | components.a; - #else - return (((uint32) components.a) << 24) | (((uint32) components.b) << 16) | (((uint32) components.g) << 8) | components.r; - #endif - } - //============================================================================== /** The indexes of the different components in the byte layout of this type of colour. */ + #if JUCE_ANDROID + #if JUCE_BIG_ENDIAN + enum { indexA = 0, indexR = 3, indexG = 2, indexB = 1 }; + #else + enum { indexA = 3, indexR = 0, indexG = 1, indexB = 2 }; + #endif + #else #if JUCE_BIG_ENDIAN enum { indexA = 0, indexR = 1, indexG = 2, indexB = 3 }; #else enum { indexA = 3, indexR = 2, indexG = 1, indexB = 0 }; #endif + #endif private: + //============================================================================== + PixelARGB (const uint32 internalValue) noexcept + : internal (internalValue) + { + } + //============================================================================== struct Components { + #if JUCE_ANDROID + #if JUCE_BIG_ENDIAN + uint8 a, b, g, r; + #else + uint8 r, g, b, a; + #endif + #else #if JUCE_BIG_ENDIAN uint8 a, r, g, b; #else uint8 b, g, r, a; #endif + #endif } JUCE_PACKED; union { - uint32 argb; + uint32 internal; Components components; #if JUCE_GCC - uint8 comps[4]; + uint8 comps[4]; // helper struct needed because gcc does not allow references to packed union members #endif }; } @@ -316,23 +365,64 @@ public: PixelRGB() noexcept {} ~PixelRGB() noexcept {} - /** Creates a pixel from a 32-bit argb value. + //============================================================================== + /** Returns a uint32 which represents the pixel in a platform dependent format which is compatible + with the native format of a PixelARGB. - (The argb format is that used by PixelARGB) - */ - PixelRGB (const uint32 argb) noexcept + @see PixelARGB::getNativeARGB */ + forcedinline uint32 getNativeARGB() const noexcept + { + #if JUCE_ANDROID + return (uint32) ((0xff << 24) | r | (g << 8) | (b << 16)); + #else + return (uint32) ((0xff << 24) | b | (g << 8) | (r << 16)); + #endif + } + + /** Returns a uint32 which will be in argb order as if constructed with the following mask operation + ((alpha << 24) | (red << 16) | (green << 8) | blue). */ + forcedinline uint32 getInARGBMaskOrder() const noexcept + { + #if JUCE_ANDROID + return (uint32) ((0xff << 24) | (r << 16) | (g << 8) | (b << 0)); + #else + return getNativeARGB(); + #endif + } + + /** Returns a uint32 which when written to memory, will be in the order a, r, g, b. In other words, + if the return-value is read as a uint8 array then the elements will be in the order of a, r, g, b*/ + inline uint32 getInARGBMemoryOrder() const noexcept { - r = (uint8) (argb >> 16); - g = (uint8) (argb >> 8); - b = (uint8) (argb); + #if JUCE_BIG_ENDIAN + return getInARGBMaskOrder(); + #else + return (uint32) ((b << 24) | (g << 16) | (r << 8) | 0xff); + #endif } - forcedinline uint32 getARGB() const noexcept { return 0xff000000 | b | (((uint32) g) << 8) | (((uint32) r) << 16); } - forcedinline uint32 getUnpremultipliedARGB() const noexcept { return getARGB(); } + /** Return channels with an even index and insert zero bytes between them. This is useful for blending + operations. The exact channels which are returned is platform dependent but compatible with the + return value of getEvenBytes of the PixelARGB class. - forcedinline uint32 getRB() const noexcept { return b | (uint32) (r << 16); } - forcedinline uint32 getAG() const noexcept { return (uint32) (0xff0000 | g); } + @see PixelARGB::getEvenBytes */ + forcedinline uint32 getEvenBytes() const noexcept + { + #if JUCE_ANDROID + return (uint32) (r | (b << 16)); + #else + return (uint32) (b | (r << 16)); + #endif + } + /** Return channels with an odd index and insert zero bytes between them. This is useful for blending + operations. The exact channels which are returned is platform dependent but compatible with the + return value of getOddBytes of the PixelARGB class. + + @see PixelARGB::getOddBytes */ + forcedinline uint32 getOddBytes() const noexcept { return (uint32)0xff0000 | g; } + + //============================================================================== forcedinline uint8 getAlpha() const noexcept { return 0xff; } forcedinline uint8 getRed() const noexcept { return r; } forcedinline uint8 getGreen() const noexcept { return g; } @@ -342,6 +432,30 @@ public: forcedinline uint8& getGreen() noexcept { return g; } forcedinline uint8& getBlue() noexcept { return b; } + //============================================================================== + /** Copies another pixel colour over this one. + + This doesn't blend it - this colour is simply replaced by the other one. + Because PixelRGB has no alpha channel, any alpha value in the source pixel + is thrown away. + */ + template + forcedinline void set (const Pixel& src) noexcept + { + b = src.getBlue(); + g = src.getGreen(); + r = src.getRed(); + } + + /** Sets the pixel's colour from individual components. */ + void setARGB (const uint8, const uint8 red, const uint8 green, const uint8 blue) noexcept + { + r = red; + g = green; + b = blue; + } + + //============================================================================== /** Blends another pixel onto this one. This takes into account the opacity of the pixel being overlaid, and blends @@ -350,14 +464,22 @@ public: template forcedinline void blend (const Pixel& src) noexcept { - const uint32 alpha = 0x100 - src.getAlpha(); + const uint32 alpha = (uint32) (0x100 - src.getAlpha()); + + // getEvenBytes returns 0x00rr00bb on non-android + uint32 rb = clampPixelComponents (src.getEvenBytes() + maskPixelComponents (getEvenBytes() * alpha)); + // getOddBytes returns 0x00aa00gg on non-android + uint32 ag = clampPixelComponents (src.getOddBytes() + ((g * alpha) >> 8)); - uint32 rb = clampPixelComponents (src.getRB() + maskPixelComponents (getRB() * alpha)); - uint32 ag = src.getAG() + (g * alpha >> 8); + g = (uint8) (ag & 0xff); + #if JUCE_ANDROID + b = (uint8) (rb >> 16); + r = (uint8) (rb & 0xff); + #else r = (uint8) (rb >> 16); - g = (uint8) clampPixelComponents (ag); - b = (uint8) rb; + b = (uint8) (rb & 0xff); + #endif } forcedinline void blend (const PixelRGB src) noexcept @@ -373,16 +495,23 @@ public: template forcedinline void blend (const Pixel& src, uint32 extraAlpha) noexcept { - uint32 ag = maskPixelComponents (extraAlpha * src.getAG()); + uint32 ag = maskPixelComponents (extraAlpha * src.getOddBytes()); + uint32 rb = maskPixelComponents (extraAlpha * src.getEvenBytes()); + const uint32 alpha = 0x100 - (ag >> 16); - ag += g * alpha >> 8; - uint32 rb = clampPixelComponents (maskPixelComponents (extraAlpha * src.getRB()) - + maskPixelComponents (getRB() * alpha)); + ag = clampPixelComponents (ag + (g * alpha >> 8)); + rb = clampPixelComponents (rb + maskPixelComponents (getEvenBytes() * alpha)); + + g = (uint8) (ag & 0xff); - b = (uint8) rb; - g = (uint8) clampPixelComponents (ag); + #if JUCE_ANDROID + b = (uint8) (rb >> 16); + r = (uint8) (rb & 0xff); + #else r = (uint8) (rb >> 16); + b = (uint8) (rb & 0xff); + #endif } /** Blends another pixel with this one, creating a colour that is somewhere @@ -391,31 +520,24 @@ public: template forcedinline void tween (const Pixel& src, const uint32 amount) noexcept { - uint32 drb = getRB(); - drb += (((src.getRB() - drb) * amount) >> 8); + uint32 dEvenBytes = getEvenBytes(); + dEvenBytes += (((src.getEvenBytes() - dEvenBytes) * amount) >> 8); - uint32 dag = getAG(); - dag += (((src.getAG() - dag) * amount) >> 8); + uint32 dOddBytes = getOddBytes(); + dOddBytes += (((src.getOddBytes() - dOddBytes) * amount) >> 8); - b = (uint8) drb; - g = (uint8) dag; - r = (uint8) (drb >> 16); - } + g = (uint8) (dOddBytes & 0xff); // dOddBytes = 0x00aa00gg - /** Copies another pixel colour over this one. - - This doesn't blend it - this colour is simply replaced by the other one. - Because PixelRGB has no alpha channel, any alpha value in the source pixel - is thrown away. - */ - template - forcedinline void set (const Pixel& src) noexcept - { - b = src.getBlue(); - g = src.getGreen(); - r = src.getRed(); + #if JUCE_ANDROID + r = (uint8) (dEvenBytes & 0xff); // dEvenBytes = 0x00bb00rr + b = (uint8) (dEvenBytes >> 16); + #else + b = (uint8) (dEvenBytes & 0xff); // dEvenBytes = 0x00rr00bb + r = (uint8) (dEvenBytes >> 16); + #endif } + //============================================================================== /** This method is included for compatibility with the PixelARGB class. */ forcedinline void setAlpha (const uint8) noexcept {} @@ -425,14 +547,6 @@ public: /** Multiplies the colour's alpha value with another one. */ forcedinline void multiplyAlpha (float) noexcept {} - /** Sets the pixel's colour from individual components. */ - void setARGB (const uint8, const uint8 red, const uint8 green, const uint8 blue) noexcept - { - r = red; - g = green; - b = blue; - } - /** Premultiplies the pixel's RGB values by its alpha. */ forcedinline void premultiply() noexcept {} @@ -454,6 +568,20 @@ public: private: //============================================================================== + PixelRGB (const uint32 internal) noexcept + { + #if JUCE_ANDROID + b = (uint8) (internal >> 16); + g = (uint8) (internal >> 8); + r = (uint8) (internal); + #else + r = (uint8) (internal >> 16); + g = (uint8) (internal >> 8); + b = (uint8) (internal); + #endif + } + + //============================================================================== #if JUCE_MAC uint8 r, g, b; #else @@ -486,21 +614,36 @@ public: PixelAlpha() noexcept {} ~PixelAlpha() noexcept {} - /** Creates a pixel from a 32-bit argb value. + //============================================================================== + /** Returns a uint32 which represents the pixel in a platform dependent format which is compatible + with the native format of a PixelARGB. - (The argb format is that used by PixelARGB) - */ - PixelAlpha (const uint32 argb) noexcept - { - a = (uint8) (argb >> 24); - } + @see PixelARGB::getNativeARGB */ + forcedinline uint32 getNativeARGB() const noexcept { return (uint32) ((a << 24) | (a << 16) | (a << 8) | a); } - forcedinline uint32 getARGB() const noexcept { return (((uint32) a) << 24) | (((uint32) a) << 16) | (((uint32) a) << 8) | a; } - forcedinline uint32 getUnpremultipliedARGB() const noexcept { return (((uint32) a) << 24) | 0xffffff; } + /** Returns a uint32 which will be in argb order as if constructed with the following mask operation + ((alpha << 24) | (red << 16) | (green << 8) | blue). */ + forcedinline uint32 getInARGBMaskOrder() const noexcept { return getNativeARGB(); } - forcedinline uint32 getRB() const noexcept { return (((uint32) a) << 16) | a; } - forcedinline uint32 getAG() const noexcept { return (((uint32) a) << 16) | a; } + /** Returns a uint32 which when written to memory, will be in the order a, r, g, b. In other words, + if the return-value is read as a uint8 array then the elements will be in the order of a, r, g, b*/ + inline uint32 getInARGBMemoryOrder() const noexcept { return getNativeARGB(); } + /** Return channels with an even index and insert zero bytes between them. This is useful for blending + operations. The exact channels which are returned is platform dependent but compatible with the + return value of getEvenBytes of the PixelARGB class. + + @see PixelARGB::getEvenBytes */ + forcedinline uint32 getEvenBytes() const noexcept { return (uint32) ((a << 16) | a); } + + /** Return channels with an odd index and insert zero bytes between them. This is useful for blending + operations. The exact channels which are returned is platform dependent but compatible with the + return value of getOddBytes of the PixelARGB class. + + @see PixelARGB::getOddBytes */ + forcedinline uint32 getOddBytes() const noexcept { return (uint32) ((a << 16) | a); } + + //============================================================================== forcedinline uint8 getAlpha() const noexcept { return a; } forcedinline uint8& getAlpha() noexcept { return a; } @@ -508,6 +651,24 @@ public: forcedinline uint8 getGreen() const noexcept { return 0; } forcedinline uint8 getBlue() const noexcept { return 0; } + //============================================================================== + /** Copies another pixel colour over this one. + + This doesn't blend it - this colour is simply replaced by the other one. + */ + template + forcedinline void set (const Pixel& src) noexcept + { + a = src.getAlpha(); + } + + /** Sets the pixel's colour from individual components. */ + forcedinline void setARGB (const uint8 a_, const uint8 /*r*/, const uint8 /*g*/, const uint8 /*b*/) noexcept + { + a = a_; + } + + //============================================================================== /** Blends another pixel onto this one. This takes into account the opacity of the pixel being overlaid, and blends @@ -542,16 +703,7 @@ public: a += ((src.getAlpha() - a) * amount) >> 8; } - /** Copies another pixel colour over this one. - - This doesn't blend it - this colour is simply replaced by the other one. - */ - template - forcedinline void set (const Pixel& src) noexcept - { - a = src.getAlpha(); - } - + //============================================================================== /** Replaces the colour's alpha value with another one. */ forcedinline void setAlpha (const uint8 newAlpha) noexcept { @@ -570,12 +722,6 @@ public: a = (uint8) (a * multiplier); } - /** Sets the pixel's colour from individual components. */ - forcedinline void setARGB (const uint8 a_, const uint8 /*r*/, const uint8 /*g*/, const uint8 /*b*/) noexcept - { - a = a_; - } - /** Premultiplies the pixel's RGB values by its alpha. */ forcedinline void premultiply() noexcept {} @@ -589,6 +735,12 @@ public: enum { indexA = 0 }; private: + //============================================================================== + PixelAlpha (const uint32 internal) noexcept + { + a = (uint8) (internal >> 24); + } + //============================================================================== uint8 a; } diff --git a/JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.cpp b/JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.cpp index a0dcd80..c6747f7 100644 --- a/JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.cpp +++ b/JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -32,8 +32,8 @@ namespace jassert ((int) x >= -maxVal && (int) x <= maxVal && (int) y >= -maxVal && (int) y <= maxVal - && (int) w >= -maxVal && (int) w <= maxVal - && (int) h >= -maxVal && (int) h <= maxVal); + && (int) w >= 0 && (int) w <= maxVal + && (int) h >= 0 && (int) h <= maxVal); #endif return Rectangle (x, y, w, h); @@ -427,6 +427,8 @@ void Graphics::drawRect (const Rectangle& r, int lineThickness) const void Graphics::drawRect (Rectangle r, const float lineThickness) const { + jassert (r.getWidth() >= 0.0f && r.getHeight() >= 0.0f); + RectangleList rects; rects.addWithoutMerging (r.removeFromTop (lineThickness)); rects.addWithoutMerging (r.removeFromBottom (lineThickness)); diff --git a/JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.h b/JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.h index ed0bc40..bf54581 100644 --- a/JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.h +++ b/JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -203,7 +203,7 @@ public: The minimumHorizontalScale parameter specifies how much the text can be squashed horizontally to try to squeeze it into the space. If you don't want any horizontal scaling to occur, you - can set this value to 1.0f. + can set this value to 1.0f. Pass 0 if you want it to use a default value. @see GlyphArrangement::addFittedText */ @@ -211,7 +211,7 @@ public: int x, int y, int width, int height, Justification justificationFlags, int maximumNumberOfLines, - float minimumHorizontalScale = 0.7f) const; + float minimumHorizontalScale = 0.0f) const; /** Tries to draw a text string inside a given space. @@ -228,7 +228,7 @@ public: The minimumHorizontalScale parameter specifies how much the text can be squashed horizontally to try to squeeze it into the space. If you don't want any horizontal scaling to occur, you - can set this value to 1.0f. + can set this value to 1.0f. Pass 0 if you want it to use a default value. @see GlyphArrangement::addFittedText */ @@ -236,7 +236,7 @@ public: const Rectangle& area, Justification justificationFlags, int maximumNumberOfLines, - float minimumHorizontalScale = 0.7f) const; + float minimumHorizontalScale = 0.0f) const; //============================================================================== /** Fills the context's entire clip region with the current colour or brush. @@ -374,21 +374,29 @@ public: //============================================================================== /** Draws a line between two points. The line is 1 pixel wide and drawn with the current colour or brush. + TIP: If you're trying to draw horizontal or vertical lines, don't use this - + it's better to use fillRect() instead unless you really need an angled line. */ void drawLine (float startX, float startY, float endX, float endY) const; /** Draws a line between two points with a given thickness. + TIP: If you're trying to draw horizontal or vertical lines, don't use this - + it's better to use fillRect() instead unless you really need an angled line. @see Path::addLineSegment */ void drawLine (float startX, float startY, float endX, float endY, float lineThickness) const; /** Draws a line between two points. The line is 1 pixel wide and drawn with the current colour or brush. + TIP: If you're trying to draw horizontal or vertical lines, don't use this - + it's better to use fillRect() instead unless you really need an angled line. */ void drawLine (const Line& line) const; /** Draws a line between two points with a given thickness. @see Path::addLineSegment + TIP: If you're trying to draw horizontal or vertical lines, don't use this - + it's better to use fillRect() instead unless you really need an angled line. */ void drawLine (const Line& line, float lineThickness) const; diff --git a/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h b/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h index 8a0176f..30a305e 100644 --- a/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h +++ b/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp b/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp index d963ed6..d2d6a1e 100644 --- a/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp +++ b/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -51,7 +51,7 @@ LowLevelGraphicsPostScriptRenderer::LowLevelGraphicsPostScriptRenderer (OutputSt out << "%!PS-Adobe-3.0 EPSF-3.0" "\n%%BoundingBox: 0 0 600 824" "\n%%Pages: 0" - "\n%%Creator: Raw Material Software JUCE" + "\n%%Creator: ROLI Ltd. JUCE" "\n%%Title: " << documentTitle << "\n%%CreationDate: none" "\n%%LanguageLevel: 2" @@ -433,11 +433,11 @@ void LowLevelGraphicsPostScriptRenderer::writeImage (const Image& im, { PixelARGB p (*(const PixelARGB*) pixelData); p.unpremultiply(); - pixel = Colours::white.overlaidWith (Colour (p.getARGB())); + pixel = Colours::white.overlaidWith (Colour (p)); } else if (im.isRGB()) { - pixel = Colour (((const PixelRGB*) pixelData)->getARGB()); + pixel = Colour (*((const PixelRGB*) pixelData)); } else { diff --git a/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h b/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h index 2b893a3..94364f6 100644 --- a/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h +++ b/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp b/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp index a57e4d6..535f74e 100644 --- a/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp +++ b/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h b/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h index 9928092..14f14a6 100644 --- a/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h +++ b/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.cpp b/JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.cpp index 448fab8..2a2eaa0 100644 --- a/JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.cpp +++ b/JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -116,11 +116,11 @@ void DropShadow::drawForPath (Graphics& g, const Path& path) const } } -static void drawShadowSection (Graphics& g, ColourGradient& cg, const Rectangle& area, +static void drawShadowSection (Graphics& g, ColourGradient& cg, Rectangle area, bool isCorner, float centreX, float centreY, float edgeX, float edgeY) { - cg.point1 = area.getRelativePoint (centreX, centreY).toFloat(); - cg.point2 = area.getRelativePoint (edgeX, edgeY).toFloat(); + cg.point1 = area.getRelativePoint (centreX, centreY); + cg.point2 = area.getRelativePoint (edgeX, edgeY); cg.isRadial = isCorner; g.setGradientFill (cg); @@ -134,14 +134,14 @@ void DropShadow::drawForRectangle (Graphics& g, const Rectangle& targetArea for (float i = 0.05f; i < 1.0f; i += 0.1f) cg.addColour (1.0 - i, colour.withMultipliedAlpha (i * i)); - const int radiusInset = (radius + 1) / 2; - const int expandedRadius = radius + radiusInset; + const float radiusInset = (radius + 1) / 2.0f; + const float expandedRadius = radius + radiusInset; - const Rectangle area (targetArea.reduced (radiusInset) + offset); + const Rectangle area (targetArea.toFloat().reduced (radiusInset) + offset.toFloat()); - Rectangle r (area.expanded (expandedRadius)); - Rectangle top (r.removeFromTop (expandedRadius)); - Rectangle bottom (r.removeFromBottom (expandedRadius)); + Rectangle r (area.expanded (expandedRadius)); + Rectangle top (r.removeFromTop (expandedRadius)); + Rectangle bottom (r.removeFromBottom (expandedRadius)); drawShadowSection (g, cg, top.removeFromLeft (expandedRadius), true, 1.0f, 1.0f, 0, 1.0f); drawShadowSection (g, cg, top.removeFromRight (expandedRadius), true, 0, 1.0f, 1.0f, 1.0f); diff --git a/JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.h b/JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.h index 1f9362a..f8b0d8c 100644 --- a/JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.h +++ b/JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.cpp b/JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.cpp index 7db7ef5..83a8d75 100644 --- a/JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.cpp +++ b/JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.h b/JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.h index ab9ce3b..df2fa3e 100644 --- a/JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.h +++ b/JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/effects/juce_ImageEffectFilter.h b/JuceLibraryCode/modules/juce_graphics/effects/juce_ImageEffectFilter.h index 84d6b0b..84a5aaa 100644 --- a/JuceLibraryCode/modules/juce_graphics/effects/juce_ImageEffectFilter.h +++ b/JuceLibraryCode/modules/juce_graphics/effects/juce_ImageEffectFilter.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.cpp b/JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.cpp index 43b6318..a5c5849 100644 --- a/JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.cpp +++ b/JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.h b/JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.h index 8c33d75..6f46e1f 100644 --- a/JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.h +++ b/JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.cpp b/JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.cpp index a2adb04..bb869b0 100644 --- a/JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.cpp +++ b/JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.h b/JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.h index 25db68b..1d71834 100644 --- a/JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.h +++ b/JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.cpp b/JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.cpp index 1b4fc04..671f98c 100644 --- a/JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.cpp +++ b/JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -30,6 +30,7 @@ namespace FontValues } const float defaultFontHeight = 14.0f; + float minimumHorizontalScale = 0.7f; String fallbackFont; String fallbackFontStyle; } @@ -37,6 +38,9 @@ namespace FontValues typedef Typeface::Ptr (*GetTypefaceForFont) (const Font&); GetTypefaceForFont juce_getTypefaceForFont = nullptr; +float Font::getDefaultMinimumHorizontalScaleFactor() noexcept { return FontValues::minimumHorizontalScale; } +void Font::setDefaultMinimumHorizontalScaleFactor (float newValue) noexcept { FontValues::minimumHorizontalScale = newValue; } + //============================================================================== class TypefaceCache : private DeletedAtShutdown { @@ -51,7 +55,7 @@ public: clearSingletonInstance(); } - juce_DeclareSingleton (TypefaceCache, false); + juce_DeclareSingleton (TypefaceCache, false) void setSize (const int numToCache) { diff --git a/JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.h b/JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.h index 9888b27..3fc11bb 100644 --- a/JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.h +++ b/JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -279,8 +279,12 @@ public: //============================================================================== /** Makes the font bold or non-bold. */ void setBold (bool shouldBeBold); - /** Returns a copy of this font with the bold attribute set. */ + + /** Returns a copy of this font with the bold attribute set. + If the font does not have a bold version, this will return the default font. + */ Font boldened() const; + /** Returns true if the font is bold. */ bool isBold() const noexcept; @@ -319,6 +323,18 @@ public: */ void setHorizontalScale (float scaleFactor); + /** Returns the minimum horizontal scale to which fonts may be squashed when trying to + create a layout. + @see setDefaultMinimumHorizontalScaleFactor + */ + static float getDefaultMinimumHorizontalScaleFactor() noexcept; + + /** Sets the minimum horizontal scale to which fonts may be squashed when trying to + create a text layout. + @see getDefaultMinimumHorizontalScaleFactor + */ + static void setDefaultMinimumHorizontalScaleFactor (float newMinimumScaleFactor) noexcept; + /** Returns the font's kerning. This is the extra space added between adjacent characters, as a proportion diff --git a/JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp b/JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp index 8ad3b7b..66a3ca1 100644 --- a/JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp +++ b/JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -75,20 +75,20 @@ PositionedGlyph& PositionedGlyph::operator= (const PositionedGlyph& other) return *this; } -static inline void drawGlyphWithFont (const Graphics& g, int glyph, const Font& font, const AffineTransform& t) +static inline void drawGlyphWithFont (Graphics& g, int glyph, const Font& font, const AffineTransform& t) { LowLevelGraphicsContext& context = g.getInternalContext(); context.setFont (font); context.drawGlyph (glyph, t); } -void PositionedGlyph::draw (const Graphics& g) const +void PositionedGlyph::draw (Graphics& g) const { if (! isWhitespace()) drawGlyphWithFont (g, glyph, font, AffineTransform::translation (x, y)); } -void PositionedGlyph::draw (const Graphics& g, const AffineTransform& transform) const +void PositionedGlyph::draw (Graphics& g, const AffineTransform& transform) const { if (! isWhitespace()) drawGlyphWithFont (g, glyph, font, AffineTransform::translation (x, y).followedBy (transform)); @@ -223,16 +223,14 @@ void GlyphArrangement::addCurtailedLineOfText (const Font& font, break; } - else - { - const float thisX = xOffsets.getUnchecked (i); - const bool isWhitespace = t.isWhitespace(); - glyphs.add (PositionedGlyph (font, t.getAndAdvance(), - newGlyphs.getUnchecked(i), - xOffset + thisX, yOffset, - nextX - thisX, isWhitespace)); - } + const float thisX = xOffsets.getUnchecked (i); + const bool isWhitespace = t.isWhitespace(); + + glyphs.add (PositionedGlyph (font, t.getAndAdvance(), + newGlyphs.getUnchecked(i), + xOffset + thisX, yOffset, + nextX - thisX, isWhitespace)); } } } @@ -316,7 +314,8 @@ void GlyphArrangement::addJustifiedText (const Font& font, break; } - else if (pg.isWhitespace()) + + if (pg.isWhitespace()) { lastWordBreakIndex = i + 1; } @@ -367,8 +366,11 @@ void GlyphArrangement::addFittedText (const Font& f, const float width, const float height, Justification layout, int maximumLines, - const float minimumHorizontalScale) + float minimumHorizontalScale) { + if (minimumHorizontalScale == 0.0f) + minimumHorizontalScale = Font::getDefaultMinimumHorizontalScaleFactor(); + // doesn't make much sense if this is outside a sensible range of 0.5 to 1.0 jassert (minimumHorizontalScale > 0 && minimumHorizontalScale <= 1.0f); @@ -758,19 +760,15 @@ void GlyphArrangement::drawGlyphUnderline (const Graphics& g, const PositionedGl void GlyphArrangement::draw (const Graphics& g) const { - for (int i = 0; i < glyphs.size(); ++i) - { - const PositionedGlyph& pg = glyphs.getReference(i); - - if (pg.font.isUnderlined()) - drawGlyphUnderline (g, pg, i, AffineTransform::identity); - - pg.draw (g); - } + draw (g, AffineTransform()); } void GlyphArrangement::draw (const Graphics& g, const AffineTransform& transform) const { + LowLevelGraphicsContext& context = g.getInternalContext(); + Font lastFont (context.getFont()); + bool needToRestore = false; + for (int i = 0; i < glyphs.size(); ++i) { const PositionedGlyph& pg = glyphs.getReference(i); @@ -778,8 +776,27 @@ void GlyphArrangement::draw (const Graphics& g, const AffineTransform& transform if (pg.font.isUnderlined()) drawGlyphUnderline (g, pg, i, transform); - pg.draw (g, transform); + if (! pg.isWhitespace()) + { + if (lastFont != pg.font) + { + lastFont = pg.font; + + if (! needToRestore) + { + needToRestore = true; + context.saveState(); + } + + context.setFont (lastFont); + } + + context.drawGlyph (pg.glyph, AffineTransform::translation (pg.x, pg.y).followedBy (transform)); + } } + + if (needToRestore) + context.restoreState(); } void GlyphArrangement::createPath (Path& path) const diff --git a/JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.h b/JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.h index ad27a57..6f4243d 100644 --- a/JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.h +++ b/JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -77,14 +77,17 @@ public: void moveBy (float deltaX, float deltaY); //============================================================================== - /** Draws the glyph into a graphics context. */ - void draw (const Graphics& g) const; + /** Draws the glyph into a graphics context. + (Note that this may change the context's currently selected font). + */ + void draw (Graphics& g) const; - /** Draws the glyph into a graphics context, with an extra transform applied to it. */ - void draw (const Graphics& g, const AffineTransform& transform) const; + /** Draws the glyph into a graphics context, with an extra transform applied to it. + (Note that this may change the context's currently selected font). + */ + void draw (Graphics& g, const AffineTransform& transform) const; /** Returns the path for this glyph. - @param path the glyph's outline will be appended to this path */ void createPath (Path& path) const; @@ -205,6 +208,10 @@ public: A Justification parameter lets you specify how the text is laid out within the rectangle, both horizontally and vertically. + The minimumHorizontalScale parameter specifies how much the text can be squashed horizontally + to try to squeeze it into the space. If you don't want any horizontal scaling to occur, you + can set this value to 1.0f. Pass 0 if you want it to use the default value. + @see Graphics::drawFittedText */ void addFittedText (const Font& font, @@ -212,7 +219,7 @@ public: float x, float y, float width, float height, Justification layout, int maximumLinesToUse, - float minimumHorizontalScale = 0.7f); + float minimumHorizontalScale = 0.0f); /** Appends another glyph arrangement to this one. */ void addGlyphArrangement (const GlyphArrangement&); diff --git a/JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.cpp b/JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.cpp index 526cac1..322b8e6 100644 --- a/JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.cpp +++ b/JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -22,8 +22,8 @@ ============================================================================== */ -TextLayout::Glyph::Glyph (const int glyphCode_, Point anchor_, float width_) noexcept - : glyphCode (glyphCode_), anchor (anchor_), width (width_) +TextLayout::Glyph::Glyph (const int glyph, Point anch, float w) noexcept + : glyphCode (glyph), anchor (anch), width (w) { } @@ -70,11 +70,10 @@ TextLayout::Line::Line() noexcept { } -TextLayout::Line::Line (Range stringRange_, Point lineOrigin_, - const float ascent_, const float descent_, const float leading_, - const int numRunsToPreallocate) - : stringRange (stringRange_), lineOrigin (lineOrigin_), - ascent (ascent_), descent (descent_), leading (leading_) +TextLayout::Line::Line (Range range, Point o, float asc, float desc, + float lead, int numRunsToPreallocate) + : stringRange (range), lineOrigin (o), + ascent (asc), descent (desc), leading (lead) { runs.ensureStorageAllocated (numRunsToPreallocate); } @@ -127,14 +126,28 @@ Range TextLayout::Line::getLineBoundsX() const noexcept return range + lineOrigin.x; } +Range TextLayout::Line::getLineBoundsY() const noexcept +{ + return Range (lineOrigin.y - ascent, + lineOrigin.y + descent); +} + +Rectangle TextLayout::Line::getLineBounds() const noexcept +{ + const Range x (getLineBoundsX()), + y (getLineBoundsY()); + + return Rectangle (x.getStart(), y.getStart(), x.getLength(), y.getLength()); +} + //============================================================================== TextLayout::TextLayout() - : width (0), justification (Justification::topLeft) + : width (0), height (0), justification (Justification::topLeft) { } TextLayout::TextLayout (const TextLayout& other) - : width (other.width), + : width (other.width), height (other.height), justification (other.justification) { lines.addCopiesOf (other.lines); @@ -142,16 +155,17 @@ TextLayout::TextLayout (const TextLayout& other) #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS TextLayout::TextLayout (TextLayout&& other) noexcept - : lines (static_cast &&> (other.lines)), - width (other.width), + : lines (static_cast&&> (other.lines)), + width (other.width), height (other.height), justification (other.justification) { } TextLayout& TextLayout::operator= (TextLayout&& other) noexcept { - lines = static_cast &&> (other.lines); + lines = static_cast&&> (other.lines); width = other.width; + height = other.height; justification = other.justification; return *this; } @@ -160,6 +174,7 @@ TextLayout& TextLayout::operator= (TextLayout&& other) noexcept TextLayout& TextLayout::operator= (const TextLayout& other) { width = other.width; + height = other.height; justification = other.justification; lines.clear(); lines.addCopiesOf (other.lines); @@ -170,17 +185,9 @@ TextLayout::~TextLayout() { } -float TextLayout::getHeight() const noexcept -{ - if (const Line* const lastLine = lines.getLast()) - return lastLine->lineOrigin.y + lastLine->descent; - - return 0.0f; -} - TextLayout::Line& TextLayout::getLine (const int index) const { - return *lines[index]; + return *lines.getUnchecked (index); } void TextLayout::ensureStorageAllocated (int numLinesNeeded) @@ -199,7 +206,7 @@ void TextLayout::draw (Graphics& g, const Rectangle& area) const LowLevelGraphicsContext& context = g.getInternalContext(); - for (int i = 0; i < getNumLines(); ++i) + for (int i = 0; i < lines.size(); ++i) { const Line& line = getLine (i); const Point lineOrigin (origin + line.lineOrigin); @@ -221,15 +228,60 @@ void TextLayout::draw (Graphics& g, const Rectangle& area) const } void TextLayout::createLayout (const AttributedString& text, float maxWidth) +{ + createLayout (text, maxWidth, 1.0e7f); +} + +void TextLayout::createLayout (const AttributedString& text, float maxWidth, float maxHeight) { lines.clear(); width = maxWidth; + height = maxHeight; justification = text.getJustification(); if (! createNativeLayout (text)) createStandardLayout (text); - recalculateWidth (text); + recalculateSize (text); +} + +void TextLayout::createLayoutWithBalancedLineLengths (const AttributedString& text, float maxWidth) +{ + createLayoutWithBalancedLineLengths (text, maxWidth, 1.0e7f); +} + +void TextLayout::createLayoutWithBalancedLineLengths (const AttributedString& text, float maxWidth, float maxHeight) +{ + const float minimumWidth = maxWidth / 2.0f; + float bestWidth = maxWidth; + float bestLineProportion = 0.0f; + + while (maxWidth > minimumWidth) + { + createLayout (text, maxWidth, maxHeight); + + if (getNumLines() < 2) + return; + + const float line1 = lines.getUnchecked (lines.size() - 1)->getLineBoundsX().getLength(); + const float line2 = lines.getUnchecked (lines.size() - 2)->getLineBoundsX().getLength(); + const float shortestLine = jmin (line1, line2); + const float prop = (shortestLine > 0) ? jmax (line1, line2) / shortestLine : 1.0f; + + if (prop > 0.9f) + return; + + if (prop > bestLineProportion) + { + bestLineProportion = prop; + bestWidth = maxWidth; + } + + maxWidth -= 10.0f; + } + + if (bestWidth != maxWidth) + createLayout (text, bestWidth, maxHeight); } //============================================================================== @@ -305,8 +357,8 @@ namespace TextLayoutHelpers { const Token& t = *tokens.getUnchecked (i); - Array newGlyphs; - Array xOffsets; + Array newGlyphs; + Array xOffsets; t.font.getGlyphPositions (getTrimmedEndIfNotAllWhitespace (t.text), newGlyphs, xOffsets); if (currentRun == nullptr) currentRun = new TextLayout::Run(); @@ -561,41 +613,6 @@ namespace TextLayoutHelpers }; } -//============================================================================== -void TextLayout::createLayoutWithBalancedLineLengths (const AttributedString& text, float maxWidth) -{ - const float minimumWidth = maxWidth / 2.0f; - float bestWidth = maxWidth; - float bestLineProportion = 0.0f; - - while (maxWidth > minimumWidth) - { - createLayout (text, maxWidth); - - if (getNumLines() < 2) - return; - - const float line1 = lines.getUnchecked (lines.size() - 1)->getLineBoundsX().getLength(); - const float line2 = lines.getUnchecked (lines.size() - 2)->getLineBoundsX().getLength(); - const float shortestLine = jmin (line1, line2); - const float prop = (shortestLine > 0) ? jmax (line1, line2) / shortestLine : 1.0f; - - if (prop > 0.9f) - return; - - if (prop > bestLineProportion) - { - bestLineProportion = prop; - bestWidth = maxWidth; - } - - maxWidth -= 10.0f; - } - - if (bestWidth != maxWidth) - createLayout (text, bestWidth); -} - //============================================================================== void TextLayout::createStandardLayout (const AttributedString& text) { @@ -603,18 +620,24 @@ void TextLayout::createStandardLayout (const AttributedString& text) l.createLayout (text, *this); } -void TextLayout::recalculateWidth (const AttributedString& text) +void TextLayout::recalculateSize (const AttributedString& text) { if (lines.size() > 0 && text.getReadingDirection() != AttributedString::rightToLeft) { - Range range (lines.getFirst()->getLineBoundsX()); + Rectangle bounds (lines.getFirst()->getLineBounds()); for (int i = lines.size(); --i > 0;) - range = range.getUnionWith (lines.getUnchecked(i)->getLineBoundsX()); + bounds = bounds.getUnion (lines.getUnchecked(i)->getLineBounds()); for (int i = lines.size(); --i >= 0;) - lines.getUnchecked(i)->lineOrigin.x -= range.getStart(); + lines.getUnchecked(i)->lineOrigin.x -= bounds.getX(); - width = range.getLength(); + width = bounds.getWidth(); + height = bounds.getHeight(); + } + else + { + width = 0; + height = 0; } } diff --git a/JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.h b/JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.h index b5f9eea..0aaa073 100644 --- a/JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.h +++ b/JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -46,7 +46,7 @@ public: TextLayout (const TextLayout&); TextLayout& operator= (const TextLayout&); #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - TextLayout (TextLayout&& other) noexcept; + TextLayout (TextLayout&&) noexcept; TextLayout& operator= (TextLayout&&) noexcept; #endif @@ -57,7 +57,20 @@ public: /** Creates a layout from the given attributed string. This will replace any data that is currently stored in the layout. */ - void createLayout (const AttributedString& text, float maxWidth); + void createLayout (const AttributedString&, float maxWidth); + + /** Creates a layout from the given attributed string, given some size constraints. + This will replace any data that is currently stored in the layout. + */ + void createLayout (const AttributedString&, float maxWidth, float maxHeight); + + /** Creates a layout, attempting to choose a width which results in lines + of a similar length. + + This will be slower than the normal createLayout method, but produces a + tidier result. + */ + void createLayoutWithBalancedLineLengths (const AttributedString&, float maxWidth); /** Creates a layout, attempting to choose a width which results in lines of a similar length. @@ -65,13 +78,13 @@ public: This will be slower than the normal createLayout method, but produces a tidier result. */ - void createLayoutWithBalancedLineLengths (const AttributedString& text, float maxWidth); + void createLayoutWithBalancedLineLengths (const AttributedString&, float maxWidth, float maxHeight); /** Draws the layout within the specified area. The position of the text within the rectangle is controlled by the justification flags set in the original AttributedString that was used to create this layout. */ - void draw (Graphics& g, const Rectangle& area) const; + void draw (Graphics&, const Rectangle& area) const; //============================================================================== /** A positioned glyph. */ @@ -131,6 +144,12 @@ public: /** Returns the X position range which contains all the glyphs in this line. */ Range getLineBoundsX() const noexcept; + /** Returns the Y position range which contains all the glyphs in this line. */ + Range getLineBoundsY() const noexcept; + + /** Returns the smallest rectangle which contains all the glyphs in this line. */ + Rectangle getLineBounds() const noexcept; + OwnedArray runs; /**< The glyph-runs in this line. */ Range stringRange; /**< The character range that this line represents in the original string that was used to create it. */ @@ -147,7 +166,7 @@ public: float getWidth() const noexcept { return width; } /** Returns the maximum height of the content. */ - float getHeight() const noexcept; + float getHeight() const noexcept { return height; } /** Returns the number of lines in the layout. */ int getNumLines() const noexcept { return lines.size(); } @@ -157,19 +176,19 @@ public: /** Adds a line to the layout. The layout will take ownership of this line object and will delete it when it is no longer needed. */ - void addLine (Line* line); + void addLine (Line*); /** Pre-allocates space for the specified number of lines. */ void ensureStorageAllocated (int numLinesNeeded); private: OwnedArray lines; - float width; + float width, height; Justification justification; void createStandardLayout (const AttributedString&); bool createNativeLayout (const AttributedString&); - void recalculateWidth (const AttributedString&); + void recalculateSize (const AttributedString&); JUCE_LEAK_DETECTOR (TextLayout) }; diff --git a/JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.cpp b/JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.cpp index 4eda6b0..2077cd7 100644 --- a/JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.cpp +++ b/JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.h b/JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.h index a392fb7..0646305 100644 --- a/JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.h +++ b/JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.cpp b/JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.cpp index 85d6f4e..3f17bb9 100644 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.cpp +++ b/JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.h b/JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.h index f30fdb8..0d24ef0 100644 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.h +++ b/JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_BorderSize.h b/JuceLibraryCode/modules/juce_graphics/geometry/juce_BorderSize.h index b6a6686..1d2436f 100644 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_BorderSize.h +++ b/JuceLibraryCode/modules/juce_graphics/geometry/juce_BorderSize.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.cpp b/JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.cpp index 73ee1c3..edefa73 100644 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.cpp +++ b/JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.h b/JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.h index d8b6d66..9f3d5eb 100644 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.h +++ b/JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_Line.h b/JuceLibraryCode/modules/juce_graphics/geometry/juce_Line.h index 95665c5..02f9169 100644 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_Line.h +++ b/JuceLibraryCode/modules/juce_graphics/geometry/juce_Line.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -224,8 +224,8 @@ public: if (length <= 0) return start; - return Point (start.x + static_cast ((delta.x * distanceFromStart - delta.y * perpendicularDistance) / length), - start.y + static_cast ((delta.y * distanceFromStart + delta.x * perpendicularDistance) / length)); + return Point (start.x + static_cast ((delta.x * distanceFromStart - delta.y * perpendicularDistance) / length), + start.y + static_cast ((delta.y * distanceFromStart + delta.x * perpendicularDistance) / length)); } /** Returns the location of the point which is a given distance along this line @@ -267,7 +267,7 @@ public: if (prop >= 0 && prop <= 1.0) { - pointOnLine = start + delta * static_cast (prop); + pointOnLine = start + delta * static_cast (prop); return targetPoint.getDistanceFrom (pointOnLine); } } @@ -301,9 +301,9 @@ public: const double length = delta.x * delta.x + delta.y * delta.y; return length <= 0 ? 0 - : jlimit (ValueType(), static_cast (1), - static_cast ((((point.x - start.x) * delta.x - + (point.y - start.y) * delta.y) / length))); + : jlimit (ValueType(), static_cast (1), + static_cast ((((point.x - start.x) * delta.x + + (point.y - start.y) * delta.y) / length))); } /** Finds the point on this line which is nearest to a given point. @@ -375,40 +375,40 @@ private: { const ValueType along = (p1.y - p3.y) / d2.y; intersection = p1.withX (p3.x + along * d2.x); - return along >= 0 && along <= static_cast (1); + return along >= 0 && along <= static_cast (1); } else if (d2.y == 0 && d1.y != 0) { const ValueType along = (p3.y - p1.y) / d1.y; intersection = p3.withX (p1.x + along * d1.x); - return along >= 0 && along <= static_cast (1); + return along >= 0 && along <= static_cast (1); } else if (d1.x == 0 && d2.x != 0) { const ValueType along = (p1.x - p3.x) / d2.x; intersection = p1.withY (p3.y + along * d2.y); - return along >= 0 && along <= static_cast (1); + return along >= 0 && along <= static_cast (1); } else if (d2.x == 0 && d1.x != 0) { const ValueType along = (p3.x - p1.x) / d1.x; intersection = p3.withY (p1.y + along * d1.y); - return along >= 0 && along <= static_cast (1); + return along >= 0 && along <= static_cast (1); } } - intersection = (p2 + p3) / static_cast (2); + intersection = (p2 + p3) / static_cast (2); return false; } const ValueType along1 = ((p1.y - p3.y) * d2.x - (p1.x - p3.x) * d2.y) / divisor; intersection = p1 + d1 * along1; - if (along1 < 0 || along1 > static_cast (1)) + if (along1 < 0 || along1 > static_cast (1)) return false; const ValueType along2 = ((p1.y - p3.y) * d1.x - (p1.x - p3.x) * d1.y) / divisor; - return along2 >= 0 && along2 <= static_cast (1); + return along2 >= 0 && along2 <= static_cast (1); } }; diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.cpp b/JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.cpp index 5a6b2f8..48c78aa 100644 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.cpp +++ b/JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -501,13 +501,20 @@ void Path::addRoundedRectangle (float x, float y, float w, float h, float cs) addRoundedRectangle (x, y, w, h, cs, cs); } -void Path::addTriangle (const float x1, const float y1, - const float x2, const float y2, - const float x3, const float y3) +void Path::addTriangle (float x1, float y1, + float x2, float y2, + float x3, float y3) { - startNewSubPath (x1, y1); - lineTo (x2, y2); - lineTo (x3, y3); + addTriangle (Point (x1, y1), + Point (x2, y2), + Point (x3, y3)); +} + +void Path::addTriangle (Point p1, Point p2, Point p3) +{ + startNewSubPath (p1); + lineTo (p2); + lineTo (p3); closeSubPath(); } @@ -649,6 +656,20 @@ void Path::addPieSegment (const float x, const float y, closeSubPath(); } +void Path::addPieSegment (Rectangle segmentBounds, + const float fromRadians, + const float toRadians, + const float innerCircleProportionalSize) +{ + addPieSegment (segmentBounds.getX(), + segmentBounds.getY(), + segmentBounds.getWidth(), + segmentBounds.getHeight(), + fromRadians, + toRadians, + innerCircleProportionalSize); +} + //============================================================================== void Path::addLineSegment (const Line& line, float lineThickness) { @@ -1546,17 +1567,17 @@ void Path::restoreFromString (StringRef stringVersion) } //============================================================================== -Path::Iterator::Iterator (const Path& path_) - : path (path_), - index (0) +Path::Iterator::Iterator (const Path& p) noexcept + : x1 (0), y1 (0), x2 (0), y2 (0), x3 (0), y3 (0), + path (p), index (0) { } -Path::Iterator::~Iterator() +Path::Iterator::~Iterator() noexcept { } -bool Path::Iterator::next() +bool Path::Iterator::next() noexcept { const float* const elements = path.data.elements; diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.h b/JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.h index ac319f9..50d2e0f 100644 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.h +++ b/JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -377,6 +377,18 @@ public: float x2, float y2, float x3, float y3); + /** Adds a triangle to the path. + + The triangle is added as a new closed sub-path. (Any currently open paths will be left open). + + Note that whether the vertices are specified in clockwise or anticlockwise + order will affect how the triangle is filled when it overlaps other + shapes (the winding order setting will affect this of course). + */ + void addTriangle (Point point1, + Point point2, + Point point3); + /** Adds a quadrilateral to the path. The quad is added as a new closed sub-path. (Any currently open paths will be left open). @@ -477,7 +489,6 @@ public: @param innerCircleProportionalSize if this is > 0, then the pie will be drawn as a curved band around a hollow ellipse at its centre, where this value indicates the inner ellipse's size with respect to the outer one. - @see addArc */ void addPieSegment (float x, float y, @@ -486,6 +497,29 @@ public: float toRadians, float innerCircleProportionalSize); + /** Adds a "pie-chart" shape to the path. + + The shape is added as a new sub-path. (Any currently open paths will be left open). + + Note that when specifying the start and end angles, the curve will be drawn either clockwise + or anti-clockwise according to whether the end angle is greater than the start. This means + that sometimes you may need to use values greater than 2*Pi for the end angle. + + @param segmentBounds the outer rectangle in which the elliptical outline fits + @param fromRadians the angle (clockwise) in radians at which to start the arc segment (where 0 is the + top-centre of the ellipse) + @param toRadians the angle (clockwise) in radians at which to end the arc segment (where 0 is the + top-centre of the ellipse) + @param innerCircleProportionalSize if this is > 0, then the pie will be drawn as a curved band around a hollow + ellipse at its centre, where this value indicates the inner ellipse's size with + respect to the outer one. + @see addArc + */ + void addPieSegment (Rectangle segmentBounds, + float fromRadians, + float toRadians, + float innerCircleProportionalSize); + /** Adds a line with a specified thickness. The line is added as a new closed sub-path. (Any currently open paths will be @@ -683,8 +717,8 @@ public: { public: //============================================================================== - Iterator (const Path& path); - ~Iterator(); + Iterator (const Path& path) noexcept; + ~Iterator() noexcept; //============================================================================== /** Moves onto the next element in the path. @@ -693,7 +727,7 @@ public: the elementType variable will be set to the type of the current element, and some of the x and y variables will be filled in with values. */ - bool next(); + bool next() noexcept; //============================================================================== enum PathElementType diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.cpp b/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.cpp index 0a15581..ce3c463 100644 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.cpp +++ b/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.h b/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.h index dcb8b90..0c1e5a1 100644 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.h +++ b/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.cpp b/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.cpp index bdac333..a762aab 100644 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.cpp +++ b/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.h b/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.h index 6374741..b390838 100644 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.h +++ b/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_Point.h b/JuceLibraryCode/modules/juce_graphics/geometry/juce_Point.h index 7cc5d49..33dc1c7 100644 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_Point.h +++ b/JuceLibraryCode/modules/juce_graphics/geometry/juce_Point.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -58,6 +58,9 @@ public: /** Returns true if the point is (0, 0). */ bool isOrigin() const noexcept { return x == ValueType() && y == ValueType(); } + /** Returns true if the coordinates are finite values. */ + inline bool isFinite() const noexcept { return juce_isfinite(x) && juce_isfinite(y); } + /** Returns the point's x coordinate. */ inline ValueType getX() const noexcept { return x; } diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_Rectangle.h b/JuceLibraryCode/modules/juce_graphics/geometry/juce_Rectangle.h index 6191d1a..ac9df0e 100644 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_Rectangle.h +++ b/JuceLibraryCode/modules/juce_graphics/geometry/juce_Rectangle.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -52,21 +52,21 @@ public: } /** Creates a rectangle with a given position and size. */ - Rectangle (const ValueType initialX, const ValueType initialY, - const ValueType width, const ValueType height) noexcept + Rectangle (ValueType initialX, ValueType initialY, + ValueType width, ValueType height) noexcept : pos (initialX, initialY), w (width), h (height) { } /** Creates a rectangle with a given size, and a position of (0, 0). */ - Rectangle (const ValueType width, const ValueType height) noexcept + Rectangle (ValueType width, ValueType height) noexcept : w (width), h (height) { } /** Creates a Rectangle from the positions of two opposite corners. */ - Rectangle (const Point corner1, const Point corner2) noexcept + Rectangle (Point corner1, Point corner2) noexcept : pos (jmin (corner1.x, corner2.x), jmin (corner1.y, corner2.y)), w (corner1.x - corner2.x), @@ -80,8 +80,8 @@ public: The right and bottom values must be larger than the left and top ones, or the resulting rectangle will have a negative size. */ - static Rectangle leftTopRightBottom (const ValueType left, const ValueType top, - const ValueType right, const ValueType bottom) noexcept + static Rectangle leftTopRightBottom (ValueType left, ValueType top, + ValueType right, ValueType bottom) noexcept { return Rectangle (left, top, right - left, bottom - top); } @@ -100,6 +100,9 @@ public: /** Returns true if the rectangle's width or height are zero or less */ bool isEmpty() const noexcept { return w <= ValueType() || h <= ValueType(); } + /** Returns true if the rectangle's values are all finite numbers, i.e. not NaN or infinity. */ + inline bool isFinite() const noexcept { return pos.isFinite() && juce_isfinite(w) && juce_isfinite(h); } + /** Returns the x coordinate of the rectangle's left-hand-side. */ inline ValueType getX() const noexcept { return pos.x; } @@ -131,17 +134,17 @@ public: /** Returns the aspect ratio of the rectangle's width / height. If widthOverHeight is true, it returns width / height; if widthOverHeight is false, it returns height / width. */ - ValueType getAspectRatio (const bool widthOverHeight = true) const noexcept { return widthOverHeight ? w / h : h / w; } + ValueType getAspectRatio (bool widthOverHeight = true) const noexcept { return widthOverHeight ? w / h : h / w; } //============================================================================== /** Returns the rectangle's top-left position as a Point. */ inline Point getPosition() const noexcept { return pos; } /** Changes the position of the rectangle's top-left corner (leaving its size unchanged). */ - inline void setPosition (const Point newPos) noexcept { pos = newPos; } + inline void setPosition (Point newPos) noexcept { pos = newPos; } /** Changes the position of the rectangle's top-left corner (leaving its size unchanged). */ - inline void setPosition (const ValueType newX, const ValueType newY) noexcept { pos.setXY (newX, newY); } + inline void setPosition (ValueType newX, ValueType newY) noexcept { pos.setXY (newX, newY); } /** Returns the rectangle's top-left position as a Point. */ Point getTopLeft() const noexcept { return pos; } @@ -155,62 +158,75 @@ public: /** Returns the rectangle's bottom-right position as a Point. */ Point getBottomRight() const noexcept { return Point (pos.x + w, pos.y + h); } + /** Returns the rectangle's left and right positions as a Range. */ + Range getHorizontalRange() const noexcept { return Range::withStartAndLength (pos.x, w); } + + /** Returns the rectangle's top and bottom positions as a Range. */ + Range getVerticalRange() const noexcept { return Range::withStartAndLength (pos.y, h); } + /** Changes the rectangle's size, leaving the position of its top-left corner unchanged. */ - void setSize (const ValueType newWidth, const ValueType newHeight) noexcept { w = newWidth; h = newHeight; } + void setSize (ValueType newWidth, ValueType newHeight) noexcept { w = newWidth; h = newHeight; } /** Changes all the rectangle's coordinates. */ - void setBounds (const ValueType newX, const ValueType newY, - const ValueType newWidth, const ValueType newHeight) noexcept { pos.x = newX; pos.y = newY; w = newWidth; h = newHeight; } + void setBounds (ValueType newX, ValueType newY, + ValueType newWidth, ValueType newHeight) noexcept { pos.x = newX; pos.y = newY; w = newWidth; h = newHeight; } /** Changes the rectangle's X coordinate */ - inline void setX (const ValueType newX) noexcept { pos.x = newX; } + inline void setX (ValueType newX) noexcept { pos.x = newX; } /** Changes the rectangle's Y coordinate */ - inline void setY (const ValueType newY) noexcept { pos.y = newY; } + inline void setY (ValueType newY) noexcept { pos.y = newY; } /** Changes the rectangle's width */ - inline void setWidth (const ValueType newWidth) noexcept { w = newWidth; } + inline void setWidth (ValueType newWidth) noexcept { w = newWidth; } /** Changes the rectangle's height */ - inline void setHeight (const ValueType newHeight) noexcept { h = newHeight; } + inline void setHeight (ValueType newHeight) noexcept { h = newHeight; } /** Changes the position of the rectangle's centre (leaving its size unchanged). */ - inline void setCentre (const ValueType newCentreX, const ValueType newCentreY) noexcept { pos.x = newCentreX - w / (ValueType) 2; pos.y = newCentreY - h / (ValueType) 2; } + inline void setCentre (ValueType newCentreX, ValueType newCentreY) noexcept { pos.x = newCentreX - w / (ValueType) 2; + pos.y = newCentreY - h / (ValueType) 2; } /** Changes the position of the rectangle's centre (leaving its size unchanged). */ - inline void setCentre (const Point newCentre) noexcept { setCentre (newCentre.x, newCentre.y); } + inline void setCentre (Point newCentre) noexcept { setCentre (newCentre.x, newCentre.y); } + + /** Changes the position of the rectangle's left and right edges. */ + void setHorizontalRange (Range range) noexcept { pos.x = range.getStart(); w = range.getLength(); } + + /** Changes the position of the rectangle's top and bottom edges. */ + void setVerticalRange (Range range) noexcept { pos.y = range.getStart(); h = range.getLength(); } /** Returns a rectangle which has the same size and y-position as this one, but with a different x-position. */ - Rectangle withX (const ValueType newX) const noexcept { return Rectangle (newX, pos.y, w, h); } + Rectangle withX (ValueType newX) const noexcept { return Rectangle (newX, pos.y, w, h); } /** Returns a rectangle which has the same size and x-position as this one, but with a different y-position. */ - Rectangle withY (const ValueType newY) const noexcept { return Rectangle (pos.x, newY, w, h); } + Rectangle withY (ValueType newY) const noexcept { return Rectangle (pos.x, newY, w, h); } /** Returns a rectangle with the same size as this one, but a new position. */ - Rectangle withPosition (const ValueType newX, const ValueType newY) const noexcept { return Rectangle (newX, newY, w, h); } + Rectangle withPosition (ValueType newX, ValueType newY) const noexcept { return Rectangle (newX, newY, w, h); } /** Returns a rectangle with the same size as this one, but a new position. */ - Rectangle withPosition (const Point newPos) const noexcept { return Rectangle (newPos.x, newPos.y, w, h); } + Rectangle withPosition (Point newPos) const noexcept { return Rectangle (newPos.x, newPos.y, w, h); } /** Returns a rectangle whose size is the same as this one, but whose top-left position is (0, 0). */ - Rectangle withZeroOrigin() const noexcept { return Rectangle (w, h); } + Rectangle withZeroOrigin() const noexcept { return Rectangle (w, h); } /** Returns a rectangle with the same size as this one, but a new centre position. */ - Rectangle withCentre (const Point newCentre) const noexcept { return Rectangle (newCentre.x - w / (ValueType) 2, - newCentre.y - h / (ValueType) 2, w, h); } + Rectangle withCentre (Point newCentre) const noexcept { return Rectangle (newCentre.x - w / (ValueType) 2, + newCentre.y - h / (ValueType) 2, w, h); } /** Returns a rectangle which has the same position and height as this one, but with a different width. */ - Rectangle withWidth (ValueType newWidth) const noexcept { return Rectangle (pos.x, pos.y, newWidth, h); } + Rectangle withWidth (ValueType newWidth) const noexcept { return Rectangle (pos.x, pos.y, newWidth, h); } /** Returns a rectangle which has the same position and width as this one, but with a different height. */ - Rectangle withHeight (ValueType newHeight) const noexcept { return Rectangle (pos.x, pos.y, w, newHeight); } + Rectangle withHeight (ValueType newHeight) const noexcept { return Rectangle (pos.x, pos.y, w, newHeight); } /** Returns a rectangle with the same top-left position as this one, but a new size. */ - Rectangle withSize (ValueType newWidth, ValueType newHeight) const noexcept { return Rectangle (pos.x, pos.y, newWidth, newHeight); } + Rectangle withSize (ValueType newWidth, ValueType newHeight) const noexcept { return Rectangle (pos.x, pos.y, newWidth, newHeight); } /** Returns a rectangle with the same centre position as this one, but a new size. */ - Rectangle withSizeKeepingCentre (ValueType newWidth, ValueType newHeight) const noexcept { return Rectangle (pos.x + (w - newWidth) / (ValueType) 2, - pos.y + (h - newHeight) / (ValueType) 2, newWidth, newHeight); } + Rectangle withSizeKeepingCentre (ValueType newWidth, ValueType newHeight) const noexcept { return Rectangle (pos.x + (w - newWidth) / (ValueType) 2, + pos.y + (h - newHeight) / (ValueType) 2, newWidth, newHeight); } /** Moves the x position, adjusting the width so that the right-hand edge remains in the same place. If the x is moved to be on the right of the current right-hand edge, the width will be set to zero. @@ -274,41 +290,41 @@ public: //============================================================================== /** Moves the rectangle's position by adding amount to its x and y coordinates. */ - void translate (const ValueType deltaX, - const ValueType deltaY) noexcept + void translate (ValueType deltaX, + ValueType deltaY) noexcept { pos.x += deltaX; pos.y += deltaY; } /** Returns a rectangle which is the same as this one moved by a given amount. */ - Rectangle translated (const ValueType deltaX, - const ValueType deltaY) const noexcept + Rectangle translated (ValueType deltaX, + ValueType deltaY) const noexcept { return Rectangle (pos.x + deltaX, pos.y + deltaY, w, h); } /** Returns a rectangle which is the same as this one moved by a given amount. */ - Rectangle operator+ (const Point deltaPosition) const noexcept + Rectangle operator+ (Point deltaPosition) const noexcept { return Rectangle (pos.x + deltaPosition.x, pos.y + deltaPosition.y, w, h); } /** Moves this rectangle by a given amount. */ - Rectangle& operator+= (const Point deltaPosition) noexcept + Rectangle& operator+= (Point deltaPosition) noexcept { pos += deltaPosition; return *this; } /** Returns a rectangle which is the same as this one moved by a given amount. */ - Rectangle operator- (const Point deltaPosition) const noexcept + Rectangle operator- (Point deltaPosition) const noexcept { return Rectangle (pos.x - deltaPosition.x, pos.y - deltaPosition.y, w, h); } /** Moves this rectangle by a given amount. */ - Rectangle& operator-= (const Point deltaPosition) noexcept + Rectangle& operator-= (Point deltaPosition) noexcept { pos -= deltaPosition; return *this; @@ -393,8 +409,8 @@ public: Effectively, its new size is (x - deltaX, y - deltaY, w + deltaX * 2, h + deltaY * 2). @see expanded, reduce, reduced */ - void expand (const ValueType deltaX, - const ValueType deltaY) noexcept + void expand (ValueType deltaX, + ValueType deltaY) noexcept { const ValueType nw = jmax (ValueType(), w + deltaX * 2); const ValueType nh = jmax (ValueType(), h + deltaY * 2); @@ -406,8 +422,8 @@ public: Effectively, the rectangle returned is (x - deltaX, y - deltaY, w + deltaX * 2, h + deltaY * 2). @see expand, reduce, reduced */ - Rectangle expanded (const ValueType deltaX, - const ValueType deltaY) const noexcept + Rectangle expanded (ValueType deltaX, + ValueType deltaY) const noexcept { const ValueType nw = jmax (ValueType(), w + deltaX * 2); const ValueType nh = jmax (ValueType(), h + deltaY * 2); @@ -419,7 +435,7 @@ public: Effectively, the rectangle returned is (x - delta, y - delta, w + delta * 2, h + delta * 2). @see expand, reduce, reduced */ - Rectangle expanded (const ValueType delta) const noexcept + Rectangle expanded (ValueType delta) const noexcept { return expanded (delta, delta); } @@ -429,8 +445,8 @@ public: Effectively, its new size is (x + deltaX, y + deltaY, w - deltaX * 2, h - deltaY * 2). @see reduced, expand, expanded */ - void reduce (const ValueType deltaX, - const ValueType deltaY) noexcept + void reduce (ValueType deltaX, + ValueType deltaY) noexcept { expand (-deltaX, -deltaY); } @@ -440,8 +456,8 @@ public: Effectively, the rectangle returned is (x + deltaX, y + deltaY, w - deltaX * 2, h - deltaY * 2). @see reduce, expand, expanded */ - Rectangle reduced (const ValueType deltaX, - const ValueType deltaY) const noexcept + Rectangle reduced (ValueType deltaX, + ValueType deltaY) const noexcept { return expanded (-deltaX, -deltaY); } @@ -451,7 +467,7 @@ public: Effectively, the rectangle returned is (x + delta, y + delta, w - delta * 2, h - delta * 2). @see reduce, expand, expanded */ - Rectangle reduced (const ValueType delta) const noexcept + Rectangle reduced (ValueType delta) const noexcept { return reduced (delta, delta); } @@ -465,7 +481,7 @@ public: If amountToRemove is greater than the height of this rectangle, it'll be clipped to that value. */ - Rectangle removeFromTop (const ValueType amountToRemove) noexcept + Rectangle removeFromTop (ValueType amountToRemove) noexcept { const Rectangle r (pos.x, pos.y, w, jmin (amountToRemove, h)); pos.y += r.h; h -= r.h; @@ -481,7 +497,7 @@ public: If amountToRemove is greater than the width of this rectangle, it'll be clipped to that value. */ - Rectangle removeFromLeft (const ValueType amountToRemove) noexcept + Rectangle removeFromLeft (ValueType amountToRemove) noexcept { const Rectangle r (pos.x, pos.y, jmin (amountToRemove, w), h); pos.x += r.w; w -= r.w; @@ -530,13 +546,13 @@ public: bool operator!= (const Rectangle& other) const noexcept { return pos != other.pos || w != other.w || h != other.h; } /** Returns true if this coordinate is inside the rectangle. */ - bool contains (const ValueType xCoord, const ValueType yCoord) const noexcept + bool contains (ValueType xCoord, ValueType yCoord) const noexcept { return xCoord >= pos.x && yCoord >= pos.y && xCoord < pos.x + w && yCoord < pos.y + h; } /** Returns true if this coordinate is inside the rectangle. */ - bool contains (const Point point) const noexcept + bool contains (Point point) const noexcept { return point.x >= pos.x && point.y >= pos.y && point.x < pos.x + w && point.y < pos.y + h; } @@ -549,7 +565,7 @@ public: } /** Returns the nearest point to the specified point that lies within this rectangle. */ - Point getConstrainedPoint (const Point point) const noexcept + Point getConstrainedPoint (Point point) const noexcept { return Point (jlimit (pos.x, pos.x + w, point.x), jlimit (pos.y, pos.y + h, point.y)); diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.h b/JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.h index f1b81a7..8863a0e 100644 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.h +++ b/JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -101,9 +101,14 @@ public: The rectangle being added will first be clipped to remove any parts of it that overlap existing rectangles in the list, and adjacent rectangles will be merged into it. + + The rectangle can have any size and may be empty, but if it's floating point + then it's expected to not contain any INF values. */ void add (const RectangleType& rect) { + jassert (rect.isFinite()); // You must provide a valid rectangle to this method! + if (! rect.isEmpty()) { if (rects.size() == 0) @@ -168,9 +173,14 @@ public: This simply adds the rectangle to the end, it doesn't merge it or remove any overlapping bits. + + The rectangle can have any size and may be empty, but if it's floating point + then it's expected to not contain any INF values. */ void addWithoutMerging (const RectangleType& rect) { + jassert (rect.isFinite()); // You must provide a valid rectangle to this method! + if (! rect.isEmpty()) rects.add (rect); } @@ -300,6 +310,8 @@ public: */ bool clipTo (const RectangleType& rect) { + jassert (rect.isFinite()); // You must provide a valid rectangle to this method! + bool notEmpty = false; if (rect.isEmpty()) @@ -367,6 +379,8 @@ public: */ bool getIntersectionWith (const RectangleType& rect, RectangleList& destRegion) const { + jassert (rect.isFinite()); // You must provide a valid rectangle to this method! + destRegion.clear(); if (! rect.isEmpty()) diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jinclude.h b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jinclude.h index ab66008..bccfd54 100644 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jinclude.h +++ b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jinclude.h @@ -180,11 +180,16 @@ static const int extend_test[16] = /* entry n is 2**(n-1) */ { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 }; +#define SHIFTED_BITS_PLUS_ONE(n) (int) (((unsigned int) -1) << n) + 1 + static const int extend_offset[16] = /* entry n is (-1 << n) + 1 */ - { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1, - ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1, - ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1, - ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 }; + { 0, + SHIFTED_BITS_PLUS_ONE (1), SHIFTED_BITS_PLUS_ONE (2), SHIFTED_BITS_PLUS_ONE (3), SHIFTED_BITS_PLUS_ONE (4), + SHIFTED_BITS_PLUS_ONE (5), SHIFTED_BITS_PLUS_ONE (6), SHIFTED_BITS_PLUS_ONE (7), SHIFTED_BITS_PLUS_ONE (8), + SHIFTED_BITS_PLUS_ONE (9), SHIFTED_BITS_PLUS_ONE (10), SHIFTED_BITS_PLUS_ONE (11), SHIFTED_BITS_PLUS_ONE (12), + SHIFTED_BITS_PLUS_ONE (13), SHIFTED_BITS_PLUS_ONE (14), SHIFTED_BITS_PLUS_ONE (15) }; + +#undef SHIFTED_BITS_PLUS_ONE #endif /* AVOID_TABLES */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/juce_GIFLoader.cpp b/JuceLibraryCode/modules/juce_graphics/image_formats/juce_GIFLoader.cpp index 2c9066f..ff5cd8f 100644 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/juce_GIFLoader.cpp +++ b/JuceLibraryCode/modules/juce_graphics/image_formats/juce_GIFLoader.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp b/JuceLibraryCode/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp index 0f56e32..1f98a97 100644 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp +++ b/JuceLibraryCode/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/juce_PNGLoader.cpp b/JuceLibraryCode/modules/juce_graphics/image_formats/juce_PNGLoader.cpp index 636b293..fa3b887 100644 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/juce_PNGLoader.cpp +++ b/JuceLibraryCode/modules/juce_graphics/image_formats/juce_PNGLoader.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/images/juce_Image.cpp b/JuceLibraryCode/modules/juce_graphics/images/juce_Image.cpp index e7be9a3..4299852 100644 --- a/JuceLibraryCode/modules/juce_graphics/images/juce_Image.cpp +++ b/JuceLibraryCode/modules/juce_graphics/images/juce_Image.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -39,6 +39,11 @@ void ImagePixelData::sendDataChangeMessage() listeners.call (&Listener::imageDataChanged, this); } +int ImagePixelData::getSharedCount() const noexcept +{ + return getReferenceCount(); +} + //============================================================================== ImageType::ImageType() {} ImageType::~ImageType() {} @@ -177,9 +182,13 @@ public: return newImage.getPixelData(); } - ImageType* createType() const override { return image->createType(); } + ImageType* createType() const override { return image->createType(); } + + /* as we always hold a reference to image, don't double count */ + int getSharedCount() const noexcept override { return getReferenceCount() + image->getSharedCount() - 1; } private: + friend class Image; const ImagePixelData::Ptr image; const Rectangle area; @@ -246,7 +255,7 @@ Image::~Image() const Image Image::null; -int Image::getReferenceCount() const noexcept { return image == nullptr ? 0 : image->getReferenceCount(); } +int Image::getReferenceCount() const noexcept { return image == nullptr ? 0 : image->getSharedCount(); } int Image::getWidth() const noexcept { return image == nullptr ? 0 : image->width; } int Image::getHeight() const noexcept { return image == nullptr ? 0 : image->height; } Rectangle Image::getBounds() const noexcept { return image == nullptr ? Rectangle() : Rectangle (image->width, image->height); } @@ -263,7 +272,7 @@ LowLevelGraphicsContext* Image::createLowLevelContext() const void Image::duplicateIfShared() { - if (image != nullptr && image->getReferenceCount() > 1) + if (getReferenceCount() > 1) image = image->clone(); } @@ -398,9 +407,9 @@ Colour Image::BitmapData::getPixelColour (const int x, const int y) const noexce switch (pixelFormat) { - case Image::ARGB: return Colour (((const PixelARGB*) pixel)->getUnpremultipliedARGB()); - case Image::RGB: return Colour (((const PixelRGB*) pixel)->getUnpremultipliedARGB()); - case Image::SingleChannel: return Colour (((const PixelAlpha*) pixel)->getUnpremultipliedARGB()); + case Image::ARGB: return Colour ( ((const PixelARGB*) pixel)->getUnpremultiplied()); + case Image::RGB: return Colour (*((const PixelRGB*) pixel)); + case Image::SingleChannel: return Colour (*((const PixelAlpha*) pixel)); default: jassertfalse; break; } diff --git a/JuceLibraryCode/modules/juce_graphics/images/juce_Image.h b/JuceLibraryCode/modules/juce_graphics/images/juce_Image.h index 0f67b4e..189094c 100644 --- a/JuceLibraryCode/modules/juce_graphics/images/juce_Image.h +++ b/JuceLibraryCode/modules/juce_graphics/images/juce_Image.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -443,6 +443,11 @@ public: virtual ImageType* createType() const = 0; /** Initialises a BitmapData object. */ virtual void initialiseBitmapData (Image::BitmapData&, int x, int y, Image::BitmapData::ReadWriteMode) = 0; + /** Returns the number of Image objects which are currently referring to the same internal + shared image data. This is different to the reference count as an instance of ImagePixelData + can internally depend on another ImagePixelData via it's member variables. */ + virtual int getSharedCount() const noexcept; + /** The pixel format of the image data. */ const Image::PixelFormat pixelFormat; diff --git a/JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.cpp b/JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.cpp index 992ff32..797c796 100644 --- a/JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.cpp +++ b/JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -110,7 +110,7 @@ public: unsigned int cacheTimeout; - juce_DeclareSingleton_SingleThreaded_Minimal (ImageCache::Pimpl); + juce_DeclareSingleton_SingleThreaded_Minimal (ImageCache::Pimpl) private: OwnedArray images; @@ -119,7 +119,7 @@ private: JUCE_DECLARE_NON_COPYABLE (Pimpl) }; -juce_ImplementSingleton_SingleThreaded (ImageCache::Pimpl); +juce_ImplementSingleton_SingleThreaded (ImageCache::Pimpl) //============================================================================== diff --git a/JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.h b/JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.h index c424395..77bdc60 100644 --- a/JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.h +++ b/JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp b/JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp index 78e4fb8..95a184c 100644 --- a/JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp +++ b/JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.h b/JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.h index 885dc6b..67d55d6 100644 --- a/JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.h +++ b/JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.cpp b/JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.cpp index a1cfd6a..3ce2dc6 100644 --- a/JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.cpp +++ b/JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.h b/JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.h index 76a13d2..e54ede6 100644 --- a/JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.h +++ b/JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/juce_graphics.cpp b/JuceLibraryCode/modules/juce_graphics/juce_graphics.cpp index 627d565..2d5a096 100644 --- a/JuceLibraryCode/modules/juce_graphics/juce_graphics.cpp +++ b/JuceLibraryCode/modules/juce_graphics/juce_graphics.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -73,17 +73,17 @@ #ifndef JUCE_USE_FREETYPE #define JUCE_USE_FREETYPE 1 #endif +#endif - #if ! JUCE_USE_FREETYPE_AMALGAMATED +#if JUCE_USE_FREETYPE + #if JUCE_USE_FREETYPE_AMALGAMATED + #include "native/freetype/FreeTypeAmalgam.h" + #else #include #include FT_FREETYPE_H #endif #endif -#if JUCE_USE_FREETYPE && JUCE_USE_FREETYPE_AMALGAMATED - #include "native/freetype/FreeTypeAmalgam.h" -#endif - #undef SIZEOF #if (JUCE_MAC || JUCE_IOS) && USE_COREGRAPHICS_RENDERING && JUCE_USE_COREIMAGE_LOADER diff --git a/JuceLibraryCode/modules/juce_graphics/juce_graphics.h b/JuceLibraryCode/modules/juce_graphics/juce_graphics.h index 9a5a015..a792131 100644 --- a/JuceLibraryCode/modules/juce_graphics/juce_graphics.h +++ b/JuceLibraryCode/modules/juce_graphics/juce_graphics.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/juce_graphics.mm b/JuceLibraryCode/modules/juce_graphics/juce_graphics.mm index b36b0ed..6e033f6 100644 --- a/JuceLibraryCode/modules/juce_graphics/juce_graphics.mm +++ b/JuceLibraryCode/modules/juce_graphics/juce_graphics.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/juce_module_info b/JuceLibraryCode/modules/juce_graphics/juce_module_info index 75903c2..053c947 100644 --- a/JuceLibraryCode/modules/juce_graphics/juce_module_info +++ b/JuceLibraryCode/modules/juce_graphics/juce_module_info @@ -1,7 +1,7 @@ { "id": "juce_graphics", "name": "JUCE graphics classes", - "version": "3.0.8", + "version": "3.2.0", "description": "Classes for 2D vector graphics, image loading/saving, font handling, etc.", "website": "http://www.juce.com/juce", "license": "GPL/Commercial", diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_RenderingHelpers.h b/JuceLibraryCode/modules/juce_graphics/native/juce_RenderingHelpers.h index 885cebd..cd8cd36 100644 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_RenderingHelpers.h +++ b/JuceLibraryCode/modules/juce_graphics/native/juce_RenderingHelpers.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -162,15 +162,6 @@ public: } //============================================================================== - void drawGlyph (RenderTargetType& target, const Font& font, const int glyphNumber, Point pos) - { - if (ReferenceCountedObjectPtr glyph = findOrCreateGlyph (font, glyphNumber)) - { - glyph->lastAccessCount = ++accessCounter; - glyph->draw (target, pos); - } - } - void reset() { const ScopedLock sl (lock); @@ -180,11 +171,14 @@ public: misses.set (0); } -private: - friend struct ContainerDeletePolicy; - ReferenceCountedArray glyphs; - Atomic accessCounter, hits, misses; - CriticalSection lock; + void drawGlyph (RenderTargetType& target, const Font& font, const int glyphNumber, Point pos) + { + if (ReferenceCountedObjectPtr glyph = findOrCreateGlyph (font, glyphNumber)) + { + glyph->lastAccessCount = ++accessCounter; + glyph->draw (target, pos); + } + } ReferenceCountedObjectPtr findOrCreateGlyph (const Font& font, int glyphNumber) { @@ -203,6 +197,12 @@ private: return g; } +private: + friend struct ContainerDeletePolicy; + ReferenceCountedArray glyphs; + Atomic accessCounter, hits, misses; + CriticalSection lock; + CachedGlyphType* findExistingGlyph (const Font& font, int glyphNumber) const { for (int i = 0; i < glyphs.size(); ++i) @@ -302,12 +302,10 @@ public: } Font font; + ScopedPointer edgeTable; int glyph, lastAccessCount; bool snapToIntegerCoordinate; -private: - ScopedPointer edgeTable; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CachedGlyphEdgeTable) }; @@ -435,12 +433,12 @@ namespace GradientPixelIterators if (vertical) { scale = roundToInt ((numEntries << (int) numScaleBits) / (double) (p2.y - p1.y)); - start = roundToInt (p1.y * scale); + start = roundToInt (p1.y * (float) scale); } else if (horizontal) { scale = roundToInt ((numEntries << (int) numScaleBits) / (double) (p2.x - p1.x)); - start = roundToInt (p1.x * scale); + start = roundToInt (p1.x * (float) scale); } else { @@ -536,8 +534,9 @@ namespace GradientPixelIterators forcedinline void setY (const int y) noexcept { - lineYM01 = inverseTransform.mat01 * y + inverseTransform.mat02 - gx1; - lineYM11 = inverseTransform.mat11 * y + inverseTransform.mat12 - gy1; + const float floatY = (float) y; + lineYM01 = inverseTransform.mat01 * floatY + inverseTransform.mat02 - gx1; + lineYM11 = inverseTransform.mat11 * floatY + inverseTransform.mat12 - gy1; } inline PixelARGB getPixel (const int px) const noexcept @@ -1303,7 +1302,7 @@ namespace EdgeTableFillers sx += pixelOffset; sy += pixelOffset; float x1 = sx, y1 = sy; - sx += numPixels; + sx += (float) numPixels; inverseTransform.transformPoints (x1, y1, sx, sy); xBresenham.set ((int) (x1 * 256.0f), (int) (sx * 256.0f), numPixels, pixelOffsetInt); diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_android_Fonts.cpp b/JuceLibraryCode/modules/juce_graphics/native/juce_android_Fonts.cpp index 29702a2..78d2b49 100644 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_android_Fonts.cpp +++ b/JuceLibraryCode/modules/juce_graphics/native/juce_android_Fonts.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -138,22 +138,47 @@ public: { JNIEnv* const env = getEnv(); - const bool isBold = style.contains ("Bold"); - const bool isItalic = style.contains ("Italic"); + // First check whether there's an embedded asset with this font name: + typeface = GlobalRef (android.activity.callObjectMethod (JuceAppActivity.getTypeFaceFromAsset, + javaString ("fonts/" + name).get())); - File fontFile (getFontFile (name, style)); + if (typeface.get() == nullptr) + { + const bool isBold = style.contains ("Bold"); + const bool isItalic = style.contains ("Italic"); + + File fontFile (getFontFile (name, style)); - if (! fontFile.exists()) - fontFile = findFontFile (name, isBold, isItalic); + if (! fontFile.exists()) + fontFile = findFontFile (name, isBold, isItalic); - if (fontFile.exists()) - typeface = GlobalRef (env->CallStaticObjectMethod (TypefaceClass, TypefaceClass.createFromFile, - javaString (fontFile.getFullPathName()).get())); - else - typeface = GlobalRef (env->CallStaticObjectMethod (TypefaceClass, TypefaceClass.create, - javaString (getName()).get(), - (isBold ? 1 : 0) + (isItalic ? 2 : 0))); + if (fontFile.exists()) + typeface = GlobalRef (env->CallStaticObjectMethod (TypefaceClass, TypefaceClass.createFromFile, + javaString (fontFile.getFullPathName()).get())); + else + typeface = GlobalRef (env->CallStaticObjectMethod (TypefaceClass, TypefaceClass.create, + javaString (getName()).get(), + (isBold ? 1 : 0) + (isItalic ? 2 : 0))); + } + initialise (env); + } + + AndroidTypeface (const void* data, size_t size) + : Typeface (String(), String()) + { + JNIEnv* const env = getEnv(); + + LocalRef bytes (env->NewByteArray (size)); + env->SetByteArrayRegion (bytes, 0, size, (const jbyte*) data); + + typeface = GlobalRef (android.activity.callObjectMethod (JuceAppActivity.getTypeFaceFromByteArray, bytes.get())); + + initialise (env); + } + + void initialise (JNIEnv* const env) + { rect = GlobalRef (env->NewObject (RectClass, RectClass.constructor, 0, 0, 0, 0)); paint = GlobalRef (GraphicsHelpers::createPaint (Graphics::highResamplingQuality)); @@ -315,10 +340,9 @@ Typeface::Ptr Typeface::createSystemTypefaceFor (const Font& font) return new AndroidTypeface (font); } -Typeface::Ptr Typeface::createSystemTypefaceFor (const void*, size_t) +Typeface::Ptr Typeface::createSystemTypefaceFor (const void* data, size_t size) { - jassertfalse; // not yet implemented! - return nullptr; + return new AndroidTypeface (data, size); } void Typeface::scanFolderForFonts (const File&) diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_android_GraphicsContext.cpp b/JuceLibraryCode/modules/juce_graphics/native/juce_android_GraphicsContext.cpp index 9382c1d..4c48812 100644 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_android_GraphicsContext.cpp +++ b/JuceLibraryCode/modules/juce_graphics/native/juce_android_GraphicsContext.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_freetype_Fonts.cpp b/JuceLibraryCode/modules/juce_graphics/native/juce_freetype_Fonts.cpp index 43a6436..cc87924 100644 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_freetype_Fonts.cpp +++ b/JuceLibraryCode/modules/juce_graphics/native/juce_freetype_Fonts.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -224,7 +224,7 @@ public: sansSerif.addIfNotAlreadyThere (faces.getUnchecked(i)->family); } - juce_DeclareSingleton_SingleThreaded_Minimal (FTTypefaceList); + juce_DeclareSingleton_SingleThreaded_Minimal (FTTypefaceList) private: FTLibWrapper::Ptr library; @@ -244,7 +244,7 @@ private: if (face.face != 0) { if (faceIndex == 0) - numFaces = face.face->num_faces; + numFaces = (int) face.face->num_faces; if ((face.face->face_flags & FT_FACE_FLAG_SCALABLE) != 0) faces.add (new KnownTypeface (file, faceIndex, face)); @@ -307,9 +307,9 @@ public: faceWrapper->face->style_name); } - void initialiseCharacteristics (const String& name, const String& style) + void initialiseCharacteristics (const String& fontName, const String& fontStyle) { - setCharacteristics (name, style, + setCharacteristics (fontName, fontStyle, faceWrapper->face->ascender / (float) (faceWrapper->face->ascender - faceWrapper->face->descender), L' '); } @@ -319,7 +319,7 @@ public: if (faceWrapper != nullptr) { FT_Face face = faceWrapper->face; - const unsigned int glyphIndex = FT_Get_Char_Index (face, character); + const unsigned int glyphIndex = FT_Get_Char_Index (face, (FT_ULong) character); if (FT_Load_Glyph (face, glyphIndex, FT_LOAD_NO_SCALE | FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_TRANSFORM | FT_LOAD_NO_HINTING) == 0 && face->glyph->format == ft_glyph_format_outline) @@ -332,7 +332,7 @@ public: addGlyph (character, destShape, face->glyph->metrics.horiAdvance * scale); if ((face->face_flags & FT_FACE_FLAG_KERNING) != 0) - addKerning (face, character, glyphIndex); + addKerning (face, (uint32) character, glyphIndex); return true; } @@ -437,7 +437,7 @@ private: const float height = (float) (face->ascender - face->descender); uint32 rightGlyphIndex; - uint32 rightCharCode = FT_Get_First_Char (face, &rightGlyphIndex); + FT_ULong rightCharCode = FT_Get_First_Char (face, &rightGlyphIndex); while (rightGlyphIndex != 0) { @@ -445,7 +445,7 @@ private: if (FT_Get_Kerning (face, glyphIndex, rightGlyphIndex, ft_kerning_unscaled, &kerning) == 0 && kerning.x != 0) - addKerningPair (character, rightCharCode, kerning.x / height); + addKerningPair ((juce_wchar) character, (juce_wchar) rightCharCode, kerning.x / height); rightCharCode = FT_Get_Next_Char (face, rightCharCode, &rightGlyphIndex); } diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_linux_Fonts.cpp b/JuceLibraryCode/modules/juce_graphics/native/juce_linux_Fonts.cpp index 0869ec7..39dd384 100644 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_linux_Fonts.cpp +++ b/JuceLibraryCode/modules/juce_graphics/native/juce_linux_Fonts.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h b/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h index bf26ce8..df34033 100644 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h +++ b/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -77,7 +77,6 @@ private: const CGFloat flipHeight; float targetScale; CGColorSpaceRef rgbColourSpace, greyColourSpace; - CGFunctionCallbacks gradientCallbacks; mutable Rectangle lastClipRect; mutable bool lastClipRectIsValid; @@ -87,24 +86,17 @@ private: SavedState (const SavedState&); ~SavedState(); - void setFill (const FillType& newFill); - CGShadingRef getShading (CoreGraphicsContext& owner); - - static void gradientCallback (void* info, const CGFloat* inData, CGFloat* outData); + void setFill (const FillType&); FillType fillType; Font font; CGFontRef fontRef; CGAffineTransform fontTransform; - - private: - CGShadingRef shading; - HeapBlock gradientLookupTable; - int numGradientLookupEntries; + CGGradientRef gradient; }; - ScopedPointer state; - OwnedArray stateStack; + ScopedPointer state; + OwnedArray stateStack; void drawGradient(); void createPath (const Path&) const; diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm b/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm index 44e344f..a6f9874 100644 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm +++ b/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -25,7 +25,7 @@ #include "juce_mac_CoreGraphicsContext.h" //============================================================================== -class CoreGraphicsImage : public ImagePixelData +class CoreGraphicsImage : public ImagePixelData { public: CoreGraphicsImage (const Image::PixelFormat format, const int w, const int h, const bool clearImage) @@ -174,13 +174,11 @@ CoreGraphicsContext::CoreGraphicsContext (CGContextRef c, const float h, const f CGContextRetain (context); CGContextSaveGState(context); CGContextSetShouldSmoothFonts (context, true); + CGContextSetAllowsFontSmoothing (context, true); CGContextSetShouldAntialias (context, true); CGContextSetBlendMode (context, kCGBlendModeNormal); rgbColourSpace = CGColorSpaceCreateDeviceRGB(); greyColourSpace = CGColorSpaceCreateDeviceGray(); - gradientCallbacks.version = 0; - gradientCallbacks.evaluate = SavedState::gradientCallback; - gradientCallbacks.releaseInfo = 0; setFont (Font()); } @@ -218,8 +216,6 @@ float CoreGraphicsContext::getPhysicalPixelScaleFactor() const CGAffineTransform t = CGContextGetCTM (context); return targetScale * (float) (juce_hypot (t.a, t.c) + juce_hypot (t.b, t.d)) / 2.0f; - -// return targetScale * (float) (t.a + t.d) / 2.0f; } bool CoreGraphicsContext::clipToRectangle (const Rectangle& r) @@ -248,19 +244,17 @@ bool CoreGraphicsContext::clipToRectangleListWithoutTest (const RectangleList(); return false; } - else - { - const size_t numRects = (size_t) clipRegion.getNumRectangles(); - HeapBlock rects (numRects); - int i = 0; - for (const Rectangle* r = clipRegion.begin(), * const e = clipRegion.end(); r != e; ++r) - rects[i++] = CGRectMake (r->getX(), flipHeight - r->getBottom(), r->getWidth(), r->getHeight()); + const size_t numRects = (size_t) clipRegion.getNumRectangles(); + HeapBlock rects (numRects); - CGContextClipToRects (context, rects, numRects); - lastClipRectIsValid = false; - return true; - } + int i = 0; + for (const Rectangle* r = clipRegion.begin(), * const e = clipRegion.end(); r != e; ++r) + rects[i++] = CGRectMake (r->getX(), flipHeight - r->getBottom(), r->getWidth(), r->getHeight()); + + CGContextClipToRects (context, rects, numRects); + lastClipRectIsValid = false; + return true; } bool CoreGraphicsContext::clipToRectangleList (const RectangleList& clipRegion) @@ -411,7 +405,9 @@ void CoreGraphicsContext::fillCGRect (const CGRect& cgRect, const bool replaceEx { if (replaceExistingContents) { - #if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 + #if JUCE_IOS + CGContextSetBlendMode (context, kCGBlendModeCopy); + #elif MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 CGContextClearRect (context, cgRect); #else #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 @@ -507,7 +503,7 @@ void CoreGraphicsContext::drawImage (const Image& sourceImage, const AffineTrans #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 // There's a bug in CGContextDrawTiledImage that makes it incredibly slow // if it's doing a transformation - it's quicker to just draw lots of images manually - if (CGContextDrawTiledImage != 0 && transform.isOnlyTranslation()) + if (&CGContextDrawTiledImage != 0 && transform.isOnlyTranslation()) CGContextDrawTiledImage (context, imageRect, image); else #endif @@ -519,7 +515,7 @@ void CoreGraphicsContext::drawImage (const Image& sourceImage, const AffineTrans while (x > clip.origin.x) x -= iw; while (y > clip.origin.y) y -= ih; - const int right = (int) (clip.origin.x + clip.size.width); + const int right = (int) (clip.origin.x + clip.size.width); const int bottom = (int) (clip.origin.y + clip.size.height); while (y < bottom) @@ -600,7 +596,7 @@ void CoreGraphicsContext::setFont (const Font& newFont) state->fontRef = 0; state->font = newFont; - if (OSXTypeface* osxTypeface = dynamic_cast (state->font.getTypeface())) + if (OSXTypeface* osxTypeface = dynamic_cast (state->font.getTypeface())) { state->fontRef = osxTypeface->fontRef; CGContextSetFont (context, state->fontRef); @@ -678,97 +674,85 @@ bool CoreGraphicsContext::drawTextLayout (const AttributedString& text, const Re } CoreGraphicsContext::SavedState::SavedState() - : font (1.0f), fontRef (0), fontTransform (CGAffineTransformIdentity), - shading (0), numGradientLookupEntries (0) + : font (1.0f), fontRef (0), fontTransform (CGAffineTransformIdentity), gradient (0) { } CoreGraphicsContext::SavedState::SavedState (const SavedState& other) : fillType (other.fillType), font (other.font), fontRef (other.fontRef), - fontTransform (other.fontTransform), shading (0), - gradientLookupTable ((size_t) other.numGradientLookupEntries), - numGradientLookupEntries (other.numGradientLookupEntries) + fontTransform (other.fontTransform), gradient (other.gradient) { - memcpy (gradientLookupTable, other.gradientLookupTable, sizeof (PixelARGB) * (size_t) numGradientLookupEntries); + if (gradient != 0) + CGGradientRetain (gradient); } CoreGraphicsContext::SavedState::~SavedState() { - if (shading != 0) - CGShadingRelease (shading); + if (gradient != 0) + CGGradientRelease (gradient); } void CoreGraphicsContext::SavedState::setFill (const FillType& newFill) { fillType = newFill; - if (fillType.isGradient() && shading != 0) + if (gradient != 0) { - CGShadingRelease (shading); - shading = 0; + CGGradientRelease (gradient); + gradient = 0; } } -CGShadingRef CoreGraphicsContext::SavedState::getShading (CoreGraphicsContext& owner) +static CGGradientRef createGradient (const ColourGradient& g, CGColorSpaceRef colourSpace) { - if (shading == 0) - { - ColourGradient& g = *(fillType.gradient); - numGradientLookupEntries = g.createLookupTable (fillType.transform, gradientLookupTable) - 1; - - CGFunctionRef function = CGFunctionCreate (this, 1, 0, 4, 0, &(owner.gradientCallbacks)); - CGPoint p1 (convertToCGPoint (g.point1)); - - if (g.isRadial) - { - shading = CGShadingCreateRadial (owner.rgbColourSpace, p1, 0, - p1, g.point1.getDistanceFrom (g.point2), - function, true, true); - } - else - { - shading = CGShadingCreateAxial (owner.rgbColourSpace, p1, - convertToCGPoint (g.point2), - function, true, true); - } + const int numColours = g.getNumColours(); + CGFloat* const data = (CGFloat*) alloca ((size_t) numColours * 5 * sizeof (CGFloat)); + CGFloat* const locations = data; + CGFloat* const components = data + numColours; + CGFloat* comps = components; - CGFunctionRelease (function); + for (int i = 0; i < numColours; ++i) + { + const Colour colour (g.getColour (i)); + *comps++ = (CGFloat) colour.getFloatRed(); + *comps++ = (CGFloat) colour.getFloatGreen(); + *comps++ = (CGFloat) colour.getFloatBlue(); + *comps++ = (CGFloat) colour.getFloatAlpha(); + locations[i] = (CGFloat) g.getColourPosition (i); } - return shading; -} - -void CoreGraphicsContext::SavedState::gradientCallback (void* info, const CGFloat* inData, CGFloat* outData) -{ - const SavedState* const s = static_cast (info); - - const int index = roundToInt (s->numGradientLookupEntries * inData[0]); - PixelARGB colour (s->gradientLookupTable [jlimit (0, s->numGradientLookupEntries, index)]); - colour.unpremultiply(); - - outData[0] = colour.getRed() / 255.0f; - outData[1] = colour.getGreen() / 255.0f; - outData[2] = colour.getBlue() / 255.0f; - outData[3] = colour.getAlpha() / 255.0f; + return CGGradientCreateWithColorComponents (colourSpace, components, locations, (size_t) numColours); } void CoreGraphicsContext::drawGradient() { flip(); applyTransform (state->fillType.transform); - - CGContextSetInterpolationQuality (context, kCGInterpolationDefault); // (This is required for 10.4, where there's a crash if - // you draw a gradient with high quality interp enabled). CGContextSetAlpha (context, state->fillType.getOpacity()); - CGContextDrawShading (context, state->getShading (*this)); + + const ColourGradient& g = *state->fillType.gradient; + + CGPoint p1 (convertToCGPoint (g.point1)); + CGPoint p2 (convertToCGPoint (g.point2)); + + state->fillType.transform.transformPoints (p1.x, p1.y, p2.x, p2.y); + + if (state->gradient == 0) + state->gradient = createGradient (g, rgbColourSpace); + + if (g.isRadial) + CGContextDrawRadialGradient (context, state->gradient, p1, 0, p1, g.point1.getDistanceFrom (g.point2), + kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation); + else + CGContextDrawLinearGradient (context, state->gradient, p1, p2, + kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation); } void CoreGraphicsContext::createPath (const Path& path) const { CGContextBeginPath (context); - Path::Iterator i (path); - while (i.next()) + for (Path::Iterator i (path); i.next();) { switch (i.elementType) { @@ -785,9 +769,8 @@ void CoreGraphicsContext::createPath (const Path& path) const void CoreGraphicsContext::createPath (const Path& path, const AffineTransform& transform) const { CGContextBeginPath (context); - Path::Iterator i (path); - while (i.next()) + for (Path::Iterator i (path); i.next();) { switch (i.elementType) { @@ -917,7 +900,7 @@ CGImageRef juce_createCoreGraphicsImage (const Image& juceImage, CGColorSpaceRef CGContextRef juce_getImageContext (const Image& image) { - if (CoreGraphicsImage* const cgi = dynamic_cast (image.getPixelData())) + if (CoreGraphicsImage* const cgi = dynamic_cast (image.getPixelData())) return cgi->context; jassertfalse; diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h b/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h index ca6f699..1982ea3 100644 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h +++ b/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -30,25 +30,25 @@ namespace { template - Rectangle convertToRectInt (const RectType& r) noexcept + Rectangle convertToRectInt (RectType r) noexcept { return Rectangle ((int) r.origin.x, (int) r.origin.y, (int) r.size.width, (int) r.size.height); } template - Rectangle convertToRectFloat (const RectType& r) noexcept + Rectangle convertToRectFloat (RectType r) noexcept { return Rectangle (r.origin.x, r.origin.y, r.size.width, r.size.height); } template - CGRect convertToCGRect (const RectType& r) noexcept + CGRect convertToCGRect (RectType r) noexcept { return CGRectMake ((CGFloat) r.getX(), (CGFloat) r.getY(), (CGFloat) r.getWidth(), (CGFloat) r.getHeight()); } template - CGPoint convertToCGPoint (const PointType& p) noexcept + CGPoint convertToCGPoint (PointType p) noexcept { return CGPointMake ((CGFloat) p.x, (CGFloat) p.y); } diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_mac_Fonts.mm b/JuceLibraryCode/modules/juce_graphics/native/juce_mac_Fonts.mm index 81a29a8..b5c6918 100644 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_mac_Fonts.mm +++ b/JuceLibraryCode/modules/juce_graphics/native/juce_mac_Fonts.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -385,7 +385,7 @@ namespace CoreTextTypeLayout static void createLayout (TextLayout& glyphLayout, const AttributedString& text) { - const CGFloat boundsHeight = 1.0e6f; + const CGFloat boundsHeight = glyphLayout.getHeight(); CTFrameRef frame = createCTFrame (text, CGRectMake (0, 0, glyphLayout.getWidth(), boundsHeight)); CFArrayRef lines = CTFrameGetLines (frame); diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp b/JuceLibraryCode/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp index e4356b7..ba1d339 100644 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp +++ b/JuceLibraryCode/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp b/JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp index 83e3c9d..1ce9232 100644 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp +++ b/JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -75,10 +75,10 @@ namespace DirectWriteTypeLayout if (currentLine >= layout->getNumLines()) { jassert (currentLine == layout->getNumLines()); - TextLayout::Line* const newLine = new TextLayout::Line(); - layout->addLine (newLine); + TextLayout::Line* const line = new TextLayout::Line(); + layout->addLine (line); - newLine->lineOrigin = Point (baselineOriginX, baselineOriginY); + line->lineOrigin = Point (baselineOriginX, baselineOriginY); } } @@ -311,6 +311,13 @@ namespace DirectWriteTypeLayout setTextFormatProperties (text, dwTextFormat); + { + DWRITE_TRIMMING trimming = { DWRITE_TRIMMING_GRANULARITY_CHARACTER, 0, 0 }; + ComSmartPtr trimmingSign; + hr = directWriteFactory->CreateEllipsisTrimmingSign (dwTextFormat, trimmingSign.resetAndGetPointerAddress()); + hr = dwTextFormat->SetTrimming (&trimming, trimmingSign); + } + const int textLen = text.getText().length(); hr = directWriteFactory->CreateTextLayout (text.getText().toWideCharPointer(), textLen, dwTextFormat, @@ -344,7 +351,8 @@ namespace DirectWriteTypeLayout ComSmartPtr dwTextLayout; - if (! setupLayout (text, layout.getWidth(), 1.0e7f, renderTarget, directWriteFactory, fontCollection, dwTextLayout)) + if (! setupLayout (text, layout.getWidth(), layout.getHeight(), renderTarget, + directWriteFactory, fontCollection, dwTextLayout)) return; UINT32 actualLineCount = 0; @@ -374,7 +382,8 @@ namespace DirectWriteTypeLayout { ComSmartPtr dwTextLayout; - if (setupLayout (text, area.getWidth(), area.getHeight(), renderTarget, directWriteFactory, fontCollection, dwTextLayout)) + if (setupLayout (text, area.getWidth(), area.getHeight(), renderTarget, + directWriteFactory, fontCollection, dwTextLayout)) { ComSmartPtr d2dBrush; renderTarget->CreateSolidColorBrush (D2D1::ColorF (D2D1::ColorF (0.0f, 0.0f, 0.0f, 1.0f)), diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp b/JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp index 0673aa5..dcf6606 100644 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp +++ b/JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_win32_Fonts.cpp b/JuceLibraryCode/modules/juce_graphics/native/juce_win32_Fonts.cpp index bc5bb35..db57fd1 100644 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_win32_Fonts.cpp +++ b/JuceLibraryCode/modules/juce_graphics/native/juce_win32_Fonts.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -542,22 +542,22 @@ private: } } - void createKerningPairs (HDC dc, const float height) + void createKerningPairs (HDC hdc, const float height) { HeapBlock rawKerning; - const DWORD numKPs = GetKerningPairs (dc, 0, 0); + const DWORD numKPs = GetKerningPairs (hdc, 0, 0); rawKerning.calloc (numKPs); - GetKerningPairs (dc, numKPs, rawKerning); + GetKerningPairs (hdc, numKPs, rawKerning); kerningPairs.ensureStorageAllocated ((int) numKPs); for (DWORD i = 0; i < numKPs; ++i) { KerningPair kp; - kp.glyph1 = getGlyphForChar (dc, rawKerning[i].wFirst); - kp.glyph2 = getGlyphForChar (dc, rawKerning[i].wSecond); + kp.glyph1 = getGlyphForChar (hdc, rawKerning[i].wFirst); + kp.glyph2 = getGlyphForChar (hdc, rawKerning[i].wSecond); - const int standardWidth = getGlyphWidth (dc, kp.glyph1); + const int standardWidth = getGlyphWidth (hdc, kp.glyph1); kp.kerning = (standardWidth + rawKerning[i].iKernAmount) / height; kerningPairs.add (kp); @@ -587,7 +587,7 @@ private: return gm.gmCellIncX; } - float getKerning (HDC dc, const int glyph1, const int glyph2) + float getKerning (HDC hdc, const int glyph1, const int glyph2) { KerningPair kp; kp.glyph1 = glyph1; @@ -602,7 +602,7 @@ private: if (index < 0) { kp.glyph2 = -1; - kp.kerning = getGlyphWidth (dc, kp.glyph1) / (float) tm.tmHeight; + kp.kerning = getGlyphWidth (hdc, kp.glyph1) / (float) tm.tmHeight; kerningPairs.add (kp); return kp.kerning; } diff --git a/JuceLibraryCode/modules/juce_graphics/placement/juce_Justification.h b/JuceLibraryCode/modules/juce_graphics/placement/juce_Justification.h index f80fa21..c48ab71 100644 --- a/JuceLibraryCode/modules/juce_graphics/placement/juce_Justification.h +++ b/JuceLibraryCode/modules/juce_graphics/placement/juce_Justification.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.cpp b/JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.cpp index 031048e..c13e505 100644 --- a/JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.cpp +++ b/JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.h b/JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.h index 9341e67..fd5b24e 100644 --- a/JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.h +++ b/JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.cpp b/JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.cpp index 4e21873..47c4ee2 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.h b/JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.h index 140cf9d..b5c3f28 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.h +++ b/JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -111,11 +111,13 @@ public: static JUCEApplication* JUCE_CALLTYPE getInstance() noexcept; //============================================================================== + #if DOXYGEN /** Returns the application's name. */ virtual const String getApplicationName() = 0; /** Returns the application's version number. */ virtual const String getApplicationVersion() = 0; + #endif /** Checks whether multiple instances of the app are allowed. @@ -172,13 +174,13 @@ public: //============================================================================== /** @internal */ - ApplicationCommandTarget* getNextCommandTarget(); + ApplicationCommandTarget* getNextCommandTarget() override; /** @internal */ - void getCommandInfo (CommandID, ApplicationCommandInfo&); + void getCommandInfo (CommandID, ApplicationCommandInfo&) override; /** @internal */ - void getAllCommands (Array&); + void getAllCommands (Array&) override; /** @internal */ - bool perform (const InvocationInfo&); + bool perform (const InvocationInfo&) override; private: bool initialiseApp() override; diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp index 75f8590..5ff5411 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.h b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.h index 5d64123..17efd6f 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.h +++ b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.cpp b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.cpp index 10d6e03..3debe03 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.h b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.h index a58342d..8704e6c 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.h +++ b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp index 83e9c89..6bbfc20 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -59,6 +59,7 @@ void DrawableButton::setImages (const Drawable* normal, overImageOn = copyDrawableIfNotNull (overOn); downImageOn = copyDrawableIfNotNull (downOn); disabledImageOn = copyDrawableIfNotNull (disabledOn); + currentImage = nullptr; buttonStateChanged(); } diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.h b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.h index f07616f..072cbbf 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.h +++ b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp index 8274f4c..f448a1e 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h index 4cd3f52..e40dae5 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h +++ b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.cpp b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.cpp index 3170d05..41a8504 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.h b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.h index 64db59d..fed3cad 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.h +++ b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp index 28cd8de..0894e80 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.h b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.h index ddc4625..624a231 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.h +++ b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.cpp b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.cpp index b51ea65..534a9f4 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.cpp @@ -1,7 +1,8 @@ /* ============================================================================== - file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + + This file is part of the JUCE library. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.h b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.h index b9093b2..161b389 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.h +++ b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -102,7 +102,7 @@ public: private: #if JUCE_CATCH_DEPRECATED_CODE_MISUSE - // Note that this method has been removed - instead, see LookAndFeel::getTextButtonWidthToFitText() + // Note that this method has been removed - instead, see LookAndFeel::getTextButtonFont() virtual int getFont() { return 0; } #endif diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp index edaf7ab..c9a68d7 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.h b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.h index 911bc59..8c10fd0 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.h +++ b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp index f7ef1b0..f398f33 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.h b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.h index 1f2548f..9721aa8 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.h +++ b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h index 9a00cbc..d24d49e 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h +++ b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp index 174ec80..e86ff44 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h index f906f43..04604f7 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h +++ b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp index 82ec3a2..0d3a1d0 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h index 5be135a..4ace284 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h +++ b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -154,7 +154,7 @@ public: This will search the list of registered commands for one with the given command ID number, and return its associated info. If no matching command is found, this - will return 0. + will return nullptr. */ const ApplicationCommandInfo* getCommandForID (CommandID commandID) const noexcept; diff --git a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp index c31d187..734def2 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h index c14faa8..b65218d 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h +++ b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp index bcfac4e..aa52f0c 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h index d3351ac..315de8f 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h +++ b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/components/juce_CachedComponentImage.h b/JuceLibraryCode/modules/juce_gui_basics/components/juce_CachedComponentImage.h index 3f273cb..e9be2c6 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/components/juce_CachedComponentImage.h +++ b/JuceLibraryCode/modules/juce_gui_basics/components/juce_CachedComponentImage.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.cpp b/JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.cpp index 7cbe59f..1f00cac 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -154,7 +154,7 @@ private: bool shouldBailOut() const noexcept { - return checker.shouldBailOut() || safePointer == 0; + return checker.shouldBailOut() || safePointer == nullptr; } private: @@ -200,7 +200,7 @@ struct ScalingHelpers // For these, we need to avoid getSmallestIntegerContainer being used, which causes // judder when moving windows - static Rectangle unscaledScreenPosToScaled (float scale, const Rectangle& pos) noexcept + static Rectangle unscaledScreenPosToScaled (float scale, Rectangle pos) noexcept { return scale != 1.0f ? Rectangle (roundToInt (pos.getX() / scale), roundToInt (pos.getY() / scale), @@ -208,7 +208,7 @@ struct ScalingHelpers roundToInt (pos.getHeight() / scale)) : pos; } - static Rectangle scaledScreenPosToUnscaled (float scale, Rectangle& pos) noexcept + static Rectangle scaledScreenPosToUnscaled (float scale, Rectangle pos) noexcept { return scale != 1.0f ? Rectangle (roundToInt (pos.getX() * scale), roundToInt (pos.getY() * scale), @@ -399,7 +399,7 @@ struct Component::ComponentHelpers return convertFromDistantParentSpace (topLevelComp, *target, p); } - static bool clipObscuredRegions (const Component& comp, Graphics& g, const Rectangle& clipRect, Point delta) + static bool clipObscuredRegions (const Component& comp, Graphics& g, const Rectangle clipRect, Point delta) { bool nothingChanged = true; @@ -784,6 +784,7 @@ public: validArea.clear(); } + if (! validArea.containsRectangle (compBounds)) { Graphics imG (image); LowLevelGraphicsContext& lg = imG.getInternalContext(); @@ -791,18 +792,15 @@ public: for (const Rectangle* i = validArea.begin(), * const e = validArea.end(); i != e; ++i) lg.excludeClipRectangle (*i); - if (! lg.isClipEmpty()) + if (! owner.isOpaque()) { - if (! owner.isOpaque()) - { - lg.setFill (Colours::transparentBlack); - lg.fillRect (imageBounds, true); - lg.setFill (Colours::black); - } - - lg.addTransform (AffineTransform::scale (scale)); - owner.paintEntireComponent (imG, true); + lg.setFill (Colours::transparentBlack); + lg.fillRect (imageBounds, true); + lg.setFill (Colours::black); } + + lg.addTransform (AffineTransform::scale (scale)); + owner.paintEntireComponent (imG, true); } validArea = imageBounds; @@ -1155,12 +1153,15 @@ void Component::setBounds (const int x, const int y, int w, int h) void Component::sendMovedResizedMessagesIfPending() { - if (flags.isMoveCallbackPending || flags.isResizeCallbackPending) - { - sendMovedResizedMessages (flags.isMoveCallbackPending, flags.isResizeCallbackPending); + const bool wasMoved = flags.isMoveCallbackPending; + const bool wasResized = flags.isResizeCallbackPending; + if (wasMoved || wasResized) + { flags.isMoveCallbackPending = false; flags.isResizeCallbackPending = false; + + sendMovedResizedMessages (wasMoved, wasResized); } } @@ -1883,15 +1884,15 @@ void Component::repaintParent() parentComponent->internalRepaint (ComponentHelpers::convertToParentSpace (*this, getLocalBounds())); } -void Component::internalRepaint (const Rectangle& area) +void Component::internalRepaint (Rectangle area) { - const Rectangle r (area.getIntersection (getLocalBounds())); + area = area.getIntersection (getLocalBounds()); - if (! r.isEmpty()) - internalRepaintUnchecked (r, false); + if (! area.isEmpty()) + internalRepaintUnchecked (area, false); } -void Component::internalRepaintUnchecked (const Rectangle& area, const bool isEntireComponent) +void Component::internalRepaintUnchecked (Rectangle area, const bool isEntireComponent) { if (flags.visibleFlag) { @@ -2311,16 +2312,15 @@ void Component::internalModalInputAttempt() //============================================================================== void Component::postCommandMessage (const int commandId) { - class CustomCommandMessage : public CallbackMessage + struct CustomCommandMessage : public CallbackMessage { - public: CustomCommandMessage (Component* const c, const int command) : target (c), commandId (command) {} void messageCallback() override { - if (target.get() != nullptr) // (get() required for VS2003 bug) - target->handleCommandMessage (commandId); + if (Component* c = target.get()) + c->handleCommandMessage (commandId); } private: diff --git a/JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h b/JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h index edc1957..f510e5c 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h +++ b/JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -443,7 +443,7 @@ public: /** Changes the component's position and size. The coordinates are relative to the top-left of the component's parent, or relative - to the origin of the screen is the component is on the desktop. + to the origin of the screen if the component is on the desktop. If this method changes the component's top-left position, it will make a synchronous call to moved(). If it changes the size, it will also make a call to resized(). @@ -459,7 +459,7 @@ public: /** Changes the component's position and size. The coordinates are relative to the top-left of the component's parent, or relative - to the origin of the screen is the component is on the desktop. + to the origin of the screen if the component is on the desktop. If this method changes the component's top-left position, it will make a synchronous call to moved(). If it changes the size, it will also make a call to resized(). @@ -480,42 +480,10 @@ public: component's bounds when the source values change. See RelativeRectangle::applyToComponent() for more details. - When using relative expressions, the following symbols are available: - - "left", "right", "top", "bottom" refer to the position of those edges in this component, so - e.g. for a component whose width is always 100, you might set the right edge to the "left + 100". - - "[id].left", "[id].right", "[id].top", "[id].bottom", "[id].width", "[id].height", where [id] is - the identifier of one of this component's siblings. A component's identifier is set with - Component::setComponentID(). So for example if you want your component to always be 50 pixels to the - right of the one called "xyz", you could set your left edge to be "xyz.right + 50". - - Instead of an [id], you can use the name "parent" to refer to this component's parent. Like - any other component, these values are relative to their component's parent, so "parent.right" won't be - very useful for positioning a component because it refers to a position with the parent's parent.. but - "parent.width" can be used for setting positions relative to the parent's size. E.g. to make a 10x10 - component which remains 1 pixel away from its parent's bottom-right, you could use - "right - 10, bottom - 10, parent.width - 1, parent.height - 1". - - The name of one of the parent component's markers can also be used as a symbol. For markers to be - used, the parent component must implement its Component::getMarkers() method, and return at least one - valid MarkerList. So if you want your component's top edge to be 10 pixels below the - marker called "foobar", you'd set it to "foobar + 10". - - See the Expression class for details about the operators that are supported, but for example - if you wanted to make your component remain centred within its parent with a size of 100, 100, - you could express it as: - @code myComp.setBounds (RelativeBounds ("parent.width / 2 - 50, parent.height / 2 - 50, left + 100, top + 100")); - @endcode - ..or an alternative way to achieve the same thing: - @code myComp.setBounds (RelativeBounds ("right - 100, bottom - 100, parent.width / 2 + 50, parent.height / 2 + 50")); - @endcode - - Or if you wanted a 100x100 component whose top edge is lined up to a marker called "topMarker" and - which is positioned 50 pixels to the right of another component called "otherComp", you could write: - @code myComp.setBounds (RelativeBounds ("otherComp.right + 50, topMarker, left + 100, top + 100")); - @endcode - - Be careful not to make your coordinate expressions recursive, though, or exceptions and assertions will - be thrown! - - @see setBounds, RelativeRectangle::applyToComponent(), Expression + For the syntax of the expressions that are allowed in the string, see the notes + for the RelativeCoordinate class. + + @see RelativeCoordinate, setBounds, RelativeRectangle::applyToComponent(), Expression */ void setBounds (const RelativeRectangle& newBounds); @@ -775,7 +743,13 @@ public: */ void removeAllChildren(); - /** Removes all this component's children, and deletes them. + /** Removes and deletes all of this component's children. + My advice is to avoid this method! It's an old function that is only kept here for + backwards-compatibility with legacy code, and should be viewed with extreme + suspicion by anyone attempting to write modern C++. In almost all cases, it's much + smarter to manage the lifetimes of your child components via modern RAII techniques + such as simply making them member variables, or using ScopedPointer, OwnedArray, etc + to manage their lifetimes appropriately. @see removeAllChildren */ void deleteAllChildren(); @@ -790,7 +764,7 @@ public: /** Searches the parent components for a component of a specified class. For example findParentComponentOfClass \() would return the first parent - component that can be dynamically cast to a MyComp, or will return 0 if none + component that can be dynamically cast to a MyComp, or will return nullptr if none of the parents are suitable. */ template @@ -838,7 +812,7 @@ public: virtual void childrenChanged(); //============================================================================== - /** Tests whether a given point inside the component. + /** Tests whether a given point is inside the component. Overriding this method allows you to create components which only intercept mouse-clicks within a user-defined area. @@ -1007,17 +981,12 @@ public: /** Makes the component use an internal buffer to optimise its redrawing. Setting this flag to true will cause the component to allocate an - internal buffer into which it paints itself, so that when asked to - redraw itself, it can use this buffer rather than actually calling the - paint() method. - - The buffer is kept until the repaint() method is called directly on - this component (or until it is resized), when the image is invalidated - and then redrawn the next time the component is painted. + internal buffer into which it paints itself and all its child components, so that + when asked to redraw itself, it can use this buffer rather than actually calling + the paint() method. - Note that only the drawing that happens within the component's paint() - method is drawn into the buffer, it's child components are not buffered, and - nor is the paintOverChildren() method. + Parts of the buffer are invalidated when repaint() is called on this component + or its children. The buffer is then repainted at the next paint() callback. @see repaint, paint, createComponentSnapshot */ @@ -2330,8 +2299,8 @@ private: void internalModifierKeysChanged(); void internalChildrenChanged(); void internalHierarchyChanged(); - void internalRepaint (const Rectangle&); - void internalRepaintUnchecked (const Rectangle&, bool); + void internalRepaint (Rectangle); + void internalRepaintUnchecked (Rectangle, bool); Component* removeChildComponent (int index, bool sendParentEvents, bool sendChildEvents); void reorderChildInternal (int sourceIndex, int destIndex); void paintComponentAndChildren (Graphics&); diff --git a/JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.cpp b/JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.cpp index 3e5cd35..b5968d9 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.h b/JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.h index 56c0631..39e5b37 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.h +++ b/JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.cpp b/JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.cpp index bb77371..a80c580 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -333,7 +333,6 @@ bool operator!= (const Desktop::Displays::Display& d1, const Desktop::Displays:: void Desktop::Displays::init (Desktop& desktop) { findDisplays (desktop.getGlobalScaleFactor()); - jassert (displays.size() > 0); } void Desktop::Displays::refresh() @@ -342,7 +341,6 @@ void Desktop::Displays::refresh() oldDisplays.swapWith (displays); init (Desktop::getInstance()); - jassert (displays.size() > 0); if (oldDisplays != displays) { diff --git a/JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.h b/JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.h index 4cc3317..a31d71e 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.h +++ b/JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp b/JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp index a6e7b07..cc46ac0 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -89,7 +89,7 @@ ModalComponentManager::~ModalComponentManager() clearSingletonInstance(); } -juce_ImplementSingleton_SingleThreaded (ModalComponentManager); +juce_ImplementSingleton_SingleThreaded (ModalComponentManager) //============================================================================== diff --git a/JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.h b/JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.h index b21421e..df8b7b2 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.h +++ b/JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -72,6 +72,9 @@ public: virtual void modalStateFinished (int returnValue) = 0; }; + //============================================================================== + juce_DeclareSingleton_SingleThreaded_Minimal (ModalComponentManager) + //============================================================================== /** Returns the number of components currently being shown modally. @see getModalComponent @@ -119,9 +122,6 @@ public: int runEventLoopForCurrentComponent(); #endif - //============================================================================== - juce_DeclareSingleton_SingleThreaded_Minimal (ModalComponentManager); - protected: /** Creates a ModalComponentManager. You shouldn't ever call the constructor - it's a singleton, so use ModalComponentManager::getInstance() diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.cpp b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.cpp index 3e88318..f9b0944 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -32,6 +32,7 @@ Drawable::Drawable (const Drawable& other) : Component (other.getName()) { setComponentID (other.getComponentID()); + setTransform (other.getTransform()); } Drawable::~Drawable() diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.h b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.h index b8956d5..f297d9c 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.h +++ b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -227,14 +227,15 @@ protected: owner (c) {} - bool registerCoordinates() { return owner.registerCoordinates (*this); } - void applyToComponentBounds() + bool registerCoordinates() override { return owner.registerCoordinates (*this); } + + void applyToComponentBounds() override { ComponentScope scope (getComponent()); owner.recalculateCoordinates (&scope); } - void applyNewBounds (const Rectangle&) + void applyNewBounds (const Rectangle&) override { jassertfalse; // drawables can't be resized directly! } diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp index 688507f..fa21d92 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.h b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.h index 1de9111..1436b1f 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.h +++ b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -92,15 +92,15 @@ public: //============================================================================== /** @internal */ - Drawable* createCopy() const; + Drawable* createCopy() const override; /** @internal */ - void refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder); + void refreshFromValueTree (const ValueTree&, ComponentBuilder&); /** @internal */ - ValueTree createValueTree (ComponentBuilder::ImageProvider* imageProvider) const; + ValueTree createValueTree (ComponentBuilder::ImageProvider* imageProvider) const override; /** @internal */ static const Identifier valueTreeType; /** @internal */ - Rectangle getDrawableBounds() const; + Rectangle getDrawableBounds() const override; /** @internal */ void childBoundsChanged (Component*) override; /** @internal */ diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp index 7c29dee..8eb51d2 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -37,6 +37,7 @@ DrawableImage::DrawableImage (const DrawableImage& other) overlayColour (other.overlayColour), bounds (other.bounds) { + setBounds (other.getBounds()); } DrawableImage::~DrawableImage() diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.h b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.h index 6089dee..56814a8 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.h +++ b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp index 6dc46ba..19a2d4d 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -83,16 +83,16 @@ public: { } - bool registerCoordinates() + bool registerCoordinates() override { bool ok = true; jassert (owner.relativePath != nullptr); - const RelativePointPath& path = *owner.relativePath; + const RelativePointPath& relPath = *owner.relativePath; - for (int i = 0; i < path.elements.size(); ++i) + for (int i = 0; i < relPath.elements.size(); ++i) { - RelativePointPath::ElementBase* const e = path.elements.getUnchecked(i); + RelativePointPath::ElementBase* const e = relPath.elements.getUnchecked(i); int numPoints; RelativePoint* const points = e->getControlPoints (numPoints); @@ -104,7 +104,7 @@ public: return ok; } - void applyToComponentBounds() + void applyToComponentBounds() override { jassert (owner.relativePath != nullptr); @@ -112,7 +112,7 @@ public: owner.applyRelativePath (*owner.relativePath, &scope); } - void applyNewBounds (const Rectangle&) + void applyNewBounds (const Rectangle&) override { jassertfalse; // drawables can't be resized directly! } diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.h b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.h index bed3895..a06ea43 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.h +++ b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -123,8 +123,8 @@ public: ValueTree getPathState(); - void readFrom (const RelativePointPath& path, UndoManager* undoManager); - void writeTo (RelativePointPath& path) const; + void readFrom (const RelativePointPath& relativePath, UndoManager* undoManager); + void writeTo (RelativePointPath& relativePath) const; static const Identifier nonZeroWinding, point1, point2, point3; }; diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp index 5a8c1c8..034953b 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h index 9bae02e..b136b8d 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h +++ b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp index 5813493..16aad5e 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -53,14 +53,14 @@ public: { } - bool registerCoordinates() + bool registerCoordinates() override { bool ok = addPoint (fill.gradientPoint1); ok = addPoint (fill.gradientPoint2) && ok; return addPoint (fill.gradientPoint3) && ok; } - void applyToComponentBounds() + void applyToComponentBounds() override { ComponentScope scope (owner); if (isMainFill ? owner.mainFill.recalculateCoords (&scope) @@ -68,7 +68,7 @@ public: owner.repaint(); } - void applyNewBounds (const Rectangle&) + void applyNewBounds (const Rectangle&) override { jassertfalse; // drawables can't be resized directly! } diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.h b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.h index ed893f1..5fa5b3e 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.h +++ b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.cpp b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.cpp index e9c9802..d142881 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.h b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.h index ac44fb4..16b801b 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.h +++ b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_SVGParser.cpp b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_SVGParser.cpp index cfb6b7b..7fbe798 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_SVGParser.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_SVGParser.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -54,7 +54,7 @@ public: DrawableComposite* const drawable = new DrawableComposite(); - setDrawableID (*drawable, xml); + setCommonAttributes (*drawable, xml); SVGState newState (*this); @@ -272,7 +272,7 @@ public: if (parseNextNumber (d, num, false)) { - const float angle = num.getFloatValue() * (180.0f / float_Pi); + const float angle = degreesToRadians (num.getFloatValue()); if (parseNextNumber (d, num, false)) { @@ -345,11 +345,14 @@ private: AffineTransform transform; String cssStyleText; - static void setDrawableID (Drawable& d, const XmlPath& xml) + static void setCommonAttributes (Drawable& d, const XmlPath& xml) { String compID (xml->getStringAttribute ("id")); d.setName (compID); d.setComponentID (compID); + + if (xml->getStringAttribute ("display") == "none") + d.setVisible (false); } //============================================================================== @@ -372,7 +375,7 @@ private: if (tag == "line") return parseLine (xml); if (tag == "polyline") return parsePolygon (xml, true); if (tag == "polygon") return parsePolygon (xml, false); - if (tag == "text") return parseText (xml); + if (tag == "text") return parseText (xml, true); if (tag == "switch") return parseSwitch (xml); if (tag == "style") parseCSSStyle (xml); @@ -391,7 +394,7 @@ private: { DrawableComposite* const drawable = new DrawableComposite(); - setDrawableID (*drawable, xml); + setCommonAttributes (*drawable, xml); if (xml->hasAttribute ("transform")) { @@ -536,7 +539,7 @@ private: } DrawablePath* dp = new DrawablePath(); - setDrawableID (*dp, xml); + setCommonAttributes (*dp, xml); dp->setFill (Colours::transparentBlack); path.applyTransform (transform); @@ -804,8 +807,16 @@ private: } //============================================================================== - Drawable* parseText (const XmlPath& xml) + Drawable* parseText (const XmlPath& xml, bool shouldParseTransform) { + if (shouldParseTransform && xml->hasAttribute ("transform")) + { + SVGState newState (*this); + newState.addTransform (xml); + + return newState.parseText (xml, false); + } + Array xCoords, yCoords, dxCoords, dyCoords; getCoordList (xCoords, getInheritedAttribute (xml, "x"), true, true); @@ -813,28 +824,59 @@ private: getCoordList (dxCoords, getInheritedAttribute (xml, "dx"), true, true); getCoordList (dyCoords, getInheritedAttribute (xml, "dy"), true, false); + const Font font (getFont (xml)); + const String anchorStr = getStyleAttribute(xml, "text-anchor"); - //xxx not done text yet! - + DrawableComposite* dc = new DrawableComposite(); + setCommonAttributes (*dc, xml); forEachXmlChildElement (*xml, e) { if (e->isTextElement()) { - const String text (e->getText()); + const String text (e->getText().trim()); + + DrawableText* dt = new DrawableText(); + dc->addAndMakeVisible (dt); + + dt->setText (text); + dt->setFont (font, true); + dt->setTransform (transform); + + int i = 0; + dt->setColour (parseColour (getStyleAttribute (xml, "fill"), i, Colours::black) + .withMultipliedAlpha (getStyleAttribute (xml, "fill-opacity", "1").getFloatValue())); - Path path; - Drawable* s = parseShape (xml.getChild (e), path); - delete s; // xxx not finished! + Rectangle bounds (xCoords[0], yCoords[0] - font.getAscent(), + font.getStringWidthFloat (text), font.getHeight()); + + if (anchorStr == "middle") bounds.setX (bounds.getX() - bounds.getWidth() / 2.0f); + else if (anchorStr == "end") bounds.setX (bounds.getX() - bounds.getWidth()); + + dt->setBoundingBox (bounds); } else if (e->hasTagNameIgnoringNamespace ("tspan")) { - Drawable* s = parseText (xml.getChild (e)); - delete s; // xxx not finished! + dc->addAndMakeVisible (parseText (xml.getChild (e), true)); } } - return nullptr; + return dc; + } + + Font getFont (const XmlPath& xml) const + { + const float fontSize = getCoordLength (getStyleAttribute (xml, "font-size"), 1.0f); + + int style = getStyleAttribute (xml, "font-style").containsIgnoreCase ("italic") ? Font::italic : Font::plain; + + if (getStyleAttribute (xml, "font-weight").containsIgnoreCase ("bold")) + style |= Font::bold; + + const String family (getStyleAttribute (xml, "font-family")); + + return family.isEmpty() ? Font (fontSize, style) + : Font (family, fontSize, style); } //============================================================================== @@ -1157,9 +1199,9 @@ private: tokens.removeEmptyStrings (true); - float numbers [6]; + float numbers[6]; - for (int i = 0; i < 6; ++i) + for (int i = 0; i < numElementsInArray (numbers); ++i) numbers[i] = tokens[i].getFloatValue(); AffineTransform trans; @@ -1171,33 +1213,23 @@ private: } else if (t.startsWithIgnoreCase ("translate")) { - jassert (tokens.size() == 2); trans = AffineTransform::translation (numbers[0], numbers[1]); } else if (t.startsWithIgnoreCase ("scale")) { - if (tokens.size() == 1) - trans = AffineTransform::scale (numbers[0]); - else - trans = AffineTransform::scale (numbers[0], numbers[1]); + trans = AffineTransform::scale (numbers[0], numbers[tokens.size() > 1 ? 1 : 0]); } else if (t.startsWithIgnoreCase ("rotate")) { - if (tokens.size() != 3) - trans = AffineTransform::rotation (numbers[0] / (180.0f / float_Pi)); - else - trans = AffineTransform::rotation (numbers[0] / (180.0f / float_Pi), - numbers[1], numbers[2]); + trans = AffineTransform::rotation (degreesToRadians (numbers[0]), numbers[1], numbers[2]); } else if (t.startsWithIgnoreCase ("skewX")) { - trans = AffineTransform (1.0f, std::tan (numbers[0] * (float_Pi / 180.0f)), 0.0f, - 0.0f, 1.0f, 0.0f); + trans = AffineTransform::shear (std::tan (degreesToRadians (numbers[0])), 0.0f); } else if (t.startsWithIgnoreCase ("skewY")) { - trans = AffineTransform (1.0f, 0.0f, 0.0f, - std::tan (numbers[0] * (float_Pi / 180.0f)), 1.0f, 0.0f); + trans = AffineTransform::shear (0.0f, std::tan (degreesToRadians (numbers[0]))); } result = trans.followedBy (result); @@ -1218,8 +1250,8 @@ private: const double midX = (x1 - x2) * 0.5; const double midY = (y1 - y2) * 0.5; - const double cosAngle = cos (angle); - const double sinAngle = sin (angle); + const double cosAngle = std::cos (angle); + const double sinAngle = std::sin (angle); const double xp = cosAngle * midX + sinAngle * midY; const double yp = cosAngle * midY - sinAngle * midX; const double xp2 = xp * xp; diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp index 265df83..2871193 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h index ebe1680..0aa8235 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h +++ b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp index db98eb2..79d810f 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h index b2e6a21..2c015de 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h +++ b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp index 4a2f023..e67215d 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -240,6 +240,9 @@ void FileBrowserComponent::setRoot (const File& newRootDirectory) currentRoot = newRootDirectory; fileList->setDirectory (currentRoot, true, true); + if (FileTreeComponent* tree = dynamic_cast (fileListComponent.get())) + tree->refresh(); + String currentRootName (currentRoot.getFullPathName()); if (currentRootName.isEmpty()) currentRootName = File::separatorString; @@ -384,7 +387,7 @@ void FileBrowserComponent::fileDoubleClicked (const File& f) { setRoot (f); - if ((flags & canSelectDirectories) != 0) + if ((flags & canSelectDirectories) != 0 && (flags & doNotClearFileNameOnRootChange) == 0) filenameBox.setText (String::empty); } else @@ -429,7 +432,9 @@ void FileBrowserComponent::textEditorReturnKeyPressed (TextEditor&) { setRoot (f); chosenFiles.clear(); - filenameBox.setText (String::empty); + + if ((flags & doNotClearFileNameOnRootChange) == 0) + filenameBox.setText (String()); } else { @@ -555,7 +560,7 @@ void FileBrowserComponent::getDefaultRoots (StringArray& rootNames, StringArray& rootPaths.add (String::empty); rootNames.add (String::empty); - Array volumes; + Array volumes; File vol ("/Volumes"); vol.findChildFiles (volumes, File::findDirectories, false); diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h index a1151ef..3053fd5 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h +++ b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -51,18 +51,19 @@ public: */ enum FileChooserFlags { - openMode = 1, /**< specifies that the component should allow the user to - choose an existing file with the intention of opening it. */ - saveMode = 2, /**< specifies that the component should allow the user to specify - the name of a file that will be used to save something. */ - canSelectFiles = 4, /**< specifies that the user can select files (can be used in - conjunction with canSelectDirectories). */ - canSelectDirectories = 8, /**< specifies that the user can select directories (can be used in - conjuction with canSelectFiles). */ - canSelectMultipleItems = 16, /**< specifies that the user can select multiple items. */ - useTreeView = 32, /**< specifies that a tree-view should be shown instead of a file list. */ - filenameBoxIsReadOnly = 64, /**< specifies that the user can't type directly into the filename box. */ - warnAboutOverwriting = 128 /**< specifies that the dialog should warn about overwriting existing files (if possible). */ + openMode = 1, /**< specifies that the component should allow the user to + choose an existing file with the intention of opening it. */ + saveMode = 2, /**< specifies that the component should allow the user to specify + the name of a file that will be used to save something. */ + canSelectFiles = 4, /**< specifies that the user can select files (can be used in + conjunction with canSelectDirectories). */ + canSelectDirectories = 8, /**< specifies that the user can select directories (can be used in + conjuction with canSelectFiles). */ + canSelectMultipleItems = 16, /**< specifies that the user can select multiple items. */ + useTreeView = 32, /**< specifies that a tree-view should be shown instead of a file list. */ + filenameBoxIsReadOnly = 64, /**< specifies that the user can't type directly into the filename box. */ + warnAboutOverwriting = 128, /**< specifies that the dialog should warn about overwriting existing files (if possible). */ + doNotClearFileNameOnRootChange = 256 /**< specifies that the file name should not be cleared upon root change. */ }; //============================================================================== diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h index bd206ae..8ff56ad 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h +++ b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp index 71c148d..40c6108 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -99,7 +99,7 @@ bool FileChooser::showDialog (const int flags, FilePreviewComponent* const previ #if JUCE_WINDOWS if (useNativeDialogBox && ! (selectsFiles && selectsDirectories)) #elif JUCE_MAC || JUCE_LINUX - if (useNativeDialogBox && (previewComp == nullptr)) + if (useNativeDialogBox) #else if (false) #endif diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.h b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.h index 7c6b69f..4dc44b3 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.h +++ b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp index 29618a3..52fa007 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h index f63632e..2f1a993 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h +++ b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp index 3125267..f75e80e 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.h b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.h index 7f074d2..30fb4fe 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.h +++ b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -56,23 +56,23 @@ public: /** Returns the number of files the user has got selected. @see getSelectedFile */ - int getNumSelectedFiles() const; + int getNumSelectedFiles() const override; /** Returns one of the files that the user has currently selected. The index should be in the range 0 to (getNumSelectedFiles() - 1). @see getNumSelectedFiles */ - File getSelectedFile (int index = 0) const; + File getSelectedFile (int index = 0) const override; /** Deselects any files that are currently selected. */ - void deselectAllFiles(); + void deselectAllFiles() override; /** Scrolls to the top of the list. */ - void scrollToTop(); + void scrollToTop() override; /** If the specified file is in the list, it will become the only selected item (and if the file isn't in the list, all other items will be deselected). */ - void setSelectedFile (const File&); + void setSelectedFile (const File&) override; private: //============================================================================== @@ -84,8 +84,8 @@ private: int getNumRows() override; void paintListBoxItem (int, Graphics&, int, int, bool) override; - Component* refreshComponentForRow (int rowNumber, bool isRowSelected, Component* existingComponentToUpdate) override; - void selectedRowsChanged (int lastRowSelected) override; + Component* refreshComponentForRow (int rowNumber, bool isRowSelected, Component*) override; + void selectedRowsChanged (int row) override; void deleteKeyPressed (int currentSelectedRow) override; void returnKeyPressed (int currentSelectedRow) override; diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h index 727f420..d09d563 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h +++ b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp index a2cad46..2adaa9a 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -152,6 +152,8 @@ void FileSearchPathListComponent::returnKeyPressed (int row) path.add (chooser.getResult(), row); changed(); } + #else + (void) row; #endif } diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h index 25ffef7..17d4b9c 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h +++ b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp index 45963e8..51f20f3 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h index cf59151..833556f 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h +++ b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp index e8e4ae8..2a69425 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h index 9dbe755..0385e9e 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h +++ b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp index 537aae3..d679089 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h index 6887a78..50347d0 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h +++ b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.cpp b/JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.cpp index d7f6fed..00eea12 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -105,6 +105,11 @@ #include #include + #if JUCE_USE_XRANDR + /* If you're trying to use Xrandr, you'll need to install the "libxrandr-dev" package.. */ + #include + #endif + #if JUCE_USE_XINERAMA /* If you're trying to use Xinerama, you'll need to install the "libxinerama-dev" package.. */ #include diff --git a/JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.h b/JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.h index dedd3a0..e34640e 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.h +++ b/JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -38,8 +38,20 @@ #define JUCE_ENABLE_REPAINT_DEBUGGING 0 #endif +/** JUCE_USE_XRANDR: Enables Xrandr multi-monitor support (Linux only). + Unless you specifically want to disable this, it's best to leave this option turned on. + Note that your users do not need to have Xrandr installed for your JUCE app to run, as + the availability of Xrandr is queried during runtime. +*/ +#ifndef JUCE_USE_XRANDR + #define JUCE_USE_XRANDR 1 +#endif + /** JUCE_USE_XINERAMA: Enables Xinerama multi-monitor support (Linux only). Unless you specifically want to disable this, it's best to leave this option turned on. + This will be used as a fallback if JUCE_USE_XRANDR not set or libxrandr cannot be found. + Note that your users do not need to have Xrandr installed for your JUCE app to run, as + the availability of Xinerama is queried during runtime. */ #ifndef JUCE_USE_XINERAMA #define JUCE_USE_XINERAMA 1 diff --git a/JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.mm b/JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.mm index fd6808c..c20b080 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.mm +++ b/JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/juce_module_info b/JuceLibraryCode/modules/juce_gui_basics/juce_module_info index d9d00fe..41a3e9c 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/juce_module_info +++ b/JuceLibraryCode/modules/juce_gui_basics/juce_module_info @@ -1,7 +1,7 @@ { "id": "juce_gui_basics", "name": "JUCE GUI core classes", - "version": "3.0.8", + "version": "3.2.0", "description": "Basic user-interface components and related classes.", "website": "http://www.juce.com/juce", "license": "GPL/Commercial", diff --git a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp index 67e8155..5cc5966 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.h b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.h index 2ae0ec1..4c4077f 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.h +++ b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.cpp b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.cpp index 76ea686..5ad9025 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.h b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.h index fb30138..15a966d 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.h +++ b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp index f833f11..29e2f4e 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.h b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.h index 1269b38..938230e 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.h +++ b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp index b84e903..5630667 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h index 94ef5f7..c1ece1e 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h +++ b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp index f3bab25..37a33b8 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.h b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.h index 123ffed..c44d77b 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.h +++ b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_SystemClipboard.h b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_SystemClipboard.h index 29e323b..d21b78e 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_SystemClipboard.h +++ b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_SystemClipboard.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h index f09dc9b..5f1da82 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h +++ b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -85,12 +85,6 @@ struct TextEditorKeyMapper if (key.isKeyCode (KeyPress::pageDownKey)) return target.pageDown (isShiftDown); } - if (numCtrlAltCommandKeys < 2) - { - if (key.isKeyCode (KeyPress::backspaceKey)) return target.deleteBackwards (ctrlOrAltDown); - if (key.isKeyCode (KeyPress::deleteKey)) return target.deleteForwards (ctrlOrAltDown); - } - if (key == KeyPress ('c', ModifierKeys::commandModifier, 0) || key == KeyPress (KeyPress::insertKey, ModifierKeys::ctrlModifier, 0)) return target.copyToClipboard(); @@ -103,6 +97,13 @@ struct TextEditorKeyMapper || key == KeyPress (KeyPress::insertKey, ModifierKeys::shiftModifier, 0)) return target.pasteFromClipboard(); + // NB: checking for delete must happen after the earlier check for shift + delete + if (numCtrlAltCommandKeys < 2) + { + if (key.isKeyCode (KeyPress::backspaceKey)) return target.deleteBackwards (ctrlOrAltDown); + if (key.isKeyCode (KeyPress::deleteKey)) return target.deleteForwards (ctrlOrAltDown); + } + if (key == KeyPress ('a', ModifierKeys::commandModifier, 0)) return target.selectAll(); diff --git a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h index 9770f5d..9021fb6 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h +++ b/JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -79,6 +79,7 @@ public: { textKeyboard = 0, numericKeyboard, + decimalKeyboard, urlKeyboard, emailAddressKeyboard, phoneNumberKeyboard diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_AnimatedPosition.h b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_AnimatedPosition.h index dac6ce1..60c2501 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_AnimatedPosition.h +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_AnimatedPosition.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -94,7 +94,7 @@ public: */ void endDrag() { - startTimer (1000 / 60); + startTimerHz (60); } /** Called outside of a drag operation to cause a nudge in the specified direction. @@ -102,7 +102,7 @@ public: */ void nudge (double deltaFromCurrentPosition) { - startTimer (100); + startTimerHz (10); moveTo (position + deltaFromCurrentPosition); } @@ -197,7 +197,7 @@ private: if (behaviour.isStopped (newPos)) stopTimer(); else - startTimer (1000 / 60); + startTimerHz (60); setPositionAndSendChange (newPos); } diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h index 026f36e..6eca4a4 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp index 6f28e8b..d2929f8 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -231,7 +231,7 @@ void ComponentAnimator::animateComponent (Component* const component, if (! isTimerRunning()) { lastTime = Time::getMillisecondCounter(); - startTimer (1000 / 50); + startTimerHz (50); } } } diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.h b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.h index 66c960b..966863e 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.h +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp index 4f1fd4a..e012e85 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h index 65f5ee4..0031e41 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp index 433ddf8..4c5c565 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -200,12 +200,12 @@ void ComponentBuilder::valueTreeChildAdded (ValueTree& tree, ValueTree&) ComponentBuilderHelpers::updateComponent (*this, tree); } -void ComponentBuilder::valueTreeChildRemoved (ValueTree& tree, ValueTree&) +void ComponentBuilder::valueTreeChildRemoved (ValueTree& tree, ValueTree&, int) { ComponentBuilderHelpers::updateComponent (*this, tree); } -void ComponentBuilder::valueTreeChildOrderChanged (ValueTree& tree) +void ComponentBuilder::valueTreeChildOrderChanged (ValueTree& tree, int, int) { ComponentBuilderHelpers::updateComponent (*this, tree); } diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.h b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.h index c524111..e87fe80 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.h +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -235,8 +235,8 @@ private: void valueTreePropertyChanged (ValueTree&, const Identifier&) override; void valueTreeChildAdded (ValueTree&, ValueTree&) override; - void valueTreeChildRemoved (ValueTree&, ValueTree&) override; - void valueTreeChildOrderChanged (ValueTree&) override; + void valueTreeChildRemoved (ValueTree&, ValueTree&, int) override; + void valueTreeChildOrderChanged (ValueTree&, int, int) override; void valueTreeParentChanged (ValueTree&) override; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ComponentBuilder) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp index 235baeb..32e8a0c 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h index c2ca30e..8c91598 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp index 21d44cc..a6358cf 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -282,6 +282,11 @@ ConcertinaPanel::ConcertinaPanel() ConcertinaPanel::~ConcertinaPanel() {} +int ConcertinaPanel::getNumPanels() const noexcept +{ + return holders.size(); +} + Component* ConcertinaPanel::getPanel (int index) const noexcept { if (PanelHolder* h = holders[index]) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ConcertinaPanel.h b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ConcertinaPanel.h index b340a8b..33f60d4 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ConcertinaPanel.h +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ConcertinaPanel.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -85,7 +85,7 @@ public: expanded to that size. Otherwise, it'll fill as much of the total space as possible. */ - bool expandPanelFully (Component* panelComponent, const bool animate); + bool expandPanelFully (Component* panelComponent, bool animate); /** Sets a maximum size for one of the panels. */ void setMaximumPanelSize (Component* panelComponent, int maximumSize); @@ -100,7 +100,8 @@ public: virtual ~LookAndFeelMethods() {} virtual void drawConcertinaPanelHeader (Graphics&, const Rectangle& area, - bool isMouseOver, bool isMouseDown, ConcertinaPanel&, Component&) = 0; + bool isMouseOver, bool isMouseDown, + ConcertinaPanel&, Component&) = 0; }; private: diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.cpp b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.cpp index 5932487..7f9e5e9 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.h b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.h index 6f111e0..02ba492 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.h +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp index 01238d9..60ba157 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h index 959e3fb..e6e6311 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp index ea05c3a..7653f8b 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h index 3aa7e55..bd7b578 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp index 1e04c48..1b2be73 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h index f5e87eb..5049bea 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp index 739c25c..d23088b 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h index db9c494..23c3689 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.cpp b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.cpp index 6184306..30182c8 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -60,6 +60,7 @@ ScrollBar::ScrollBar (const bool vertical_) thumbAreaSize (0), thumbStart (0), thumbSize (0), + minimumScrollBarThumbSize (0), initialDelayInMillisecs (100), repeatDelayInMillisecs (50), minimumDelayInMillisecs (10), @@ -67,6 +68,8 @@ ScrollBar::ScrollBar (const bool vertical_) isDraggingThumb (false), autohides (true) { + minimumScrollBarThumbSize = getLookAndFeel().getMinimumScrollbarThumbSize (*this); + setRepaintsOnMouseActivity (true); setFocusContainer (true); } @@ -190,10 +193,8 @@ void ScrollBar::updateThumbPosition() int newThumbSize = roundToInt (totalRange.getLength() > 0 ? (visibleRange.getLength() * thumbAreaSize) / totalRange.getLength() : thumbAreaSize); - LookAndFeel& lf = getLookAndFeel(); - - if (newThumbSize < lf.getMinimumScrollbarThumbSize (*this)) - newThumbSize = jmin (lf.getMinimumScrollbarThumbSize (*this), thumbAreaSize - 1); + if (newThumbSize < minimumScrollBarThumbSize) + newThumbSize = jmin (minimumScrollBarThumbSize, thumbAreaSize - 1); if (newThumbSize > thumbAreaSize) newThumbSize = thumbAreaSize; @@ -280,6 +281,7 @@ void ScrollBar::resized() const int length = vertical ? getHeight() : getWidth(); LookAndFeel& lf = getLookAndFeel(); + minimumScrollBarThumbSize = lf.getMinimumScrollbarThumbSize (*this); const bool buttonsVisible = lf.areScrollbarButtonsVisible(); int buttonSize = 0; @@ -329,6 +331,11 @@ void ScrollBar::resized() updateThumbPosition(); } +void ScrollBar::parentHierarchyChanged() +{ + lookAndFeelChanged(); +} + void ScrollBar::mouseDown (const MouseEvent& e) { isDraggingThumb = false; diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.h b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.h index 2731af0..b59fed2 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.h +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -376,12 +376,15 @@ public: void paint (Graphics&) override; /** @internal */ void resized() override; + /** @internal */ + void parentHierarchyChanged() override; private: //============================================================================== Range totalRange, visibleRange; double singleStepSize, dragStartRange; int thumbAreaStart, thumbAreaSize, thumbStart, thumbSize; + int minimumScrollBarThumbSize; int dragStartMousePos, lastMousePos; int initialDelayInMillisecs, repeatDelayInMillisecs, minimumDelayInMillisecs; bool vertical, isDraggingThumb, autohides; diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp index ee7ff14..14141bd 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h index 318a5cb..1de508e 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp index 10bd717..8737377 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h index f1aae0c..28de39f 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp index 08d04df..9deeb90 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h index f4cf399..9bf11f0 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp index ed5c02f..d16528c 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h index 31afbad..9622a23 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.cpp b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.cpp index a2f4680..1682cf7 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.h b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.h index b7bc85a..944ff83 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.h +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.cpp b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.cpp index 2824233..909eb2c 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -30,6 +30,7 @@ Viewport::Viewport (const String& name) showHScrollbar (true), showVScrollbar (true), deleteContent (true), + customScrollBarThickness (false), allowScrollingWithoutScrollbarV (false), allowScrollingWithoutScrollbarH (false), verticalScrollBar (true), @@ -39,6 +40,8 @@ Viewport::Viewport (const String& name) addAndMakeVisible (contentHolder); contentHolder.setInterceptsMouseClicks (false, true); + scrollBarThickness = getLookAndFeel().getDefaultScrollbarWidth(); + addChildComponent (verticalScrollBar); addChildComponent (horizontalScrollBar); @@ -173,6 +176,12 @@ void Viewport::componentMovedOrResized (Component&, bool, bool) updateVisibleArea(); } +void Viewport::lookAndFeelChanged() +{ + if (! customScrollBarThickness) + scrollBarThickness = getLookAndFeel().getDefaultScrollbarWidth(); +} + void Viewport::resized() { updateVisibleArea(); @@ -313,17 +322,32 @@ void Viewport::setScrollBarsShown (const bool showVerticalScrollbarIfNeeded, void Viewport::setScrollBarThickness (const int thickness) { - if (scrollBarThickness != thickness) + int newThickness; + + // To stay compatible with the previous code: use the + // default thickness if thickness parameter is zero + // or negative + if (thickness <= 0) + { + customScrollBarThickness = false; + newThickness = getLookAndFeel().getDefaultScrollbarWidth(); + } + else + { + customScrollBarThickness = true; + newThickness = thickness; + } + + if (scrollBarThickness != newThickness) { - scrollBarThickness = thickness; + scrollBarThickness = newThickness; updateVisibleArea(); } } int Viewport::getScrollBarThickness() const { - return scrollBarThickness > 0 ? scrollBarThickness - : getLookAndFeel().getDefaultScrollbarWidth(); + return scrollBarThickness; } void Viewport::scrollBarMoved (ScrollBar* scrollBarThatHasMoved, double newRangeStart) diff --git a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.h b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.h index baeb42a..9873c4c 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.h +++ b/JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -253,6 +253,8 @@ public: /** @internal */ void componentMovedOrResized (Component&, bool wasMoved, bool wasResized) override; /** @internal */ + void lookAndFeelChanged() override; + /** @internal */ bool useMouseWheelMoveIfNeeded (const MouseEvent&, const MouseWheelDetails&); /** @internal */ static bool respondsToKey (const KeyPress&); @@ -264,9 +266,11 @@ private: int scrollBarThickness; int singleStepX, singleStepY; bool showHScrollbar, showVScrollbar, deleteContent; + bool customScrollBarThickness; bool allowScrollingWithoutScrollbarV, allowScrollingWithoutScrollbarH; Component contentHolder; ScrollBar verticalScrollBar, horizontalScrollBar; + Point viewportPosToCompPos (Point) const; void updateVisibleArea(); diff --git a/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp b/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp index a457169..005c05b 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h b/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h index ef5c416..3de56b3 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h +++ b/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp b/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp index 2aa2c1d..927873c 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h b/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h index bc2b6db..c875326 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h +++ b/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp b/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp index 4135afe..13c821f 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -490,6 +490,12 @@ int LookAndFeel_V2::getAlertWindowButtonHeight() return 28; } +Font LookAndFeel_V2::getAlertWindowTitleFont() +{ + Font messageFont = getAlertWindowMessageFont(); + return messageFont.withHeight (messageFont.getHeight() * 1.1f).boldened(); +} + Font LookAndFeel_V2::getAlertWindowMessageFont() { return Font (15.0f); @@ -1397,7 +1403,6 @@ void LookAndFeel_V2::drawRotarySlider (Graphics& g, int x, int y, int width, int g.fillPath (filledArc); } - if (thickness > 0) { const float innerRadius = radius * 0.2f; Path p; @@ -1456,24 +1461,20 @@ Label* LookAndFeel_V2::createSliderTextBox (Slider& slider) Label* const l = new SliderLabelComp(); l->setJustificationType (Justification::centred); + l->setKeyboardType (TextInputTarget::decimalKeyboard); l->setColour (Label::textColourId, slider.findColour (Slider::textBoxTextColourId)); - l->setColour (Label::backgroundColourId, (slider.getSliderStyle() == Slider::LinearBar || slider.getSliderStyle() == Slider::LinearBarVertical) ? Colours::transparentBlack : slider.findColour (Slider::textBoxBackgroundColourId)); l->setColour (Label::outlineColourId, slider.findColour (Slider::textBoxOutlineColourId)); - l->setColour (TextEditor::textColourId, slider.findColour (Slider::textBoxTextColourId)); - l->setColour (TextEditor::backgroundColourId, slider.findColour (Slider::textBoxBackgroundColourId) .withAlpha ((slider.getSliderStyle() == Slider::LinearBar || slider.getSliderStyle() == Slider::LinearBarVertical) ? 0.7f : 1.0f)); - l->setColour (TextEditor::outlineColourId, slider.findColour (Slider::textBoxOutlineColourId)); - l->setColour (TextEditor::highlightColourId, slider.findColour (Slider::textBoxHighlightColourId)); return l; @@ -1498,12 +1499,86 @@ int LookAndFeel_V2::getSliderPopupPlacement (Slider&) } //============================================================================== -void LookAndFeel_V2::getTooltipSize (const String& tipText, int& width, int& height) +Slider::SliderLayout LookAndFeel_V2::getSliderLayout (Slider& slider) +{ + // 1. compute the actually visible textBox size from the slider textBox size and some additional constraints + + int minXSpace = 0; + int minYSpace = 0; + + Slider::TextEntryBoxPosition textBoxPos = slider.getTextBoxPosition(); + + if (textBoxPos == Slider::TextBoxLeft || textBoxPos == Slider::TextBoxRight) + minXSpace = 30; + else + minYSpace = 15; + + Rectangle localBounds = slider.getLocalBounds(); + + const int textBoxWidth = jmax (0, jmin (slider.getTextBoxWidth(), localBounds.getWidth() - minXSpace)); + const int textBoxHeight = jmax (0, jmin (slider.getTextBoxHeight(), localBounds.getHeight() - minYSpace)); + + Slider::SliderLayout layout; + + // 2. set the textBox bounds + + if (textBoxPos != Slider::NoTextBox) + { + if (slider.isBar()) + { + layout.textBoxBounds = localBounds; + } + else + { + layout.textBoxBounds.setWidth (textBoxWidth); + layout.textBoxBounds.setHeight (textBoxHeight); + + if (textBoxPos == Slider::TextBoxLeft) layout.textBoxBounds.setX (0); + else if (textBoxPos == Slider::TextBoxRight) layout.textBoxBounds.setX (localBounds.getWidth() - textBoxWidth); + else /* above or below -> centre horizontally */ layout.textBoxBounds.setX ((localBounds.getWidth() - textBoxWidth) / 2); + + if (textBoxPos == Slider::TextBoxAbove) layout.textBoxBounds.setY (0); + else if (textBoxPos == Slider::TextBoxBelow) layout.textBoxBounds.setY (localBounds.getHeight() - textBoxHeight); + else /* left or right -> centre vertically */ layout.textBoxBounds.setY ((localBounds.getHeight() - textBoxHeight) / 2); + } + } + + // 3. set the slider bounds + + layout.sliderBounds = localBounds; + + if (slider.isBar()) + { + layout.sliderBounds.reduce (1, 1); // bar border + } + else + { + if (textBoxPos == Slider::TextBoxLeft) layout.sliderBounds.removeFromLeft (textBoxWidth); + else if (textBoxPos == Slider::TextBoxRight) layout.sliderBounds.removeFromRight (textBoxWidth); + else if (textBoxPos == Slider::TextBoxAbove) layout.sliderBounds.removeFromTop (textBoxHeight); + else if (textBoxPos == Slider::TextBoxBelow) layout.sliderBounds.removeFromBottom (textBoxHeight); + + const int thumbIndent = getSliderThumbRadius (slider); + + if (slider.isHorizontal()) layout.sliderBounds.reduce (thumbIndent, 0); + else if (slider.isVertical()) layout.sliderBounds.reduce (0, thumbIndent); + } + + return layout; +} + +//============================================================================== +Rectangle LookAndFeel_V2::getTooltipBounds (const String& tipText, Point screenPos, Rectangle parentArea) { const TextLayout tl (LookAndFeelHelpers::layoutTooltipText (tipText, Colours::black)); - width = (int) (tl.getWidth() + 14.0f); - height = (int) (tl.getHeight() + 6.0f); + const int w = (int) (tl.getWidth() + 14.0f); + const int h = (int) (tl.getHeight() + 6.0f); + + return Rectangle (screenPos.x > parentArea.getCentreX() ? screenPos.x - (w + 12) : screenPos.x + 24, + screenPos.y > parentArea.getCentreY() ? screenPos.y - (h + 6) : screenPos.y + 6, + w, h) + .constrainedWithin (parentArea); } void LookAndFeel_V2::drawTooltip (Graphics& g, const String& text, int width, int height) @@ -2509,7 +2584,7 @@ void LookAndFeel_V2::layoutFileBrowserComponent (FileBrowserComponent& browserCo filenameBox->setBounds (x + 50, y, w - 50, controlsHeight); } -// Pulls a drawable out of compressed valuetree data.. +// Pulls a drawable out of compressed ValueTree data.. static Drawable* loadDrawableFromData (const void* data, size_t numBytes) { MemoryInputStream m (data, numBytes, false); diff --git a/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h b/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h index 2342b7c..aea4539 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h +++ b/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -67,7 +67,22 @@ public: void drawAlertBox (Graphics&, AlertWindow&, const Rectangle& textArea, TextLayout&) override; int getAlertBoxWindowFlags() override; int getAlertWindowButtonHeight() override; + + /** Override this function to supply a custom font for the alert window title. + This default implementation will use a boldened and slightly larger version + of the alert window message font. + + @see getAlertWindowMessageFont. + */ + Font getAlertWindowTitleFont() override; + + /** Override this function to supply a custom font for the alert window message. + This default implementation will use the default font with height set to 15.0f. + + @see getAlertWindowTitleFont + */ Font getAlertWindowMessageFont() override; + Font getAlertWindowFont() override; //============================================================================== @@ -193,9 +208,10 @@ public: ImageEffectFilter* getSliderEffect (Slider&) override; Font getSliderPopupFont (Slider&) override; int getSliderPopupPlacement (Slider&) override; + Slider::SliderLayout getSliderLayout (Slider&) override; //============================================================================== - void getTooltipSize (const String& tipText, int& width, int& height) override; + Rectangle getTooltipBounds (const String& tipText, Point screenPos, Rectangle parentArea) override; void drawTooltip (Graphics&, const String& text, int width, int height) override; //============================================================================== diff --git a/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp b/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp index e64288e..3e8e135 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h b/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h index ad97552..2a47425 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h +++ b/JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp b/JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp index 842fa59..8d746c4 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.h b/JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.h index badd05a..22be75b 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.h +++ b/JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -41,10 +41,10 @@ public: /** Creates a menu bar. @param model the model object to use to control this bar. You can - pass nullptr into this if you like, and set the model - later using the setModel() method + pass omit the parameter or pass nullptr into this if you like, + and set the model later using the setModel() method. */ - MenuBarComponent (MenuBarModel* model); + MenuBarComponent (MenuBarModel* model = nullptr); /** Destructor. */ ~MenuBarComponent(); diff --git a/JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.cpp b/JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.cpp index c72de96..d93642f 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.h b/JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.h index 99b6985..cf9c42f 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.h +++ b/JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.cpp b/JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.cpp index b2e64a3..143de11 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -1219,7 +1219,7 @@ public: getLookAndFeel().drawPopupMenuSectionHeader (g, getLocalBounds(), getName()); } - void getIdealSize (int& idealWidth, int& idealHeight) + void getIdealSize (int& idealWidth, int& idealHeight) override { getLookAndFeel().getIdealPopupMenuItemSize (getName(), false, -1, idealWidth, idealHeight); idealHeight += idealHeight / 2; @@ -1543,6 +1543,7 @@ int PopupMenu::showWithOptionalCallback (const Options& options, ModalComponentM if (userCallback == nullptr && canBeModal) return window->runModalLoop(); #else + (void) canBeModal; jassert (! (userCallback == nullptr && canBeModal)); #endif } @@ -1697,9 +1698,9 @@ void PopupMenu::CustomComponent::setHighlighted (bool shouldBeHighlighted) void PopupMenu::CustomComponent::triggerMenuItem() { - if (HelperClasses::ItemComponent* const mic = dynamic_cast (getParentComponent())) + if (HelperClasses::ItemComponent* const mic = findParentComponentOfClass()) { - if (HelperClasses::MenuWindow* const pmw = dynamic_cast (mic->getParentComponent())) + if (HelperClasses::MenuWindow* const pmw = mic->findParentComponentOfClass()) { pmw->dismissMenu (&mic->itemInfo); } diff --git a/JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.h b/JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.h index 97ac596..a14b2de 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.h +++ b/JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.cpp b/JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.cpp index 920a222..f45c93e 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.h b/JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.h index 200d272..c6c758a 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.h +++ b/JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.cpp b/JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.cpp index c6d0d77..d46f137 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.h b/JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.h index 484ed63..584f548 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.h +++ b/JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp index 0259706..139ae26 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.h b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.h index 0bb5cbe..7475710 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.h +++ b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp index 2e9c44b..e7c88ee 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -43,7 +43,7 @@ public: imageOffset (offset), hasCheckedForExternalDrag (false) { - setSize (im.getWidth(), im.getHeight()); + updateSize(); if (mouseDragSource == nullptr) mouseDragSource = sourceComponent; @@ -160,6 +160,13 @@ public: forceMouseCursorUpdate(); } + void updateImage (const Image& newImage) + { + image = newImage; + updateSize(); + repaint(); + } + void timerCallback() override { forceMouseCursorUpdate(); @@ -207,6 +214,11 @@ private: bool hasCheckedForExternalDrag; Time lastTimeOverTarget; + void updateSize() + { + setSize (image.getWidth(), image.getHeight()); + } + void forceMouseCursorUpdate() { Desktop::getInstance().getMainMouseSource().forceMouseCursorUpdate(); @@ -472,6 +484,12 @@ var DragAndDropContainer::getCurrentDragDescription() const : var(); } +void DragAndDropContainer::setCurrentDragImage (const Image& newImage) +{ + if (dragImageComponent != nullptr) + dragImageComponent->updateImage (newImage); +} + DragAndDropContainer* DragAndDropContainer::findParentDragContainerFor (Component* c) { return c != nullptr ? c->findParentComponentOfClass() : nullptr; diff --git a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h index 072f35e..cc8d4fb 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h +++ b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -102,6 +102,9 @@ public: */ var getCurrentDragDescription() const; + /** If a drag is in progress, this allows the image being shown to be dynamically updated. */ + void setCurrentDragImage (const Image& newImage); + /** Utility to find the DragAndDropContainer for a given Component. This will search up this component's parent hierarchy looking for the first diff --git a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h index d08b085..7d81841 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h +++ b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h index 0e3fadf..e949ea3 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h +++ b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_LassoComponent.h b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_LassoComponent.h index 786ca07..347cd4c 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_LassoComponent.h +++ b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_LassoComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp index 3f2c84f..f1b834c 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.h b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.h index df540f0..36b6433 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.h +++ b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.cpp b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.cpp index df94ae3..517b198 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.h b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.h index 92ac754..5cc6c78 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.h +++ b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -354,6 +354,10 @@ struct MouseWheelDetails /** If true, then the wheel has continuous, un-stepped motion. */ bool isSmooth; + + /** If true, then this event is part of the intertial momentum phase that follows + the wheel being released. */ + bool isInertial; }; diff --git a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp index b450181..03aa87c 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -23,7 +23,7 @@ */ MouseInactivityDetector::MouseInactivityDetector (Component& c) - : targetComp (c), delayMs (1500), isActive (true) + : targetComp (c), delayMs (1500), toleranceDistance (15), isActive (true) { targetComp.addMouseListener (this, true); } @@ -33,11 +33,8 @@ MouseInactivityDetector::~MouseInactivityDetector() targetComp.removeMouseListener (this); } -void MouseInactivityDetector::setDelay (int newDelayMilliseconds) -{ - delayMs = newDelayMilliseconds; -} - +void MouseInactivityDetector::setDelay (int newDelay) noexcept { delayMs = newDelay; } +void MouseInactivityDetector::setMouseMoveTolerance (int newDistance) noexcept { toleranceDistance = newDistance; } void MouseInactivityDetector::addListener (Listener* l) { listenerList.add (l); } void MouseInactivityDetector::removeListener (Listener* l) { listenerList.remove (l); } @@ -51,7 +48,7 @@ void MouseInactivityDetector::wakeUp (const MouseEvent& e, bool alwaysWake) { const Point newPos (e.getEventRelativeTo (&targetComp).getPosition()); - if ((! isActive) && (alwaysWake || e.source.isTouch() || newPos.getDistanceFrom (lastMousePos) > 15)) + if ((! isActive) && (alwaysWake || e.source.isTouch() || newPos.getDistanceFrom (lastMousePos) > toleranceDistance)) setActive (true); if (lastMousePos != newPos) diff --git a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h index a2f6533..949f059 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h +++ b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -54,7 +54,12 @@ public: /** Sets the time for which the mouse must be still before the callback is triggered. */ - void setDelay (int newDelayMilliseconds); + void setDelay (int newDelayMilliseconds) noexcept; + + /** Sets the number of pixels by which the cursor is allowed to drift before it is + considered to be actively moved. + */ + void setMouseMoveTolerance (int pixelsNeededToTrigger) noexcept; //============================================================================== /** Classes should implement this to receive callbacks from a MouseInactivityDetector @@ -84,7 +89,7 @@ private: Component& targetComp; ListenerList listenerList; Point lastMousePos; - int delayMs; + int delayMs, toleranceDistance; bool isActive; void timerCallback() override; diff --git a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp index 8bed5af..77be371 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -331,10 +331,17 @@ public: Time time, const MouseWheelDetails& wheel) { Desktop::getInstance().incrementMouseWheelCounter(); - Point screenPos; - if (Component* current = getTargetForGesture (peer, positionWithinPeer, time, screenPos)) - sendMouseWheel (*current, screenPos, time, wheel); + + // This will make sure that when the wheel spins in its inertial phase, any events + // continue to be sent to the last component that the mouse was over when it was being + // actively controlled by the user. This avoids confusion when scrolling through nested + // scrollable components. + if (lastNonInertialWheelTarget == nullptr || ! wheel.isInertial) + lastNonInertialWheelTarget = getTargetForGesture (peer, positionWithinPeer, time, screenPos); + + if (Component* target = lastNonInertialWheelTarget) + sendMouseWheel (*target, screenPos, time, wheel); } void handleMagnifyGesture (ComponentPeer& peer, Point positionWithinPeer, @@ -351,13 +358,10 @@ public: int getNumberOfMultipleClicks() const noexcept { - int numClicks = 0; + int numClicks = 1; - if (mouseDowns[0].time != Time()) + if (! hasMouseMovedSignificantlySincePressed()) { - if (! mouseMovedSignificantlySincePressed) - ++numClicks; - for (int i = 1; i < numElementsInArray (mouseDowns); ++i) { if (mouseDowns[0].canBePartOfMultipleClickWith (mouseDowns[i], MouseEvent::getDoubleClickTimeout() * jmin (i, 2))) @@ -470,7 +474,7 @@ public: bool isUnboundedMouseModeOn, isCursorVisibleUntilOffscreen; private: - WeakReference componentUnderMouse; + WeakReference componentUnderMouse, lastNonInertialWheelTarget; ComponentPeer* lastPeer; void* currentCursorHandle; @@ -515,6 +519,7 @@ private: mouseDowns[0].peerID = 0; mouseMovedSignificantlySincePressed = false; + lastNonInertialWheelTarget = nullptr; } void registerMouseDrag (Point screenPos) noexcept diff --git a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.h b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.h index e257363..7bf19c5 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.h +++ b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.cpp b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.cpp index f1ad122..3021bcb 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.h b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.h index 54069c5..5aab50b 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.h +++ b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_SelectedItemSet.h b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_SelectedItemSet.h index 20f1f7b..2905dbd 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_SelectedItemSet.h +++ b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_SelectedItemSet.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -38,8 +38,6 @@ To be informed when items are selected/deselected, register a ChangeListener with this object. - - @see SelectableObject */ template class SelectedItemSet : public ChangeBroadcaster diff --git a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h index 60fa491..90e1713 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h +++ b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_TooltipClient.h b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_TooltipClient.h index 9fc0118..06cd315 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_TooltipClient.h +++ b/JuceLibraryCode/modules/juce_gui_basics/mouse/juce_TooltipClient.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/native/juce_MultiTouchMapper.h b/JuceLibraryCode/modules/juce_gui_basics/native/juce_MultiTouchMapper.h index 66187e9..dd866b5 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/native/juce_MultiTouchMapper.h +++ b/JuceLibraryCode/modules/juce_gui_basics/native/juce_MultiTouchMapper.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/native/juce_android_FileChooser.cpp b/JuceLibraryCode/modules/juce_gui_basics/native/juce_android_FileChooser.cpp index 78f157e..f563fea 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/native/juce_android_FileChooser.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/native/juce_android_FileChooser.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/native/juce_android_Windowing.cpp b/JuceLibraryCode/modules/juce_gui_basics/native/juce_android_Windowing.cpp index 200615f..94e69f5 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/native/juce_android_Windowing.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/native/juce_android_Windowing.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -41,9 +41,15 @@ JUCE_JNI_CALLBACK (JUCE_ANDROID_ACTIVITY_CLASSNAME, launchApp, void, (JNIEnv* en initialiseJuce_GUI(); - JUCEApplicationBase* app = JUCEApplicationBase::createInstance(); - if (! app->initialiseApp()) - exit (app->getApplicationReturnValue()); + if (JUCEApplicationBase* app = JUCEApplicationBase::createInstance()) + { + if (! app->initialiseApp()) + exit (app->shutdownApp()); + } + else + { + jassertfalse; // you must supply an application object for an android app! + } jassert (MessageManager::getInstance()->isThisTheMessageThread()); } @@ -106,12 +112,14 @@ public: : ComponentPeer (comp, windowStyleFlags), usingAndroidGraphics (false), fullScreen (false), - sizeAllocated (0) + sizeAllocated (0), + scale ((float) Desktop::getInstance().getDisplays().getMainDisplay().scale) { // NB: must not put this in the initialiser list, as it invokes a callback, // which will fail if the peer is only half-constructed. view = GlobalRef (android.activity.callObjectMethod (JuceAppActivity.createNewView, - component.isOpaque(), (jlong) this)); + (jboolean) component.isOpaque(), + (jlong) this)); if (isFocused()) handleFocusGain(); @@ -182,8 +190,10 @@ public: view.callVoidMethod (ComponentPeerView.setViewName, javaString (title).get()); } - void setBounds (const Rectangle& r, bool isNowFullScreen) override + void setBounds (const Rectangle& userRect, bool isNowFullScreen) override { + Rectangle r = userRect * scale; + if (MessageManager::getInstance()->isThisTheMessageThread()) { fullScreen = isNowFullScreen; @@ -217,7 +227,7 @@ public: return Rectangle (view.callIntMethod (ComponentPeerView.getLeft), view.callIntMethod (ComponentPeerView.getTop), view.callIntMethod (ComponentPeerView.getWidth), - view.callIntMethod (ComponentPeerView.getHeight)); + view.callIntMethod (ComponentPeerView.getHeight)) / scale; } void handleScreenSizeChange() @@ -231,7 +241,7 @@ public: Point getScreenPosition() const { return Point (view.callIntMethod (ComponentPeerView.getLeft), - view.callIntMethod (ComponentPeerView.getTop)); + view.callIntMethod (ComponentPeerView.getTop)) / scale; } Point localToGlobal (Point relativePosition) override @@ -284,7 +294,8 @@ public: return isPositiveAndBelow (localPos.x, component.getWidth()) && isPositiveAndBelow (localPos.y, component.getHeight()) && ((! trueIfInAChildWindow) || view.callBooleanMethod (ComponentPeerView.containsPoint, - localPos.x, localPos.y)); + localPos.x * scale, + localPos.y * scale)); } BorderSize getFrameSize() const override @@ -315,19 +326,21 @@ public: } //============================================================================== - void handleMouseDownCallback (int index, Point pos, int64 time) + void handleMouseDownCallback (int index, Point sysPos, int64 time) { + Point pos = sysPos / scale; lastMousePos = pos; // this forces a mouse-enter/up event, in case for some reason we didn't get a mouse-up before. handleMouseEvent (index, pos, currentModifiers.withoutMouseButtons(), time); if (isValidPeer (this)) - handleMouseDragCallback (index, pos, time); + handleMouseDragCallback (index, sysPos, time); } void handleMouseDragCallback (int index, Point pos, int64 time) { + pos /= scale; lastMousePos = pos; jassert (index < 64); @@ -339,6 +352,7 @@ public: void handleMouseUpCallback (int index, Point pos, int64 time) { + pos /= scale; lastMousePos = pos; jassert (index < 64); @@ -384,6 +398,7 @@ public: { case TextInputTarget::textKeyboard: return "text"; case TextInputTarget::numericKeyboard: return "number"; + case TextInputTarget::decimalKeyboard: return "numberDecimal"; case TextInputTarget::urlKeyboard: return "textUri"; case TextInputTarget::emailAddressKeyboard: return "textEmailAddress"; case TextInputTarget::phoneNumberKeyboard: return "phone"; @@ -405,7 +420,7 @@ public: } //============================================================================== - void handlePaintCallback (JNIEnv* env, jobject canvas) + void handlePaintCallback (JNIEnv* env, jobject canvas, jobject paint) { jobject rect = env->CallObjectMethod (canvas, CanvasMinimal.getClipBounds); const int left = env->GetIntField (rect, RectClass.left); @@ -433,6 +448,7 @@ public: { LowLevelGraphicsSoftwareRenderer g (temp); g.setOrigin (-clip.getPosition()); + g.addTransform (AffineTransform::scale (scale)); handlePaint (g); } } @@ -441,12 +457,14 @@ public: env->CallVoidMethod (canvas, CanvasMinimal.drawBitmap, (jintArray) buffer.get(), 0, clip.getWidth(), (jfloat) clip.getX(), (jfloat) clip.getY(), - clip.getWidth(), clip.getHeight(), true, (jobject) 0); + clip.getWidth(), clip.getHeight(), true, paint); } } - void repaint (const Rectangle& area) override + void repaint (const Rectangle& userArea) override { + Rectangle area = userArea * scale; + if (MessageManager::getInstance()->isThisTheMessageThread()) { view.callVoidMethod (ComponentPeerView.invalidate, area.getX(), area.getY(), area.getRight(), area.getBottom()); @@ -499,6 +517,7 @@ private: GlobalRef buffer; bool usingAndroidGraphics, fullScreen; int sizeAllocated; + float scale; class PreallocatedImage : public ImagePixelData { @@ -567,7 +586,7 @@ int64 AndroidComponentPeer::touchesDown = 0; peer->juceMethodInvocation; \ } -JUCE_VIEW_CALLBACK (void, handlePaint, (JNIEnv* env, jobject view, jlong host, jobject canvas), handlePaintCallback (env, canvas)) +JUCE_VIEW_CALLBACK (void, handlePaint, (JNIEnv* env, jobject view, jlong host, jobject canvas, jobject paint), handlePaintCallback (env, canvas, paint)) JUCE_VIEW_CALLBACK (void, handleMouseDown, (JNIEnv* env, jobject view, jlong host, jint i, jfloat x, jfloat y, jlong time), handleMouseDownCallback (i, Point ((float) x, (float) y), (int64) time)) JUCE_VIEW_CALLBACK (void, handleMouseDrag, (JNIEnv* env, jobject view, jlong host, jint i, jfloat x, jfloat y, jlong time), handleMouseDragCallback (i, Point ((float) x, (float) y), (int64) time)) JUCE_VIEW_CALLBACK (void, handleMouseUp, (JNIEnv* env, jobject view, jlong host, jint i, jfloat x, jfloat y, jlong time), handleMouseUpCallback (i, Point ((float) x, (float) y), (int64) time)) @@ -584,7 +603,7 @@ ComponentPeer* Component::createNewPeer (int styleFlags, void*) jobject createOpenGLView (ComponentPeer* peer) { - jobject parentView = static_cast (peer->getNativeHandle()); + jobject parentView = static_cast (peer->getNativeHandle()); return getEnv()->CallObjectMethod (parentView, ComponentPeerView.createGLView); } @@ -715,11 +734,12 @@ bool juce_areThereAnyAlwaysOnTopWindows() void Desktop::Displays::findDisplays (float masterScale) { Display d; - d.userArea = d.totalArea = Rectangle (android.screenWidth, - android.screenHeight) / masterScale; + d.isMain = true; - d.scale = masterScale; d.dpi = android.dpi; + d.scale = masterScale * (d.dpi / 150.); + d.userArea = d.totalArea = Rectangle (android.screenWidth, + android.screenHeight) / d.scale; displays.add (d); } diff --git a/JuceLibraryCode/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm b/JuceLibraryCode/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm index b139ccf..6e55d4c 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm +++ b/JuceLibraryCode/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -862,12 +862,18 @@ void UIViewComponentPeer::textInputRequired (Point, TextInputTarget&) { } +static bool isIOS4_1() noexcept +{ + return [[[UIDevice currentDevice] systemVersion] doubleValue] >= 4.1; +} + static UIKeyboardType getUIKeyboardType (TextInputTarget::VirtualKeyboardType type) noexcept { switch (type) { case TextInputTarget::textKeyboard: return UIKeyboardTypeAlphabet; - case TextInputTarget::numericKeyboard: return UIKeyboardTypeNumbersAndPunctuation; + case TextInputTarget::numericKeyboard: return isIOS4_1() ? UIKeyboardTypeNumberPad : UIKeyboardTypeNumbersAndPunctuation; + case TextInputTarget::decimalKeyboard: return isIOS4_1() ? UIKeyboardTypeDecimalPad : UIKeyboardTypeNumbersAndPunctuation; case TextInputTarget::urlKeyboard: return UIKeyboardTypeURL; case TextInputTarget::emailAddressKeyboard: return UIKeyboardTypeEmailAddress; case TextInputTarget::phoneNumberKeyboard: return UIKeyboardTypePhonePad; @@ -881,7 +887,7 @@ void UIViewComponentPeer::updateHiddenTextContent (TextInputTarget* target) { view->hiddenTextView.keyboardType = getUIKeyboardType (target->getKeyboardType()); view->hiddenTextView.text = juceStringToNS (target->getTextInRange (Range (0, target->getHighlightedRegion().getStart()))); - view->hiddenTextView.selectedRange = NSMakeRange (target->getHighlightedRegion().getStart(), 0); + view->hiddenTextView.selectedRange = NSMakeRange ((NSUInteger) target->getHighlightedRegion().getStart(), 0); } BOOL UIViewComponentPeer::textViewReplaceCharacters (Range range, const String& text) diff --git a/JuceLibraryCode/modules/juce_gui_basics/native/juce_ios_Windowing.mm b/JuceLibraryCode/modules/juce_gui_basics/native/juce_ios_Windowing.mm index 6df6db0..4200e34 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/native/juce_ios_Windowing.mm +++ b/JuceLibraryCode/modules/juce_gui_basics/native/juce_ios_Windowing.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -43,44 +43,51 @@ extern bool isIOSAppActive; - (void) applicationDidFinishLaunching: (UIApplication*) application { - (void) application; + ignoreUnused (application); initialiseJuce_GUI(); - JUCEApplicationBase* app = JUCEApplicationBase::createInstance(); - - if (! app->initialiseApp()) - exit (0); + if (JUCEApplicationBase* app = JUCEApplicationBase::createInstance()) + { + if (! app->initialiseApp()) + exit (app->shutdownApp()); + } + else + { + jassertfalse; // you must supply an application object for an iOS app! + } } - (void) applicationWillTerminate: (UIApplication*) application { - (void) application; + ignoreUnused (application); JUCEApplicationBase::appWillTerminateByForce(); } - (void) applicationDidEnterBackground: (UIApplication*) application { - (void) application; + ignoreUnused (application); + if (JUCEApplicationBase* const app = JUCEApplicationBase::getInstance()) app->suspended(); } - (void) applicationWillEnterForeground: (UIApplication*) application { - (void) application; + ignoreUnused (application); + if (JUCEApplicationBase* const app = JUCEApplicationBase::getInstance()) app->resumed(); } - (void) applicationDidBecomeActive: (UIApplication*) application { - (void) application; + ignoreUnused (application); isIOSAppActive = true; } - (void) applicationWillResignActive: (UIApplication*) application { - (void) application; + ignoreUnused (application); isIOSAppActive = false; } @@ -207,7 +214,7 @@ void JUCE_CALLTYPE NativeMessageBox::showMessageBox (AlertWindow::AlertIconType JUCE_AUTORELEASEPOOL { iOSMessageBox mb (title, message, @"OK", nil, nil, nullptr, false); - (void) mb.getResult(); + ignoreUnused (mb.getResult()); } } #endif @@ -294,10 +301,10 @@ void SystemClipboard::copyTextToClipboard (const String& text) String SystemClipboard::getTextFromClipboard() { - NSString* text = [[UIPasteboard generalPasteboard] valueForPasteboardType: @"public.text"]; + if (NSString* text = [[UIPasteboard generalPasteboard] valueForPasteboardType: @"public.text"]) + return nsStringToJuce (text); - return text == nil ? String::empty - : nsStringToJuce (text); + return String(); } //============================================================================== diff --git a/JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_Clipboard.cpp b/JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_Clipboard.cpp index b64c85c..a629187 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_Clipboard.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_Clipboard.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -22,8 +22,8 @@ ============================================================================== */ -extern Display* display; -extern Window juce_messageWindowHandle; +extern ::Display* display; +extern ::Window juce_messageWindowHandle; namespace ClipboardHelpers { @@ -36,8 +36,11 @@ namespace ClipboardHelpers static void initSelectionAtoms() { static bool isInitialised = false; + if (! isInitialised) { + isInitialised = true; + atom_UTF8_STRING = XInternAtom (display, "UTF8_STRING", False); atom_CLIPBOARD = XInternAtom (display, "CLIPBOARD", False); atom_TARGETS = XInternAtom (display, "TARGETS", False); @@ -50,29 +53,34 @@ namespace ClipboardHelpers static String readWindowProperty (Window window, Atom prop) { String returnData; - char* clipData; - Atom actualType; - int actualFormat; - unsigned long numItems, bytesLeft; - - if (XGetWindowProperty (display, window, prop, - 0L /* offset */, 1000000 /* length (max) */, False, - AnyPropertyType /* format */, - &actualType, &actualFormat, &numItems, &bytesLeft, - (unsigned char**) &clipData) == Success) + + if (display != nullptr) { - if (actualType == atom_UTF8_STRING && actualFormat == 8) - returnData = String::fromUTF8 (clipData, numItems); - else if (actualType == XA_STRING && actualFormat == 8) - returnData = String (clipData, numItems); + char* clipData; + Atom actualType; + int actualFormat; + unsigned long numItems, bytesLeft; + + if (XGetWindowProperty (display, window, prop, + 0L /* offset */, 1000000 /* length (max) */, False, + AnyPropertyType /* format */, + &actualType, &actualFormat, &numItems, &bytesLeft, + (unsigned char**) &clipData) == Success) + { + if (actualType == atom_UTF8_STRING && actualFormat == 8) + returnData = String::fromUTF8 (clipData, (int) numItems); + else if (actualType == XA_STRING && actualFormat == 8) + returnData = String (clipData, numItems); + + if (clipData != nullptr) + XFree (clipData); - if (clipData != nullptr) - XFree (clipData); + jassert (bytesLeft == 0 || numItems == 1000000); + } - jassert (bytesLeft == 0 || numItems == 1000000); + XDeleteProperty (display, window, prop); } - XDeleteProperty (display, window, prop); return returnData; } @@ -92,6 +100,7 @@ namespace ClipboardHelpers while (--count >= 0) { XEvent event; + if (XCheckTypedWindowEvent (display, juce_messageWindowHandle, SelectionNotify, &event)) { if (event.xselection.property == property_name) @@ -102,10 +111,8 @@ namespace ClipboardHelpers event.xselection.property); return true; } - else - { - return false; // the format we asked for was denied.. (event.xselection.property == None) - } + + return false; // the format we asked for was denied.. (event.xselection.property == None) } // not very elegant.. we could do a select() or something like that... @@ -121,66 +128,69 @@ namespace ClipboardHelpers // Called from the event loop in juce_linux_Messaging in response to SelectionRequest events static void handleSelection (XSelectionRequestEvent& evt) { - ClipboardHelpers::initSelectionAtoms(); - - // the selection content is sent to the target window as a window property - XSelectionEvent reply; - reply.type = SelectionNotify; - reply.display = evt.display; - reply.requestor = evt.requestor; - reply.selection = evt.selection; - reply.target = evt.target; - reply.property = None; // == "fail" - reply.time = evt.time; - - HeapBlock data; - int propertyFormat = 0; - size_t numDataItems = 0; - - if (evt.selection == XA_PRIMARY || evt.selection == ClipboardHelpers::atom_CLIPBOARD) + if (display != nullptr) { - if (evt.target == XA_STRING || evt.target == ClipboardHelpers::atom_UTF8_STRING) + ClipboardHelpers::initSelectionAtoms(); + + // the selection content is sent to the target window as a window property + XSelectionEvent reply; + reply.type = SelectionNotify; + reply.display = evt.display; + reply.requestor = evt.requestor; + reply.selection = evt.selection; + reply.target = evt.target; + reply.property = None; // == "fail" + reply.time = evt.time; + + HeapBlock data; + int propertyFormat = 0; + size_t numDataItems = 0; + + if (evt.selection == XA_PRIMARY || evt.selection == ClipboardHelpers::atom_CLIPBOARD) { - // translate to utf8 - numDataItems = ClipboardHelpers::localClipboardContent.getNumBytesAsUTF8() + 1; - data.calloc (numDataItems + 1); - ClipboardHelpers::localClipboardContent.copyToUTF8 (data, numDataItems); - propertyFormat = 8; // bits/item + if (evt.target == XA_STRING || evt.target == ClipboardHelpers::atom_UTF8_STRING) + { + // translate to utf8 + numDataItems = ClipboardHelpers::localClipboardContent.getNumBytesAsUTF8() + 1; + data.calloc (numDataItems + 1); + ClipboardHelpers::localClipboardContent.copyToUTF8 (data, numDataItems); + propertyFormat = 8; // bits/item + } + else if (evt.target == ClipboardHelpers::atom_TARGETS) + { + // another application wants to know what we are able to send + numDataItems = 2; + propertyFormat = 32; // atoms are 32-bit + data.calloc (numDataItems * 4); + Atom* atoms = reinterpret_cast (data.getData()); + atoms[0] = ClipboardHelpers::atom_UTF8_STRING; + atoms[1] = XA_STRING; + + evt.target = XA_ATOM; + } } - else if (evt.target == ClipboardHelpers::atom_TARGETS) + else { - // another application wants to know what we are able to send - numDataItems = 2; - propertyFormat = 32; // atoms are 32-bit - data.calloc (numDataItems * 4); - Atom* atoms = reinterpret_cast (data.getData()); - atoms[0] = ClipboardHelpers::atom_UTF8_STRING; - atoms[1] = XA_STRING; - - evt.target = XA_ATOM; + DBG ("requested unsupported clipboard"); } - } - else - { - DBG ("requested unsupported clipboard"); - } - if (data != nullptr) - { - const size_t maxReasonableSelectionSize = 1000000; - - // for very big chunks of data, we should use the "INCR" protocol , which is a pain in the *ss - if (evt.property != None && numDataItems < maxReasonableSelectionSize) + if (data != nullptr) { - XChangeProperty (evt.display, evt.requestor, - evt.property, evt.target, - propertyFormat /* 8 or 32 */, PropModeReplace, - reinterpret_cast (data.getData()), numDataItems); - reply.property = evt.property; // " == success" + const size_t maxReasonableSelectionSize = 1000000; + + // for very big chunks of data, we should use the "INCR" protocol , which is a pain in the *ss + if (evt.property != None && numDataItems < maxReasonableSelectionSize) + { + XChangeProperty (evt.display, evt.requestor, + evt.property, evt.target, + propertyFormat /* 8 or 32 */, PropModeReplace, + reinterpret_cast (data.getData()), (int) numDataItems); + reply.property = evt.property; // " == success" + } } - } - XSendEvent (evt.display, evt.requestor, 0, NoEventMask, (XEvent*) &reply); + XSendEvent (evt.display, evt.requestor, 0, NoEventMask, (XEvent*) &reply); + } } } @@ -201,51 +211,58 @@ static ClipboardCallbackInitialiser clipboardInitialiser; //============================================================================== void SystemClipboard::copyTextToClipboard (const String& clipText) { - ClipboardHelpers::initSelectionAtoms(); - ClipboardHelpers::localClipboardContent = clipText; + if (display != nullptr) + { + ClipboardHelpers::initSelectionAtoms(); + ClipboardHelpers::localClipboardContent = clipText; - XSetSelectionOwner (display, XA_PRIMARY, juce_messageWindowHandle, CurrentTime); - XSetSelectionOwner (display, ClipboardHelpers::atom_CLIPBOARD, juce_messageWindowHandle, CurrentTime); + XSetSelectionOwner (display, XA_PRIMARY, juce_messageWindowHandle, CurrentTime); + XSetSelectionOwner (display, ClipboardHelpers::atom_CLIPBOARD, juce_messageWindowHandle, CurrentTime); + } } String SystemClipboard::getTextFromClipboard() { - ClipboardHelpers::initSelectionAtoms(); - - /* 1) try to read from the "CLIPBOARD" selection first (the "high - level" clipboard that is supposed to be filled by ctrl-C - etc). When a clipboard manager is running, the content of this - selection is preserved even when the original selection owner - exits. - - 2) and then try to read from "PRIMARY" selection (the "legacy" selection - filled by good old x11 apps such as xterm) - */ String content; - Atom selection = XA_PRIMARY; - Window selectionOwner = None; - if ((selectionOwner = XGetSelectionOwner (display, selection)) == None) + if (display != nullptr) { - selection = ClipboardHelpers::atom_CLIPBOARD; - selectionOwner = XGetSelectionOwner (display, selection); - } + ClipboardHelpers::initSelectionAtoms(); - if (selectionOwner != None) - { - if (selectionOwner == juce_messageWindowHandle) + /* 1) try to read from the "CLIPBOARD" selection first (the "high + level" clipboard that is supposed to be filled by ctrl-C + etc). When a clipboard manager is running, the content of this + selection is preserved even when the original selection owner + exits. + + 2) and then try to read from "PRIMARY" selection (the "legacy" selection + filled by good old x11 apps such as xterm) + */ + Atom selection = XA_PRIMARY; + Window selectionOwner = None; + + if ((selectionOwner = XGetSelectionOwner (display, selection)) == None) { - content = ClipboardHelpers::localClipboardContent; + selection = ClipboardHelpers::atom_CLIPBOARD; + selectionOwner = XGetSelectionOwner (display, selection); } - else - { - // first try: we want an utf8 string - bool ok = ClipboardHelpers::requestSelectionContent (content, selection, ClipboardHelpers::atom_UTF8_STRING); - if (! ok) + if (selectionOwner != None) + { + if (selectionOwner == juce_messageWindowHandle) { - // second chance, ask for a good old locale-dependent string .. - ok = ClipboardHelpers::requestSelectionContent (content, selection, XA_STRING); + content = ClipboardHelpers::localClipboardContent; + } + else + { + // first try: we want an utf8 string + bool ok = ClipboardHelpers::requestSelectionContent (content, selection, ClipboardHelpers::atom_UTF8_STRING); + + if (! ok) + { + // second chance, ask for a good old locale-dependent string .. + ok = ClipboardHelpers::requestSelectionContent (content, selection, XA_STRING); + } } } } diff --git a/JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp b/JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp index 8ac190b..a24b14b 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -131,11 +131,11 @@ static void addZenityArgs (StringArray& args, String& separator, if (filters.isNotEmpty() && filters != "*" && filters != "*.*") { - args.add ("--file-filter"); - args.add (filters.replaceCharacter (';', ' ')); + StringArray tokens; + tokens.addTokens (filters, ";,|", "\""); - args.add ("--file-filter"); - args.add ("All files | *"); + for (int i = 0; i < tokens.size(); ++i) + args.add ("--file-filter=" + tokens[i]); } if (file.isDirectory()) diff --git a/JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_Windowing.cpp b/JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_Windowing.cpp index 2fbc6cb..e4e66f0 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_Windowing.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_Windowing.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -22,7 +22,7 @@ ============================================================================== */ -extern Display* display; +extern ::Display* display; extern XContext windowHandleXContext; typedef void (*WindowMessageReceiveCallback) (XEvent&); extern WindowMessageReceiveCallback dispatchWindowMessage; @@ -165,6 +165,9 @@ namespace Keys bool KeyPress::isKeyCurrentlyDown (const int keyCode) { + if (display == nullptr) + return false; + int keysym; if (keyCode & Keys::extendedKeyModifier) @@ -186,7 +189,7 @@ bool KeyPress::isKeyCurrentlyDown (const int keyCode) ScopedXLock xlock; - const int keycode = XKeysymToKeycode (display, keysym); + const int keycode = XKeysymToKeycode (display, (KeySym) keysym); const int keybyte = keycode >> 3; const int keybit = (1 << (keycode & 7)); @@ -212,54 +215,58 @@ namespace XSHMHelpers if (! isChecked) { isChecked = true; - int major, minor; - Bool pixmaps; - - ScopedXLock xlock; - if (XShmQueryVersion (display, &major, &minor, &pixmaps)) + if (display != nullptr) { - trappedErrorCode = 0; - XErrorHandler oldHandler = XSetErrorHandler (errorTrapHandler); - - XShmSegmentInfo segmentInfo; - zerostruct (segmentInfo); + int major, minor; + Bool pixmaps; - XImage* xImage = XShmCreateImage (display, DefaultVisual (display, DefaultScreen (display)), - 24, ZPixmap, 0, &segmentInfo, 50, 50); + ScopedXLock xlock; - if ((segmentInfo.shmid = shmget (IPC_PRIVATE, - xImage->bytes_per_line * xImage->height, - IPC_CREAT | 0777)) >= 0) + if (XShmQueryVersion (display, &major, &minor, &pixmaps)) { - segmentInfo.shmaddr = (char*) shmat (segmentInfo.shmid, 0, 0); + trappedErrorCode = 0; + XErrorHandler oldHandler = XSetErrorHandler (errorTrapHandler); + + XShmSegmentInfo segmentInfo; + zerostruct (segmentInfo); + + XImage* xImage = XShmCreateImage (display, DefaultVisual (display, DefaultScreen (display)), + 24, ZPixmap, 0, &segmentInfo, 50, 50); - if (segmentInfo.shmaddr != (void*) -1) + if ((segmentInfo.shmid = shmget (IPC_PRIVATE, + (size_t) (xImage->bytes_per_line * xImage->height), + IPC_CREAT | 0777)) >= 0) { - segmentInfo.readOnly = False; - xImage->data = segmentInfo.shmaddr; - XSync (display, False); + segmentInfo.shmaddr = (char*) shmat (segmentInfo.shmid, 0, 0); - if (XShmAttach (display, &segmentInfo) != 0) + if (segmentInfo.shmaddr != (void*) -1) { + segmentInfo.readOnly = False; + xImage->data = segmentInfo.shmaddr; XSync (display, False); - XShmDetach (display, &segmentInfo); - isAvailable = true; + if (XShmAttach (display, &segmentInfo) != 0) + { + XSync (display, False); + XShmDetach (display, &segmentInfo); + + isAvailable = true; + } } - } - XFlush (display); - XDestroyImage (xImage); + XFlush (display); + XDestroyImage (xImage); - shmdt (segmentInfo.shmaddr); - } + shmdt (segmentInfo.shmaddr); + } - shmctl (segmentInfo.shmid, IPC_RMID, 0); + shmctl (segmentInfo.shmid, IPC_RMID, 0); - XSetErrorHandler (oldHandler); - if (trappedErrorCode != 0) - isAvailable = false; + XSetErrorHandler (oldHandler); + if (trappedErrorCode != 0) + isAvailable = false; + } } } @@ -288,25 +295,29 @@ namespace XRender if (! hasLoaded) { - ScopedXLock xlock; - hasLoaded = true; - - if (void* h = dlopen ("libXrender.so", RTLD_GLOBAL | RTLD_NOW)) + if (display != nullptr) { - xRenderQueryVersion = (tXRenderQueryVersion) dlsym (h, "XRenderQueryVersion"); - xRenderFindStandardFormat = (tXRenderFindStandardFormat) dlsym (h, "XRenderFindStandardFormat"); - xRenderFindFormat = (tXRenderFindFormat) dlsym (h, "XRenderFindFormat"); - xRenderFindVisualFormat = (tXRenderFindVisualFormat) dlsym (h, "XRenderFindVisualFormat"); - } + hasLoaded = true; - if (xRenderQueryVersion != nullptr - && xRenderFindStandardFormat != nullptr - && xRenderFindFormat != nullptr - && xRenderFindVisualFormat != nullptr) - { - int major, minor; - if (xRenderQueryVersion (display, &major, &minor)) - return true; + ScopedXLock xlock; + + if (void* h = dlopen ("libXrender.so", RTLD_GLOBAL | RTLD_NOW)) + { + xRenderQueryVersion = (tXRenderQueryVersion) dlsym (h, "XRenderQueryVersion"); + xRenderFindStandardFormat = (tXRenderFindStandardFormat) dlsym (h, "XRenderFindStandardFormat"); + xRenderFindFormat = (tXRenderFindFormat) dlsym (h, "XRenderFindFormat"); + xRenderFindVisualFormat = (tXRenderFindVisualFormat) dlsym (h, "XRenderFindVisualFormat"); + } + + if (xRenderQueryVersion != nullptr + && xRenderFindStandardFormat != nullptr + && xRenderFindFormat != nullptr + && xRenderFindVisualFormat != nullptr) + { + int major, minor; + if (xRenderQueryVersion (display, &major, &minor)) + return true; + } } xRenderQueryVersion = nullptr; @@ -317,7 +328,7 @@ namespace XRender static bool hasCompositingWindowManager() { - return XGetSelectionOwner (display, Atoms::get().compositingManager) != 0; + return display != nullptr && XGetSelectionOwner (display, Atoms::get().compositingManager) != 0; } static XRenderPictFormat* findPictureFormat() @@ -494,7 +505,7 @@ class XBitmapImage : public ImagePixelData { public: XBitmapImage (const Image::PixelFormat format, const int w, const int h, - const bool clearImage, const int imageDepth_, Visual* visual) + const bool clearImage, const unsigned int imageDepth_, Visual* visual) : ImagePixelData (format, w, h), imageDepth (imageDepth_), gc (None) @@ -517,12 +528,13 @@ public: segmentInfo.shmaddr = (char *) -1; segmentInfo.readOnly = False; - xImage = XShmCreateImage (display, visual, imageDepth, ZPixmap, 0, &segmentInfo, w, h); + xImage = XShmCreateImage (display, visual, imageDepth, ZPixmap, 0, + &segmentInfo, (unsigned int) w, (unsigned int) h); if (xImage != nullptr) { if ((segmentInfo.shmid = shmget (IPC_PRIVATE, - xImage->bytes_per_line * xImage->height, + (size_t) (xImage->bytes_per_line * xImage->height), IPC_CREAT | 0777)) >= 0) { if (segmentInfo.shmid != -1) @@ -550,10 +562,10 @@ public: } } - if (! usingXShm) + if (! isUsingXShm()) #endif { - imageDataAllocated.allocate (lineStride * h, format == Image::ARGB && clearImage); + imageDataAllocated.allocate ((size_t) (lineStride * h), format == Image::ARGB && clearImage); imageData = imageDataAllocated; xImage = (XImage*) ::calloc (1, sizeof (XImage)); @@ -576,15 +588,15 @@ public: if (imageDepth == 16) { - const int pixelStride = 2; - const int lineStride = ((w * pixelStride + 3) & ~3); + const int pixStride = 2; + const int stride = ((w * pixStride + 3) & ~3); - imageData16Bit.malloc (lineStride * h); + imageData16Bit.malloc ((size_t) (stride * h)); xImage->data = imageData16Bit; xImage->bitmap_pad = 16; - xImage->depth = pixelStride * 8; - xImage->bytes_per_line = lineStride; - xImage->bits_per_pixel = pixelStride * 8; + xImage->depth = pixStride * 8; + xImage->bytes_per_line = stride; + xImage->bits_per_pixel = pixStride * 8; xImage->red_mask = visual->red_mask; xImage->green_mask = visual->green_mask; xImage->blue_mask = visual->blue_mask; @@ -603,7 +615,7 @@ public: XFreeGC (display, gc); #if JUCE_USE_XSHM - if (usingXShm) + if (isUsingXShm()) { XShmDetach (display, &segmentInfo); @@ -646,7 +658,7 @@ public: ImageType* createType() const override { return new NativeImageType(); } - void blitToWindow (Window window, int dx, int dy, int dw, int dh, int sx, int sy) + void blitToWindow (Window window, int dx, int dy, unsigned int dw, unsigned int dh, int sx, int sy) { ScopedXLock xlock; @@ -667,50 +679,54 @@ public: if (imageDepth == 16) { - const uint32 rMask = xImage->red_mask; - const uint32 gMask = xImage->green_mask; - const uint32 bMask = xImage->blue_mask; - const uint32 rShiftL = jmax (0, getShiftNeeded (rMask)); - const uint32 rShiftR = jmax (0, -getShiftNeeded (rMask)); - const uint32 gShiftL = jmax (0, getShiftNeeded (gMask)); - const uint32 gShiftR = jmax (0, -getShiftNeeded (gMask)); - const uint32 bShiftL = jmax (0, getShiftNeeded (bMask)); - const uint32 bShiftR = jmax (0, -getShiftNeeded (bMask)); + const uint32 rMask = (uint32) xImage->red_mask; + const uint32 gMask = (uint32) xImage->green_mask; + const uint32 bMask = (uint32) xImage->blue_mask; + const uint32 rShiftL = (uint32) jmax (0, getShiftNeeded (rMask)); + const uint32 rShiftR = (uint32) jmax (0, -getShiftNeeded (rMask)); + const uint32 gShiftL = (uint32) jmax (0, getShiftNeeded (gMask)); + const uint32 gShiftR = (uint32) jmax (0, -getShiftNeeded (gMask)); + const uint32 bShiftL = (uint32) jmax (0, getShiftNeeded (bMask)); + const uint32 bShiftR = (uint32) jmax (0, -getShiftNeeded (bMask)); const Image::BitmapData srcData (Image (this), Image::BitmapData::readOnly); - for (int y = sy; y < sy + dh; ++y) + for (int y = sy; y < sy + (int)dh; ++y) { const uint8* p = srcData.getPixelPointer (sx, y); - for (int x = sx; x < sx + dw; ++x) + for (int x = sx; x < sx + (int)dw; ++x) { const PixelRGB* const pixel = (const PixelRGB*) p; p += srcData.pixelStride; XPutPixel (xImage, x, y, - (((((uint32) pixel->getRed()) << rShiftL) >> rShiftR) & rMask) + (((((uint32) pixel->getRed()) << rShiftL) >> rShiftR) & rMask) | (((((uint32) pixel->getGreen()) << gShiftL) >> gShiftR) & gMask) - | (((((uint32) pixel->getBlue()) << bShiftL) >> bShiftR) & bMask)); + | (((((uint32) pixel->getBlue()) << bShiftL) >> bShiftR) & bMask)); } } } // blit results to screen. #if JUCE_USE_XSHM - if (usingXShm) + if (isUsingXShm()) XShmPutImage (display, (::Drawable) window, gc, xImage, sx, sy, dx, dy, dw, dh, True); else #endif XPutImage (display, (::Drawable) window, gc, xImage, sx, sy, dx, dy, dw, dh); } + #if JUCE_USE_XSHM + bool isUsingXShm() const noexcept { return usingXShm; } + #endif + private: //============================================================================== XImage* xImage; - const int imageDepth; - HeapBlock imageDataAllocated; - HeapBlock imageData16Bit; + const unsigned int imageDepth; + HeapBlock imageDataAllocated; + HeapBlock imageData16Bit; int pixelStride, lineStride; uint8* imageData; GC gc; @@ -733,6 +749,674 @@ private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (XBitmapImage) }; +//============================================================================== +#if JUCE_USE_XRANDR +template <> +struct ContainerDeletePolicy +{ + static void destroy (XRRScreenResources* object); +}; + +template <> +struct ContainerDeletePolicy +{ + static void destroy (XRROutputInfo* object); +}; + +template <> +struct ContainerDeletePolicy +{ + static void destroy (XRRCrtcInfo* object); +}; +#endif + +//============================================================================== +class DisplayGeometry +{ +private: + //============================================================================== + DisplayGeometry (::Display* dpy, double masterScale) + { + jassert (instance == nullptr); + instance = this; + + queryDisplayInfos (dpy, masterScale); + updatePositions(); + } + +public: + //============================================================================== + struct ExtendedInfo + { + // Unlike Desktop::Displays::Display, the following is in + // physical pixels, i.e. the area is not scaled + Rectangle totalBounds; + // Usable bounds is the usable area in local coordinates + // with respect to the above totalBounds + Rectangle usableBounds; + // top-left point of display in scaled coordinates. This + // is different from totalBounds.getTopLeft() / scale, + // because the neighbouring display may have a different + // scale factor + Point topLeftScaled; + double dpi, scale; + bool isMain; + }; + + Array infos; + + //============================================================================== + ExtendedInfo& findDisplayForRect (const Rectangle& bounds, bool isScaledBounds) + { + int maxArea = -1; + ExtendedInfo* retval = nullptr; + + for (int i = 0; i < infos.size(); ++i) + { + ExtendedInfo& dpy = infos.getReference (i); + + Rectangle displayBounds = dpy.totalBounds; + + if (isScaledBounds) + displayBounds = (displayBounds.withZeroOrigin() / dpy.scale) + dpy.topLeftScaled; + + displayBounds = displayBounds.getIntersection (bounds); + int area = displayBounds.getWidth() * displayBounds.getHeight(); + + if (area >= maxArea) + { + maxArea = area; + retval = &dpy; + } + } + + return *retval; + } + + ExtendedInfo& findDisplayForPoint (Point pt, bool isScaledPoint) + { + int minDistance = (int) ((((unsigned int)(-1)) >> 1) - 1); + ExtendedInfo* retval = nullptr; + + for (int i = 0; i < infos.size(); ++i) + { + ExtendedInfo& dpy = infos.getReference (i); + + Rectangle displayBounds = dpy.totalBounds; + + if (isScaledPoint) + displayBounds = (displayBounds.withZeroOrigin() / dpy.scale) + dpy.topLeftScaled; + + if (displayBounds.contains (pt)) + return dpy; + + int distance = displayBounds.getCentre().getDistanceFrom (pt); + if (distance <= minDistance) + { + minDistance = distance; + retval = &dpy; + } + } + + return *retval; + } + + //============================================================================== + static Rectangle physicalToScaled (const Rectangle& physicalBounds) + { + // first find with which display physicalBounds has the most overlap + ExtendedInfo& dpy = getInstance().findDisplayForRect (physicalBounds, false); + + // convert to local screen bounds + Rectangle retval = physicalBounds - dpy.totalBounds.getTopLeft(); + + // now we can safely scale the coordinates and convert to global again + return (retval / dpy.scale) + dpy.topLeftScaled; + } + + static Rectangle scaledToPhysical (const Rectangle& scaledBounds) + { + // first find with which display physicalBounds has the most overlap + ExtendedInfo& dpy = getInstance().findDisplayForRect (scaledBounds, true); + + // convert to local screen bounds + Rectangle retval = scaledBounds - dpy.topLeftScaled; + + // now we can safely scale the coordinates and convert to global again + return (retval * dpy.scale) + dpy.totalBounds.getTopLeft(); + } + + //============================================================================== + template + static Point physicalToScaled (const Point& physicalPoint) + { + ExtendedInfo& dpy = getInstance().findDisplayForPoint (physicalPoint.roundToInt(), false); + Point scaledTopLeft = + Point (dpy.topLeftScaled.getX(), dpy.topLeftScaled.getY()); + Point physicalTopLeft = + Point (dpy.totalBounds.getX(), dpy.totalBounds.getY()); + + return ((physicalPoint - physicalTopLeft) / dpy.scale) + scaledTopLeft; + } + + template + static Point scaledToPhysical (const Point& scaledPoint) + { + ExtendedInfo& dpy = getInstance().findDisplayForPoint (scaledPoint.roundToInt(), true); + Point scaledTopLeft = + Point (dpy.topLeftScaled.getX(), dpy.topLeftScaled.getY()); + Point physicalTopLeft = + Point (dpy.totalBounds.getX(), dpy.totalBounds.getY()); + + return ((scaledPoint - scaledTopLeft) * dpy.scale) + physicalTopLeft; + } + + //============================================================================== + static DisplayGeometry& getInstance() + { + jassert (instance != nullptr); + return *instance; + } + + static DisplayGeometry& getOrCreateInstance (::Display* dpy, double masterScale) + { + if (instance == nullptr) + new DisplayGeometry (dpy, masterScale); + + return getInstance(); + } + +private: + //============================================================================== + static DisplayGeometry* instance; + + //============================================================================== + #if JUCE_USE_XINERAMA + static Array XineramaQueryDisplays (::Display* dpy) + { + typedef Bool (*tXineramaIsActive) (::Display*); + typedef XineramaScreenInfo* (*tXineramaQueryScreens) (::Display*, int*); + + int major_opcode, first_event, first_error; + + if (XQueryExtension (dpy, "XINERAMA", &major_opcode, &first_event, &first_error)) + { + static void* libXinerama = nullptr; + static tXineramaIsActive isActiveFuncPtr = nullptr; + static tXineramaQueryScreens xineramaQueryScreens = nullptr; + + if (libXinerama == nullptr) + { + libXinerama = dlopen ("libXinerama.so", RTLD_GLOBAL | RTLD_NOW); + + if (libXinerama == nullptr) + libXinerama = dlopen ("libXinerama.so.1", RTLD_GLOBAL | RTLD_NOW); + + if (libXinerama != nullptr) + { + isActiveFuncPtr = (tXineramaIsActive) dlsym (libXinerama, "XineramaIsActive"); + xineramaQueryScreens = (tXineramaQueryScreens) dlsym (libXinerama, "XineramaQueryScreens"); + } + } + + if (isActiveFuncPtr != nullptr && xineramaQueryScreens != nullptr && isActiveFuncPtr (dpy) != 0) + { + int numScreens; + if (XineramaScreenInfo* xinfo = xineramaQueryScreens (dpy, &numScreens)) + { + Array infos (xinfo, numScreens); + XFree (xinfo); + + return infos; + } + } + } + + return Array(); + } + #endif + + //============================================================================== + #if JUCE_USE_XRANDR + friend struct ContainerDeletePolicy; + friend struct ContainerDeletePolicy; + friend struct ContainerDeletePolicy; + + class XRandrWrapper + { + private: + XRandrWrapper() + : libXrandr (nullptr), + getScreenResourcesPtr (nullptr), + freeScreenResourcesPtr (nullptr), + getOutputInfoPtr (nullptr), + freeOutputInfoPtr (nullptr), + getCrtcInfoPtr (nullptr), + freeCrtcInfoPtr (nullptr), + getOutputPrimaryPtr (nullptr) + { + if (libXrandr == nullptr) + { + libXrandr = dlopen ("libXrandr.so", RTLD_GLOBAL | RTLD_NOW); + + if (libXrandr == nullptr) + libXrandr = dlopen ("libXinerama.so.2", RTLD_GLOBAL | RTLD_NOW); + + if (libXrandr != nullptr) + { + getScreenResourcesPtr = (tXRRGetScreenResources) dlsym (libXrandr, "XRRGetScreenResources"); + freeScreenResourcesPtr = (tXRRFreeScreenResources) dlsym (libXrandr, "XRRFreeScreenResources"); + getOutputInfoPtr = (tXRRGetOutputInfo) dlsym (libXrandr, "XRRGetOutputInfo"); + freeOutputInfoPtr = (tXRRFreeOutputInfo) dlsym (libXrandr, "XRRFreeOutputInfo"); + getCrtcInfoPtr = (tXRRGetCrtcInfo) dlsym (libXrandr, "XRRGetCrtcInfo"); + freeCrtcInfoPtr = (tXRRFreeCrtcInfo) dlsym (libXrandr, "XRRFreeCrtcInfo"); + getOutputPrimaryPtr = (tXRRGetOutputPrimary) dlsym (libXrandr, "XRRGetOutputPrimary"); + } + } + + instance = this; + } + + public: + //============================================================================== + static XRandrWrapper& getInstance() + { + if (instance == nullptr) + instance = new XRandrWrapper(); + + return *instance; + } + + //============================================================================== + XRRScreenResources* getScreenResources (::Display* dpy, ::Window window) + { + if (getScreenResourcesPtr != nullptr) + return getScreenResourcesPtr (dpy, window); + + return nullptr; + } + + XRROutputInfo* getOutputInfo (::Display* dpy, XRRScreenResources* resources, RROutput output) + { + if (getOutputInfoPtr != nullptr) + return getOutputInfoPtr (dpy, resources, output); + + return nullptr; + } + + XRRCrtcInfo* getCrtcInfo (::Display* dpy, XRRScreenResources* resources, RRCrtc crtc) + { + if (getCrtcInfoPtr != nullptr) + return getCrtcInfoPtr (dpy, resources, crtc); + + return nullptr; + } + + RROutput getOutputPrimary (::Display* dpy, ::Window window) + { + if (getOutputPrimaryPtr != nullptr) + return getOutputPrimaryPtr (dpy, window); + + return 0; + } + + private: + //============================================================================== + friend struct ContainerDeletePolicy; + friend struct ContainerDeletePolicy; + friend struct ContainerDeletePolicy; + + void freeScreenResources (XRRScreenResources* ptr) + { + if (freeScreenResourcesPtr != nullptr) + freeScreenResourcesPtr (ptr); + } + + void freeOutputInfo (XRROutputInfo* ptr) + { + if (freeOutputInfoPtr != nullptr) + freeOutputInfoPtr (ptr); + } + + void freeCrtcInfo (XRRCrtcInfo* ptr) + { + if (freeCrtcInfoPtr != nullptr) + freeCrtcInfoPtr (ptr); + } + private: + static XRandrWrapper* instance; + + typedef XRRScreenResources* (*tXRRGetScreenResources) (::Display*, ::Window); + typedef void (*tXRRFreeScreenResources) (XRRScreenResources*); + typedef XRROutputInfo* (*tXRRGetOutputInfo) (::Display*, XRRScreenResources*, RROutput); + typedef void (*tXRRFreeOutputInfo) (XRROutputInfo*); + typedef XRRCrtcInfo* (*tXRRGetCrtcInfo) (::Display*, XRRScreenResources*, RRCrtc); + typedef void (*tXRRFreeCrtcInfo) (XRRCrtcInfo*); + typedef RROutput (*tXRRGetOutputPrimary) (::Display*, ::Window); + + void* libXrandr; + tXRRGetScreenResources getScreenResourcesPtr; + tXRRFreeScreenResources freeScreenResourcesPtr; + tXRRGetOutputInfo getOutputInfoPtr; + tXRRFreeOutputInfo freeOutputInfoPtr; + tXRRGetCrtcInfo getCrtcInfoPtr; + tXRRFreeCrtcInfo freeCrtcInfoPtr; + tXRRGetOutputPrimary getOutputPrimaryPtr; + }; + #endif + + + static double getDisplayDPI (int index) + { + double dpiX = (DisplayWidth (display, index) * 25.4) / DisplayWidthMM (display, index); + double dpiY = (DisplayHeight (display, index) * 25.4) / DisplayHeightMM (display, index); + return (dpiX + dpiY) / 2.0; + } + + static double getScaleForDisplay (const String& name, const ExtendedInfo& info) + { + if (! name.isEmpty()) + { + // Ubuntu and derived distributions now save a per-display scale factor as a configuration + // variable. This can be changed in the Monitor system settings panel. + ChildProcess dconf; + if (File ("/usr/bin/dconf").existsAsFile() && + dconf.start ("/usr/bin/dconf read /com/ubuntu/user-interface/scale-factor", ChildProcess::wantStdOut)) + { + if (dconf.waitForProcessToFinish (200)) + { + String jsonOutput = dconf.readAllProcessOutput().replaceCharacter ('\'', '"'); + + if (dconf.getExitCode() == 0 && jsonOutput.isNotEmpty()) + { + var jsonVar = JSON::parse (jsonOutput); + + if (DynamicObject* object = jsonVar.getDynamicObject()) + { + var scaleFactorVar = object->getProperty (name); + if (! scaleFactorVar.isVoid()) + { + double scaleFactor = ((double) scaleFactorVar) / 8.0; + + if (scaleFactor > 0.0) + return scaleFactor; + } + } + } + } + } + } + + { + // Other gnome based distros now use gsettings for a global scale factor + ChildProcess gsettings; + if (File ("/usr/bin/gsettings").existsAsFile() && + gsettings.start ("/usr/bin/gsettings get org.gnome.desktop.interface scaling-factor", ChildProcess::wantStdOut)) + { + if (gsettings.waitForProcessToFinish (200)) + { + StringArray gsettingsOutput = StringArray::fromTokens (gsettings.readAllProcessOutput(), true); + if (gsettingsOutput.size() >= 2 && gsettingsOutput[1].length() > 0) + { + double scaleFactor = gsettingsOutput[1].getDoubleValue(); + + if (scaleFactor > 0.0) + return scaleFactor; + } + } + } + } + + // If no scale factor is set by GNOME or Ubuntu then calculate from monitor dpi + // We use the same approach as chromium which simply divides the dpi by 96 + // and then rounds the result + return round (info.dpi / 150.0); + } + + //============================================================================== + void queryDisplayInfos (::Display* dpy, double masterScale) noexcept + { + ScopedXLock xlock; + + #if JUCE_USE_XRANDR + { + int major_opcode, first_event, first_error; + + if (XQueryExtension (dpy, "RANDR", &major_opcode, &first_event, &first_error)) + { + XRandrWrapper& xrandr = XRandrWrapper::getInstance(); + + ScopedPointer screens; + + const int numMonitors = ScreenCount (dpy); + RROutput mainDisplay = xrandr.getOutputPrimary (dpy, RootWindow (dpy, 0)); + + for (int i = 0; i < numMonitors; ++i) + { + if ((screens = xrandr.getScreenResources (dpy, RootWindow (dpy, i))).get()) + { + for (int j = 0; j < screens->noutput; ++j) + { + if (! screens->outputs[j]) + continue; + + // Xrandr on the raspberry pi fails to determine the main display (mainDisplay == 0)! + // Detect this edge case and make the first found display the main display + if (! mainDisplay) + mainDisplay = screens->outputs[j]; + + ScopedPointer output; + + if ((output = xrandr.getOutputInfo (dpy, screens.get(), screens->outputs[j])).get()) + { + if (! output->crtc) + continue; + + ScopedPointer crtc; + + if ((crtc = xrandr.getCrtcInfo (dpy, screens.get(), output->crtc)).get()) + { + ExtendedInfo e; + e.totalBounds = Rectangle (crtc->x, crtc->y, + (int) crtc->width, (int) crtc->height); + e.usableBounds = e.totalBounds.withZeroOrigin(); // Support for usable area is not implemented in JUCE yet + e.topLeftScaled = e.totalBounds.getTopLeft(); + e.isMain = (mainDisplay == screens->outputs[j]) && (i == 0); + e.dpi = getDisplayDPI (0); + + // The raspberry pi returns a zero sized display, so we need to guard for divide-by-zero + if (output->mm_width > 0 && output->mm_height > 0) + e.dpi = ((static_cast (crtc->width) * 25.4 * 0.5) / static_cast (output->mm_width)) + + ((static_cast (crtc->height) * 25.4 * 0.5) / static_cast (output->mm_height)); + + e.scale = masterScale * getScaleForDisplay (output->name, e); + + infos.add (e); + } + } + } + } + } + } + } + if (infos.size() == 0) + #endif + #if JUCE_USE_XINERAMA + { + Array screens = XineramaQueryDisplays (dpy); + int numMonitors = screens.size(); + + for (int index = 0; index < numMonitors; ++index) + { + for (int j = numMonitors; --j >= 0;) + { + if (screens[j].screen_number == index) + { + ExtendedInfo e; + e.totalBounds = Rectangle (screens[j].x_org, + screens[j].y_org, + screens[j].width, + screens[j].height); + e.usableBounds = e.totalBounds.withZeroOrigin(); // Support for usable area is not implemented in JUCE yet + e.topLeftScaled = e.totalBounds.getTopLeft(); // this will be overwritten by updatePositions later + e.isMain = (index == 0); + e.scale = masterScale; + e.dpi = getDisplayDPI (0); // (all screens share the same DPI) + + infos.add (e); + } + } + } + } + + if (infos.size() == 0) + #endif + { + Atom hints = Atoms::getIfExists ("_NET_WORKAREA"); + + if (hints != None) + { + const int numMonitors = ScreenCount (dpy); + + for (int i = 0; i < numMonitors; ++i) + { + GetXProperty prop (RootWindow (dpy, i), hints, 0, 4, false, XA_CARDINAL); + + if (prop.success && prop.actualType == XA_CARDINAL && prop.actualFormat == 32 && prop.numItems == 4) + { + const long* const position = (const long*) prop.data; + + ExtendedInfo e; + e.totalBounds = Rectangle ((int) position[0], (int) position[1], + (int) position[2], (int) position[3]); + e.usableBounds = e.totalBounds.withZeroOrigin(); // Support for usable area is not implemented in JUCE yet + e.topLeftScaled = e.totalBounds.getTopLeft(); // this will be overwritten by updatePositions later + e.isMain = (infos.size() == 0); + e.scale = masterScale; + e.dpi = getDisplayDPI (i); + + infos.add (e); + } + } + } + + if (infos.size() == 0) + { + ExtendedInfo e; + e.totalBounds = Rectangle (DisplayWidth (dpy, DefaultScreen (dpy)), + DisplayHeight (dpy, DefaultScreen (dpy))); + e.usableBounds = e.totalBounds; // Support for usable area is not implemented in JUCE yet + e.topLeftScaled = e.totalBounds.getTopLeft(); // this will be overwritten by updatePositions later + e.isMain = true; + e.scale = masterScale; + e.dpi = getDisplayDPI (0); + + infos.add (e); + } + } + } + + //============================================================================== + struct SortByCoordinate + { + bool sortByYCoordinate; + + SortByCoordinate (bool byYCoordinate) + : sortByYCoordinate (byYCoordinate) + { + } + + int compareElements (const ExtendedInfo* a, const ExtendedInfo* b) + { + int coordinateA, coordinateB; + + if (sortByYCoordinate) + { + coordinateA = a->totalBounds.getY(); + coordinateB = b->totalBounds.getY(); + } + else + { + coordinateA = a->totalBounds.getX(); + coordinateB = b->totalBounds.getX(); + } + + return coordinateA - coordinateB; + } + }; + + //============================================================================== + void updateScaledDisplayCoordinate(bool updateYCoordinates) + { + if (infos.size() < 2) + return; + + Array copy; + { + SortByCoordinate sorter (updateYCoordinates); + for (int i = 0; i < infos.size(); ++i) + copy.addSorted (sorter, &infos.getReference (i)); + } + + for (int i = 1; i < copy.size(); ++i) + { + ExtendedInfo& current = *copy[i]; + + // Is this screen's position aligned to any other previous display? + for (int j = i - 1; j >= 0; --j) + { + ExtendedInfo& other = *copy[j]; + int prevCoordinate = updateYCoordinates ? other.totalBounds.getBottom() : other.totalBounds.getRight(); + int curCoordinate = updateYCoordinates ? current.totalBounds.getY() : current.totalBounds.getX(); + if (prevCoordinate == curCoordinate) + { + // both displays are aligned! As "other" comes before "current" in the array, it must already + // have a valid topLeftScaled which we can use + Point topLeftScaled = other.topLeftScaled; + topLeftScaled += Point (other.totalBounds.getWidth(), other.totalBounds.getHeight()) / other.scale; + + if (updateYCoordinates) + current.topLeftScaled.setY (topLeftScaled.getY()); + else + current.topLeftScaled.setX (topLeftScaled.getX()); + + break; + } + } + } + } + + void updatePositions() + { + updateScaledDisplayCoordinate (false); + updateScaledDisplayCoordinate (true); + } +}; + +DisplayGeometry* DisplayGeometry::instance = nullptr; + +#if JUCE_USE_XRANDR +DisplayGeometry::XRandrWrapper* DisplayGeometry::XRandrWrapper::instance = nullptr; + +void ContainerDeletePolicy::destroy (XRRScreenResources* ptr) +{ + if (ptr != nullptr) + DisplayGeometry::XRandrWrapper::getInstance().freeScreenResources (ptr); +} + +void ContainerDeletePolicy::destroy (XRROutputInfo* ptr) +{ + if (ptr != nullptr) + DisplayGeometry::XRandrWrapper::getInstance().freeOutputInfo (ptr); +} + +void ContainerDeletePolicy::destroy (XRRCrtcInfo* ptr) +{ + if (ptr != nullptr) + DisplayGeometry::XRandrWrapper::getInstance().freeCrtcInfo (ptr); +} +#endif + //============================================================================== namespace PixmapHelpers { @@ -740,13 +1424,13 @@ namespace PixmapHelpers { ScopedXLock xlock; - const int width = image.getWidth(); - const int height = image.getHeight(); - HeapBlock colour (width * height); + const unsigned int width = (unsigned int) image.getWidth(); + const unsigned int height = (unsigned int) image.getHeight(); + HeapBlock colour (width * height); int index = 0; - for (int y = 0; y < height; ++y) - for (int x = 0; x < width; ++x) + for (int y = 0; y < (int) height; ++y) + for (int x = 0; x < (int) width; ++x) colour[index++] = image.getPixelAt (x, y).getARGB(); XImage* ximage = XCreateImage (display, CopyFromParent, 24, ZPixmap, @@ -767,21 +1451,21 @@ namespace PixmapHelpers { ScopedXLock xlock; - const int width = image.getWidth(); - const int height = image.getHeight(); - const int stride = (width + 7) >> 3; - HeapBlock mask; + const unsigned int width = (unsigned int) image.getWidth(); + const unsigned int height = (unsigned int) image.getHeight(); + const unsigned int stride = (width + 7) >> 3; + HeapBlock mask; mask.calloc (stride * height); const bool msbfirst = (BitmapBitOrder (display) == MSBFirst); - for (int y = 0; y < height; ++y) + for (unsigned int y = 0; y < height; ++y) { - for (int x = 0; x < width; ++x) + for (unsigned int x = 0; x < width; ++x) { const char bit = (char) (1 << (msbfirst ? (7 - (x & 7)) : (x & 7))); - const int offset = y * stride + (x >> 3); + const unsigned int offset = y * stride + (x >> 3); - if (image.getPixelAt (x, y).getAlpha() >= 128) + if (image.getPixelAt ((int) x, (int) y).getAlpha() >= 128) mask[offset] |= bit; } } @@ -818,7 +1502,8 @@ public: windowH (0), parentWindow (0), fullScreen (false), mapped (false), visual (nullptr), depth (0), - isAlwaysOnTop (comp.isAlwaysOnTop()) + isAlwaysOnTop (comp.isAlwaysOnTop()), + currentScaleFactor (1.0) { // it's dangerous to create a window on a thread other than the message thread.. jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); @@ -872,17 +1557,22 @@ public: { XPointer peer = nullptr; - ScopedXLock xlock; - if (! XFindContext (display, (XID) windowHandle, windowHandleXContext, &peer)) - if (peer != nullptr && ! ComponentPeer::isValidPeer (reinterpret_cast (peer))) - peer = nullptr; + if (display != nullptr) + { + ScopedXLock xlock; + + if (! XFindContext (display, (XID) windowHandle, windowHandleXContext, &peer)) + if (peer != nullptr && ! ComponentPeer::isValidPeer (reinterpret_cast (peer))) + peer = nullptr; + } - return reinterpret_cast (peer); + return reinterpret_cast (peer); } void setVisible (bool shouldBeVisible) override { ScopedXLock xlock; + if (shouldBeVisible) XMapWindow (display, windowH); else @@ -892,7 +1582,7 @@ public: void setTitle (const String& title) override { XTextProperty nameProperty; - char* strings[] = { const_cast (title.toRawUTF8()) }; + char* strings[] = { const_cast (title.toRawUTF8()) }; ScopedXLock xlock; if (XStringListToTextProperty (strings, 1, &nameProperty)) @@ -923,7 +1613,7 @@ public: clientMsg.format = 32; clientMsg.message_type = Atoms::get().windowState; clientMsg.data.l[0] = 0; // Remove - clientMsg.data.l[1] = fs; + clientMsg.data.l[1] = (long) fs; clientMsg.data.l[2] = 0; clientMsg.data.l[3] = 1; // Normal Source @@ -941,17 +1631,22 @@ public: bounds = newBounds.withSize (jmax (1, newBounds.getWidth()), jmax (1, newBounds.getHeight())); + currentScaleFactor = DisplayGeometry::getInstance().findDisplayForRect (bounds, true).scale; + + Rectangle physicalBounds = + DisplayGeometry::scaledToPhysical (bounds); + WeakReference deletionChecker (&component); ScopedXLock xlock; XSizeHints* const hints = XAllocSizeHints(); hints->flags = USSize | USPosition; - hints->x = bounds.getX(); - hints->y = bounds.getY(); - hints->width = bounds.getWidth(); - hints->height = bounds.getHeight(); + hints->x = physicalBounds.getX(); + hints->y = physicalBounds.getY(); + hints->width = physicalBounds.getWidth(); + hints->height = physicalBounds.getHeight(); - if ((getStyleFlags() & (windowHasTitleBar | windowIsResizable)) == windowHasTitleBar) + if ((getStyleFlags() & windowIsResizable) == 0) { hints->min_width = hints->max_width = hints->width; hints->min_height = hints->max_height = hints->height; @@ -962,10 +1657,10 @@ public: XFree (hints); XMoveResizeWindow (display, windowH, - bounds.getX() - windowBorder.getLeft(), - bounds.getY() - windowBorder.getTop(), - bounds.getWidth(), - bounds.getHeight()); + physicalBounds.getX() - windowBorder.getLeft(), + physicalBounds.getY() - windowBorder.getTop(), + (unsigned int) physicalBounds.getWidth(), + (unsigned int) physicalBounds.getHeight()); if (deletionChecker != nullptr) { @@ -1085,7 +1780,7 @@ public: if (XQueryTree (display, root, &root, &parent, &windowList, &windowListSize) != 0) { - for (int i = windowListSize; --i >= 0;) + for (int i = (int) windowListSize; --i >= 0;) { if (LinuxComponentPeer* const peer = LinuxComponentPeer::getPeerFor (windowList[i])) { @@ -1123,11 +1818,13 @@ public: ::Window root, child; int wx, wy; - unsigned int ww, wh, bw, depth; + unsigned int ww, wh, bw, bitDepth; ScopedXLock xlock; - return XGetGeometry (display, (::Drawable) windowH, &root, &wx, &wy, &ww, &wh, &bw, &depth) + localPos *= currentScaleFactor; + + return XGetGeometry (display, (::Drawable) windowH, &root, &wx, &wy, &ww, &wh, &bw, &bitDepth) && XTranslateCoordinates (display, windowH, windowH, localPos.getX(), localPos.getY(), &wx, &wy, &child) && child == None; } @@ -1215,7 +1912,7 @@ public: && atts.map_state == IsViewable && ! isFocused()) { - XSetInputFocus (display, windowH, RevertToParent, getUserTime()); + XSetInputFocus (display, windowH, RevertToParent, (::Time) getUserTime()); isActiveApplication = true; } } @@ -1235,7 +1932,7 @@ public: void setIcon (const Image& newIcon) override { const int dataSize = newIcon.getWidth() * newIcon.getHeight() + 2; - HeapBlock data (dataSize); + HeapBlock data ((size_t) dataSize); int index = 0; data[index++] = (unsigned long) newIcon.getWidth(); @@ -1343,6 +2040,8 @@ public: void handleKeyPressEvent (XKeyEvent& keyEvent) { + const ModifierKeys oldMods (currentModifiers); + char utf8 [64] = { 0 }; juce_wchar unicodeChar = 0; int keyCode = 0; @@ -1351,7 +2050,7 @@ public: { ScopedXLock xlock; - updateKeyStates (keyEvent.keycode, true); + updateKeyStates ((int) keyEvent.keycode, true); String oldLocale (::setlocale (LC_ALL, 0)); ::setlocale (LC_ALL, ""); @@ -1364,12 +2063,11 @@ public: keyCode = (int) unicodeChar; if (keyCode < 0x20) - keyCode = XkbKeycodeToKeysym (display, keyEvent.keycode, 0, currentModifiers.isShiftDown() ? 1 : 0); + keyCode = (int) XkbKeycodeToKeysym (display, (::KeyCode) keyEvent.keycode, 0, currentModifiers.isShiftDown() ? 1 : 0); keyDownChange = (sym != NoSymbol) && ! updateKeyModifiersFromSym (sym, true); } - const ModifierKeys oldMods (currentModifiers); bool keyPressed = false; if ((sym & 0xff00) == 0xff00 || keyCode == XK_ISO_Left_Tab) @@ -1479,12 +2177,12 @@ public: { if (! isKeyReleasePartOfAutoRepeat (keyEvent)) { - updateKeyStates (keyEvent.keycode, false); + updateKeyStates ((int) keyEvent.keycode, false); KeySym sym; { ScopedXLock xlock; - sym = XkbKeycodeToKeysym (display, keyEvent.keycode, 0, 0); + sym = XkbKeycodeToKeysym (display, (::KeyCode) keyEvent.keycode, 0, 0); } const ModifierKeys oldMods (currentModifiers); @@ -1499,9 +2197,9 @@ public: } template - static Point getMousePos (const EventType& e) noexcept + Point getMousePos (const EventType& e) noexcept { - return Point ((float) e.x, (float) e.y); + return Point ((float) e.x, (float) e.y) / currentScaleFactor; } void handleWheelEvent (const XButtonPressedEvent& buttonPressEvent, const float amount) @@ -1511,6 +2209,7 @@ public: wheel.deltaY = amount; wheel.isReversed = false; wheel.isSmooth = false; + wheel.isInertial = false; handleMouseWheel (0, getMousePos (buttonPressEvent), getEventTime (buttonPressEvent), wheel); } @@ -1524,7 +2223,7 @@ public: void handleButtonPressEvent (const XButtonPressedEvent& buttonPressEvent) { - updateKeyModifiers (buttonPressEvent.state); + updateKeyModifiers ((int) buttonPressEvent.state); switch (pointerMap [buttonPressEvent.button - Button1]) { @@ -1541,7 +2240,7 @@ public: void handleButtonReleaseEvent (const XButtonReleasedEvent& buttonRelEvent) { - updateKeyModifiers (buttonRelEvent.state); + updateKeyModifiers ((int) buttonRelEvent.state); if (parentWindow != 0) updateWindowBounds(); @@ -1564,7 +2263,7 @@ public: void handleMotionNotifyEvent (const XPointerMovedEvent& movedEvent) { - updateKeyModifiers (movedEvent.state); + updateKeyModifiers ((int) movedEvent.state); lastMousePos = Point (movedEvent.x_root, movedEvent.y_root); @@ -1583,7 +2282,7 @@ public: if (! currentModifiers.isAnyMouseButtonDown()) { - updateKeyModifiers (enterEvent.state); + updateKeyModifiers ((int) enterEvent.state); handleMouseEvent (0, getMousePos (enterEvent), currentModifiers, getEventTime (enterEvent)); } } @@ -1596,7 +2295,7 @@ public: if (((! currentModifiers.isAnyMouseButtonDown()) && leaveEvent.mode == NotifyNormal) || leaveEvent.mode == NotifyUngrab) { - updateKeyModifiers (leaveEvent.state); + updateKeyModifiers ((int) leaveEvent.state); handleMouseEvent (0, getMousePos (leaveEvent), currentModifiers, getEventTime (leaveEvent)); } } @@ -1621,6 +2320,10 @@ public: XEvent nextEvent; ScopedXLock xlock; + // if we have opengl contexts then just repaint them all + // regardless if this is really necessary + repaintOpenGLContexts (); + if (exposeEvent.window != windowH) { Window child; @@ -1629,8 +2332,10 @@ public: &child); } + // exposeEvent is in local window local coordinates so do not convert with + // physicalToScaled, but rather use currentScaleFactor repaint (Rectangle (exposeEvent.x, exposeEvent.y, - exposeEvent.width, exposeEvent.height)); + exposeEvent.width, exposeEvent.height) / currentScaleFactor); while (XEventsQueued (display, QueuedAfterFlush) > 0) { @@ -1641,7 +2346,7 @@ public: XNextEvent (display, &nextEvent); const XExposeEvent& nextExposeEvent = (const XExposeEvent&) nextEvent.xexpose; repaint (Rectangle (nextExposeEvent.x, nextExposeEvent.y, - nextExposeEvent.width, nextExposeEvent.height)); + nextExposeEvent.width, nextExposeEvent.height) / currentScaleFactor); } } @@ -1731,7 +2436,7 @@ public: && XGetWindowAttributes (display, clientMsg.window, &atts)) { if (atts.map_state == IsViewable) - XSetInputFocus (display, clientMsg.window, RevertToParent, clientMsg.data.l[1]); + XSetInputFocus (display, clientMsg.window, RevertToParent, (::Time) clientMsg.data.l[1]); } } } @@ -1802,6 +2507,34 @@ public: XDefineCursor (display, windowH, cursor); } + //============================================================================== + double getCurrentScale() noexcept + { + return currentScaleFactor; + } + + //=============================================================================== + void addOpenGLRepaintListener (Component* dummy) + { + if (dummy != nullptr) + glRepaintListeners.addIfNotAlreadyThere (dummy); + } + + void removeOpenGLRepaintListener (Component* dummy) + { + if (dummy != nullptr) + glRepaintListeners.removeAllInstancesOf (dummy); + } + + void repaintOpenGLContexts() + { + for (int i = 0; i < glRepaintListeners.size(); ++i) + { + if (Component* c = glRepaintListeners [i]) + c->handleCommandMessage (0); + } + } + //============================================================================== bool dontRepaint; @@ -1860,7 +2593,7 @@ private: if (! isTimerRunning()) startTimer (repaintTimerPeriod); - regionsNeedingRepaint.add (area); + regionsNeedingRepaint.add (area * peer.currentScaleFactor); } void performAnyPendingRepaintsNow() @@ -1890,7 +2623,7 @@ private: #endif (totalArea.getWidth() + 31) & ~31, (totalArea.getHeight() + 31) & ~31, - false, peer.depth, peer.visual)); + false, (unsigned int) peer.depth, peer.visual)); } startTimer (repaintTimerPeriod); @@ -1905,20 +2638,24 @@ private: { ScopedPointer context (peer.getComponent().getLookAndFeel() .createGraphicsContext (image, -totalArea.getPosition(), adjustedList)); + context->addTransform (AffineTransform::scale ((float) peer.currentScaleFactor)); peer.handlePaint (*context); } for (const Rectangle* i = originalRepaintRegion.begin(), * const e = originalRepaintRegion.end(); i != e; ++i) { + XBitmapImage* xbitmap = static_cast (image.getPixelData()); #if JUCE_USE_XSHM - if (XSHMHelpers::isShmAvailable()) + if (xbitmap->isUsingXShm()) ++shmPaintsPending; #endif - static_cast (image.getPixelData()) - ->blitToWindow (peer.windowH, - i->getX(), i->getY(), i->getWidth(), i->getHeight(), - i->getX() - totalArea.getX(), i->getY() - totalArea.getY()); + + xbitmap->blitToWindow (peer.windowH, + i->getX(), i->getY(), + (unsigned int) i->getWidth(), + (unsigned int) i->getHeight(), + i->getX() - totalArea.getX(), i->getY() - totalArea.getY()); } } @@ -1945,7 +2682,7 @@ private: JUCE_DECLARE_NON_COPYABLE (LinuxRepaintManager) }; - ScopedPointer repainter; + ScopedPointer repainter; friend class LinuxRepaintManager; Window windowH, parentWindow; @@ -1956,6 +2693,8 @@ private: int depth; BorderSize windowBorder; bool isAlwaysOnTop; + double currentScaleFactor; + Array glRepaintListeners; enum { KeyPressEventType = 2 }; struct MotifWmHints @@ -2199,6 +2938,8 @@ private: const int screen = DefaultScreen (display); Window root = RootWindow (display, screen); + parentWindow = parentToAddTo; + // Try to obtain a 32-bit visual or fallback to 24 or 16 visual = Visuals::findVisualFormat ((styleFlags & windowIsSemiTransparent) ? 32 : 24, depth); @@ -2263,7 +3004,7 @@ private: const Atoms& atoms = Atoms::get(); // Associate the PID, allowing to be shut down when something goes wrong - unsigned long pid = getpid(); + unsigned long pid = (unsigned long) getpid(); xchangeProperty (windowH, atoms.pid, XA_CARDINAL, 32, &pid, 1); // Set window manager protocols @@ -2314,7 +3055,7 @@ private: static int64 getEventTime (::Time t) { static int64 eventTimeOffset = 0x12345678; - const int64 thisMessageTime = t; + const int64 thisMessageTime = (int64) t; if (eventTimeOffset == 0x12345678) eventTimeOffset = Time::currentTimeMillis() - thisMessageTime; @@ -2361,15 +3102,20 @@ private: { Window root, child; int wx = 0, wy = 0; - unsigned int ww = 0, wh = 0, bw, depth; + unsigned int ww = 0, wh = 0, bw, bitDepth; ScopedXLock xlock; - if (XGetGeometry (display, (::Drawable) windowH, &root, &wx, &wy, &ww, &wh, &bw, &depth)) + if (XGetGeometry (display, (::Drawable) windowH, &root, &wx, &wy, &ww, &wh, &bw, &bitDepth)) if (! XTranslateCoordinates (display, windowH, root, 0, 0, &wx, &wy, &child)) wx = wy = 0; - bounds.setBounds (wx, wy, ww, wh); + Rectangle physicalBounds (wx, wy, (int) ww, (int) wh); + + currentScaleFactor = + DisplayGeometry::getInstance().findDisplayForRect (physicalBounds, false).scale; + + bounds = DisplayGeometry::physicalToScaled (physicalBounds); } } @@ -2429,7 +3175,7 @@ private: msg.display = display; msg.window = dragAndDropSourceWindow; msg.format = 32; - msg.data.l[0] = windowH; + msg.data.l[0] = (long) windowH; ScopedXLock xlock; XSendEvent (display, dragAndDropSourceWindow, False, 0, (XEvent*) &msg); @@ -2441,7 +3187,7 @@ private: msg.display = display; msg.window = targetWindow; msg.format = 32; - msg.data.l[0] = windowH; + msg.data.l[0] = (long) windowH; ScopedXLock xlock; return XSendEvent (display, targetWindow, False, 0, (XEvent*) &msg) != 0; @@ -2469,9 +3215,9 @@ private: const int numMimeTypes = dragState.getNumMimeTypes(); msg.data.l[1] = (dragState.xdndVersion << 24) | (numMimeTypes > 3); - msg.data.l[2] = numMimeTypes > 0 ? mimeTypes[0] : 0; - msg.data.l[3] = numMimeTypes > 1 ? mimeTypes[1] : 0; - msg.data.l[4] = numMimeTypes > 2 ? mimeTypes[2] : 0; + msg.data.l[2] = numMimeTypes > 0 ? (long) mimeTypes[0] : 0; + msg.data.l[3] = numMimeTypes > 1 ? (long) mimeTypes[1] : 0; + msg.data.l[4] = numMimeTypes > 2 ? (long) mimeTypes[2] : 0; sendExternalDragAndDropMessage (msg, targetWindow); } @@ -2483,15 +3229,16 @@ private: msg.message_type = Atoms::get().XdndPosition; - const Point mousePos (Desktop::getInstance().getMousePosition()); + Point mousePos (Desktop::getInstance().getMousePosition()); if (dragState.silentRect.contains (mousePos)) // we've been asked to keep silent return; + mousePos = DisplayGeometry::scaledToPhysical (mousePos); msg.data.l[1] = 0; msg.data.l[2] = (mousePos.x << 16) | mousePos.y; msg.data.l[3] = CurrentTime; - msg.data.l[4] = Atoms::get().XdndActionCopy; // this is all JUCE currently supports + msg.data.l[4] = (long) Atoms::get().XdndActionCopy; // this is all JUCE currently supports dragState.expectingStatus = sendExternalDragAndDropMessage (msg, targetWindow); } @@ -2503,7 +3250,7 @@ private: msg.message_type = Atoms::get().XdndStatus; msg.data.l[1] = (acceptDrop ? 1 : 0) | 2; // 2 indicates that we want to receive position messages - msg.data.l[4] = dropAction; + msg.data.l[4] = (long) dropAction; sendDragAndDropMessage (msg); } @@ -2552,7 +3299,7 @@ private: evt.xselectionrequest.property, targetType, 8, dragState.textOrFiles.toRawUTF8(), - dragState.textOrFiles.getNumBytesAsUTF8()); + (int) dragState.textOrFiles.getNumBytesAsUTF8()); } XSendEvent (display, evt.xselectionrequest.requestor, True, 0, &s); @@ -2571,10 +3318,10 @@ private: || (Atom) clientMsg.data.l[4] == Atoms::get().XdndActionPrivate)) { if ((clientMsg.data.l[1] & 2) == 0) // target requests silent rectangle - dragState.silentRect.setBounds (clientMsg.data.l[2] >> 16, - clientMsg.data.l[2] & 0xffff, - clientMsg.data.l[3] >> 16, - clientMsg.data.l[3] & 0xffff); + dragState.silentRect.setBounds ((int) clientMsg.data.l[2] >> 16, + (int) clientMsg.data.l[2] & 0xffff, + (int) clientMsg.data.l[3] >> 16, + (int) clientMsg.data.l[3] & 0xffff); dragState.canDrop = true; } @@ -2641,7 +3388,7 @@ private: if (dragAndDropSourceWindow == 0) return; - dragAndDropSourceWindow = clientMsg.data.l[0]; + dragAndDropSourceWindow = (::Window) clientMsg.data.l[0]; Point dropPos ((int) clientMsg.data.l[2] >> 16, (int) clientMsg.data.l[2] & 0xffff); @@ -2704,7 +3451,7 @@ private: srcMimeTypeAtomList.clear(); dragAndDropCurrentMimeType = 0; - const unsigned long dndCurrentVersion = static_cast (clientMsg.data.l[1] & 0xff000000) >> 24; + const unsigned long dndCurrentVersion = static_cast (clientMsg.data.l[1] & 0xff000000) >> 24; if (dndCurrentVersion < 3 || dndCurrentVersion > Atoms::DndVersion) { @@ -2712,7 +3459,7 @@ private: return; } - dragAndDropSourceWindow = clientMsg.data.l[0]; + dragAndDropSourceWindow = (::Window) clientMsg.data.l[0]; if ((clientMsg.data.l[1] & 1) != 0) { @@ -2736,7 +3483,7 @@ private: { for (int i = 2; i < 5; ++i) if (clientMsg.data.l[i] != None) - srcMimeTypeAtomList.add (clientMsg.data.l[i]); + srcMimeTypeAtomList.add ((unsigned long) clientMsg.data.l[i]); if (srcMimeTypeAtomList.size() == 0) { @@ -2773,7 +3520,7 @@ private: if (! prop.success) break; - dropData.append (prop.data, prop.numItems * prop.actualFormat / 8); + dropData.append (prop.data, prop.numItems * (size_t) prop.actualFormat / 8); if (prop.bytesLeft <= 0) break; @@ -2813,7 +3560,7 @@ private: dragAndDropCurrentMimeType, Atoms::getCreating ("JXSelectionWindowProperty"), windowH, - clientMsg.data.l[2]); + (::Time) clientMsg.data.l[2]); } } @@ -2901,7 +3648,7 @@ private: Window dragAndDropSourceWindow; bool finishAfterDropDataReceived; - Array srcMimeTypeAtomList; + Array srcMimeTypeAtomList; int pointerMap[5]; @@ -2961,31 +3708,35 @@ void ModifierKeys::updateCurrentModifiers() noexcept ModifierKeys ModifierKeys::getCurrentModifiersRealtime() noexcept { - Window root, child; - int x, y, winx, winy; - unsigned int mask; - int mouseMods = 0; + if (display != nullptr) + { + Window root, child; + int x, y, winx, winy; + unsigned int mask; + int mouseMods = 0; - ScopedXLock xlock; + ScopedXLock xlock; - if (XQueryPointer (display, RootWindow (display, DefaultScreen (display)), - &root, &child, &x, &y, &winx, &winy, &mask) != False) - { - if ((mask & Button1Mask) != 0) mouseMods |= ModifierKeys::leftButtonModifier; - if ((mask & Button2Mask) != 0) mouseMods |= ModifierKeys::middleButtonModifier; - if ((mask & Button3Mask) != 0) mouseMods |= ModifierKeys::rightButtonModifier; + if (XQueryPointer (display, RootWindow (display, DefaultScreen (display)), + &root, &child, &x, &y, &winx, &winy, &mask) != False) + { + if ((mask & Button1Mask) != 0) mouseMods |= ModifierKeys::leftButtonModifier; + if ((mask & Button2Mask) != 0) mouseMods |= ModifierKeys::middleButtonModifier; + if ((mask & Button3Mask) != 0) mouseMods |= ModifierKeys::rightButtonModifier; + } + + LinuxComponentPeer::currentModifiers = LinuxComponentPeer::currentModifiers.withoutMouseButtons().withFlags (mouseMods); } - LinuxComponentPeer::currentModifiers = LinuxComponentPeer::currentModifiers.withoutMouseButtons().withFlags (mouseMods); return LinuxComponentPeer::currentModifiers; } //============================================================================== -void Desktop::setKioskComponent (Component* kioskModeComponent, bool enableOrDisable, bool /* allowMenusAndBars */) +void Desktop::setKioskComponent (Component* comp, bool enableOrDisable, bool /* allowMenusAndBars */) { if (enableOrDisable) - kioskModeComponent->setBounds (getDisplays().getMainDisplay().totalArea); + comp->setBounds (getDisplays().getMainDisplay().totalArea); } //============================================================================== @@ -2995,118 +3746,56 @@ ComponentPeer* Component::createNewPeer (int styleFlags, void* nativeWindowToAtt } //============================================================================== -static double getDisplayDPI (int index) -{ - double dpiX = (DisplayWidth (display, index) * 25.4) / DisplayWidthMM (display, index); - double dpiY = (DisplayHeight (display, index) * 25.4) / DisplayHeightMM (display, index); - return (dpiX + dpiY) / 2.0; -} - void Desktop::Displays::findDisplays (float masterScale) { - if (display == 0) - return; - - ScopedXLock xlock; + DisplayGeometry& geometry = DisplayGeometry::getOrCreateInstance (display, masterScale); - #if JUCE_USE_XINERAMA - int major_opcode, first_event, first_error; - - if (XQueryExtension (display, "XINERAMA", &major_opcode, &first_event, &first_error)) + // add the main display first + int mainDisplayIdx; + for (mainDisplayIdx = 0; mainDisplayIdx < geometry.infos.size(); ++mainDisplayIdx) { - typedef Bool (*tXineramaIsActive) (::Display*); - typedef XineramaScreenInfo* (*tXineramaQueryScreens) (::Display*, int*); - - static tXineramaIsActive xineramaIsActive = nullptr; - static tXineramaQueryScreens xineramaQueryScreens = nullptr; - - if (xineramaIsActive == nullptr || xineramaQueryScreens == nullptr) - { - void* h = dlopen ("libXinerama.so", RTLD_GLOBAL | RTLD_NOW); + const DisplayGeometry::ExtendedInfo& info = geometry.infos.getReference (mainDisplayIdx); + if (info.isMain) + break; + } - if (h == nullptr) - h = dlopen ("libXinerama.so.1", RTLD_GLOBAL | RTLD_NOW); + // no main display found then use the first + if (mainDisplayIdx >= geometry.infos.size()) + mainDisplayIdx = 0; - if (h != nullptr) - { - xineramaIsActive = (tXineramaIsActive) dlsym (h, "XineramaIsActive"); - xineramaQueryScreens = (tXineramaQueryScreens) dlsym (h, "XineramaQueryScreens"); - } - } + // add the main display + { + const DisplayGeometry::ExtendedInfo& info = + geometry.infos.getReference (mainDisplayIdx); + Desktop::Displays::Display d; - if (xineramaIsActive != nullptr - && xineramaQueryScreens != nullptr - && xineramaIsActive (display)) - { - int numMonitors = 0; + d.isMain = true; + d.scale = masterScale * info.scale; + d.dpi = info.dpi; - if (XineramaScreenInfo* const screens = xineramaQueryScreens (display, &numMonitors)) - { - for (int index = 0; index < numMonitors; ++index) - { - for (int j = numMonitors; --j >= 0;) - { - if (screens[j].screen_number == index) - { - Display d; - d.userArea = d.totalArea = Rectangle (screens[j].x_org, - screens[j].y_org, - screens[j].width, - screens[j].height) / masterScale; - d.isMain = (index == 0); - d.scale = masterScale; - d.dpi = getDisplayDPI (0); // (all screens share the same DPI) - - displays.add (d); - } - } - } + d.totalArea = DisplayGeometry::physicalToScaled (info.totalBounds); + d.userArea = (info.usableBounds / d.scale) + info.topLeftScaled; - XFree (screens); - } - } + displays.add (d); } - if (displays.size() == 0) - #endif + for (int i = 0; i < geometry.infos.size(); ++i) { - Atom hints = Atoms::getIfExists ("_NET_WORKAREA"); - - if (hints != None) - { - const int numMonitors = ScreenCount (display); - - for (int i = 0; i < numMonitors; ++i) - { - GetXProperty prop (RootWindow (display, i), hints, 0, 4, false, XA_CARDINAL); + // don't add the main display a second time + if (i == mainDisplayIdx) + continue; - if (prop.success && prop.actualType == XA_CARDINAL && prop.actualFormat == 32 && prop.numItems == 4) - { - const long* const position = (const long*) prop.data; + const DisplayGeometry::ExtendedInfo& info = geometry.infos.getReference (i); + Desktop::Displays::Display d; - Display d; - d.userArea = d.totalArea = Rectangle (position[0], position[1], - position[2], position[3]) / masterScale; - d.isMain = (displays.size() == 0); - d.scale = masterScale; - d.dpi = getDisplayDPI (i); + d.isMain = false; + d.scale = masterScale * info.scale; + d.dpi = info.dpi; - displays.add (d); - } - } - } + d.totalArea = DisplayGeometry::physicalToScaled (info.totalBounds); + d.userArea = (info.usableBounds / d.scale) + info.topLeftScaled; - if (displays.size() == 0) - { - Display d; - d.userArea = d.totalArea = Rectangle (DisplayWidth (display, DefaultScreen (display)), - DisplayHeight (display, DefaultScreen (display))) * masterScale; - d.isMain = true; - d.scale = masterScale; - d.dpi = getDisplayDPI (0); - - displays.add (d); - } + displays.add (d); } } @@ -3139,6 +3828,9 @@ bool Desktop::canUseSemiTransparentWindows() noexcept Point MouseInputSource::getCurrentRawMousePosition() { + if (display == nullptr) + return Point(); + Window root, child; int x, y, winx, winy; unsigned int mask; @@ -3154,14 +3846,18 @@ Point MouseInputSource::getCurrentRawMousePosition() x = y = -1; } - return Point ((float) x, (float) y); + return DisplayGeometry::physicalToScaled (Point ((float) x, (float) y)); } void MouseInputSource::setRawMousePosition (Point newPosition) { - ScopedXLock xlock; - Window root = RootWindow (display, DefaultScreen (display)); - XWarpPointer (display, None, root, 0, 0, 0, 0, roundToInt (newPosition.getX()), roundToInt (newPosition.getY())); + if (display != nullptr) + { + ScopedXLock xlock; + Window root = RootWindow (display, DefaultScreen (display)); + newPosition = DisplayGeometry::scaledToPhysical (newPosition); + XWarpPointer (display, None, root, 0, 0, 0, 0, roundToInt (newPosition.getX()), roundToInt (newPosition.getY())); + } } double Desktop::getDefaultMasterScale() @@ -3183,16 +3879,19 @@ void Desktop::setScreenSaverEnabled (const bool isEnabled) { screenSaverAllowed = isEnabled; - typedef void (*tXScreenSaverSuspend) (Display*, Bool); - static tXScreenSaverSuspend xScreenSaverSuspend = nullptr; + if (display != nullptr) + { + typedef void (*tXScreenSaverSuspend) (Display*, Bool); + static tXScreenSaverSuspend xScreenSaverSuspend = nullptr; - if (xScreenSaverSuspend == nullptr) - if (void* h = dlopen ("libXss.so", RTLD_GLOBAL | RTLD_NOW)) - xScreenSaverSuspend = (tXScreenSaverSuspend) dlsym (h, "XScreenSaverSuspend"); + if (xScreenSaverSuspend == nullptr) + if (void* h = dlopen ("libXss.so", RTLD_GLOBAL | RTLD_NOW)) + xScreenSaverSuspend = (tXScreenSaverSuspend) dlsym (h, "XScreenSaverSuspend"); - ScopedXLock xlock; - if (xScreenSaverSuspend != nullptr) - xScreenSaverSuspend (display, ! isEnabled); + ScopedXLock xlock; + if (xScreenSaverSuspend != nullptr) + xScreenSaverSuspend (display, ! isEnabled); + } } } @@ -3204,9 +3903,12 @@ bool Desktop::isScreenSaverEnabled() //============================================================================== void* CustomMouseCursorInfo::create() const { + if (display == nullptr) + return nullptr; + ScopedXLock xlock; - const unsigned int imageW = image.getWidth(); - const unsigned int imageH = image.getHeight(); + const unsigned int imageW = (unsigned int) image.getWidth(); + const unsigned int imageH = (unsigned int) image.getHeight(); int hotspotX = hotspot.x; int hotspotY = hotspot.y; @@ -3243,10 +3945,10 @@ void* CustomMouseCursorInfo::create() const if (xcursorSupportsARGB != nullptr) { - if (XcursorImage* xcImage = xcursorImageCreate (imageW, imageH)) + if (XcursorImage* xcImage = xcursorImageCreate ((int) imageW, (int) imageH)) { - xcImage->xhot = hotspotX; - xcImage->yhot = hotspotY; + xcImage->xhot = (XcursorDim) hotspotX; + xcImage->yhot = (XcursorDim) hotspotY; XcursorPixel* dest = xcImage->pixels; for (int y = 0; y < (int) imageH; ++y) @@ -3268,17 +3970,17 @@ void* CustomMouseCursorInfo::create() const if (! XQueryBestCursor (display, root, imageW, imageH, &cursorW, &cursorH)) return nullptr; - Image im (Image::ARGB, cursorW, cursorH, true); + Image im (Image::ARGB, (int) cursorW, (int) cursorH, true); { Graphics g (im); if (imageW > cursorW || imageH > cursorH) { - hotspotX = (hotspotX * cursorW) / imageW; - hotspotY = (hotspotY * cursorH) / imageH; + hotspotX = (hotspotX * (int) cursorW) / (int) imageW; + hotspotY = (hotspotY * (int) cursorH) / (int) imageH; - g.drawImageWithin (image, 0, 0, imageW, imageH, + g.drawImageWithin (image, 0, 0, (int) imageW, (int) imageH, RectanglePlacement::xLeft | RectanglePlacement::yTop | RectanglePlacement::onlyReduceInSize, false); } @@ -3288,19 +3990,19 @@ void* CustomMouseCursorInfo::create() const } } - const int stride = (cursorW + 7) >> 3; - HeapBlock maskPlane, sourcePlane; + const unsigned int stride = (cursorW + 7) >> 3; + HeapBlock maskPlane, sourcePlane; maskPlane.calloc (stride * cursorH); sourcePlane.calloc (stride * cursorH); const bool msbfirst = (BitmapBitOrder (display) == MSBFirst); - for (int y = cursorH; --y >= 0;) + for (int y = (int) cursorH; --y >= 0;) { - for (int x = cursorW; --x >= 0;) + for (int x = (int) cursorW; --x >= 0;) { const char mask = (char) (1 << (msbfirst ? (7 - (x & 7)) : (x & 7))); - const int offset = y * stride + (x >> 3); + const unsigned int offset = (unsigned int) y * stride + ((unsigned int) x >> 3); const Colour c (im.getPixelAt (x, y)); @@ -3316,7 +4018,8 @@ void* CustomMouseCursorInfo::create() const black.red = black.green = black.blue = 0; white.red = white.green = white.blue = 0xffff; - void* result = (void*) XCreatePixmapCursor (display, sourcePixmap, maskPixmap, &white, &black, hotspotX, hotspotY); + void* result = (void*) XCreatePixmapCursor (display, sourcePixmap, maskPixmap, &white, &black, + (unsigned int) hotspotX, (unsigned int) hotspotY); XFreePixmap (display, sourcePixmap); XFreePixmap (display, maskPixmap); @@ -3326,13 +4029,18 @@ void* CustomMouseCursorInfo::create() const void MouseCursor::deleteMouseCursor (void* const cursorHandle, const bool) { - ScopedXLock xlock; - if (cursorHandle != nullptr) + if (cursorHandle != nullptr && display != nullptr) + { + ScopedXLock xlock; XFreeCursor (display, (Cursor) cursorHandle); + } } void* MouseCursor::createStandardMouseCursor (MouseCursor::StandardCursorType type) { + if (display == nullptr) + return None; + unsigned int shape; switch (type) @@ -3432,7 +4140,28 @@ void LookAndFeel::playAlertSound() { std::cout << "\a" << std::flush; } +//============================================================================== +Rectangle juce_LinuxScaledToPhysicalBounds(ComponentPeer* peer, const Rectangle& bounds) +{ + Rectangle retval = bounds; + + if (LinuxComponentPeer* linuxPeer = dynamic_cast (peer)) + retval *= linuxPeer->getCurrentScale(); + return retval; +} + +void juce_LinuxAddRepaintListener (ComponentPeer* peer, Component* dummy) +{ + if (LinuxComponentPeer* linuxPeer = dynamic_cast (peer)) + linuxPeer->addOpenGLRepaintListener (dummy); +} + +void juce_LinuxRemoveRepaintListener (ComponentPeer* peer, Component* dummy) +{ + if (LinuxComponentPeer* linuxPeer = dynamic_cast (peer)) + linuxPeer->removeOpenGLRepaintListener (dummy); +} //============================================================================== #if JUCE_MODAL_LOOPS_PERMITTED @@ -3522,7 +4251,7 @@ const int KeyPress::numberPadSeparator = (XK_KP_Separator & 0xff)| Keys::ex const int KeyPress::numberPadDecimalPoint = (XK_KP_Decimal & 0xff)| Keys::extendedKeyModifier; const int KeyPress::numberPadEquals = (XK_KP_Equal & 0xff)| Keys::extendedKeyModifier; const int KeyPress::numberPadDelete = (XK_KP_Delete & 0xff)| Keys::extendedKeyModifier; -const int KeyPress::playKey = (0xffeeff00) | Keys::extendedKeyModifier; -const int KeyPress::stopKey = (0xffeeff01) | Keys::extendedKeyModifier; -const int KeyPress::fastForwardKey = (0xffeeff02) | Keys::extendedKeyModifier; -const int KeyPress::rewindKey = (0xffeeff03) | Keys::extendedKeyModifier; +const int KeyPress::playKey = ((int) 0xffeeff00) | Keys::extendedKeyModifier; +const int KeyPress::stopKey = ((int) 0xffeeff01) | Keys::extendedKeyModifier; +const int KeyPress::fastForwardKey = ((int) 0xffeeff02) | Keys::extendedKeyModifier; +const int KeyPress::rewindKey = ((int) 0xffeeff03) | Keys::extendedKeyModifier; diff --git a/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_FileChooser.mm b/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_FileChooser.mm index d5f36a6..8097620 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_FileChooser.mm +++ b/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_FileChooser.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -29,9 +29,11 @@ struct FileChooserDelegateClass : public ObjCClass FileChooserDelegateClass() : ObjCClass ("JUCEFileChooser_") { addIvar ("filters"); + addIvar ("filePreviewComponent"); - addMethod (@selector (dealloc), dealloc, "v@:"); - addMethod (@selector (panel:shouldShowFilename:), shouldShowFilename, "c@:@@"); + addMethod (@selector (dealloc), dealloc, "v@:"); + addMethod (@selector (panel:shouldShowFilename:), shouldShowFilename, "c@:@@"); + addMethod (@selector (panelSelectionDidChange:), panelSelectionDidChange, "c@"); #if defined (MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 addProtocol (@protocol (NSOpenSavePanelDelegate)); @@ -40,21 +42,21 @@ struct FileChooserDelegateClass : public ObjCClass registerClass(); } - static void setFilters (id self, StringArray* filters) - { - object_setInstanceVariable (self, "filters", filters); - } + static void setFilters (id self, StringArray* filters) { object_setInstanceVariable (self, "filters", filters); } + static void setFilePreviewComponent (id self, FilePreviewComponent* comp) { object_setInstanceVariable (self, "filePreviewComponent", comp); } + static StringArray* getFilters (id self) { return getIvar (self, "filters"); } + static FilePreviewComponent* getFilePreviewComponent (id self) { return getIvar (self, "filePreviewComponent"); } private: static void dealloc (id self, SEL) { - delete getIvar (self, "filters"); + delete getFilters (self); sendSuperclassMessage (self, @selector (dealloc)); } static BOOL shouldShowFilename (id self, SEL, id /*sender*/, NSString* filename) { - StringArray* const filters = getIvar (self, "filters"); + StringArray* const filters = getFilters (self); const File f (nsStringToJuce (filename)); @@ -81,6 +83,32 @@ private: return f.isDirectory() && ! [[NSWorkspace sharedWorkspace] isFilePackageAtPath: filename]; } + + static StringArray getSelectedPaths (id sender) + { + StringArray paths; + + if ([sender isKindOfClass: [NSOpenPanel class]]) + { + NSArray* urls = [(NSOpenPanel*) sender URLs]; + + for (NSUInteger i = 0; i < [urls count]; ++i) + paths.add (nsStringToJuce ([[urls objectAtIndex: i] path])); + } + else if ([sender isKindOfClass: [NSSavePanel class]]) + { + paths.add (nsStringToJuce ([[(NSSavePanel*) sender URL] path])); + } + + return paths; + } + + static void panelSelectionDidChange (id self, SEL, id sender) + { + // NB: would need to extend FilePreviewComponent to handle the full list rather than just the first one + if (FilePreviewComponent* const previewComp = getFilePreviewComponent (self)) + previewComp->selectedFileChanged (File (getSelectedPaths (sender)[0])); + } }; static NSMutableArray* createAllowedTypesArray (const StringArray& filters) @@ -113,7 +141,7 @@ void FileChooser::showPlatformDialog (Array& results, bool isSaveDialogue, bool /*warnAboutOverwritingExistingFiles*/, bool selectMultipleFiles, - FilePreviewComponent* /*extraInfoComponent*/) + FilePreviewComponent* extraInfoComponent) { JUCE_AUTORELEASEPOOL { @@ -151,6 +179,16 @@ void FileChooser::showPlatformDialog (Array& results, [openPanel setResolvesAliases: YES]; } + if (extraInfoComponent != nullptr) + { + NSView* view = [[[NSView alloc] initWithFrame: makeNSRect (extraInfoComponent->getLocalBounds())] autorelease]; + extraInfoComponent->addToDesktop (0, (void*) view); + extraInfoComponent->setVisible (true); + FileChooserDelegateClass::setFilePreviewComponent (delegate, extraInfoComponent); + + [panel setAccessoryView: view]; + } + [panel setDelegate: delegate]; if (isSaveDialogue || selectsDirectory) @@ -172,10 +210,10 @@ void FileChooser::showPlatformDialog (Array& results, [panel setDirectoryURL: [NSURL fileURLWithPath: juceStringToNS (directory)]]; [panel setNameFieldStringValue: juceStringToNS (filename)]; - if ([panel runModal] == NSOKButton) + if ([panel runModal] == 1 /*NSModalResponseOK*/) #else if ([panel runModalForDirectory: juceStringToNS (directory) - file: juceStringToNS (filename)] == NSOKButton) + file: juceStringToNS (filename)] == 1 /*NSModalResponseOK*/) #endif { if (isSaveDialogue) diff --git a/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_MainMenu.mm b/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_MainMenu.mm index ea3406e..c511b44 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_MainMenu.mm +++ b/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_MainMenu.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_MouseCursor.mm b/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_MouseCursor.mm index 4811607..09a63d8 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_MouseCursor.mm +++ b/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_MouseCursor.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -50,34 +50,62 @@ namespace MouseCursorHelpers } } - static void* fromWebKitFile (const char* filename, float hx, float hy) + static NSCursor* fromNSImage (NSImage* im, NSPoint hotspot) { - FileInputStream fileStream (File ("/System/Library/Frameworks/WebKit.framework/Frameworks/WebCore.framework/Resources") - .getChildFile (filename)); + NSCursor* c = [[NSCursor alloc] initWithImage: im + hotSpot: hotspot]; + [im release]; + return c; + } - if (fileStream.openedOk()) + static void* fromHIServices (const char* filename) + { + JUCE_AUTORELEASEPOOL { - BufferedInputStream buf (fileStream, 4096); + const String cursorPath (String ("/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/" + "HIServices.framework/Versions/A/Resources/cursors/") + + filename); - PNGImageFormat pngFormat; - Image im (pngFormat.decodeImage (buf)); + NSImage* originalImage = [[NSImage alloc] initByReferencingFile: juceStringToNS (cursorPath + "/cursor.pdf")]; + NSSize originalSize = [originalImage size]; + NSImage* resultImage = [[NSImage alloc] initWithSize: originalSize]; - if (im.isValid()) - return CustomMouseCursorInfo (im, (int) (hx * im.getWidth()), - (int) (hy * im.getHeight())).create(); - } + for (int scale = 1; scale <= 4; ++scale) + { + NSAffineTransform* scaleTransform = [NSAffineTransform transform]; + [scaleTransform scaleBy: (float) scale]; + + if (CGImageRef rasterCGImage = [originalImage CGImageForProposedRect: nil + context: nil + hints: [NSDictionary dictionaryWithObjectsAndKeys: + NSImageHintCTM, scaleTransform, nil]]) + { + NSBitmapImageRep* imageRep = [[NSBitmapImageRep alloc] initWithCGImage: rasterCGImage]; + [imageRep setSize: originalSize]; + + [resultImage addRepresentation: imageRep]; + [imageRep release]; + } + else + { + return nil; + } + } - return nullptr; + NSDictionary* info = [NSDictionary dictionaryWithContentsOfFile: juceStringToNS (cursorPath + "/info.plist")]; + + const float hotspotX = (float) [[info valueForKey: nsStringLiteral ("hotx")] doubleValue]; + const float hotspotY = (float) [[info valueForKey: nsStringLiteral ("hoty")] doubleValue]; + + return fromNSImage (resultImage, NSMakePoint (hotspotX, hotspotY)); + } } } void* CustomMouseCursorInfo::create() const { - NSImage* im = MouseCursorHelpers::createNSImage (image); - NSCursor* c = [[NSCursor alloc] initWithImage: im - hotSpot: NSMakePoint (hotspot.x, hotspot.y)]; - [im release]; - return c; + return MouseCursorHelpers::fromNSImage (MouseCursorHelpers::createNSImage (image), + NSMakePoint (hotspot.x, hotspot.y)); } void* MouseCursor::createStandardMouseCursor (MouseCursor::StandardCursorType type) @@ -102,9 +130,10 @@ void* MouseCursor::createStandardMouseCursor (MouseCursor::StandardCursorType ty case CopyingCursor: { #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6 - if (void* m = MouseCursorHelpers::fromWebKitFile ("copyCursor.png", 0, 0)) + if (void* m = MouseCursorHelpers::fromHIServices ("copy")) return m; #endif + c = [NSCursor dragCopyCursor]; // added in 10.6 break; } @@ -112,10 +141,14 @@ void* MouseCursor::createStandardMouseCursor (MouseCursor::StandardCursorType ty case UpDownResizeCursor: case TopEdgeResizeCursor: case BottomEdgeResizeCursor: - return MouseCursorHelpers::fromWebKitFile ("northSouthResizeCursor.png", 0.5f, 0.5f); + if (void* m = MouseCursorHelpers::fromHIServices ("resizenorthsouth")) + return m; + + c = [NSCursor resizeUpDownCursor]; + break; case LeftRightResizeCursor: - if (void* m = MouseCursorHelpers::fromWebKitFile ("eastWestResizeCursor.png", 0.5f, 0.5f)) + if (void* m = MouseCursorHelpers::fromHIServices ("resizeeastwest")) return m; c = [NSCursor resizeLeftRightCursor]; @@ -123,14 +156,14 @@ void* MouseCursor::createStandardMouseCursor (MouseCursor::StandardCursorType ty case TopLeftCornerResizeCursor: case BottomRightCornerResizeCursor: - return MouseCursorHelpers::fromWebKitFile ("northWestSouthEastResizeCursor.png", 0.5f, 0.5f); + return MouseCursorHelpers::fromHIServices ("resizenorthwestsoutheast"); case TopRightCornerResizeCursor: case BottomLeftCornerResizeCursor: - return MouseCursorHelpers::fromWebKitFile ("northEastSouthWestResizeCursor.png", 0.5f, 0.5f); + return MouseCursorHelpers::fromHIServices ("resizenortheastsouthwest"); case UpDownLeftRightResizeCursor: - return MouseCursorHelpers::fromWebKitFile ("moveCursor.png", 0.5f, 0.5f); + return MouseCursorHelpers::fromHIServices ("move"); default: jassertfalse; diff --git a/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm b/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm index 45569b8..d0fc1b4 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm +++ b/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -411,9 +411,9 @@ public: if (NSWindow* const viewWindow = [view window]) { const NSRect windowFrame = [viewWindow frame]; - const NSPoint windowPoint = [view convertPoint: NSMakePoint (localPos.x, localPos.y) toView: nil]; + const NSPoint windowPoint = [view convertPoint: NSMakePoint (localPos.x, viewFrame.size.height - localPos.y) toView: nil]; const NSPoint screenPoint = NSMakePoint (windowFrame.origin.x + windowPoint.x, - windowFrame.origin.y + windowFrame.size.height - windowPoint.y); + windowFrame.origin.y + windowPoint.y); if (! isWindowAtPoint (viewWindow, screenPoint)) return false; @@ -497,10 +497,7 @@ public: void toBehind (ComponentPeer* other) override { - NSViewComponentPeer* const otherPeer = dynamic_cast (other); - jassert (otherPeer != nullptr); // wrong type of window? - - if (otherPeer != nullptr) + if (NSViewComponentPeer* const otherPeer = dynamic_cast (other)) { if (isSharedWindow) { @@ -514,6 +511,10 @@ public: relativeTo: [otherPeer->window windowNumber]]; } } + else + { + jassertfalse; // wrong type of window? + } } void setIcon (const Image&) override @@ -574,7 +575,15 @@ public: { currentModifiers = currentModifiers.withoutMouseButtons(); - if (isWindowAtPoint ([ev window], [[ev window] convertBaseToScreen: [ev locationInWindow]])) + NSPoint windowPos = [ev locationInWindow]; + + #if defined (MAC_OS_X_VERSION_10_7) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_7 + NSPoint screenPos = [[ev window] convertRectToScreen: NSMakeRect (windowPos.x, windowPos.y, 1.0f, 1.0f)].origin; + #else + NSPoint screenPos = [[ev window] convertBaseToScreen: windowPos]; + #endif + + if (isWindowAtPoint ([ev window], screenPos)) sendMouseEvent (ev); else // moved into another window which overlaps this one, so trigger an exit @@ -612,6 +621,7 @@ public: wheel.deltaY = 0; wheel.isReversed = false; wheel.isSmooth = false; + wheel.isInertial = false; #if ! JUCE_PPC @try @@ -620,6 +630,8 @@ public: if ([ev respondsToSelector: @selector (isDirectionInvertedFromDevice)]) wheel.isReversed = [ev isDirectionInvertedFromDevice]; + wheel.isInertial = ([ev momentumPhase] != NSEventPhaseNone); + if ([ev respondsToSelector: @selector (hasPreciseScrollingDeltas)]) { if ([ev hasPreciseScrollingDeltas]) @@ -634,8 +646,8 @@ public: #endif if ([ev respondsToSelector: @selector (deviceDeltaX)]) { - wheel.deltaX = checkDeviceDeltaReturnValue ((float) objc_msgSend_fpret (ev, @selector (deviceDeltaX))); - wheel.deltaY = checkDeviceDeltaReturnValue ((float) objc_msgSend_fpret (ev, @selector (deviceDeltaY))); + wheel.deltaX = checkDeviceDeltaReturnValue ((float) getMsgSendFPRetFn() (ev, @selector (deviceDeltaX))); + wheel.deltaY = checkDeviceDeltaReturnValue ((float) getMsgSendFPRetFn() (ev, @selector (deviceDeltaY))); } } @catch (...) @@ -657,7 +669,7 @@ public: #if defined (MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 const float invScale = 1.0f - (float) [ev magnification]; - if (invScale != 0.0f) + if (invScale > 0.0f) handleMagnifyGesture (0, getMousePos (ev, view), getMouseTime (ev), 1.0f / invScale); #endif (void) ev; @@ -870,6 +882,13 @@ public: return (getStyleFlags() & juce::ComponentPeer::windowIgnoresKeyPresses) == 0; } + bool canBecomeMainWindow() + { + Component* owner = &juce::ComponentPeer::getComponent(); + + return dynamic_cast (owner) != nullptr; + } + void becomeKeyWindow() { handleBroughtToFront(); @@ -1483,7 +1502,7 @@ private: if ((! owner->textWasInserted) && (owner == nullptr || ! owner->redirectKeyDown (ev))) { objc_super s = { self, [NSView class] }; - objc_msgSendSuper (&s, @selector (keyDown:), ev); + getMsgSendSuperFn() (&s, @selector (keyDown:), ev); } } } @@ -1495,7 +1514,7 @@ private: if (owner == nullptr || ! owner->redirectKeyUp (ev)) { objc_super s = { self, [NSView class] }; - objc_msgSendSuper (&s, @selector (keyUp:), ev); + getMsgSendSuperFn() (&s, @selector (keyUp:), ev); } } @@ -1636,7 +1655,7 @@ private: return true; objc_super s = { self, [NSView class] }; - return objc_msgSendSuper (&s, @selector (performKeyEquivalent:), ev) != nil; + return getMsgSendSuperFn() (&s, @selector (performKeyEquivalent:), ev) != nil; } #endif @@ -1710,6 +1729,7 @@ struct JuceNSWindowClass : public ObjCClass addIvar ("owner"); addMethod (@selector (canBecomeKeyWindow), canBecomeKeyWindow, "c@:"); + addMethod (@selector (canBecomeMainWindow), canBecomeMainWindow, "c@:"); addMethod (@selector (becomeKeyWindow), becomeKeyWindow, "v@:"); addMethod (@selector (windowShouldClose:), windowShouldClose, "c@:@"); addMethod (@selector (constrainFrameRect:toScreen:), constrainFrameRect, @encode (NSRect), "@:", @encode (NSRect), "@"); @@ -1743,6 +1763,15 @@ private: && ! owner->sendModalInputAttemptIfBlocked(); } + static BOOL canBecomeMainWindow (id self, SEL) + { + NSViewComponentPeer* const owner = getOwner (self); + + return owner != nullptr + && owner->canBecomeMainWindow() + && ! owner->sendModalInputAttemptIfBlocked(); + } + static void becomeKeyWindow (id self, SEL) { sendSuperclassMessage (self, @selector (becomeKeyWindow)); @@ -1786,7 +1815,9 @@ private: static void windowDidExitFullScreen (id, SEL, NSNotification*) { + #if defined (MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 [NSApp setPresentationOptions: NSApplicationPresentationDefault]; + #endif } static void zoom (id self, SEL, id sender) @@ -1795,7 +1826,7 @@ private: { owner->isZooming = true; objc_super s = { self, [NSWindow class] }; - objc_msgSendSuper (&s, @selector (zoom:), sender); + getMsgSendSuperFn() (&s, @selector (zoom:), sender); owner->isZooming = false; owner->redirectMovedOrResized(); diff --git a/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_Windowing.mm b/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_Windowing.mm index 8f53304..103f4b1 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_Windowing.mm +++ b/JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_Windowing.mm @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -45,9 +45,9 @@ public: { switch (getRawResult()) { - case NSAlertDefaultReturn: return 1; - case NSAlertOtherReturn: return 2; - default: return 0; + case NSAlertFirstButtonReturn: return 1; + case NSAlertThirdButtonReturn: return 2; + default: return 0; } } @@ -82,25 +82,26 @@ private: delete this; } - static NSString* translateIfNotNull (const char* s) + NSInteger getRawResult() const { - return s != nullptr ? juceStringToNS (TRANS (s)) : nil; + NSAlert* alert = [[[NSAlert alloc] init] autorelease]; + + [alert setMessageText: juceStringToNS (title)]; + [alert setInformativeText: juceStringToNS (message)]; + + [alert setAlertStyle: iconType == AlertWindow::WarningIcon ? NSCriticalAlertStyle + : NSInformationalAlertStyle]; + addButton (alert, button1); + addButton (alert, button2); + addButton (alert, button3); + + return [alert runModal]; } - NSInteger getRawResult() const + static void addButton (NSAlert* alert, const char* button) { - NSString* msg = juceStringToNS (message); - NSString* ttl = juceStringToNS (title); - NSString* b1 = translateIfNotNull (button1); - NSString* b2 = translateIfNotNull (button2); - NSString* b3 = translateIfNotNull (button3); - - switch (iconType) - { - case AlertWindow::InfoIcon: return NSRunInformationalAlertPanel (ttl, msg, b1, b2, b3); - case AlertWindow::WarningIcon: return NSRunCriticalAlertPanel (ttl, msg, b1, b2, b3); - default: return NSRunAlertPanel (ttl, msg, b1, b2, b3); - } + if (button != nullptr) + [alert addButtonWithTitle: juceStringToNS (TRANS (button))]; } }; @@ -164,37 +165,29 @@ bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& fi JUCE_AUTORELEASEPOOL { - NSView* view = (NSView*) sourceComp->getWindowHandle(); - - if (view == nil) - return false; - - NSPasteboard* pboard = [NSPasteboard pasteboardWithName: NSDragPboard]; - [pboard declareTypes: [NSArray arrayWithObject: NSFilenamesPboardType] - owner: nil]; - - NSMutableArray* filesArray = [NSMutableArray arrayWithCapacity: 4]; - for (int i = 0; i < files.size(); ++i) - [filesArray addObject: juceStringToNS (files[i])]; - - [pboard setPropertyList: filesArray - forType: NSFilenamesPboardType]; - - NSPoint dragPosition = [view convertPoint: [[[view window] currentEvent] locationInWindow] - fromView: nil]; - dragPosition.x -= 16; - dragPosition.y -= 16; - - [view dragImage: [[NSWorkspace sharedWorkspace] iconForFile: juceStringToNS (files[0])] - at: dragPosition - offset: NSMakeSize (0, 0) - event: [[view window] currentEvent] - pasteboard: pboard - source: view - slideBack: YES]; + if (NSView* view = (NSView*) sourceComp->getWindowHandle()) + { + if (NSEvent* event = [[view window] currentEvent]) + { + NSPoint eventPos = [event locationInWindow]; + NSRect dragRect = [view convertRect: NSMakeRect (eventPos.x - 16.0f, eventPos.y - 16.0f, 32.0f, 32.0f) + fromView: nil]; + + for (int i = 0; i < files.size(); ++i) + { + if (! [view dragFile: juceStringToNS (files[i]) + fromRect: dragRect + slideBack: YES + event: event]) + return false; + } + + return true; + } + } } - return true; + return false; } bool DragAndDropContainer::performExternalDragDropOfText (const String& /*text*/) @@ -340,13 +333,13 @@ public: const_cast (Desktop::getInstance().getDisplays()).refresh(); } - juce_DeclareSingleton_SingleThreaded_Minimal (DisplaySettingsChangeCallback); + juce_DeclareSingleton_SingleThreaded_Minimal (DisplaySettingsChangeCallback) private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DisplaySettingsChangeCallback) }; -juce_ImplementSingleton_SingleThreaded (DisplaySettingsChangeCallback); +juce_ImplementSingleton_SingleThreaded (DisplaySettingsChangeCallback) static Rectangle convertDisplayRect (NSRect r, CGFloat mainScreenBottom) { diff --git a/JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp b/JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp index 51def83..253364e 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp b/JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp index 2f7044a..0e5d3ab 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -225,6 +225,10 @@ void FileChooser::showPlatformDialog (Array& results, const String& title_ filter.copyToUTF16 (filters + (bytesWritten / sizeof (WCHAR)), ((filterSpaceNumChars - 1) * sizeof (WCHAR) - bytesWritten)); + for (int i = 0; i < filterSpaceNumChars; ++i) + if (filters[i] == '|') + filters[i] = 0; + OPENFILENAMEW of = { 0 }; String localPath (info.initialPath); diff --git a/JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_Windowing.cpp b/JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_Windowing.cpp index 3ec007c..a9baee0 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_Windowing.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_Windowing.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -1224,9 +1224,9 @@ private: clearSingletonInstance(); } - LPCTSTR getWindowClassName() const noexcept { return (LPCTSTR) MAKELONG (atom, 0); } + LPCTSTR getWindowClassName() const noexcept { return (LPCTSTR) atom; } - juce_DeclareSingleton_SingleThreaded_Minimal (WindowClassHolder); + juce_DeclareSingleton_SingleThreaded_Minimal (WindowClassHolder) private: ATOM atom; @@ -1749,10 +1749,13 @@ private: doMouseMove (position); - updateModifiersFromWParam (wParam); - isDragging = true; + if (isValidPeer (this)) + { + updateModifiersFromWParam (wParam); + isDragging = true; - doMouseEvent (position); + doMouseEvent (position); + } } void doMouseUp (Point position, const WPARAM wParam) @@ -1817,6 +1820,7 @@ private: wheel.deltaY = isVertical ? amount / 256.0f : 0.0f; wheel.isReversed = false; wheel.isSmooth = false; + wheel.isInertial = false; Point localPos; if (ComponentPeer* const peer = findPeerUnderMouse (localPos)) @@ -2936,7 +2940,7 @@ ComponentPeer* createNonRepaintingEmbeddedWindowsPeer (Component& component, voi } -juce_ImplementSingleton_SingleThreaded (HWNDComponentPeer::WindowClassHolder); +juce_ImplementSingleton_SingleThreaded (HWNDComponentPeer::WindowClassHolder) //============================================================================== @@ -2965,24 +2969,27 @@ bool KeyPress::isKeyCurrentlyDown (const int keyCode) { SHORT k = (SHORT) keyCode; - if ((keyCode & extendedKeyModifier) == 0 - && (k >= (SHORT) 'a' && k <= (SHORT) 'z')) - k += (SHORT) 'A' - (SHORT) 'a'; - - const SHORT translatedValues[] = { (SHORT) ',', VK_OEM_COMMA, - (SHORT) '+', VK_OEM_PLUS, - (SHORT) '-', VK_OEM_MINUS, - (SHORT) '.', VK_OEM_PERIOD, - (SHORT) ';', VK_OEM_1, - (SHORT) ':', VK_OEM_1, - (SHORT) '/', VK_OEM_2, - (SHORT) '?', VK_OEM_2, - (SHORT) '[', VK_OEM_4, - (SHORT) ']', VK_OEM_6 }; - - for (int i = 0; i < numElementsInArray (translatedValues); i += 2) - if (k == translatedValues [i]) - k = translatedValues [i + 1]; + if ((keyCode & extendedKeyModifier) == 0) + { + if (k >= (SHORT) 'a' && k <= (SHORT) 'z') + k += (SHORT) 'A' - (SHORT) 'a'; + + // Only translate if extendedKeyModifier flag is not set + const SHORT translatedValues[] = { (SHORT) ',', VK_OEM_COMMA, + (SHORT) '+', VK_OEM_PLUS, + (SHORT) '-', VK_OEM_MINUS, + (SHORT) '.', VK_OEM_PERIOD, + (SHORT) ';', VK_OEM_1, + (SHORT) ':', VK_OEM_1, + (SHORT) '/', VK_OEM_2, + (SHORT) '?', VK_OEM_2, + (SHORT) '[', VK_OEM_4, + (SHORT) ']', VK_OEM_6 }; + + for (int i = 0; i < numElementsInArray (translatedValues); i += 2) + if (k == translatedValues [i]) + k = translatedValues [i + 1]; + } return HWNDComponentPeer::isKeyDown (k); } @@ -3273,13 +3280,13 @@ String SystemClipboard::getTextFromClipboard() } //============================================================================== -void Desktop::setKioskComponent (Component* kioskModeComponent, bool enableOrDisable, bool /*allowMenusAndBars*/) +void Desktop::setKioskComponent (Component* kioskModeComp, bool enableOrDisable, bool /*allowMenusAndBars*/) { - if (TopLevelWindow* tlw = dynamic_cast (kioskModeComponent)) + if (TopLevelWindow* tlw = dynamic_cast (kioskModeComp)) tlw->setUsingNativeTitleBar (! enableOrDisable); if (enableOrDisable) - kioskModeComponent->setBounds (getDisplays().getMainDisplay().totalArea); + kioskModeComp->setBounds (getDisplays().getMainDisplay().totalArea); } //============================================================================== @@ -3426,7 +3433,6 @@ void* MouseCursor::createStandardMouseCursor (const MouseCursor::StandardCursorT case IBeamCursor: cursorName = IDC_IBEAM; break; case PointingHandCursor: cursorName = MAKEINTRESOURCE(32649); break; case CrosshairCursor: cursorName = IDC_CROSS; break; - case CopyingCursor: break; // can't seem to find one of these in the system list.. case LeftRightResizeCursor: case LeftEdgeResizeCursor: @@ -3461,6 +3467,24 @@ void* MouseCursor::createStandardMouseCursor (const MouseCursor::StandardCursorT return dragHandCursor; } + case CopyingCursor: + { + static void* copyCursor = nullptr; + + if (copyCursor == nullptr) + { + static unsigned char copyCursorData[] = { 71,73,70,56,57,97,21,0,21,0,145,0,0,0,0,0,255,255,255,0, + 128,128,255,255,255,33,249,4,1,0,0,3,0,44,0,0,0,0,21,0, 21,0,0,2,72,4,134,169,171,16,199,98,11,79,90,71,161,93,56,111, + 78,133,218,215,137,31,82,154,100,200,86,91,202,142,12,108,212,87,235,174, 15,54,214,126,237,226,37,96,59,141,16,37,18,201,142,157,230,204,51,112, + 252,114,147,74,83,5,50,68,147,208,217,16,71,149,252,124,5,0,59,0,0 }; + const int copyCursorSize = 119; + + copyCursor = CustomMouseCursorInfo (ImageFileFormat::loadFrom (copyCursorData, copyCursorSize), 1, 3).create(); + } + + return copyCursor; + } + default: jassertfalse; break; } diff --git a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.cpp b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.cpp index 751bcab..0e3495a 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.h b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.h index 05131e4..a19a348 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.h +++ b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp index 7482f57..c08f7dd 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h index c1f4eb4..91b901d 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h +++ b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -30,6 +30,41 @@ /** Expresses a coordinate as a dynamically evaluated expression. + When using relative coordinates to position components, the following symbols are available: + - "left", "right", "top", "bottom" refer to the position of those edges in this component, so + e.g. for a component whose width is always 100, you might set the right edge to the "left + 100". + - "[id].left", "[id].right", "[id].top", "[id].bottom", "[id].width", "[id].height", where [id] is + the identifier of one of this component's siblings. A component's identifier is set with + Component::setComponentID(). So for example if you want your component to always be 50 pixels to the + right of the one called "xyz", you could set your left edge to be "xyz.right + 50". + - Instead of an [id], you can use the name "parent" to refer to this component's parent. Like + any other component, these values are relative to their component's parent, so "parent.right" won't be + very useful for positioning a component because it refers to a position with the parent's parent.. but + "parent.width" can be used for setting positions relative to the parent's size. E.g. to make a 10x10 + component which remains 1 pixel away from its parent's bottom-right, you could use + "right - 10, bottom - 10, parent.width - 1, parent.height - 1". + - The name of one of the parent component's markers can also be used as a symbol. For markers to be + used, the parent component must implement its Component::getMarkers() method, and return at least one + valid MarkerList. So if you want your component's top edge to be 10 pixels below the + marker called "foobar", you'd set it to "foobar + 10". + + See the Expression class for details about the operators that are supported, but for example + if you wanted to make your component remains centred within its parent with a size of 100, 100, + you could express it as: + @code myComp.setBounds (RelativeBounds ("parent.width / 2 - 50, parent.height / 2 - 50, left + 100, top + 100")); + @endcode + ..or an alternative way to achieve the same thing: + @code myComp.setBounds (RelativeBounds ("right - 100, bottom - 100, parent.width / 2 + 50, parent.height / 2 + 50")); + @endcode + + Or if you wanted a 100x100 component whose top edge is lined up to a marker called "topMarker" and + which is positioned 50 pixels to the right of another component called "otherComp", you could write: + @code myComp.setBounds (RelativeBounds ("otherComp.right + 50, topMarker, left + 100, top + 100")); + @endcode + + Be careful not to make your coordinate expressions recursive, though, or exceptions and assertions will + be thrown! + @see RelativePoint, RelativeRectangle */ class JUCE_API RelativeCoordinate diff --git a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp index 589eb26..fc6772b 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h index 35213e9..bf9047c 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h +++ b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -40,8 +40,8 @@ public: void componentMovedOrResized (Component&, bool, bool); void componentParentHierarchyChanged (Component&); - void componentChildrenChanged (Component& component); - void componentBeingDeleted (Component& component); + void componentChildrenChanged (Component&); + void componentBeingDeleted (Component&); void markersChanged (MarkerList*); void markerListBeingDeleted (MarkerList* markerList); diff --git a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp index 77e3a75..330dd41 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h index ee426d2..cef4d47 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h +++ b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.cpp b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.cpp index 307b2ec..c1c7cf2 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.h b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.h index 43f7c44..c50ce2f 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.h +++ b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp index 29f6816..14b1aa3 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.h b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.h index d705b44..6de294d 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.h +++ b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp index 27f3eb6..6f39912 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -192,7 +192,7 @@ public: { } - bool registerCoordinates() + bool registerCoordinates() override { bool ok = addCoordinate (rectangle.left); ok = addCoordinate (rectangle.right) && ok; @@ -206,9 +206,9 @@ public: return rectangle == other; } - void applyToComponentBounds() + void applyToComponentBounds() override { - for (int i = 4; --i >= 0;) + for (int i = 32; --i >= 0;) { ComponentScope scope (getComponent()); const Rectangle newBounds (rectangle.resolve (&scope).getSmallestIntegerContainer()); @@ -222,7 +222,7 @@ public: jassertfalse; // Seems to be a recursive reference! } - void applyNewBounds (const Rectangle& newBounds) + void applyNewBounds (const Rectangle& newBounds) override { if (newBounds != getComponent().getBounds()) { diff --git a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.h b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.h index fc5ad45..0e04e2c 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.h +++ b/JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -28,7 +28,7 @@ //============================================================================== /** - An rectangle stored as a set of RelativeCoordinate values. + A rectangle stored as a set of RelativeCoordinate values. The rectangle's top, left, bottom and right edge positions are each stored as a RelativeCoordinate. diff --git a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp index bb85a19..d5095bb 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h index 066c952..08ad78c 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h +++ b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp index cf03191..c8e99d7 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h index 5f70def..e6b82f5 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h +++ b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp index 60b66d9..9145918 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h index 78887a3..6f97d5b 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h +++ b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.cpp b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.cpp index 96fd868..aada118 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.h b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.h index 2fd3d7a..8b1856b 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.h +++ b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -108,8 +108,6 @@ public: These constants can be used either via the Component::setColour(), or LookAndFeel::setColour() methods. - To change the colours of the menu that pops up - @see Component::setColour, Component::findColour, LookAndFeel::setColour, LookAndFeel::findColour */ enum ColourIds diff --git a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.cpp b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.cpp index dc93d7c..99eccbd 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -22,15 +22,14 @@ ============================================================================== */ -class PropertyPanel::SectionComponent : public Component +struct PropertyPanel::SectionComponent : public Component { -public: SectionComponent (const String& sectionTitle, - const Array & newProperties, - const bool sectionIsOpen_) + const Array& newProperties, + const bool sectionIsOpen) : Component (sectionTitle), titleHeight (sectionTitle.isNotEmpty() ? 22 : 0), - sectionIsOpen (sectionIsOpen_) + isOpen (sectionIsOpen) { propertyComps.addArray (newProperties); @@ -49,7 +48,7 @@ public: void paint (Graphics& g) override { if (titleHeight > 0) - getLookAndFeel().drawPropertyPanelSectionHeader (g, getName(), isOpen(), getWidth(), titleHeight); + getLookAndFeel().drawPropertyPanelSectionHeader (g, getName(), isOpen, getWidth(), titleHeight); } void resized() override @@ -68,20 +67,18 @@ public: { int y = titleHeight; - if (isOpen()) - { + if (isOpen) for (int i = propertyComps.size(); --i >= 0;) y += propertyComps.getUnchecked(i)->getPreferredHeight(); - } return y; } void setOpen (const bool open) { - if (sectionIsOpen != open) + if (isOpen != open) { - sectionIsOpen = open; + isOpen = open; for (int i = propertyComps.size(); --i >= 0;) propertyComps.getUnchecked(i)->setVisible (open); @@ -91,11 +88,6 @@ public: } } - bool isOpen() const - { - return sectionIsOpen; - } - void refreshAll() const { for (int i = propertyComps.size(); --i >= 0;) @@ -105,32 +97,27 @@ public: void mouseUp (const MouseEvent& e) override { if (e.getMouseDownX() < titleHeight - && e.x < titleHeight - && e.y < titleHeight - && e.getNumberOfClicks() != 2) - { - setOpen (! isOpen()); - } + && e.x < titleHeight + && e.getNumberOfClicks() != 2) + mouseDoubleClick (e); } void mouseDoubleClick (const MouseEvent& e) override { if (e.y < titleHeight) - setOpen (! isOpen()); + setOpen (! isOpen); } -private: - OwnedArray propertyComps; - int titleHeight; - bool sectionIsOpen; + OwnedArray propertyComps; + const int titleHeight; + bool isOpen; JUCE_DECLARE_NON_COPYABLE (SectionComponent) }; //============================================================================== -class PropertyPanel::PropertyHolderComponent : public Component +struct PropertyPanel::PropertyHolderComponent : public Component { -public: PropertyHolderComponent() {} void paint (Graphics&) override {} @@ -157,21 +144,26 @@ public: sections.getUnchecked(i)->refreshAll(); } - void clear() + void insertSection (int indexToInsertAt, SectionComponent* newSection) { - sections.clear(); + sections.insert (indexToInsertAt, newSection); + addAndMakeVisible (newSection, 0); } - void addSection (SectionComponent* newSection) + SectionComponent* getSectionWithNonEmptyName (const int targetIndex) const noexcept { - sections.add (newSection); - addAndMakeVisible (newSection, 0); - } + for (int index = 0, i = 0; i < sections.size(); ++i) + { + SectionComponent* const section = sections.getUnchecked (i); - int getNumSections() const noexcept { return sections.size(); } - SectionComponent* getSection (const int index) const { return sections [index]; } + if (section->getName().isNotEmpty()) + if (index++ == targetIndex) + return section; + } + + return nullptr; + } -private: OwnedArray sections; JUCE_DECLARE_NON_COPYABLE (PropertyHolderComponent) @@ -226,14 +218,14 @@ void PropertyPanel::clear() { if (! isEmpty()) { - propertyHolderComponent->clear(); + propertyHolderComponent->sections.clear(); updatePropHolderLayout(); } } bool PropertyPanel::isEmpty() const { - return propertyHolderComponent->getNumSections() == 0; + return propertyHolderComponent->sections.size() == 0; } int PropertyPanel::getTotalContentHeight() const @@ -241,25 +233,26 @@ int PropertyPanel::getTotalContentHeight() const return propertyHolderComponent->getHeight(); } -void PropertyPanel::addProperties (const Array & newProperties) +void PropertyPanel::addProperties (const Array& newProperties) { if (isEmpty()) repaint(); - propertyHolderComponent->addSection (new SectionComponent (String::empty, newProperties, true)); + propertyHolderComponent->insertSection (-1, new SectionComponent (String::empty, newProperties, true)); updatePropHolderLayout(); } void PropertyPanel::addSection (const String& sectionTitle, - const Array & newProperties, - const bool shouldBeOpen) + const Array& newProperties, + const bool shouldBeOpen, + const int indexToInsertAt) { jassert (sectionTitle.isNotEmpty()); if (isEmpty()) repaint(); - propertyHolderComponent->addSection (new SectionComponent (sectionTitle, newProperties, shouldBeOpen)); + propertyHolderComponent->insertSection (indexToInsertAt, new SectionComponent (sectionTitle, newProperties, shouldBeOpen)); updatePropHolderLayout(); } @@ -286,9 +279,9 @@ StringArray PropertyPanel::getSectionNames() const { StringArray s; - for (int i = 0; i < propertyHolderComponent->getNumSections(); ++i) + for (int i = 0; i < propertyHolderComponent->sections.size(); ++i) { - SectionComponent* const section = propertyHolderComponent->getSection (i); + SectionComponent* const section = propertyHolderComponent->sections.getUnchecked(i); if (section->getName().isNotEmpty()) s.add (section->getName()); @@ -299,63 +292,30 @@ StringArray PropertyPanel::getSectionNames() const bool PropertyPanel::isSectionOpen (const int sectionIndex) const { - int index = 0; - - for (int i = 0; i < propertyHolderComponent->getNumSections(); ++i) - { - SectionComponent* const section = propertyHolderComponent->getSection (i); - - if (section->getName().isNotEmpty()) - { - if (index == sectionIndex) - return section->isOpen(); - - ++index; - } - } + if (SectionComponent* s = propertyHolderComponent->getSectionWithNonEmptyName (sectionIndex)) + return s->isOpen; return false; } void PropertyPanel::setSectionOpen (const int sectionIndex, const bool shouldBeOpen) { - int index = 0; - - for (int i = 0; i < propertyHolderComponent->getNumSections(); ++i) - { - SectionComponent* const section = propertyHolderComponent->getSection (i); - - if (section->getName().isNotEmpty()) - { - if (index == sectionIndex) - { - section->setOpen (shouldBeOpen); - break; - } - - ++index; - } - } + if (SectionComponent* s = propertyHolderComponent->getSectionWithNonEmptyName (sectionIndex)) + s->setOpen (shouldBeOpen); } void PropertyPanel::setSectionEnabled (const int sectionIndex, const bool shouldBeEnabled) { - int index = 0; + if (SectionComponent* s = propertyHolderComponent->getSectionWithNonEmptyName (sectionIndex)) + s->setEnabled (shouldBeEnabled); +} - for (int i = 0; i < propertyHolderComponent->getNumSections(); ++i) +void PropertyPanel::removeSection (int sectionIndex) +{ + if (SectionComponent* s = propertyHolderComponent->getSectionWithNonEmptyName (sectionIndex)) { - SectionComponent* const section = propertyHolderComponent->getSection (i); - - if (section->getName().isNotEmpty()) - { - if (index == sectionIndex) - { - section->setEnabled (shouldBeEnabled); - break; - } - - ++index; - } + propertyHolderComponent->sections.removeObject (s); + updatePropHolderLayout(); } } @@ -408,7 +368,7 @@ void PropertyPanel::setMessageWhenEmpty (const String& newMessage) } } -const String& PropertyPanel::getMessageWhenEmpty() const +const String& PropertyPanel::getMessageWhenEmpty() const noexcept { return messageWhenEmpty; } diff --git a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.h b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.h index 3bd6115..43615b9 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.h +++ b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -67,8 +67,9 @@ public: /** Adds a set of properties to the panel. - These properties are added at the bottom of the list, under a section heading with - a plus/minus button that allows it to be opened and closed. + These properties are added under a section heading with a plus/minus button that + allows it to be opened and closed. If indexToInsertAt is < 0 then it will be added + at the end of the list, or before the given index if the index is non-zero. The components in the list will be owned by this object and will be automatically deleted later on when no longer needed. @@ -77,7 +78,8 @@ public: */ void addSection (const String& sectionTitle, const Array& newPropertyComponents, - bool shouldSectionInitiallyBeOpen = true); + bool shouldSectionInitiallyBeOpen = true, + int indexToInsertAt = -1); /** Calls the refresh() method of all PropertyComponents in the panel */ void refreshAll() const; @@ -111,6 +113,11 @@ public: */ void setSectionEnabled (int sectionIndex, bool shouldBeEnabled); + /** Remove one of the sections using the section index. + The index is from 0 up to the number of items returned by getSectionNames(). + */ + void removeSection (int sectionIndex); + //============================================================================== /** Saves the current state of open/closed sections so it can be restored later. @@ -140,7 +147,7 @@ public: /** Returns the message that is displayed when there are no properties. @see setMessageWhenEmpty */ - const String& getMessageWhenEmpty() const; + const String& getMessageWhenEmpty() const noexcept; //============================================================================== /** @internal */ @@ -149,10 +156,9 @@ public: void resized() override; private: - class SectionComponent; - Viewport viewport; - class PropertyHolderComponent; + struct SectionComponent; + struct PropertyHolderComponent; PropertyHolderComponent* propertyHolderComponent; String messageWhenEmpty; diff --git a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp index d1190ae..75c4581 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h index 832c399..35983df 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h +++ b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp index e45941a..670cf7d 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.h b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.h index 2b48496..da7d780 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.h +++ b/JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) diff --git a/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.cpp b/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.cpp index ffdcfd1..409969e 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.cpp +++ b/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.cpp @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -56,10 +56,7 @@ ComboBox::ComboBox (const String& name) ComboBox::~ComboBox() { currentId.removeListener (this); - - if (menuActive) - PopupMenu::dismissAllActiveMenus(); - + hidePopup(); label = nullptr; } @@ -473,7 +470,7 @@ bool ComboBox::keyPressed (const KeyPress& key) if (key == KeyPress::returnKey) { - showPopup(); + showPopupIfNotActive(); return true; } @@ -501,51 +498,70 @@ void ComboBox::labelTextChanged (Label*) //============================================================================== -void ComboBox::popupMenuFinishedCallback (int result, ComboBox* box) +void ComboBox::showPopupIfNotActive() { - if (box != nullptr) + if (! menuActive) { - box->menuActive = false; + menuActive = true; + showPopup(); + } +} - if (result != 0) - box->setSelectedId (result); +void ComboBox::hidePopup() +{ + if (menuActive) + { + menuActive = false; + PopupMenu::dismissAllActiveMenus(); + repaint(); } } -void ComboBox::showPopup() +static void comboBoxPopupMenuFinishedCallback (int result, ComboBox* combo) { - if (! menuActive) + if (combo != nullptr) { - const int selectedId = getSelectedId(); + combo->hidePopup(); - PopupMenu menu; - menu.setLookAndFeel (&getLookAndFeel()); + if (result != 0) + combo->setSelectedId (result); + } +} - for (int i = 0; i < items.size(); ++i) - { - const ItemInfo* const item = items.getUnchecked(i); - - if (item->isSeparator()) - menu.addSeparator(); - else if (item->isHeading) - menu.addSectionHeader (item->name); - else - menu.addItem (item->itemId, item->name, - item->isEnabled, item->itemId == selectedId); - } +void ComboBox::showPopup() +{ + PopupMenu menu; + menu.setLookAndFeel (&getLookAndFeel()); + addItemsToMenu (menu); - if (items.size() == 0) - menu.addItem (1, noChoicesMessage, false); + menu.showMenuAsync (PopupMenu::Options().withTargetComponent (this) + .withItemThatMustBeVisible (getSelectedId()) + .withMinimumWidth (getWidth()) + .withMaximumNumColumns (1) + .withStandardItemHeight (label->getHeight()), + ModalCallbackFunction::forComponent (comboBoxPopupMenuFinishedCallback, this)); +} - menuActive = true; +void ComboBox::addItemsToMenu (PopupMenu& menu) const +{ + const int selectedId = getSelectedId(); - menu.showMenuAsync (PopupMenu::Options().withTargetComponent (this) - .withItemThatMustBeVisible (selectedId) - .withMinimumWidth (getWidth()) - .withMaximumNumColumns (1) - .withStandardItemHeight (jlimit (12, 24, getHeight())), - ModalCallbackFunction::forComponent (popupMenuFinishedCallback, this)); + for (int i = 0; i < items.size(); ++i) + { + const ItemInfo* const item = items.getUnchecked(i); + jassert (item != nullptr); + + if (item->isSeparator()) + menu.addSeparator(); + else if (item->isHeading) + menu.addSectionHeader (item->name); + else + menu.addItem (item->itemId, item->name, + item->isEnabled, item->itemId == selectedId); } + + if (items.size() == 0) + menu.addItem (1, noChoicesMessage, false); } //============================================================================== @@ -556,7 +572,7 @@ void ComboBox::mouseDown (const MouseEvent& e) isButtonDown = isEnabled() && ! e.mods.isPopupMenu(); if (isButtonDown && (e.eventComponent == this || ! label->isEditable())) - showPopup(); + showPopupIfNotActive(); } void ComboBox::mouseDrag (const MouseEvent& e) @@ -564,7 +580,7 @@ void ComboBox::mouseDrag (const MouseEvent& e) beginDragAutoRepeat (50); if (isButtonDown && ! e.mouseWasClicked()) - showPopup(); + showPopupIfNotActive(); } void ComboBox::mouseUp (const MouseEvent& e2) @@ -579,7 +595,7 @@ void ComboBox::mouseUp (const MouseEvent& e2) if (reallyContains (e.getPosition(), true) && (e2.eventComponent == this || ! label->isEditable())) { - showPopup(); + showPopupIfNotActive(); } } } diff --git a/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.h b/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.h index 11515ba..515e5d2 100644 --- a/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.h +++ b/JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.h @@ -2,7 +2,7 @@ ============================================================================== This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) @@ -63,7 +63,7 @@ public: ~ComboBox(); //============================================================================== - /** Sets whether the test in the combo-box is editable. + /** Sets whether the text in the combo-box is editable. The default state for a new ComboBox is non-editable, and can only be changed by choosing from the drop-down list. @@ -263,6 +263,15 @@ public: */ virtual void showPopup(); + /** Hides the combo box's popup list, if it's currently visible. */ + void hidePopup(); + + /** Returns true if the popup menu is currently being shown. */ + bool isPopupActive() const noexcept { return menuActive; } + + /** Adds the items in this ComboBox to the given menu. */ + virtual void addItemsToMenu (PopupMenu&) const; + //============================================================================== /** A class for receiving events from a ComboBox. @@ -329,7 +338,7 @@ public: These constants can be used either via the Component::setColour(), or LookAndFeel::setColour() methods. - To change the colours of the menu that pops up + To change the colours of the menu that pops up, you can set the colour IDs in PopupMenu::ColourIDs. @see Component::setColour, Component::findColour, LookAndFeel::setColour, LookAndFeel::findColour */ @@ -423,7 +432,7 @@ private: int lastCurrentId; bool isButtonDown, separatorPending, menuActive, scrollWheelEnabled; float mouseWheelAccumulator; - ListenerList listeners; + ListenerList listeners; ScopedPointer

(hea`&|c@V_UK-^A{pA%%mu66Ua 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 diff --git a/Builds/MacOSX/Dexed.xcodeproj/xcuserdata/asb2m10.xcuserdatad/xcschemes/Dexed.xcscheme b/Builds/MacOSX/Dexed.xcodeproj/xcuserdata/asb2m10.xcuserdatad/xcschemes/Dexed.xcscheme index 9d008f9..ad6ec43 100644 --- a/Builds/MacOSX/Dexed.xcodeproj/xcuserdata/asb2m10.xcuserdatad/xcschemes/Dexed.xcscheme +++ b/Builds/MacOSX/Dexed.xcodeproj/xcuserdata/asb2m10.xcuserdatad/xcschemes/Dexed.xcscheme @@ -1,6 +1,6 @@ + shouldUseLaunchSchemeArgsEnv = "YES"> + + + + + + - - - - - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - - CFBundleIdentifier - com.digitalsuburban.Dexed - CFBundleName - Dexed - CFBundlePackageType - TDMw - CFBundleSignature - PTul - CFBundleShortVersionString - 1.0.0 - CFBundleVersion - 1.0.0 - NSHumanReadableCopyright - Digital Suburban - NSHighResolutionCapable - - AudioComponents - - - name - Digital Suburban: Dexed - description - Dexed FM Synth - factoryFunction - DexedAUFactory - manufacturer - DGSB - type - aumu - subtype - Dexd - version - 65536 - - - - + + + + + AudioComponents + + + description + Dexed FM Synth + factoryFunction + DexedAUFactory + manufacturer + DGSB + name + Digital Suburban: Dexed + subtype + Dexd + type + aumu + version + 65536 + + + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleName + Dexed + CFBundlePackageType + TDMw + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + PTul + CFBundleVersion + 1.0.0 + NSHighResolutionCapable + + NSHumanReadableCopyright + Digital Suburban + + diff --git a/Source/CartManager.cpp b/Source/CartManager.cpp index b01ea9d..d5ff30f 100644 --- a/Source/CartManager.cpp +++ b/Source/CartManager.cpp @@ -115,10 +115,8 @@ void CartManager::programSelected(ProgramListBox *source, int pos) { mainWindow->processor->setCurrentProgram(pos); mainWindow->processor->updateHostDisplay(); } else { - if ( source->getCurrentCart() == nullptr ) - return; - char unpackPgm[161]; - unpackProgramFromSysex(unpackPgm, source->getCurrentCart(), pos); + uint8_t unpackPgm[161]; + source->getCurrentCart().unpackProgram(unpackPgm, pos); activeCart->setSelected(-1); browserCart->setSelected(pos); repaint(); @@ -177,7 +175,7 @@ void CartManager::fileDoubleClicked(const File& file) { if ( file.isDirectory() ) return; mainWindow->loadCart(file); - activeCart->setCartridge(mainWindow->processor->sysex); + activeCart->setCartridge(mainWindow->processor->currentCart); } void CartManager::fileClicked(const File& file, const MouseEvent& e) { @@ -215,7 +213,7 @@ void CartManager::setActiveProgram(int idx, String activeName) { } void CartManager::resetActiveSysex() { - activeCart->setCartridge(mainWindow->processor->sysex); + activeCart->setCartridge(mainWindow->processor->currentCart); } void CartManager::selectionChanged() { @@ -227,21 +225,14 @@ void CartManager::selectionChanged() { if ( file.isDirectory() ) return; - String f = file.getFullPathName(); - uint8_t syx_data[4104]; - ifstream fp_in(f.toRawUTF8(), ios::binary); - if (fp_in.fail()) { - AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon, "Error", "Unable to open: " + f); + Cartridge browserSysex; + int rc = browserSysex.load(file); + if ( rc < 0 ) { + AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon, "Error", "Unable to open file"); return; } - fp_in.read((char *)syx_data, 4104); - fp_in.close(); - char browserSysex[4104]; - memcpy(browserSysex, syx_data+6, 4096); - int checksum = sysexChecksum(((char *) &browserSysex), 4096); - - if ( checksum != syx_data[4102] ) { + if ( rc != 0 ) { browserCart->readOnly = true; } else { browserCart->readOnly = false; @@ -260,15 +251,12 @@ void CartManager::programRightClicked(ProgramListBox *source, int pos) { switch(menu.show()) { case 1000: - char unpackPgm[161]; + uint8_t unpackPgm[161]; if ( source == activeCart ) { - unpackProgramFromSysex(unpackPgm, mainWindow->processor->sysex, pos); + mainWindow->processor->currentCart.unpackProgram(unpackPgm, pos); } else { - char *sysex = source->getCurrentCart(); - if ( sysex == nullptr ) - return; - unpackProgramFromSysex(unpackPgm, sysex, pos); + source->getCurrentCart().unpackProgram(unpackPgm, pos); } if ( mainWindow->processor->sysexComm.isOutputActive() ) @@ -284,7 +272,7 @@ void CartManager::programRightClicked(ProgramListBox *source, int pos) { void CartManager::programDragged(ProgramListBox *destListBox, int dest, char *packedPgm) { if ( destListBox == activeCart ) { - char *sysex = mainWindow->processor->sysex; + char *sysex = mainWindow->processor->currentCart.getRawVoice(); memcpy(sysex+(dest*128), packedPgm, 128); mainWindow->updateUI(); } else { @@ -295,22 +283,14 @@ void CartManager::programDragged(ProgramListBox *destListBox, int dest, char *pa if ( file.isDirectory() ) return; - if ( file.getSize() > 5000 ) - return; - - MemoryBlock block; - file.loadFileAsData(block); - - if ( block.getSize() < 4104 ) + if ( file.getSize() != 4104 ) return; - - char *sysex = ((char *) block.getData()) + 6; - memcpy(sysex+(dest*128), packedPgm, 128); - - char exported[4104]; - exportSysexCart(exported, sysex, 0); - file.replaceWithData(exported, 4104); - browserCart->setCartridge(sysex); + + Cartridge cart; + cart.load(file); + memcpy(cart.getRawVoice()+(dest*128), packedPgm, 128); + cart.saveVoice(file); + browserCart->setCartridge(cart); } } diff --git a/Source/DXComponents.cpp b/Source/DXComponents.cpp index d3a9177..39ed1e5 100644 --- a/Source/DXComponents.cpp +++ b/Source/DXComponents.cpp @@ -157,13 +157,13 @@ static double getDuration(int p_rate, int p_level_l, int p_level_r) { } EnvDisplay::EnvDisplay() { - pvalues = (char *) &TMP_LEVEL_PTR; + pvalues = (uint8_t *) &TMP_LEVEL_PTR; } void EnvDisplay::paint(Graphics &g) { int h = getHeight(); - char *rates = pvalues; - char *levels = pvalues + 4; + uint8_t *rates = pvalues; + uint8_t *levels = pvalues + 4; double d[4]; double keyoff = 0.0; @@ -250,15 +250,15 @@ void EnvDisplay::paint(Graphics &g) { } PitchEnvDisplay::PitchEnvDisplay() { - pvalues = (char *) &TMP_LEVEL_PTR; + pvalues = (uint8_t *) &TMP_LEVEL_PTR; vPos = 0; } void PitchEnvDisplay::paint(Graphics &g) { g.setColour(Colours::white); - char *levels = pvalues + 4; - char *rates = pvalues; + uint8_t *levels = pvalues + 4; + uint8_t *rates = pvalues; float dist[4]; float total = 0; diff --git a/Source/DXComponents.h b/Source/DXComponents.h index 3672194..987ac8e 100644 --- a/Source/DXComponents.h +++ b/Source/DXComponents.h @@ -26,7 +26,7 @@ class EnvDisplay : public Component { public: EnvDisplay(); - char *pvalues; + uint8_t *pvalues; char vPos; void paint(Graphics &g); }; @@ -35,7 +35,7 @@ class PitchEnvDisplay : public Component { char rvalues[8]; public: PitchEnvDisplay(); - char *pvalues; + uint8_t *pvalues; char vPos; void paint(Graphics &g); }; diff --git a/Source/Dexed.h b/Source/Dexed.h index ab2930c..c17bd55 100644 --- a/Source/Dexed.h +++ b/Source/Dexed.h @@ -24,14 +24,14 @@ void dexed_trace(const char *source, const char *fmt, ...); #ifdef DEBUG - #define DEXED_VERSION "0.9.0 DEBUG" + #define DEXED_VERSION "0.9.1 DEBUG" #ifdef _MSC_VER #define TRACE(fmt, ...) dexed_trace(__FUNCTION__,fmt,##__VA_ARGS__) #else #define TRACE(fmt, ...) dexed_trace(__PRETTY_FUNCTION__,fmt,##__VA_ARGS__) #endif #else - #define DEXED_VERSION "0.9.0" + #define DEXED_VERSION "0.9.1" #define TRACE(fmt, ...) #endif diff --git a/Source/GlobalEditor.cpp b/Source/GlobalEditor.cpp index d8d9f99..10041ae 100644 --- a/Source/GlobalEditor.cpp +++ b/Source/GlobalEditor.cpp @@ -542,7 +542,7 @@ void GlobalEditor::bind(DexedAudioProcessorEditor *edit) { processor->fxCutoff->bind(cutoff); processor->fxReso->bind(reso); processor->output->bind(output); - algoDisplay->algo = &(processor->data[134]); + algoDisplay->algo = (char *) &(processor->data[134]); pitchEnvDisplay->pvalues = &(processor->data[126]); editor = edit; diff --git a/Source/PluginData.cpp b/Source/PluginData.cpp index 9488245..190a842 100644 --- a/Source/PluginData.cpp +++ b/Source/PluginData.cpp @@ -28,7 +28,7 @@ #include using namespace ::std; -uint8_t sysexChecksum(const char *sysex, int size) { +uint8_t sysexChecksum(const uint8_t *sysex, int size) { int sum = 0; int i; @@ -36,64 +36,9 @@ uint8_t sysexChecksum(const char *sysex, int size) { return sum & 0x7F; } -String normalizeSysexName(const char *sysexName) { - char buffer[11]; - - memcpy(buffer, sysexName, 10); - - for (int j = 0; j < 10; j++) { - char c = (unsigned char) buffer[j]; - switch (c) { - case 92: - c = 'Y'; - break; /* yen */ - case 126: - c = '>'; - break; /* >> */ - case 127: - c = '<'; - break; /* << */ - default: - if (c < 32 || c > 127) - c = 32; - break; - } - buffer[j] = c; - } - buffer[10] = 0; - - return String(buffer); -} - - -void extractProgramNames(const char *block, StringArray &dest) { - dest.clear(); - - for (int i = 0; i < 32; i++) { - dest.add(String(normalizeSysexName(block + ((i * 128) + 118)))); - } -} - -void exportSysexCart(char *dest, char *src, char sysexChl) { - uint8_t header[] = { 0xF0, 0x43, 0x00, 0x09, 0x20, 0x00 }; - header[2] = sysexChl; - - memcpy(dest, header, 6); - - // copy 32 voices - memcpy(dest+6, src, 4096); - - // make checksum for dump - uint8_t footer[] = { sysexChecksum(src, 4096), 0xF7 }; - - memcpy(dest+4102, footer, 2); -} - - -void exportSysexPgm(char *dest, char *src, char sysexChl) { +void exportSysexPgm(uint8_t *dest, uint8_t *src) { uint8_t header[] = { 0xF0, 0x43, 0x00, 0x00, 0x01, 0x1B }; - header[2] = sysexChl; - + memcpy(dest, header, 6); // copy 1 unpacked voices @@ -110,8 +55,8 @@ void exportSysexPgm(char *dest, char *src, char sysexChl) { /** * Pack a program into a 32 packed sysex */ -void packProgram(uint8_t *dest, uint8_t *src, int idx, String name) { - uint8_t *bulk = dest + (idx * 128); +void Cartridge::packProgram(uint8_t *src, int idx, String name) { + uint8_t *bulk = voiceData + 6 + (idx * 128); for(int op = 0; op < 6; op++) { // eg rate and level, brk pt, depth, scaling @@ -171,8 +116,9 @@ char normparm(char value, char max, int id) { return v; } -void unpackProgramFromSysex(char *unpackPgm, char *sysexCart, int idx) { - char *bulk = sysexCart + (idx * 128); +void Cartridge::unpackProgram(uint8_t *unpackPgm, int idx) { + // TODO put this in uint8_t :D + char *bulk = (char *)voiceData + 6 + (idx * 128); for (int op = 0; op < 6; op++) { // eg rate and level, brk pt, depth, scaling @@ -220,53 +166,33 @@ void unpackProgramFromSysex(char *unpackPgm, char *sysexCart, int idx) { unpackPgm[160] = 1; } -void DexedAudioProcessor::unpackProgram(int idx) { - unpackProgramFromSysex(data, sysex, idx); -} - -int DexedAudioProcessor::importSysex(const char *imported) { - memcpy(sysex, imported + 6, 4096); - - uint8_t checksum = sysexChecksum(((char *) &sysex), 4096); - extractProgramNames(sysex, programNames); - - if ( checksum != imported[4102] ) { - TRACE("sysex import checksum doesnt match %d != %d", checksum, imported[4102]); - return 1; - } - - return 0; +void DexedAudioProcessor::loadCartridge(Cartridge &sysex) { + currentCart = sysex; + currentCart.getProgramNames(programNames); } -void DexedAudioProcessor::updateProgramFromSysex(const uint8 *rawdata) { +void DexedAudioProcessor::updateProgramFromSysex(const uint8_t *rawdata) { memcpy(data, rawdata, 161); triggerAsyncUpdate(); } void DexedAudioProcessor::setupStartupCart() { - char syx_data[4104]; - memset(&syx_data, 0, 4104); - File startup = dexedCartDir.getChildFile("Dexed_01.syx"); + + if ( currentCart.load(startup) != -1 ) + return; - if ( startup.exists() ) { - FileInputStream *fis = startup.createInputStream(); - if ( fis == nullptr ) { - TRACE("unable to open default cartridge"); - return; - } - fis->read(syx_data, 4104); - delete fis; - } else { - // The user deleted the file :/, load from the builtin zip file. - MemoryInputStream *mis = new MemoryInputStream(BinaryData::builtin_pgm_zip, BinaryData::builtin_pgm_zipSize, false); - ZipFile *builtin_pgm = new ZipFile(mis, true); - InputStream *is = builtin_pgm->createStreamForEntry(builtin_pgm->getIndexOfFileName(("Dexed_01.syx"))); - is->read(syx_data, 4104); - delete is; - delete builtin_pgm; - } - importSysex((char *) &syx_data); + // The user deleted the file :/, load from the builtin zip file. + MemoryInputStream *mis = new MemoryInputStream(BinaryData::builtin_pgm_zip, BinaryData::builtin_pgm_zipSize, false); + ZipFile *builtin_pgm = new ZipFile(mis, true); + InputStream *is = builtin_pgm->createStreamForEntry(builtin_pgm->getIndexOfFileName(("Dexed_01.syx"))); + Cartridge init; + + if ( init.load(*is) != -1 ) + loadCartridge(init); + + delete is; + delete builtin_pgm; } void DexedAudioProcessor::resetToInitVoice() { @@ -305,7 +231,7 @@ void DexedAudioProcessor::pasteEnvFromClipboard(int destOp) { void DexedAudioProcessor::sendCurrentSysexProgram() { uint8_t raw[167]; - exportSysexPgm((char *) raw, data, sysexComm.getChl()); + exportSysexPgm(raw, data); if ( sysexComm.isOutputActive() ) { sysexComm.send(MidiMessage(raw, 163)); } @@ -314,7 +240,7 @@ void DexedAudioProcessor::sendCurrentSysexProgram() { void DexedAudioProcessor::sendCurrentSysexCartridge() { uint8_t raw[4104]; - exportSysexCart((char *) raw, (char *) &sysex, sysexComm.getChl()); + currentCart.saveVoice(raw); if ( sysexComm.isOutputActive() ) { sysexComm.send(MidiMessage(raw, 4104)); } @@ -363,11 +289,8 @@ void DexedAudioProcessor::getStateInformation(MemoryBlock& destData) { if ( activeFileCartridge.exists() ) dexedState.setAttribute("activeFileCartridge", activeFileCartridge.getFullPathName()); - char sysex_blob[4104]; - exportSysexCart((char *) &sysex_blob, (char *) sysex, 0); - NamedValueSet blobSet; - blobSet.set("sysex", var((void *) &sysex_blob, 4104)); + blobSet.set("sysex", var((void *) currentCart.getVoiceSysex(), 4104)); blobSet.set("program", var((void *) &data, 161)); blobSet.copyToXmlAttributes(*dexedBlob); @@ -415,7 +338,9 @@ void DexedAudioProcessor::setStateInformation(const void* source, int sizeInByte return; } - importSysex((char *) sysex_blob.getBinaryData()->getData()); + Cartridge cart; + cart.load((uint8 *)sysex_blob.getBinaryData()->getData(), 4104); + loadCartridge(cart); memcpy(data, program.getBinaryData()->getData(), 161); lastStateSave = (long) time(NULL); diff --git a/Source/PluginData.h b/Source/PluginData.h index b41b051..aa42726 100644 --- a/Source/PluginData.h +++ b/Source/PluginData.h @@ -25,46 +25,155 @@ #define SYSEX_SIZE 4104 #include +#include "Dexed.h" -enum UnpackedOffset { - egRate, - egLevel = 4, - breakpoint = 8, - lScaleDepth, - rScaleDepth, - lKeyScale, - rKeyScale, - rateScaling, - keyVelocity, - outputLevel, - mode, - fCoarse, - fFine, - oscDetune, +uint8_t sysexChecksum(const uint8_t *sysex, int size); - // Global values - pitchEgRate = 126, - pitchEgLevel = 130, - algorythm = 134, - feedback, - oscKeySync, - lfoSpeed, - lfoDelay, - lfoPmDepth, - lfoAmDepth, - lfoKeySync, - lfoWave, - middleC, - pModeSens, - osc6state -}; +#define SYSEX_HEADER { 0xF0, 0x43, 0x00, 0x00, 0x20, 0x00 } + +class Cartridge { + uint8_t voiceData[SYSEX_SIZE]; + uint8_t perfData[SYSEX_SIZE]; + + void setHeader() { + uint8 voiceHeader[] = SYSEX_HEADER; + memcpy(voiceData, voiceHeader, 6); + voiceData[4102] = sysexChecksum(voiceData+6, 4096); + voiceData[4103] = 0xF7; + } + +public: + Cartridge() { } + + Cartridge(const Cartridge &cpy) { + memcpy(voiceData, cpy.voiceData, SYSEX_SIZE); + memcpy(perfData, cpy.perfData, SYSEX_SIZE); + } + + static String normalizePgmName(const char *sysexName) { + char buffer[11]; + + memcpy(buffer, sysexName, 10); + + for (int j = 0; j < 10; j++) { + char c = (unsigned char) buffer[j]; + switch (c) { + case 92: + c = 'Y'; + break; /* yen */ + case 126: + c = '>'; + break; /* >> */ + case 127: + c = '<'; + break; /* << */ + default: + if (c < 32 || c > 127) + c = 32; + break; + } + buffer[j] = c; + } + buffer[10] = 0; + + return String(buffer); + } + + int load(File f) { + FileInputStream *fis = f.createInputStream(); + if ( fis == NULL ) + return -1; + int rc = load(*fis); + delete fis; + return rc; + } + + int load(InputStream &fis) { + uint8 buffer[65535]; + int sz = fis.read(buffer, 65535); + if ( sz == 0 ) + return -1; + return load(buffer, sz); + } + + int load(const uint8_t *stream, int size) { + uint8 voiceHeader[] = SYSEX_HEADER; + uint8 tmp[65535]; + uint8 *pos = tmp; + int status = 3; + + if ( size > 65535 ) + size = 65535; + + memcpy(tmp, stream, size); + + while(size >= 4104) { + // random data + if ( pos[0] != 0xF0 ) { + if ( status != 0 ) + return status; + memcpy(voiceData, pos+6, 4096); + return 2; + } + + pos[3] = 0; + if ( memcmp(pos, voiceHeader, 6) == 0 ) { + memcpy(voiceData, pos, SYSEX_SIZE); + if ( sysexChecksum(voiceData + 6, 4096) == pos[4102] ) + status = 0; + else + status = 1; + size -= 4104; + pos += 4104; + continue; + } -String normalizeSysexName(const char *sysexName); -uint8_t sysexChecksum(const char *sysex, int size); -void extractProgramNames(const char *block, StringArray &dest); -void exportSysexCart(char *dest, char *src, char sysexChl); -void exportSysexPgm(char *dest, char *src, char sysexChl); -void packProgram(uint8_t *dest, uint8_t *src, int idx, String name); -void unpackProgramFromSysex(char *unpackPgm, char *sysexCart, int idx); + // other sysex + int i; + for(i=0;iimportSysex((char *) &syx_data) ) { - global.setSystemMessage(String("Unkown sysex format !?")); - } - processor->setCurrentProgram(0); + + processor->loadCartridge(cart); rebuildProgramCombobox(); + processor->setCurrentProgram(0); global.programs->setSelectedId(processor->getCurrentProgram()+1, dontSendNotification); processor->updateHostDisplay(); @@ -167,19 +163,10 @@ void DexedAudioProcessorEditor::saveCart() { FileChooser fc ("Export DX sysex...", processor->dexedCartDir, "*.syx", 1); if ( fc.browseForFileToSave(true) ) { - String f = fc.getResults().getReference(0).getFullPathName(); - char syx_data[4104]; - - exportSysexCart((char *) syx_data, (char *) &processor->sysex, 0); - - ofstream fp_out(f.toRawUTF8(), ios::binary); - fp_out.write((char *)syx_data, 4104); - fp_out.close(); - - if (fp_out.fail()) { + if ( ! processor->currentCart.saveVoice(fc.getResults().getReference(0)) ) { AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon, "Error", - "Unable to write: " + f); + "Unable to write: " + fc.getResults().getReference(0).getFullPathName()); } } } @@ -250,6 +237,8 @@ void DexedAudioProcessorEditor::updateUI() { void DexedAudioProcessorEditor::rebuildProgramCombobox() { global.programs->clear(dontSendNotification); + processor->currentCart.getProgramNames(processor->programNames); + for(int i=0;igetNumPrograms();i++) { String id; id << (i+1) << ". " << processor->getProgramName(i); @@ -258,7 +247,7 @@ void DexedAudioProcessorEditor::rebuildProgramCombobox() { global.programs->setSelectedId(processor->getCurrentProgram()+1, dontSendNotification); - String name = normalizeSysexName((const char *) processor->data+145); + String name = Cartridge::normalizePgmName((const char *) processor->data+145); cartManager.setActiveProgram(processor->getCurrentProgram(), name); if ( name != processor->getProgramName(processor->getCurrentProgram()) ) global.programs->setText("**. " + name, dontSendNotification); @@ -267,11 +256,9 @@ void DexedAudioProcessorEditor::rebuildProgramCombobox() { } void DexedAudioProcessorEditor::storeProgram() { - String currentName = normalizeSysexName((const char *) processor->data+145); - char destSysex[4096]; + String currentName = Cartridge::normalizePgmName((const char *) processor->data+145); + Cartridge destSysex = processor->currentCart; File *externalFile = NULL; - - memcpy(&destSysex, processor->sysex, 4096); bool activeCartridgeFound = processor->activeFileCartridge.exists(); @@ -292,7 +279,7 @@ void DexedAudioProcessorEditor::storeProgram() { // TODO: fix the name length to 10 StringArray programs; - extractProgramNames((char *) &destSysex, programs); + destSysex.getProgramNames(programs); dialog.addComboBox("Dest", programs, "Program Destination"); @@ -318,12 +305,9 @@ void DexedAudioProcessorEditor::storeProgram() { if ( externalFile != NULL ) delete externalFile; - MemoryBlock block; externalFile = new File(fc.getResults().getReference(0)); - if ( externalFile->loadFileAsData(block) ) { - block.copyTo(destSysex, 6, 4096); + if ( destSysex.load(*externalFile) ) continue; - } AlertWindow::showMessageBoxAsync(AlertWindow::WarningIcon, "Read error", "Unable to read file"); } } @@ -340,8 +324,7 @@ void DexedAudioProcessorEditor::storeProgram() { } if ( externalFile == NULL ) { - packProgram((uint8_t *) processor->sysex, (uint8_t *) processor->data, programNum, programName); - processor->programNames.set(programNum, programName); + processor->currentCart.packProgram((uint8_t *) processor->data, programNum, programName); rebuildProgramCombobox(); processor->setCurrentProgram(programNum); processor->updateHostDisplay(); @@ -355,18 +338,13 @@ void DexedAudioProcessorEditor::storeProgram() { break; destination = fc.getResult(); } - char sysexFile[4104]; - exportSysexCart((char *) &sysexFile, (char *) &processor->sysex, 0); - if ( ! destination.replaceWithData(sysexFile, 4104) ) { - AlertWindow::showMessageBoxAsync(AlertWindow::WarningIcon, "Write error", "Unable to write file"); - } + + processor->currentCart.saveVoice(destination); processor->activeFileCartridge = destination; } } else { - packProgram((uint8_t *) &destSysex, (uint8_t *) processor->data, programNum, programName); - char sysexFile[4104]; - exportSysexCart((char *) &sysexFile, (char *) &destSysex, 0); - if ( ! externalFile->replaceWithData(sysexFile, 4104) ) { + destSysex.packProgram((uint8_t *) processor->data, programNum, programName); + if ( ! destSysex.saveVoice(*externalFile)) { AlertWindow::showMessageBoxAsync(AlertWindow::WarningIcon, "Write error", "Unable to write file"); } } diff --git a/Source/PluginParam.cpp b/Source/PluginParam.cpp index a180024..4699ae6 100644 --- a/Source/PluginParam.cpp +++ b/Source/PluginParam.cpp @@ -512,7 +512,7 @@ void DexedAudioProcessor::setCurrentProgram(int index) { panic(); index = index > 31 ? 31 : index; - unpackProgram(index); + currentCart.unpackProgram(data, index); lfo.reset(data + 137); currentProgram = index; triggerAsyncUpdate(); diff --git a/Source/PluginProcessor.cpp b/Source/PluginProcessor.cpp index 8a30425..241ab0a 100644 --- a/Source/PluginProcessor.cpp +++ b/Source/PluginProcessor.cpp @@ -152,7 +152,7 @@ void DexedAudioProcessor::processBlock(AudioSampleBuffer& buffer, MidiBuffer& mi MidiBuffer::Iterator it(midiMessages); hasMidiMessage = it.getNextEvent(*nextMidi,midiEventPos); - float *channelData = buffer.getSampleData(0); + float *channelData = buffer.getWritePointer(0); // flush first events for (i=0; i < numSamples && i < extra_buf_size; i++) { @@ -443,13 +443,11 @@ void DexedAudioProcessor::handleIncomingMidiMessage(MidiInput* source, const Mid // 32 voice dump if ( buf[3] == 9 ) { - if ( sz < 4104 ) { - TRACE("wrong 32 voice datasize %d", sz); - return; + Cartridge received; + if ( received.load(buf, sz) ) { + loadCartridge(received); + setCurrentProgram(0); } - TRACE("update 32bulk voice"); - importSysex((const char *)buf); - setCurrentProgram(0); } updateHostDisplay(); diff --git a/Source/PluginProcessor.h b/Source/PluginProcessor.h index bc72ca3..da8abaf 100644 --- a/Source/PluginProcessor.h +++ b/Source/PluginProcessor.h @@ -115,14 +115,14 @@ class DexedAudioProcessor : public AudioProcessor, public AsyncUpdater, public char clipboardContent; void resolvAppDir(); + public : // in MIDI units (0x4000 is neutral) Controllers controllers; - StringArray programNames; - char sysex[4096]; - char data[161]; + StringArray programNames; + Cartridge currentCart; + uint8_t data[161]; - //CartridgeManager cartManager; SysexComm sysexComm; VoiceStatus voiceStatus; File activeFileCartridge; @@ -154,7 +154,8 @@ public : ScopedPointer fxReso; ScopedPointer output; - int importSysex(const char *imported); + //int importSysex(const char *imported); + void loadCartridge(Cartridge &cart); void setDxValue(int offset, int v); //============================================================================== @@ -184,7 +185,6 @@ public : bool hasEditor() const; void updateUI(); bool peekVoiceStatus(); - void unpackProgram(int idx); void updateProgramFromSysex(const uint8 *rawdata); void setupStartupCart(); diff --git a/Source/ProgramListBox.cpp b/Source/ProgramListBox.cpp index 6309421..db1b122 100644 --- a/Source/ProgramListBox.cpp +++ b/Source/ProgramListBox.cpp @@ -30,6 +30,7 @@ ProgramListBox::ProgramListBox(const String name, int numCols) : Component(name) hasContent = false; dragCandidate = -1; readOnly = false; + programNames.clear(); } void ProgramListBox::paint(Graphics &g) { @@ -85,9 +86,9 @@ void ProgramListBox::resized() { cellHeight = getHeight() / rows; } -void ProgramListBox::setCartridge(char *sysex) { - extractProgramNames((const char *)sysex, programNames); - memcpy(cartContent, sysex, 4104); +void ProgramListBox::setCartridge(Cartridge &cart) { + cartContent = cart; + cartContent.getProgramNames(programNames); hasContent = true; repaint(); } @@ -138,7 +139,7 @@ void ProgramListBox::mouseDrag(const MouseEvent &event) { g.fillRect(0,0,cellWidth, cellHeight); g.setColour(Colours::white); g.drawFittedText(programNames[position], 0, 0, cellWidth, cellHeight, Justification::centred, true); - void *src = cartContent + (position*128); + void *src = cartContent.getRawVoice() + (position*128); var description = var(src, 128); dragContainer->startDragging(description, this, snapshot, false); } @@ -148,9 +149,7 @@ void ProgramListBox::setSelected(int idx) { selectedPgm = idx; } -char* ProgramListBox::getCurrentCart() { - if ( ! hasContent ) - return nullptr; +Cartridge &ProgramListBox::getCurrentCart() { return cartContent; } diff --git a/Source/ProgramListBox.h b/Source/ProgramListBox.h index 531971a..e9b592a 100644 --- a/Source/ProgramListBox.h +++ b/Source/ProgramListBox.h @@ -22,6 +22,7 @@ #define PROGRAMLISTBOX_H_INCLUDED #include "JuceHeader.h" +#include "PluginData.h" class ProgramListBox; class ProgramListBoxListener { @@ -41,8 +42,7 @@ class ProgramListBox : public Component, public DragAndDropTarget { int programPosition(int x, int y); int selectedPgm; - // TODO: this should be a pointer - char cartContent[4104]; + Cartridge cartContent; int dragCandidate; public: @@ -52,14 +52,15 @@ public: ProgramListBox(const String name, int numCols); void addListener(ProgramListBoxListener *listener); - void paint(Graphics &g); - void setCartridge(char *sysex); - void resized(); - void mouseDoubleClick(const MouseEvent &event); - void mouseDown(const MouseEvent &event); - void mouseDrag(const MouseEvent &event); + void paint(Graphics &g) override; + void resized() override; + void mouseDoubleClick(const MouseEvent &event) override; + void mouseDown(const MouseEvent &event) override; + void mouseDrag(const MouseEvent &event) override; void setSelected(int idx); - char* getCurrentCart(); + + Cartridge &getCurrentCart(); + void setCartridge(Cartridge &cart); bool isInterestedInDragSource(const SourceDetails& dragSourceDetails) override; void itemDragEnter(const SourceDetails &dragSourceDetails) override; diff --git a/Source/msfa/dx7note.cc b/Source/msfa/dx7note.cc index 574e86d..6be3a04 100644 --- a/Source/msfa/dx7note.cc +++ b/Source/msfa/dx7note.cc @@ -139,7 +139,7 @@ Dx7Note::Dx7Note() { } } -void Dx7Note::init(const char patch[156], int midinote, int velocity) { +void Dx7Note::init(const uint8_t patch[156], int midinote, int velocity) { int rates[4]; int levels[4]; for (int op = 0; op < 6; op++) { @@ -244,7 +244,7 @@ void Dx7Note::keyup() { } } -void Dx7Note::update(const char patch[156], int midinote) { +void Dx7Note::update(const uint8_t patch[156], int midinote) { for (int op = 0; op < 6; op++) { int off = op * 21; int mode = patch[off + 17]; @@ -285,7 +285,6 @@ void Dx7Note::transferSignal(Dx7Note &src) { for (int i=0;i<6;i++) { params_[i].gain_out = src.params_[i].gain_out; params_[i].phase = src.params_[i].phase; - //params_[i].phase = 0; } } diff --git a/Source/msfa/dx7note.h b/Source/msfa/dx7note.h index 01c3e2f..2adb55a 100644 --- a/Source/msfa/dx7note.h +++ b/Source/msfa/dx7note.h @@ -36,7 +36,7 @@ struct VoiceStatus { class Dx7Note { public: Dx7Note(); - void init(const char patch[156], int midinote, int velocity); + void init(const uint8_t patch[156], int midinote, int velocity); // Note: this _adds_ to the buffer. Interesting question whether it's // worth it... @@ -51,7 +51,7 @@ class Dx7Note { // keyup, that won't work. // PG:add the update - void update(const char patch[156], int midinote); + void update(const uint8_t patch[156], int midinote); void peekVoiceStatus(VoiceStatus &status); void transferState(Dx7Note& src); void transferSignal(Dx7Note &src); diff --git a/Source/msfa/lfo.cc b/Source/msfa/lfo.cc index a3836b8..79b77b2 100644 --- a/Source/msfa/lfo.cc +++ b/Source/msfa/lfo.cc @@ -28,7 +28,7 @@ void Lfo::init(double sample_rate) { Lfo::unit_ = (int32_t)(N * 25190424 / sample_rate + 0.5); } -void Lfo::reset(const char params[6]) { +void Lfo::reset(const uint8_t params[6]) { int rate = params[0]; // 0..99 int sr = rate == 0 ? 1 : (165 * rate) >> 6; sr *= sr < 160 ? 11 : (11 + ((sr - 160) >> 4)); diff --git a/Source/msfa/lfo.h b/Source/msfa/lfo.h index e769535..c7c0a9c 100644 --- a/Source/msfa/lfo.h +++ b/Source/msfa/lfo.h @@ -19,7 +19,7 @@ class Lfo { public: static void init(double sample_rate); - void reset(const char params[6]); + void reset(const uint8_t params[6]); // result is 0..1 in Q24 int32_t getsample(); From 79e6007fa27ff98aa2d4bed7b0edfb0eb61411f4 Mon Sep 17 00:00:00 2001 From: asb2m10 Date: Fri, 25 Sep 2015 22:47:18 -0400 Subject: [PATCH 03/14] Support for drop of .syx files in the cart manager Fixed the "Send '*' program to DX7" missing sysex header --- .../UserInterfaceState.xcuserstate | Bin 197709 -> 201301 bytes README.md | 13 ++++-- Source/CartManager.cpp | 44 ++++++++++++++++-- Source/CartManager.h | 15 +++--- Source/PluginData.cpp | 2 +- Source/PluginData.h | 1 + 6 files changed, 59 insertions(+), 16 deletions(-) diff --git a/Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate b/Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate index 20badf5a7cef3fbbfdb7869707daa5abd9cd5457..8e9fa1113991d11c73e452beb4ddb83b6c427c4c 100644 GIT binary patch literal 201301 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 literal 197709 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 diff --git a/README.md b/README.md index d0286fe..3ff47d6 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,12 @@ in the source folder) stays on the Apache 2.0 license to able to collaborate bet Changelog --------- +#### Version 0.9.1 +* Drop of .syx files in the cartridge manager +* Dexed data directory can now optionally reside in the same location where the binary is installed +* 'Send current program to DX7' in Cartridge Manager works as designed +* Support for sysex streams (multiple sysex messages in one .syx file) +* falkTX upstream fixes for Linux #### Version 0.9.0 * Apple AU support @@ -26,7 +32,6 @@ Changelog * Fixed the UI corruption when more than one Dexed instance was loaded * Fixed wrong display value issues (coarse and fine) - #### Version 0.8.0 * New UI by [AZur Studio](http://bji.yukihotaru.com/) * You can now copy/paste the operator/envelopes values by using the right-click mouse button on the operator @@ -63,15 +68,15 @@ Credits & thanks * PPPlay : Great [OPL3](http://sourceforge.net/projects/peepeeplayer) implementation, with documented code :D * DX7 program compilation : Jean-Marc Desprez (author of [SynprezFM](http://www.synprez.com/SynprezFM)) * DX7 programs : Dave Benson, Frank Carvalho, Tim Conrardy, Jack Deckard, Chris Dodunski, Tim Garrett, Hitaye, Stephan Ibsen, Christian Jezreel, Narfman, Godric Wilkie -* markusthegeek direct implication for this project +* falkTX [distrho](http://distrho.sourceforge.net/) TODO - Dexed ------------ * Yamaha 4 operators (DX21/DX27/DX100) sysex import * UI threaded messaging to avoid DAW automation 'clicks' -* Zomby UI changes: this occurs in Live and will be fixed in the 0.8.1 version. +* Zomby UI changes: this occurs in Live * Various code cleanup -* More smothness in mono mode +* More smoothness in mono mode TODO - msfa ----------- diff --git a/Source/CartManager.cpp b/Source/CartManager.cpp index d5ff30f..6e0b8ee 100644 --- a/Source/CartManager.cpp +++ b/Source/CartManager.cpp @@ -38,8 +38,41 @@ public: }; }; +class FileTreeDrop : public FileTreeComponent { +public : + FileTreeDrop(DirectoryContentsList &listToShow) : FileTreeComponent(listToShow) {} + + bool isInterestedInFileDrag (const StringArray &files) override { + bool found = false; + + for(int i=0; istartThread(); cartBrowserList = new DirectoryContentsList(syxFileFilter, *timeSliceThread); cartBrowserList->setDirectory(cartDir, true, true); - cartBrowser = new FileTreeComponent(*cartBrowserList); + cartBrowser = new FileTreeDrop(*cartBrowserList); addAndMakeVisible(cartBrowser); cartBrowser->setBounds(23, 18, 590, 384); cartBrowser->setDragAndDropDescription("Sysex Browser"); @@ -259,8 +292,11 @@ void CartManager::programRightClicked(ProgramListBox *source, int pos) { source->getCurrentCart().unpackProgram(unpackPgm, pos); } - if ( mainWindow->processor->sysexComm.isOutputActive() ) - mainWindow->processor->sysexComm.send(MidiMessage(unpackPgm, 161)); + if ( mainWindow->processor->sysexComm.isOutputActive() ) { + uint8_t msg[163]; + exportSysexPgm(msg, unpackPgm); + mainWindow->processor->sysexComm.send(MidiMessage(msg, 163)); + } break; case 1010: diff --git a/Source/CartManager.h b/Source/CartManager.h index f71af77..5e58e82 100644 --- a/Source/CartManager.h +++ b/Source/CartManager.h @@ -24,6 +24,7 @@ #include "../JuceLibraryCode/JuceHeader.h" #include "PluginData.h" #include "ProgramListBox.h" +#include "PluginData.h" class CartManager : public Component, public ButtonListener, public DragAndDropContainer, public FileBrowserListener , public ProgramListBoxListener { @@ -53,13 +54,13 @@ class CartManager : public Component, public ButtonListener, public DragAndDrop public: CartManager(DexedAudioProcessorEditor *editor); virtual ~CartManager(); - void paint(Graphics& g); - void buttonClicked (Button* buttonThatWasClicked); + void paint(Graphics& g) override; + void buttonClicked (Button* buttonThatWasClicked) override; - void selectionChanged(); - void fileClicked (const File& file, const MouseEvent& e); - void fileDoubleClicked (const File& file); - void browserRootChanged (const File& newRoot); + void selectionChanged() override; + void fileClicked (const File& file, const MouseEvent& e) override; + void fileDoubleClicked (const File& file) override; + void browserRootChanged (const File& newRoot) override; void setActiveProgram(int idx, String activeName); void resetActiveSysex(); @@ -67,7 +68,7 @@ public: virtual void programSelected(ProgramListBox *source, int pos) override; virtual void programRightClicked(ProgramListBox *source, int pos) override; virtual void programDragged(ProgramListBox *destListBox, int dest, char *packedPgm) override; - + void initialFocus(); }; diff --git a/Source/PluginData.cpp b/Source/PluginData.cpp index 190a842..bf5bce0 100644 --- a/Source/PluginData.cpp +++ b/Source/PluginData.cpp @@ -229,7 +229,7 @@ void DexedAudioProcessor::pasteEnvFromClipboard(int destOp) { } void DexedAudioProcessor::sendCurrentSysexProgram() { - uint8_t raw[167]; + uint8_t raw[163]; exportSysexPgm(raw, data); if ( sysexComm.isOutputActive() ) { diff --git a/Source/PluginData.h b/Source/PluginData.h index aa42726..f5a8579 100644 --- a/Source/PluginData.h +++ b/Source/PluginData.h @@ -28,6 +28,7 @@ #include "Dexed.h" uint8_t sysexChecksum(const uint8_t *sysex, int size); +void exportSysexPgm(uint8_t *dest, uint8_t *src); #define SYSEX_HEADER { 0xF0, 0x43, 0x00, 0x00, 0x20, 0x00 } From 35d6a423d04c4dc8a0198007bf9e2626a00ac123 Mon Sep 17 00:00:00 2001 From: asb2m10 Date: Fri, 25 Sep 2015 23:05:14 -0400 Subject: [PATCH 04/14] New msfa homepage --- .../UserInterfaceState.xcuserstate | Bin 201301 -> 201623 bytes README.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate b/Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate index 8e9fa1113991d11c73e452beb4ddb83b6c427c4c..074dcf24691a191de274526eb725eb4f1f09f319 100644 GIT binary patch literal 201623 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

XU4BI7Mt% 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%0A9{bSWOmd6|Ig{s4=9S0h_8_NnOLJoj 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 z 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 literal 201301 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 diff --git a/README.md b/README.md index 3ff47d6..ae3b4cd 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Dexed - FM Plugin Synth ======================= Dexed is a multi platform, multi format plugin synth that is closely modeled on the Yamaha DX7. -Under the hood it uses [music-synthesizer-for-android](https://code.google.com/p/music-synthesizer-for-android) +Under the hood it uses [music-synthesizer-for-android](https://github.com/google/music-synthesizer-for-android) for the synth engine and [JUCE](http://wwww.juce.com) as a plugin wrapper. The goal of this project is to be a tool/companion for the original DX7. Sound engine From d3bf7393d2f6810464331c1f03cbaa9c96a0acf9 Mon Sep 17 00:00:00 2001 From: asb2m10 Date: Fri, 20 Nov 2015 23:32:21 -0500 Subject: [PATCH 05/14] Modulation (wheel,foot,breath,aftertouch) support --- Builds/MacOSX/Dexed.xcodeproj/project.pbxproj | 199 +--------- .../UserInterfaceState.xcuserstate | Bin 201623 -> 201542 bytes Builds/MacOSX/Info.plist | 72 ++-- Dexed.jucer | 2 +- JuceLibraryCode/AppConfig.h | 2 +- Source/EngineMkI.cpp | 11 - Source/ParamDialog.cpp | 364 +++++++++++++++++- Source/ParamDialog.h | 24 +- Source/PluginData.cpp | 1 + Source/PluginProcessor.cpp | 58 +-- Source/PluginProcessor.h | 1 - Source/msfa/controllers.h | 76 +++- Source/msfa/dx7note.cc | 313 ++++++++------- Source/msfa/dx7note.h | 80 ++-- 14 files changed, 708 insertions(+), 495 deletions(-) diff --git a/Builds/MacOSX/Dexed.xcodeproj/project.pbxproj b/Builds/MacOSX/Dexed.xcodeproj/project.pbxproj index 8c96fe7..7a426d6 100644 --- a/Builds/MacOSX/Dexed.xcodeproj/project.pbxproj +++ b/Builds/MacOSX/Dexed.xcodeproj/project.pbxproj @@ -8,48 +8,36 @@ /* Begin PBXBuildFile section */ 00C044DBB8BA1AF35CBC42E6 /* juce_VST_Wrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D6C6FCBA5ECA257959BFE674 /* juce_VST_Wrapper.cpp */; }; - 02B7485A3DD3F44C6058AB0E /* AUCarbonViewBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8ED1068B85DCEFEFDD3C4F82 /* AUCarbonViewBase.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; 069530C6CF2796C568DD3E90 /* juce_gui_basics.mm in Sources */ = {isa = PBXBuildFile; fileRef = 19B56FF22ED0090A8D7A3E04 /* juce_gui_basics.mm */; }; 082D6FF34EFF195C3A3B0CFB /* OperatorEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 838E63F5800CA577B92EF6AE /* OperatorEditor.cpp */; }; - 09E5F88C9C879073B1B103F1 /* AUCarbonViewControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D8F138F48E933ECCF2DB2321 /* AUCarbonViewControl.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; 0D3132A8B412AE9E63024927 /* sin.cc in Sources */ = {isa = PBXBuildFile; fileRef = B0230FCCA099E6430411DFC9 /* sin.cc */; }; - 0E0B0D39FCB31A57F5298C7A /* AUInputElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6A462A15DB909F68F4A9BECC /* AUInputElement.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; 13F8BF7C26D50908163425CF /* juce_VST3_Wrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 01EF232D8B427B8CE38127C2 /* juce_VST3_Wrapper.mm */; }; 1C87DA0B69D67481FC6CF4FD /* BinaryData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 54363D0B39B88D43447C0123 /* BinaryData.cpp */; }; 1CBFE444B43C89E749602B7F /* PluginProcessor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 45ADFD8885BE76C7F7D999AC /* PluginProcessor.cpp */; }; 1E2E719F9E93AD97BC37565F /* juce_RTAS_DigiCode2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D8038990994C30BDD631733E /* juce_RTAS_DigiCode2.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - 2360F3C87933B5A51B0D4839 /* AUBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0598D37F24E489C12F43EF93 /* AUBase.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - 26E1D92384FB66ED8FCF5101 /* AUBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C4DE747B720C310D6BC65936 /* AUBuffer.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; 3AB728E101D7B85DD39C5CC8 /* freqlut.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3715DFDD7A1B12083F051F5A /* freqlut.cc */; }; - 3D8568887BBA0D81340FF64D /* AUMIDIEffectBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3E301CD94F9029D7E3898EB2 /* AUMIDIEffectBase.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - 3FC0533D8E67D63666A51C64 /* AUEffectBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B8B14C1AA3491F103E6A5F7 /* AUEffectBase.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; 434647C21C803FA8A4D44A70 /* fm_op_kernel.cc in Sources */ = {isa = PBXBuildFile; fileRef = 78CA76788217B98287D9E007 /* fm_op_kernel.cc */; }; 478699B4EF80A1A1C0D34C10 /* PluginEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 018D0FB9E97B68D2EB3E3F72 /* PluginEditor.cpp */; }; 47C317B0F77A29ECA0400B2B /* dx7note.cc in Sources */ = {isa = PBXBuildFile; fileRef = AE09B4C2A4BDE8FDA01A8A13 /* dx7note.cc */; }; 4B27ACC5993C8C74FFCDD3BB /* EngineOpl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61F792AFE04C15F413A4F766 /* EngineOpl.cpp */; }; 52770E3D32989EC50834582A /* juce_data_structures.mm in Sources */ = {isa = PBXBuildFile; fileRef = 48BDF7DFA849127655B86873 /* juce_data_structures.mm */; }; 52C0C94470D90310AF2F8433 /* juce_VST3_Wrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D0178A36F6E46F92111E4883 /* juce_VST3_Wrapper.cpp */; }; - 556863C97636A308001CFD21 /* CarbonEventHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3A44529EBD28E325DAA12D80 /* CarbonEventHandler.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; 5B3A6A14A3951CF8E37608FF /* juce_gui_extra.mm in Sources */ = {isa = PBXBuildFile; fileRef = 6DC26B61BA1638AFAF142A6C /* juce_gui_extra.mm */; }; 5F4FB65ABC71FAAD6EDD822E /* juce_RTAS_DigiCode1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 55E39FAA63BA8B9D40F40712 /* juce_RTAS_DigiCode1.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; 60686C2C30A9F2777CEF01BD /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0A56796E1B84D05D8DD1100D /* AudioToolbox.framework */; }; 623AFA9E78826CA0136251DF /* PluginParam.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 59D15F780D468B587F9C7E78 /* PluginParam.cpp */; }; 6252C45CDFF75E05CCDBF737 /* CartManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B3889626BDBB814F2387085 /* CartManager.cpp */; }; - 62798B841D9D5E0B71064A73 /* CAVectorUnit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2CA60524355CF872ADB42EA4 /* CAVectorUnit.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; 6443699C06267ECC22CF9D12 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E32283AE8CC5A022E1A6B30B /* Accelerate.framework */; }; 68878920F603FF1473994736 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FC856709502EE15E8D3F448B /* IOKit.framework */; }; - 6970EC0E1FEDCF3793098929 /* CAStreamBasicDescription.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7B2E31BD7292002DEBCC366B /* CAStreamBasicDescription.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; 697C52FD23363CB2EB9075C6 /* EngineMkI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BEBEDCAD409EE3A5D383B6D /* EngineMkI.cpp */; }; 69A60891A52C61989A205791 /* ProgramListBox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BF7A1720DADC7983F61E895C /* ProgramListBox.cpp */; }; 6CE74A36A215C0D39041710F /* juce_events.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB6186E32E92664DEFA0C0A1 /* juce_events.mm */; }; 7116DC8487DC8321F36CD3D8 /* DiscRecording.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 452C1184BD776249B33151E5 /* DiscRecording.framework */; }; - 77C3EA8D0A12986429BA466D /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 838A5E852BBD79A98CD9FDDD /* AudioUnit.framework */; }; 7B82F1D5F8DED01AA8988D33 /* fm_core.cc in Sources */ = {isa = PBXBuildFile; fileRef = C01EE75D859C1F942DA3AE61 /* fm_core.cc */; }; 7E444608AFB10ED54DB5C9AB /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E966C95FACF7B8D5A907FE3 /* WebKit.framework */; }; 7E6DF76EEA834AC1E96470CE /* juce_AAX_Wrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3254CAE4C282C4432214B016 /* juce_AAX_Wrapper.mm */; }; 8121E10419E2D99645EA254E /* DXComponents.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D984CE634945077E682B48F3 /* DXComponents.cpp */; }; 813B2285513D65DDA30AA6E3 /* RecentFilesMenuTemplate.nib in Resources */ = {isa = PBXBuildFile; fileRef = 6F9852573AA442CFBAD9695F /* RecentFilesMenuTemplate.nib */; }; - 82253A3BBFF29FC56A08C972 /* CoreAudioKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 919DF1054C09D19EDA044BE8 /* CoreAudioKit.framework */; }; 823ECA6DD062A4D0CC056CF0 /* juce_core.mm in Sources */ = {isa = PBXBuildFile; fileRef = 99078823EE2D77389696F0E5 /* juce_core.mm */; }; 87B95D41180EF626460B2EA3 /* juce_audio_basics.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3DF47857774F10344F12BE65 /* juce_audio_basics.mm */; }; 8BE2A084394DA3E45DDB5646 /* PluginData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7936BBAA586387B2FAFB958B /* PluginData.cpp */; }; @@ -57,36 +45,24 @@ 927401C89B9B4F84AC1FE42F /* juce_audio_processors.mm in Sources */ = {isa = PBXBuildFile; fileRef = AA2F01B149F981C2997D583F /* juce_audio_processors.mm */; }; 93279A1D631E5F4103EAB17E /* juce_AU_Wrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 502D49C82606515A80907EB3 /* juce_AU_Wrapper.mm */; }; 95105DC8536836A06FD5C7BB /* pitchenv.cc in Sources */ = {isa = PBXBuildFile; fileRef = 51E5757E2D48E638F9A4CB61 /* pitchenv.cc */; }; - 95D4EF9899B0D0D3FC729312 /* AUOutputBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 16D7D354B7CBC971E8B0CFA5 /* AUOutputBase.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - 9D042F9D005532F763A72C26 /* juce_AU_Resources.r in Rez */ = {isa = PBXBuildFile; fileRef = 64CC83E4D891EAEC65EE41C4 /* juce_AU_Resources.r */; }; 9EC12165834B1341938E951D /* env.cc in Sources */ = {isa = PBXBuildFile; fileRef = 00FDFD1ABE59B4CEF74BF5A3 /* env.cc */; }; A451AE788A4BD5AA72174D4C /* juce_audio_formats.mm in Sources */ = {isa = PBXBuildFile; fileRef = 32FC163D919C52263303EF7E /* juce_audio_formats.mm */; }; A6E2908774D7F669F21B1874 /* juce_RTAS_MacUtilities.mm in Sources */ = {isa = PBXBuildFile; fileRef = C7C6039A52C3EE370CA9E73A /* juce_RTAS_MacUtilities.mm */; }; A7D45B047CA84D7EF7018CDC /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2F55D83145737DE69999DB92 /* QuartzCore.framework */; }; - AE7F0435D9C8D94FFDA16DCA /* AUMIDIBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6E1E415B080EA491A7D58D3A /* AUMIDIBase.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; B0A4786A252B14B604101175 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A01DC4DEBE65C313C7C8A44 /* CoreAudio.framework */; }; B18C192606DF6079E7B9AEB9 /* PluginFx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BADEB7BF1A65E83A7A1736D /* PluginFx.cpp */; }; B82FDEB3E53C9455BC6A5DAE /* juce_RTAS_Wrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EAA5D8078BCC042BDF94C77A /* juce_RTAS_Wrapper.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - B96C21AF3AD25C7950EA6CE5 /* CAAudioChannelLayout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F3171B20C2BBF12A5786B1F5 /* CAAudioChannelLayout.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - C19B69B5974FA50D116A4F52 /* AUOutputElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 81A949AE03BA033D5D762E9F /* AUOutputElement.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; C2090920CAE913A6C56E0ACE /* juce_PluginUtilities.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B63E7FBEF314AA2B6A8083F4 /* juce_PluginUtilities.cpp */; }; C510246D7D5E162C9DE63DDE /* GlobalEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 19CEF599CB23958AC63D427E /* GlobalEditor.cpp */; }; - CCC498943EDC85558AF6D8B8 /* ComponentBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 561A9793AA73B7FDDED14476 /* ComponentBase.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; CD1CF0C6B4AB9F4C8175FE08 /* ParamDialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F221CF21582EE0B8FE774583 /* ParamDialog.cpp */; }; D5A4D43A16EA4C71D53E96CD /* DXLookNFeel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A02775EA788AD4BF7DD1B1A1 /* DXLookNFeel.cpp */; }; - DAC2F8A317486D36C0E0F81F /* CAMutex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A31C49ABA24290126250F574 /* CAMutex.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; DDD1E74DE1AC7E6493AF04CA /* juce_RTAS_DigiCode3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4574217C2F5219DEDDDC9656 /* juce_RTAS_DigiCode3.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - DFA8CE3B7D7FE269254C9BDD /* CAAUParameter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DB84FE1DF027D2AB0952F18 /* CAAUParameter.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; E3FA856CA4DB2009BB0F13E7 /* juce_AAX_Wrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 505852570B48EB3F18076B03 /* juce_AAX_Wrapper.cpp */; }; E52CB89B4C49057C5A54CFFE /* juce_graphics.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9E3820CD63B47B5385AF2DB6 /* juce_graphics.mm */; }; E8BEA8ABF5E288C5D5FCD620 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 817CC81F50861DAEEFB2043A /* Carbon.framework */; }; E8D9A2B640A87FE92D2DA887 /* juce_VST_Wrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6F950B6ABB40B62AE4C0B78 /* juce_VST_Wrapper.mm */; }; - EB464CA0288DD69ABBAE73B3 /* AUDispatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02802D92B7CF0D835254B6C1 /* AUDispatch.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; EC23F9F2EE10A2DE3CB6D406 /* SysexComm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65BE679590BFE2466E16EA67 /* SysexComm.cpp */; }; - ED19C7C3EF2026BC9386CAA3 /* AUScopeElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BAADD431AF7666E435C6C4B3 /* AUScopeElement.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; ED2B6C710BC0474617D147B7 /* juce_audio_devices.mm in Sources */ = {isa = PBXBuildFile; fileRef = 31AEFAC2A9E8C7C96ECB4B96 /* juce_audio_devices.mm */; }; - EE173D0BBBF66A8977FE3A7E /* AUCarbonViewDispatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 173994FFD45CE7CB6D2CCAD7 /* AUCarbonViewDispatch.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; - F1106DF1AB7F08D4FC6B6BBB /* MusicDeviceBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 68CCE716313990E1412107A8 /* MusicDeviceBase.cpp */; settings = {COMPILER_FLAGS = "-w"; }; }; F329522961F1313091764113 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2FDF76165C655B2E77BE4CFD /* Cocoa.framework */; }; F9A9CC03BA0B3030E92675AD /* exp2.cc in Sources */ = {isa = PBXBuildFile; fileRef = F63CE53483AF125DCFB024F1 /* exp2.cc */; }; FA2AF2015CFD98299593EA30 /* CoreMIDI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A81F4DC234E8D93BF9803529 /* CoreMIDI.framework */; }; @@ -103,9 +79,7 @@ 01EF232D8B427B8CE38127C2 /* juce_VST3_Wrapper.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_VST3_Wrapper.mm; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.mm; sourceTree = SOURCE_ROOT; }; 02139A14E2732DE36631414F /* juce_TableHeaderComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TableHeaderComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp; sourceTree = SOURCE_ROOT; }; 0236A082C107280C1505021A /* juce_ImageConvolutionKernel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ImageConvolutionKernel.h; path = ../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.h; sourceTree = SOURCE_ROOT; }; - 02802D92B7CF0D835254B6C1 /* AUDispatch.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUDispatch.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.cpp; sourceTree = DEVELOPER_DIR; }; 02E962E65624D43B0906B0C6 /* juce_PerformanceCounter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PerformanceCounter.cpp; path = ../../JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.cpp; sourceTree = SOURCE_ROOT; }; - 0337F4D67CD2D5C29939E940 /* CAMutex.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAMutex.h; path = Extras/CoreAudio/PublicUtility/CAMutex.h; sourceTree = DEVELOPER_DIR; }; 0353CE3273A1063693BC5D55 /* juce_win32_Files.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_Files.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_win32_Files.cpp; sourceTree = SOURCE_ROOT; }; 037F8EB68705A98C29AEE6B0 /* juce_SystemStats.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_SystemStats.cpp; path = ../../JuceLibraryCode/modules/juce_core/system/juce_SystemStats.cpp; sourceTree = SOURCE_ROOT; }; 03813BF0D93D100F6F0393C9 /* AlgoDisplay.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AlgoDisplay.cpp; path = ../../Source/AlgoDisplay.cpp; sourceTree = SOURCE_ROOT; }; @@ -116,7 +90,6 @@ 041EA7D542B0EBF7213B9BA2 /* juce_ApplicationCommandID.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ApplicationCommandID.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h; sourceTree = SOURCE_ROOT; }; 041F12CAFA1CD7215AEC5098 /* juce_Component.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Component.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h; sourceTree = SOURCE_ROOT; }; 04E04837EB4F3E03908835C9 /* juce_win32_HiddenMessageWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_win32_HiddenMessageWindow.h; path = ../../JuceLibraryCode/modules/juce_events/native/juce_win32_HiddenMessageWindow.h; sourceTree = SOURCE_ROOT; }; - 0598D37F24E489C12F43EF93 /* AUBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUBase.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.cpp; sourceTree = DEVELOPER_DIR; }; 05F4DA9558D39B50DA5DEF79 /* juce_SortedSet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SortedSet.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_SortedSet.h; sourceTree = SOURCE_ROOT; }; 06387FD4ED709086E8E0152E /* juce_XmlDocument.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_XmlDocument.h; path = ../../JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.h; sourceTree = SOURCE_ROOT; }; 06625FB929EB46E8D09E77F8 /* juce_ApplicationCommandInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ApplicationCommandInfo.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h; sourceTree = SOURCE_ROOT; }; @@ -140,7 +113,6 @@ 0C0B6B8DAD62A3F5C926825F /* juce_DynamicLibrary.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DynamicLibrary.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_DynamicLibrary.h; sourceTree = SOURCE_ROOT; }; 0CB234755B75E0DBC2FFB58E /* juce_ResizableCornerComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ResizableCornerComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp; sourceTree = SOURCE_ROOT; }; 0D5761BE1D2DEA319B57D740 /* Switch_48x26.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Switch_48x26.png; path = ../../Resources/ui/Switch_48x26.png; sourceTree = SOURCE_ROOT; }; - 0DB84FE1DF027D2AB0952F18 /* CAAUParameter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CAAUParameter.cpp; path = Extras/CoreAudio/PublicUtility/CAAUParameter.cpp; sourceTree = DEVELOPER_DIR; }; 0DCC7A5AD5AC5D3637FFAAFB /* juce_ToolbarButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ToolbarButton.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.h; sourceTree = SOURCE_ROOT; }; 0DE1759C594D2719742E928A /* juce_ElementComparator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ElementComparator.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_ElementComparator.h; sourceTree = SOURCE_ROOT; }; 0E3FA3D7B11FC7D19CC634BE /* about.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = about.png; path = ../../Resources/about.png; sourceTree = SOURCE_ROOT; }; @@ -153,7 +125,6 @@ 0FDAC75611540A0DE7FE3E22 /* juce_SplashScreen.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_SplashScreen.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SplashScreen.cpp; sourceTree = SOURCE_ROOT; }; 105DA88FCA60BE6C92A7249B /* juce_FloatVectorOperations.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FloatVectorOperations.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h; sourceTree = SOURCE_ROOT; }; 108462DA6B96E6F49DBD521E /* juce_ScrollBar.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ScrollBar.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.cpp; sourceTree = SOURCE_ROOT; }; - 10E7F81B8369A5A923D5EE9A /* AUInputFormatConverter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUInputFormatConverter.h; path = Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUInputFormatConverter.h; sourceTree = DEVELOPER_DIR; }; 112C97A7D8CEC06ED2E1B1BE /* juce_StringArray.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_StringArray.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_StringArray.h; sourceTree = SOURCE_ROOT; }; 113019177161C70BFD9E655E /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_gui_extra/juce_module_info; sourceTree = SOURCE_ROOT; }; 11329C73799FA61B7BC76418 /* juce_ResizableEdgeComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ResizableEdgeComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp; sourceTree = SOURCE_ROOT; }; @@ -177,9 +148,7 @@ 1629C7407F033B97102CEF6B /* juce_NormalisableRange.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_NormalisableRange.h; path = ../../JuceLibraryCode/modules/juce_core/maths/juce_NormalisableRange.h; sourceTree = SOURCE_ROOT; }; 1635BBF869518BAA7A88A6A0 /* juce_FileSearchPathListComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileSearchPathListComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h; sourceTree = SOURCE_ROOT; }; 163C2312B370BA53F482B84B /* juce_TabbedButtonBar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TabbedButtonBar.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h; sourceTree = SOURCE_ROOT; }; - 16D7D354B7CBC971E8B0CFA5 /* AUOutputBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUOutputBase.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.cpp; sourceTree = DEVELOPER_DIR; }; 170F06D00B2197E66300D558 /* juce_TextPropertyComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TextPropertyComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.h; sourceTree = SOURCE_ROOT; }; - 173994FFD45CE7CB6D2CCAD7 /* AUCarbonViewDispatch.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUCarbonViewDispatch.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewDispatch.cpp; sourceTree = DEVELOPER_DIR; }; 1754400A2E372510CB25043F /* juce_TopLevelWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TopLevelWindow.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TopLevelWindow.h; sourceTree = SOURCE_ROOT; }; 1756BAFDC82F5E69704BEAFE /* juce_ComponentMovementWatcher.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComponentMovementWatcher.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp; sourceTree = SOURCE_ROOT; }; 17A328AD02B5D7DA362E1D5D /* juce_ConnectedChildProcess.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ConnectedChildProcess.cpp; path = ../../JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp; sourceTree = SOURCE_ROOT; }; @@ -217,7 +186,6 @@ 2068B2F409A743F7AA6005B8 /* juce_android_Network.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_Network.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_android_Network.cpp; sourceTree = SOURCE_ROOT; }; 20D22F9CE83DD70583C68940 /* juce_BufferingAudioSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_BufferingAudioSource.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h; sourceTree = SOURCE_ROOT; }; 20D4AE86B061E4D7F2F1F1BF /* juce_ToolbarItemComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ToolbarItemComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h; sourceTree = SOURCE_ROOT; }; - 210364718D006CC26958D583 /* CAVectorUnit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAVectorUnit.h; path = Extras/CoreAudio/PublicUtility/CAVectorUnit.h; sourceTree = DEVELOPER_DIR; }; 212A0795619AC3D8387EB085 /* juce_Logger.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Logger.cpp; path = ../../JuceLibraryCode/modules/juce_core/logging/juce_Logger.cpp; sourceTree = SOURCE_ROOT; }; 214092134C5925973C210C26 /* juce_Process.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Process.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_Process.h; sourceTree = SOURCE_ROOT; }; 217D5E7DC9D4006AA1994A96 /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_audio_processors/juce_module_info; sourceTree = SOURCE_ROOT; }; @@ -260,7 +228,6 @@ 2BEBDED2BACDEEEE975583F3 /* juce_StringPool.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_StringPool.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_StringPool.h; sourceTree = SOURCE_ROOT; }; 2C65FDA74486C92DF5EA5C87 /* juce_FileFilter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileFilter.h; path = ../../JuceLibraryCode/modules/juce_core/files/juce_FileFilter.h; sourceTree = SOURCE_ROOT; }; 2CA19470CA427333F8CAC0A5 /* juce_ImagePreviewComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ImagePreviewComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp; sourceTree = SOURCE_ROOT; }; - 2CA60524355CF872ADB42EA4 /* CAVectorUnit.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CAVectorUnit.cpp; path = Extras/CoreAudio/PublicUtility/CAVectorUnit.cpp; sourceTree = DEVELOPER_DIR; }; 2CB4C73C121FCDEF65CBAC79 /* juce_mac_MainMenu.mm */ = {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; }; 2D26E2304C0F6FC633936014 /* lfo.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = lfo.cc; path = ../../Source/msfa/lfo.cc; sourceTree = SOURCE_ROOT; }; 2D8A5B5929909ADD898D7E00 /* juce_HashMap.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_HashMap.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_HashMap.h; sourceTree = SOURCE_ROOT; }; @@ -313,7 +280,6 @@ 3A0F35877A9E2F5D5D6A0434 /* juce_IIRFilterAudioSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_IIRFilterAudioSource.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h; sourceTree = SOURCE_ROOT; }; 3A2252FE59FEB529074751B8 /* juce_osx_ObjCHelpers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_osx_ObjCHelpers.h; path = ../../JuceLibraryCode/modules/juce_core/native/juce_osx_ObjCHelpers.h; sourceTree = SOURCE_ROOT; }; 3A2DE2FA7B6D718AEF872F43 /* juce_ChannelRemappingAudioSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ChannelRemappingAudioSource.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h; sourceTree = SOURCE_ROOT; }; - 3A44529EBD28E325DAA12D80 /* CarbonEventHandler.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CarbonEventHandler.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/CarbonEventHandler.cpp; sourceTree = DEVELOPER_DIR; }; 3BB7B60AE87F68C10DBEE118 /* juce_FileSearchPath.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileSearchPath.h; path = ../../JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.h; sourceTree = SOURCE_ROOT; }; 3BE8F91A99E8F48CB9F10C1F /* sin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = sin.h; path = ../../Source/msfa/sin.h; sourceTree = SOURCE_ROOT; }; 3C11994F7B26920BEB9DA52D /* juce_LookAndFeel_V3.h */ = {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; }; @@ -321,7 +287,6 @@ 3D52BDFF32D151178ABE21D0 /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_gui_basics/juce_module_info; sourceTree = SOURCE_ROOT; }; 3DC88C42A001EAAB6B959C6F /* juce_MidiKeyboardState.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiKeyboardState.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp; sourceTree = SOURCE_ROOT; }; 3DF47857774F10344F12BE65 /* juce_audio_basics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_audio_basics.mm; path = ../../JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.mm; sourceTree = SOURCE_ROOT; }; - 3E301CD94F9029D7E3898EB2 /* AUMIDIEffectBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUMIDIEffectBase.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.cpp; sourceTree = DEVELOPER_DIR; }; 3E312C7BB77E7FF22DF88B96 /* juce_RTAS_DigiCode_Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_RTAS_DigiCode_Header.h; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode_Header.h; sourceTree = SOURCE_ROOT; }; 3E5A6D7508BF64D897DABC3A /* juce_DrawableText.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawableText.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.cpp; sourceTree = SOURCE_ROOT; }; 3EBA7E3E2CFD54B3C786098E /* juce_ModalComponentManager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ModalComponentManager.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp; sourceTree = SOURCE_ROOT; }; @@ -339,7 +304,6 @@ 4166468539A5F6E92A7A153E /* juce_ReferenceCountedArray.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ReferenceCountedArray.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_ReferenceCountedArray.h; sourceTree = SOURCE_ROOT; }; 41700CC92AEEF157D3B53BA2 /* juce_Drawable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Drawable.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.h; sourceTree = SOURCE_ROOT; }; 418C5A909668054B5140BDA9 /* juce_FileInputStream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileInputStream.h; path = ../../JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.h; sourceTree = SOURCE_ROOT; }; - 42037D6AD47F7FEBAF6D4732 /* AUBuffer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUBuffer.h; path = Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUBuffer.h; sourceTree = DEVELOPER_DIR; }; 420843F2827F7FB7A31A4C76 /* juce_TableListBox.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TableListBox.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableListBox.cpp; sourceTree = SOURCE_ROOT; }; 4313B453E6E7735DFFD2609A /* juce_ApplicationCommandTarget.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ApplicationCommandTarget.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp; sourceTree = SOURCE_ROOT; }; 431B6C9349785FFC83D695F5 /* juce_Toolbar.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Toolbar.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Toolbar.cpp; sourceTree = SOURCE_ROOT; }; @@ -364,14 +328,12 @@ 462B768DFC2129F54233D51D /* juce_StretchableLayoutResizerBar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_StretchableLayoutResizerBar.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h; sourceTree = SOURCE_ROOT; }; 46908987EEFC3623A53A95C2 /* juce_LagrangeInterpolator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_LagrangeInterpolator.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.cpp; sourceTree = SOURCE_ROOT; }; 46969E6B78BC89383358DCDA /* juce_XMLCodeTokeniser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_XMLCodeTokeniser.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h; sourceTree = SOURCE_ROOT; }; - 4697BFC33D1A3C846B2DED19 /* AUSilentTimeout.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUSilentTimeout.h; path = Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUSilentTimeout.h; sourceTree = DEVELOPER_DIR; }; 46C20298CCB469481F5C8D36 /* juce_MouseInactivityDetector.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MouseInactivityDetector.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h; sourceTree = SOURCE_ROOT; }; 4710CA869326390AF0CE2A0B /* juce_ResizableEdgeComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ResizableEdgeComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h; sourceTree = SOURCE_ROOT; }; 47168956BF1BAC3FCBD55BB8 /* juce_posix_NamedPipe.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_posix_NamedPipe.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_posix_NamedPipe.cpp; sourceTree = SOURCE_ROOT; }; 475CE9A832328566544F457F /* juce_ZipFile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ZipFile.h; path = ../../JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.h; sourceTree = SOURCE_ROOT; }; 4778838DB96C82580CBE10D0 /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_audio_utils/juce_module_info; sourceTree = SOURCE_ROOT; }; 477946525F6F1BE9135A3101 /* juce_FakeMouseMoveGenerator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FakeMouseMoveGenerator.h; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_FakeMouseMoveGenerator.h; sourceTree = SOURCE_ROOT; }; - 478D907DACBE0CF918C6A0AD /* CarbonEventHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CarbonEventHandler.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/CarbonEventHandler.h; sourceTree = DEVELOPER_DIR; }; 47EF393874A20700CD249091 /* juce_AffineTransform.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AffineTransform.h; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.h; sourceTree = SOURCE_ROOT; }; 4836B8889A1100EA724CE7C2 /* juce_StretchableLayoutManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_StretchableLayoutManager.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h; sourceTree = SOURCE_ROOT; }; 48BDF7DFA849127655B86873 /* juce_data_structures.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_data_structures.mm; path = ../../JuceLibraryCode/modules/juce_data_structures/juce_data_structures.mm; sourceTree = SOURCE_ROOT; }; @@ -392,7 +354,6 @@ 4C67D4B9902C1B0CC80E11D8 /* LFO_36_26.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = LFO_36_26.png; path = ../../Resources/ui/LFO_36_26.png; sourceTree = SOURCE_ROOT; }; 4C6C14363344C87BDA4C1C71 /* juce_ComponentBoundsConstrainer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComponentBoundsConstrainer.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp; sourceTree = SOURCE_ROOT; }; 4C9751F81C3C052C9A6390F4 /* juce_StretchableObjectResizer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_StretchableObjectResizer.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h; sourceTree = SOURCE_ROOT; }; - 4CB06EEFAA877AA4A28FE150 /* MusicDeviceBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MusicDeviceBase.h; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.h; sourceTree = DEVELOPER_DIR; }; 4CD97CB51FE3AD5248285B0A /* juce_MouseCursor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MouseCursor.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp; sourceTree = SOURCE_ROOT; }; 4D488219CE9D736D69F6EF59 /* juce_DirectoryIterator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DirectoryIterator.h; path = ../../JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.h; sourceTree = SOURCE_ROOT; }; 4D8B2790A6E7552C64453A53 /* juce_StretchableLayoutManager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_StretchableLayoutManager.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp; sourceTree = SOURCE_ROOT; }; @@ -424,7 +385,6 @@ 55474A49BF29196733C89BBB /* juce_BigInteger.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_BigInteger.h; path = ../../JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.h; sourceTree = SOURCE_ROOT; }; 5548DEE5ED071453F8AD8AB6 /* juce_ResamplingAudioSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ResamplingAudioSource.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp; sourceTree = SOURCE_ROOT; }; 55E39FAA63BA8B9D40F40712 /* juce_RTAS_DigiCode1.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RTAS_DigiCode1.cpp; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode1.cpp; sourceTree = SOURCE_ROOT; }; - 561A9793AA73B7FDDED14476 /* ComponentBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ComponentBase.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.cpp; sourceTree = DEVELOPER_DIR; }; 5721702823682EC883FCB870 /* juce_HyperlinkButton.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_HyperlinkButton.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp; sourceTree = SOURCE_ROOT; }; 577D5E62E1CE48CEAD5855AE /* juce_ThreadWithProgressWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ThreadWithProgressWindow.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h; sourceTree = SOURCE_ROOT; }; 57A533082FEF0CE002D69EDB /* juce_ChannelRemappingAudioSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ChannelRemappingAudioSource.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp; sourceTree = SOURCE_ROOT; }; @@ -433,7 +393,6 @@ 59D15F780D468B587F9C7E78 /* PluginParam.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = PluginParam.cpp; path = ../../Source/PluginParam.cpp; sourceTree = SOURCE_ROOT; }; 5A1BD822F8CB7D42BB0EAF7A /* juce_PluginListComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PluginListComponent.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp; sourceTree = SOURCE_ROOT; }; 5A366F36F3B4E50587A30351 /* NotoSans-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file.ttf; name = "NotoSans-Bold.ttf"; path = "../../Resources/ui/NotoSans-Bold.ttf"; sourceTree = SOURCE_ROOT; }; - 5AD3DDD0285C94CEB17BF03C /* AUEffectBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUEffectBase.h; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUEffectBase.h; sourceTree = DEVELOPER_DIR; }; 5B12686E2808FCCB8BBE0E24 /* juce_android_GraphicsContext.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_GraphicsContext.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_android_GraphicsContext.cpp; sourceTree = SOURCE_ROOT; }; 5BA236D62129EFE13A9EAB1B /* juce_MixerAudioSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MixerAudioSource.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp; sourceTree = SOURCE_ROOT; }; 5BC311F801FE9D018A7B231C /* juce_ComponentDragger.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ComponentDragger.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp; sourceTree = SOURCE_ROOT; }; @@ -449,8 +408,6 @@ 5FA112054E39C5FF09F6928B /* juce_LowLevelGraphicsSoftwareRenderer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_LowLevelGraphicsSoftwareRenderer.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp; sourceTree = SOURCE_ROOT; }; 5FE10203FC5AE23DBA573E3B /* juce_KnownPluginList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_KnownPluginList.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.h; sourceTree = SOURCE_ROOT; }; 600DDC87EB44F5B6EFA1500F /* juce_ApplicationCommandTarget.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ApplicationCommandTarget.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h; sourceTree = SOURCE_ROOT; }; - 6050F8DB4EA5F9A4A27D7653 /* CADebugMacros.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CADebugMacros.h; path = Extras/CoreAudio/PublicUtility/CADebugMacros.h; sourceTree = DEVELOPER_DIR; }; - 60F23312570D43B7F7FC0D43 /* AUInputElement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUInputElement.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.h; sourceTree = DEVELOPER_DIR; }; 61A517E758E2BF89FF445D7F /* juce_MemoryBlock.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MemoryBlock.cpp; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.cpp; sourceTree = SOURCE_ROOT; }; 61E56039E1D2929463E58D62 /* juce_GlyphArrangement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_GlyphArrangement.h; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.h; sourceTree = SOURCE_ROOT; }; 61F792AFE04C15F413A4F766 /* EngineOpl.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = EngineOpl.cpp; path = ../../Source/EngineOpl.cpp; sourceTree = SOURCE_ROOT; }; @@ -459,7 +416,6 @@ 63B73D99B066179BB9661D4E /* juce_ChoicePropertyComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ChoicePropertyComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp; sourceTree = SOURCE_ROOT; }; 6475DF69D5BDC709E275BF4D /* juce_WeakReference.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_WeakReference.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_WeakReference.h; sourceTree = SOURCE_ROOT; }; 64C579AFCDCEED8CAFEF9830 /* juce_ListBox.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ListBox.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ListBox.h; sourceTree = SOURCE_ROOT; }; - 64CC83E4D891EAEC65EE41C4 /* juce_AU_Resources.r */ = {isa = PBXFileReference; lastKnownFileType = file.r; name = juce_AU_Resources.r; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/AU/juce_AU_Resources.r; sourceTree = SOURCE_ROOT; }; 64CF42AFC2E05AEF9D350CD2 /* env.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = env.h; path = ../../Source/msfa/env.h; sourceTree = SOURCE_ROOT; }; 64E0EE125571D369100796D9 /* juce_ComponentPeer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComponentPeer.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_ComponentPeer.h; sourceTree = SOURCE_ROOT; }; 65BE679590BFE2466E16EA67 /* SysexComm.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = SysexComm.cpp; path = ../../Source/SysexComm.cpp; sourceTree = SOURCE_ROOT; }; @@ -467,17 +423,14 @@ 6742794BECA5E223253EF810 /* juce_mac_Fonts.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_mac_Fonts.mm; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_Fonts.mm; sourceTree = SOURCE_ROOT; }; 6833DFDF33AA9A5F551EA79D /* juce_DrawableComposite.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawableComposite.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.h; sourceTree = SOURCE_ROOT; }; 687A7EC567E4B00B663808F1 /* juce_audio_utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_audio_utils.h; path = ../../JuceLibraryCode/modules/juce_audio_utils/juce_audio_utils.h; sourceTree = SOURCE_ROOT; }; - 68CCE716313990E1412107A8 /* MusicDeviceBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MusicDeviceBase.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.cpp; sourceTree = DEVELOPER_DIR; }; 68D35AFE11BAA35EAE497D47 /* synth.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = synth.h; path = ../../Source/msfa/synth.h; sourceTree = SOURCE_ROOT; }; 68E9769CFD4CE3B4CA530DA3 /* juce_BooleanPropertyComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_BooleanPropertyComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp; sourceTree = SOURCE_ROOT; }; 68EBBB35B7A5A57E4BA2F8E2 /* module.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = module.h; path = ../../Source/msfa/module.h; sourceTree = SOURCE_ROOT; }; 69327BB424333BE9051A2C1D /* juce_win32_DragAndDrop.cpp */ = {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; }; 69B3908CF6E97D2326117534 /* juce_PathIterator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PathIterator.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.cpp; sourceTree = SOURCE_ROOT; }; 6A33E3588893DFC8E8370460 /* juce_FFT.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FFT.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_FFT.h; sourceTree = SOURCE_ROOT; }; - 6A462A15DB909F68F4A9BECC /* AUInputElement.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUInputElement.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.cpp; sourceTree = DEVELOPER_DIR; }; 6AFA3298C0E6EBF44DF90481 /* juce_PixelFormats.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PixelFormats.h; path = ../../JuceLibraryCode/modules/juce_graphics/colour/juce_PixelFormats.h; sourceTree = SOURCE_ROOT; }; 6B3889626BDBB814F2387085 /* CartManager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CartManager.cpp; path = ../../Source/CartManager.cpp; sourceTree = SOURCE_ROOT; }; - 6B8B14C1AA3491F103E6A5F7 /* AUEffectBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUEffectBase.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUEffectBase.cpp; sourceTree = DEVELOPER_DIR; }; 6C1EBFA6E5161BFC6E0A6686 /* juce_Expression.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Expression.cpp; path = ../../JuceLibraryCode/modules/juce_core/maths/juce_Expression.cpp; sourceTree = SOURCE_ROOT; }; 6CAAD366E2D6A650900C75F0 /* juce_linux_Network.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_linux_Network.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_linux_Network.cpp; sourceTree = SOURCE_ROOT; }; 6CBCD70FF1AE3E23D1598F84 /* juce_ContainerDeletePolicy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ContainerDeletePolicy.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_ContainerDeletePolicy.h; sourceTree = SOURCE_ROOT; }; @@ -486,7 +439,6 @@ 6DC26B61BA1638AFAF142A6C /* juce_gui_extra.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_gui_extra.mm; path = ../../JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.mm; sourceTree = SOURCE_ROOT; }; 6DCB546B40A962FCA3C74DB9 /* juce_ColourGradient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ColourGradient.h; path = ../../JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.h; sourceTree = SOURCE_ROOT; }; 6DEFC761C7F27A8ED88790B4 /* juce_XMLCodeTokeniser.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_XMLCodeTokeniser.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp; sourceTree = SOURCE_ROOT; }; - 6E1E415B080EA491A7D58D3A /* AUMIDIBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUMIDIBase.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.cpp; sourceTree = DEVELOPER_DIR; }; 6E2A781F28B3F735F4FAB2A2 /* juce_KeyMappingEditorComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_KeyMappingEditorComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp; sourceTree = SOURCE_ROOT; }; 6E84E300D2ECD62ED1ED3478 /* juce_FileInputSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileInputSource.h; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.h; sourceTree = SOURCE_ROOT; }; 6E8FC799E88893F8CD15BB71 /* juce_LADSPAPluginFormat.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_LADSPAPluginFormat.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp; sourceTree = SOURCE_ROOT; }; @@ -532,13 +484,10 @@ 7A0FB6545BA2E344A1F45EA5 /* juce_Decibels.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Decibels.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/effects/juce_Decibels.h; sourceTree = SOURCE_ROOT; }; 7A26D67672786E0663369D49 /* juce_IIRFilterAudioSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_IIRFilterAudioSource.cpp; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp; sourceTree = SOURCE_ROOT; }; 7A58027CF8C6967B02370E01 /* EngineOpl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EngineOpl.h; path = ../../Source/EngineOpl.h; sourceTree = SOURCE_ROOT; }; - 7A65F23E42CEFBDBA64EE2DA /* CAAudioChannelLayout.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAAudioChannelLayout.h; path = Extras/CoreAudio/PublicUtility/CAAudioChannelLayout.h; sourceTree = DEVELOPER_DIR; }; 7A739B1B4B833A4668904CA6 /* juce_ReferenceCountedObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ReferenceCountedObject.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_ReferenceCountedObject.h; sourceTree = SOURCE_ROOT; }; 7A854175B4E6D35ABB7D4E45 /* juce_URL.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_URL.h; path = ../../JuceLibraryCode/modules/juce_core/network/juce_URL.h; sourceTree = SOURCE_ROOT; }; 7A905E3EE096DAA1D7BA7ABD /* juce_TabbedButtonBar.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TabbedButtonBar.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp; sourceTree = SOURCE_ROOT; }; 7AB9FBAA49422497E050FFAC /* juce_ChildProcess.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ChildProcess.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.h; sourceTree = SOURCE_ROOT; }; - 7B2E31BD7292002DEBCC366B /* CAStreamBasicDescription.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CAStreamBasicDescription.cpp; path = Extras/CoreAudio/PublicUtility/CAStreamBasicDescription.cpp; sourceTree = DEVELOPER_DIR; }; - 7B6DC352755033E8436427CA /* AUMIDIBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUMIDIBase.h; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIBase.h; sourceTree = DEVELOPER_DIR; }; 7BE1A83B817F581F39B1F983 /* juce_TextEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TextEditor.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TextEditor.cpp; sourceTree = SOURCE_ROOT; }; 7BF1EEFA4D36A91714D26060 /* juce_Time.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Time.cpp; path = ../../JuceLibraryCode/modules/juce_core/time/juce_Time.cpp; sourceTree = SOURCE_ROOT; }; 7C2634F55C78A3822A661CE2 /* juce_XmlElement.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_XmlElement.cpp; path = ../../JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.cpp; sourceTree = SOURCE_ROOT; }; @@ -556,18 +505,13 @@ 7FCE241BE34BC4D1E6988B1F /* juce_Result.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Result.cpp; path = ../../JuceLibraryCode/modules/juce_core/misc/juce_Result.cpp; sourceTree = SOURCE_ROOT; }; 80149DC851E70B4D50DA03DB /* juce_SparseSet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SparseSet.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_SparseSet.h; sourceTree = SOURCE_ROOT; }; 80153220EFB623D6F205FD1B /* juce_MenuBarComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MenuBarComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp; sourceTree = SOURCE_ROOT; }; - 801E57A03A710591F1B5FEC6 /* AUDispatch.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUDispatch.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.h; sourceTree = DEVELOPER_DIR; }; 80B36B053E1EA2D1352BD0C9 /* juce_AudioProcessorParameter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioProcessorParameter.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h; sourceTree = SOURCE_ROOT; }; 8141C52E88E3E82A0A226FAD /* juce_KeyPress.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_KeyPress.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp; sourceTree = SOURCE_ROOT; }; 817CC81F50861DAEEFB2043A /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; - 81A949AE03BA033D5D762E9F /* AUOutputElement.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUOutputElement.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.cpp; sourceTree = DEVELOPER_DIR; }; 81E389AD161BE88DA92A59AA /* juce_events.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_events.h; path = ../../JuceLibraryCode/modules/juce_events/juce_events.h; sourceTree = SOURCE_ROOT; }; 829D2BFEB85DC3589FEBB868 /* juce_WildcardFileFilter.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_WildcardFileFilter.cpp; path = ../../JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.cpp; sourceTree = SOURCE_ROOT; }; - 82D97C5FDE8A53DEBB075DC7 /* AUCarbonViewControl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUCarbonViewControl.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewControl.h; sourceTree = DEVELOPER_DIR; }; 8312A52619B88D3763F6B493 /* juce_LookAndFeel_V3.cpp */ = {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; }; - 83281A9109419F0057EABD31 /* CAVectorUnitTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAVectorUnitTypes.h; path = Extras/CoreAudio/PublicUtility/CAVectorUnitTypes.h; sourceTree = DEVELOPER_DIR; }; 834F3F9FC2FE9564FF95243D /* juce_win32_Fonts.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_Fonts.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_win32_Fonts.cpp; sourceTree = SOURCE_ROOT; }; - 838A5E852BBD79A98CD9FDDD /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; }; 838E63F5800CA577B92EF6AE /* OperatorEditor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = OperatorEditor.cpp; path = ../../Source/OperatorEditor.cpp; sourceTree = SOURCE_ROOT; }; 8390BC6E8D8190A7C45C6A08 /* juce_win32_Messaging.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_Messaging.cpp; path = ../../JuceLibraryCode/modules/juce_events/native/juce_win32_Messaging.cpp; sourceTree = SOURCE_ROOT; }; 83B3A12467C52CB13FB353C6 /* juce_mac_SystemTrayIcon.cpp */ = {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; }; @@ -584,7 +528,6 @@ 88DEE0054A9328954E19EECA /* juce_InterprocessConnection.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_InterprocessConnection.cpp; path = ../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.cpp; sourceTree = SOURCE_ROOT; }; 89003B5CB547C82F42EEB0A9 /* juce_mac_NSViewComponentPeer.mm */ = {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; }; 8915FD41B7EB8AB0961F199A /* juce_ImageFileFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ImageFileFormat.h; path = ../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.h; sourceTree = SOURCE_ROOT; }; - 8921057E004FE1036191B888 /* AUOutputBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUOutputBase.h; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUOutputBase.h; sourceTree = DEVELOPER_DIR; }; 89BBB19B9AFC6DAD43B9B512 /* juce_Random.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Random.cpp; path = ../../JuceLibraryCode/modules/juce_core/maths/juce_Random.cpp; sourceTree = SOURCE_ROOT; }; 89CF359102665330C30E1F9A /* juce_NamedPipe.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_NamedPipe.h; path = ../../JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.h; sourceTree = SOURCE_ROOT; }; 8A4EB298996C4C410C1B4CDC /* juce_PathStrokeType.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PathStrokeType.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.cpp; sourceTree = SOURCE_ROOT; }; @@ -607,7 +550,6 @@ 8E04EF74113A0E9808FC4F09 /* juce_PluginDescription.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PluginDescription.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.h; sourceTree = SOURCE_ROOT; }; 8E3B1087D0795F0D4E02DAF0 /* juce_DirectoryContentsList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DirectoryContentsList.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h; sourceTree = SOURCE_ROOT; }; 8EC249E14405CAC614E7A4CF /* juce_AttributedString.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AttributedString.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.cpp; sourceTree = SOURCE_ROOT; }; - 8ED1068B85DCEFEFDD3C4F82 /* AUCarbonViewBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUCarbonViewBase.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewBase.cpp; sourceTree = DEVELOPER_DIR; }; 8F32EF92B0A18751EC39A79B /* JuceHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = SOURCE_ROOT; }; 8F395B738E7AB81A0333AF96 /* freqlut.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = freqlut.h; path = ../../Source/msfa/freqlut.h; sourceTree = SOURCE_ROOT; }; 8F62A58CDAF0709EDE33F5E0 /* juce_ImageButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ImageButton.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.h; sourceTree = SOURCE_ROOT; }; @@ -618,7 +560,6 @@ 911A3E44C161694FF7084464 /* juce_ToggleButton.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ToggleButton.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp; sourceTree = SOURCE_ROOT; }; 91544DAFCDBE05708D10A24C /* juce_WaitableEvent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_WaitableEvent.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_WaitableEvent.h; sourceTree = SOURCE_ROOT; }; 9196D1FCEC768D074AAAD581 /* juce_Variant.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Variant.cpp; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_Variant.cpp; sourceTree = SOURCE_ROOT; }; - 919DF1054C09D19EDA044BE8 /* CoreAudioKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; }; 930D512FD24D7E21E43C7322 /* juce_data_structures.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_data_structures.h; path = ../../JuceLibraryCode/modules/juce_data_structures/juce_data_structures.h; sourceTree = SOURCE_ROOT; }; 936D695F9C82434D08C181FC /* juce_BorderSize.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_BorderSize.h; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_BorderSize.h; sourceTree = SOURCE_ROOT; }; 937CFA7E69529A634C1DCD5C /* juce_PropertyComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PropertyComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.h; sourceTree = SOURCE_ROOT; }; @@ -673,7 +614,6 @@ A2C4984859B7A2F3CB17C609 /* juce_MultiTimer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MultiTimer.h; path = ../../JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.h; sourceTree = SOURCE_ROOT; }; A2D3A958C5D96910BEDE9283 /* juce_ListBox.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ListBox.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ListBox.cpp; sourceTree = SOURCE_ROOT; }; A2DABCCF72397C2C7C69F441 /* juce_TreeView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TreeView.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TreeView.h; sourceTree = SOURCE_ROOT; }; - A31C49ABA24290126250F574 /* CAMutex.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CAMutex.cpp; path = Extras/CoreAudio/PublicUtility/CAMutex.cpp; sourceTree = DEVELOPER_DIR; }; A348DAE6ECDEF51CAD6B5FE4 /* juce_ValueTree.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ValueTree.cpp; path = ../../JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.cpp; sourceTree = SOURCE_ROOT; }; A354DF25FF89648B38DB63DC /* juce_gui_basics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_gui_basics.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.h; sourceTree = SOURCE_ROOT; }; A3B840D8C76CA45D3096241C /* juce_OwnedArray.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_OwnedArray.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_OwnedArray.h; sourceTree = SOURCE_ROOT; }; @@ -690,7 +630,6 @@ A70082D71DB8B5D779944812 /* juce_FileOutputStream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileOutputStream.h; path = ../../JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.h; sourceTree = SOURCE_ROOT; }; A700ACBCC4D648B60362B3D6 /* juce_FileLogger.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_FileLogger.h; path = ../../JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.h; sourceTree = SOURCE_ROOT; }; A763DB1FF5441EFF39491530 /* juce_UndoManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_UndoManager.h; path = ../../JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.h; sourceTree = SOURCE_ROOT; }; - A7894AD5A242CD86ACE9455C /* AUResources.r */ = {isa = PBXFileReference; lastKnownFileType = file.r; name = AUResources.r; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUResources.r; sourceTree = DEVELOPER_DIR; }; A7BE5CE9E0BA615BCC867CB8 /* juce_DrawableRectangle.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawableRectangle.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h; sourceTree = SOURCE_ROOT; }; A7C3E1CAAA03F545AA4FCFAA /* juce_Path.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Path.h; path = ../../JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.h; sourceTree = SOURCE_ROOT; }; A810A279E11A672B8F84AD72 /* juce_MidiBuffer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MidiBuffer.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.h; sourceTree = SOURCE_ROOT; }; @@ -724,7 +663,6 @@ AE4B8002F4435BEADA3AE966 /* juce_PropertySet.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PropertySet.cpp; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.cpp; sourceTree = SOURCE_ROOT; }; AE4DF6AF917F1A8DDF5376E3 /* juce_ModalComponentManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ModalComponentManager.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.h; sourceTree = SOURCE_ROOT; }; AE8321756C03700EB12FF98A /* juce_RecentlyOpenedFilesList.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RecentlyOpenedFilesList.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp; sourceTree = SOURCE_ROOT; }; - AE84ADD347C9AB73ECFCBED7 /* AUTimestampGenerator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUTimestampGenerator.h; path = Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUTimestampGenerator.h; sourceTree = DEVELOPER_DIR; }; AED57A3601CE4B9FF8007855 /* juce_HeapBlock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_HeapBlock.h; path = ../../JuceLibraryCode/modules/juce_core/memory/juce_HeapBlock.h; sourceTree = SOURCE_ROOT; }; AEFD0A7D65FEC1D23A87FB1C /* juce_PropertyPanel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PropertyPanel.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.h; sourceTree = SOURCE_ROOT; }; AF1DFD842A36E967DF140D5C /* aligned_buf.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = aligned_buf.h; path = ../../Source/msfa/aligned_buf.h; sourceTree = SOURCE_ROOT; }; @@ -765,9 +703,7 @@ BA9FFDC7BCC2D364014E1280 /* juce_FileTreeComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileTreeComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp; sourceTree = SOURCE_ROOT; }; BAA40A78E81F4FF0F0E075A6 /* juce_linux_Clipboard.cpp */ = {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; }; BAA44451865610A98B3A69AE /* juce_FileBasedDocument.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileBasedDocument.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp; sourceTree = SOURCE_ROOT; }; - BAADD431AF7666E435C6C4B3 /* AUScopeElement.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUScopeElement.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.cpp; sourceTree = DEVELOPER_DIR; }; BAE2BAF1F5DC75A6E72FC56A /* juce_TableListBox.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TableListBox.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableListBox.h; sourceTree = SOURCE_ROOT; }; - BAEAEDCE17A81C84439E984A /* CAAUParameter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAAUParameter.h; path = Extras/CoreAudio/PublicUtility/CAAUParameter.h; sourceTree = DEVELOPER_DIR; }; BB08970C0517BF01D80D49B3 /* juce_ComponentAnimator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComponentAnimator.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.h; sourceTree = SOURCE_ROOT; }; BB7808FBEB84DD9C60978532 /* juce_audio_plugin_client.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_audio_plugin_client.h; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/juce_audio_plugin_client.h; sourceTree = SOURCE_ROOT; }; BC383B9F2F352E373DE6C4A6 /* juce_CharPointer_UTF32.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CharPointer_UTF32.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF32.h; sourceTree = SOURCE_ROOT; }; @@ -791,7 +727,6 @@ C16DEC12DA7B1444AF0FD5BB /* juce_CustomTypeface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_CustomTypeface.h; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.h; sourceTree = SOURCE_ROOT; }; C1CB32E507C8F16FFF6014F6 /* juce_ApplicationBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ApplicationBase.h; path = ../../JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.h; sourceTree = SOURCE_ROOT; }; C1E13F0AFFDADDB080D11B74 /* juce_Drawable.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Drawable.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.cpp; sourceTree = SOURCE_ROOT; }; - C1F03CEB2804747AF4C6BF4D /* ComponentBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ComponentBase.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.h; sourceTree = DEVELOPER_DIR; }; C1FFEA64DED8E45D6A8F17F2 /* juce_ImageFileFormat.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ImageFileFormat.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.cpp; sourceTree = SOURCE_ROOT; }; C222D35AC4FC5C2A3BB0F8B6 /* EngineMkI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EngineMkI.h; path = ../../Source/EngineMkI.h; sourceTree = SOURCE_ROOT; }; C28D3CC3B868C4F092E68D45 /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_graphics/juce_module_info; sourceTree = SOURCE_ROOT; }; @@ -803,7 +738,6 @@ C48DAE373124C258F3414CDB /* juce_GIFLoader.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GIFLoader.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/image_formats/juce_GIFLoader.cpp; sourceTree = SOURCE_ROOT; }; C49F636E4677A7C8C62A9859 /* juce_Synthesiser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Synthesiser.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h; sourceTree = SOURCE_ROOT; }; C4A2C1FDE57CCF33BE778B39 /* juce_AppleRemote.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AppleRemote.h; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_AppleRemote.h; sourceTree = SOURCE_ROOT; }; - C4DE747B720C310D6BC65936 /* AUBuffer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUBuffer.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUBuffer.cpp; sourceTree = DEVELOPER_DIR; }; C56E401381FF968837F82364 /* PluginData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PluginData.h; path = ../../Source/PluginData.h; sourceTree = SOURCE_ROOT; }; C5E92613992AB74C2E715271 /* juce_ApplicationCommandManager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ApplicationCommandManager.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp; sourceTree = SOURCE_ROOT; }; C6559A509BD759234BFFCA5D /* juce_TooltipWindow.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TooltipWindow.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp; sourceTree = SOURCE_ROOT; }; @@ -813,7 +747,6 @@ C78890910E4BE9A24F562397 /* juce_BufferedInputStream.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_BufferedInputStream.cpp; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.cpp; sourceTree = SOURCE_ROOT; }; C7C6039A52C3EE370CA9E73A /* juce_RTAS_MacUtilities.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_RTAS_MacUtilities.mm; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacUtilities.mm; sourceTree = SOURCE_ROOT; }; C7EFC098CAC8AAB04A9D5183 /* juce_win32_ComSmartPtr.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_win32_ComSmartPtr.h; path = ../../JuceLibraryCode/modules/juce_core/native/juce_win32_ComSmartPtr.h; sourceTree = SOURCE_ROOT; }; - C89190A10B698C7B1E42C76D /* AUMIDIEffectBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUMIDIEffectBase.h; path = Extras/CoreAudio/AudioUnits/AUPublic/OtherBases/AUMIDIEffectBase.h; sourceTree = DEVELOPER_DIR; }; C8DE1F3E1A1871ABB88A5B2D /* juce_SelectedItemSet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SelectedItemSet.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_SelectedItemSet.h; sourceTree = SOURCE_ROOT; }; C92DFD53D297FAD265D1DB8D /* juce_InputSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_InputSource.h; path = ../../JuceLibraryCode/modules/juce_core/streams/juce_InputSource.h; sourceTree = SOURCE_ROOT; }; C9BA4E2199E2302799EFB744 /* juce_ValueTreeSynchroniser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ValueTreeSynchroniser.h; path = ../../JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTreeSynchroniser.h; sourceTree = SOURCE_ROOT; }; @@ -833,17 +766,14 @@ CFFA7532FAFF5655253878FE /* juce_android_Threads.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_android_Threads.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_android_Threads.cpp; sourceTree = SOURCE_ROOT; }; D0096F2804DF0875565D0051 /* juce_AudioDataConverters.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioDataConverters.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h; sourceTree = SOURCE_ROOT; }; D0178A36F6E46F92111E4883 /* juce_VST3_Wrapper.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_VST3_Wrapper.cpp; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp; sourceTree = SOURCE_ROOT; }; - D0A92955B64EB66E9334F51F /* AUOutputElement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUOutputElement.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.h; sourceTree = DEVELOPER_DIR; }; D1353A684AD92A6A9FAFBB1B /* juce_DynamicObject.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DynamicObject.cpp; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.cpp; sourceTree = SOURCE_ROOT; }; D154251B66BF13E992D3D06A /* juce_SystemTrayIconComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_SystemTrayIconComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp; sourceTree = SOURCE_ROOT; }; D17049595AD1C1353337817D /* juce_ImageConvolutionKernel.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ImageConvolutionKernel.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp; sourceTree = SOURCE_ROOT; }; D1BEED433BFC4AA10346BE1C /* juce_FileSearchPath.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileSearchPath.cpp; path = ../../JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.cpp; sourceTree = SOURCE_ROOT; }; - D251BD558FBD32ECA221D81C /* AUScopeElement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUScopeElement.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.h; sourceTree = DEVELOPER_DIR; }; D25566BCBFE5CCA4E425E6A7 /* juce_Variant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Variant.h; path = ../../JuceLibraryCode/modules/juce_core/containers/juce_Variant.h; sourceTree = SOURCE_ROOT; }; D2E57CCA4E6F6DBE2953744C /* juce_ComponentBoundsConstrainer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ComponentBoundsConstrainer.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h; sourceTree = SOURCE_ROOT; }; D33DD8892334E06135451054 /* juce_FileSearchPathListComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileSearchPathListComponent.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp; sourceTree = SOURCE_ROOT; }; D35E45B2269C44FCCAD7B1C4 /* juce_Typeface.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Typeface.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.cpp; sourceTree = SOURCE_ROOT; }; - D378EA436E4D111ECE7099C6 /* AUViewLocalizedStringKeys.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUViewLocalizedStringKeys.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUViewBase/AUViewLocalizedStringKeys.h; sourceTree = DEVELOPER_DIR; }; D409BECBAD7CDC3DE48EFA2F /* juce_FileInputStream.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_FileInputStream.cpp; path = ../../JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.cpp; sourceTree = SOURCE_ROOT; }; D4811402C8922A6D8EB4C660 /* juce_AudioProcessorPlayer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioProcessorPlayer.cpp; path = ../../JuceLibraryCode/modules/juce_audio_utils/players/juce_AudioProcessorPlayer.cpp; sourceTree = SOURCE_ROOT; }; D4B060A58438D21EE6CC8F76 /* juce_TimeSliceThread.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TimeSliceThread.h; path = ../../JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.h; sourceTree = SOURCE_ROOT; }; @@ -863,7 +793,6 @@ D7E27005916D044FD96919B8 /* juce_ReverbAudioSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ReverbAudioSource.h; path = ../../JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h; sourceTree = SOURCE_ROOT; }; D8038990994C30BDD631733E /* juce_RTAS_DigiCode2.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_RTAS_DigiCode2.cpp; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode2.cpp; sourceTree = SOURCE_ROOT; }; D8498304CBB374B2800442D4 /* juce_LassoComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_LassoComponent.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/mouse/juce_LassoComponent.h; sourceTree = SOURCE_ROOT; }; - D8F138F48E933ECCF2DB2321 /* AUCarbonViewControl.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUCarbonViewControl.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewControl.cpp; sourceTree = DEVELOPER_DIR; }; D90A42D47F3DD9C505D8A925 /* juce_SystemStats.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_SystemStats.h; path = ../../JuceLibraryCode/modules/juce_core/system/juce_SystemStats.h; sourceTree = SOURCE_ROOT; }; D921C8001631F2FC4D7EFF9D /* juce_KeyboardFocusTraverser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_KeyboardFocusTraverser.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h; sourceTree = SOURCE_ROOT; }; D984CE634945077E682B48F3 /* DXComponents.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DXComponents.cpp; path = ../../Source/DXComponents.cpp; sourceTree = SOURCE_ROOT; }; @@ -948,14 +877,11 @@ F273ED17232368EBFAFC820B /* juce_DropShadowEffect.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DropShadowEffect.cpp; path = ../../JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.cpp; sourceTree = SOURCE_ROOT; }; F27DB431B9ECEE07B84281E8 /* juce_TextButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TextButton.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.h; sourceTree = SOURCE_ROOT; }; F2A26292713BB459A7AE5780 /* juce_ImageCache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ImageCache.h; path = ../../JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.h; sourceTree = SOURCE_ROOT; }; - F2C763A217C6D0704C6FB4F2 /* AUCarbonViewBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUCarbonViewBase.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewBase.h; sourceTree = DEVELOPER_DIR; }; - F3171B20C2BBF12A5786B1F5 /* CAAudioChannelLayout.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CAAudioChannelLayout.cpp; path = Extras/CoreAudio/PublicUtility/CAAudioChannelLayout.cpp; sourceTree = DEVELOPER_DIR; }; F32BA2ADBCF84519105AB974 /* juce_TextDiff.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_TextDiff.h; path = ../../JuceLibraryCode/modules/juce_core/text/juce_TextDiff.h; sourceTree = SOURCE_ROOT; }; F3718D9D288A2760B6126585 /* juce_mac_CoreGraphicsContext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_mac_CoreGraphicsContext.h; path = ../../JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h; sourceTree = SOURCE_ROOT; }; F38E4F0A432CAB98BA8F4F8A /* fm_op_kernel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = fm_op_kernel.h; path = ../../Source/msfa/fm_op_kernel.h; sourceTree = SOURCE_ROOT; }; F39BD87913AB2F91817C50EF /* juce_DrawableImage.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawableImage.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp; sourceTree = SOURCE_ROOT; }; F3EADB9BD1C520ABD153B785 /* juce_AudioPluginInstance.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_AudioPluginInstance.h; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h; sourceTree = SOURCE_ROOT; }; - F4050C3BAC97B06A7ED35103 /* CAStreamBasicDescription.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAStreamBasicDescription.h; path = Extras/CoreAudio/PublicUtility/CAStreamBasicDescription.h; sourceTree = DEVELOPER_DIR; }; F426F0185DB4E97E1E59A807 /* juce_module_info */ = {isa = PBXFileReference; lastKnownFileType = text; name = juce_module_info; path = ../../JuceLibraryCode/modules/juce_events/juce_module_info; sourceTree = SOURCE_ROOT; }; F47FA981083705D4B545339F /* pitchenv.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = pitchenv.h; path = ../../Source/msfa/pitchenv.h; sourceTree = SOURCE_ROOT; }; F4EA09FAC67FDDA4D2E1D151 /* juce_InterprocessConnection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_InterprocessConnection.h; path = ../../JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.h; sourceTree = SOURCE_ROOT; }; @@ -966,7 +892,6 @@ F6F950B6ABB40B62AE4C0B78 /* juce_VST_Wrapper.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = juce_VST_Wrapper.mm; path = ../../JuceLibraryCode/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm; sourceTree = SOURCE_ROOT; }; F74CAAECFC16D1E87041E5A7 /* juce_DropShadower.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DropShadower.h; path = ../../JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.h; sourceTree = SOURCE_ROOT; }; F7826D43ACD985679DEACFD0 /* juce_PluginDescription.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PluginDescription.cpp; path = ../../JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.cpp; sourceTree = SOURCE_ROOT; }; - F7B762EB74B4145099C06C5A /* AUBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUBase.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.h; sourceTree = DEVELOPER_DIR; }; F805C241B3074BB357475216 /* juce_ToolbarButton.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ToolbarButton.cpp; path = ../../JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp; sourceTree = SOURCE_ROOT; }; F83AF328F15F82C722B45598 /* juce_ImageEffectFilter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ImageEffectFilter.h; path = ../../JuceLibraryCode/modules/juce_graphics/effects/juce_ImageEffectFilter.h; sourceTree = SOURCE_ROOT; }; F8A589597222065EA52C4F9C /* juce_linux_CommonFile.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_linux_CommonFile.cpp; path = ../../JuceLibraryCode/modules/juce_core/native/juce_linux_CommonFile.cpp; sourceTree = SOURCE_ROOT; }; @@ -1006,11 +931,9 @@ files = ( 6443699C06267ECC22CF9D12 /* Accelerate.framework in Frameworks */, 60686C2C30A9F2777CEF01BD /* AudioToolbox.framework in Frameworks */, - 77C3EA8D0A12986429BA466D /* AudioUnit.framework in Frameworks */, E8BEA8ABF5E288C5D5FCD620 /* Carbon.framework in Frameworks */, F329522961F1313091764113 /* Cocoa.framework in Frameworks */, B0A4786A252B14B604101175 /* CoreAudio.framework in Frameworks */, - 82253A3BBFF29FC56A08C972 /* CoreAudioKit.framework in Frameworks */, FA2AF2015CFD98299593EA30 /* CoreMIDI.framework in Frameworks */, 7116DC8487DC8321F36CD3D8 /* DiscRecording.framework in Frameworks */, 68878920F603FF1473994736 /* IOKit.framework in Frameworks */, @@ -1341,11 +1264,9 @@ children = ( E32283AE8CC5A022E1A6B30B /* Accelerate.framework */, 0A56796E1B84D05D8DD1100D /* AudioToolbox.framework */, - 838A5E852BBD79A98CD9FDDD /* AudioUnit.framework */, 817CC81F50861DAEEFB2043A /* Carbon.framework */, 2FDF76165C655B2E77BE4CFD /* Cocoa.framework */, 3A01DC4DEBE65C313C7C8A44 /* CoreAudio.framework */, - 919DF1054C09D19EDA044BE8 /* CoreAudioKit.framework */, A81F4DC234E8D93BF9803529 /* CoreMIDI.framework */, 452C1184BD776249B33151E5 /* DiscRecording.framework */, FC856709502EE15E8D3F448B /* IOKit.framework */, @@ -1392,13 +1313,11 @@ 3E0C3A2E8ED7ED09FA4E1CF0 /* Juce Library Code */ = { isa = PBXGroup; children = ( - C2089BDCA7170FE59577FA72 /* Juce AU Wrapper */, A4732634AB48AFD0FB06D7FA /* AppConfig.h */, 54363D0B39B88D43447C0123 /* BinaryData.cpp */, 7228D8E143CA465FB15BD546 /* BinaryData.h */, 505852570B48EB3F18076B03 /* juce_AAX_Wrapper.cpp */, 3254CAE4C282C4432214B016 /* juce_AAX_Wrapper.mm */, - 64CC83E4D891EAEC65EE41C4 /* juce_AU_Resources.r */, 502D49C82606515A80907EB3 /* juce_AU_Wrapper.mm */, 3DF47857774F10344F12BE65 /* juce_audio_basics.mm */, 31AEFAC2A9E8C7C96ECB4B96 /* juce_audio_devices.mm */, @@ -2255,61 +2174,6 @@ name = juce_audio_plugin_client; sourceTree = ""; }; - C2089BDCA7170FE59577FA72 /* Juce AU Wrapper */ = { - isa = PBXGroup; - children = ( - 0598D37F24E489C12F43EF93 /* AUBase.cpp */, - F7B762EB74B4145099C06C5A /* AUBase.h */, - C4DE747B720C310D6BC65936 /* AUBuffer.cpp */, - 42037D6AD47F7FEBAF6D4732 /* AUBuffer.h */, - 8ED1068B85DCEFEFDD3C4F82 /* AUCarbonViewBase.cpp */, - F2C763A217C6D0704C6FB4F2 /* AUCarbonViewBase.h */, - D8F138F48E933ECCF2DB2321 /* AUCarbonViewControl.cpp */, - 82D97C5FDE8A53DEBB075DC7 /* AUCarbonViewControl.h */, - 173994FFD45CE7CB6D2CCAD7 /* AUCarbonViewDispatch.cpp */, - 02802D92B7CF0D835254B6C1 /* AUDispatch.cpp */, - 801E57A03A710591F1B5FEC6 /* AUDispatch.h */, - 6B8B14C1AA3491F103E6A5F7 /* AUEffectBase.cpp */, - 5AD3DDD0285C94CEB17BF03C /* AUEffectBase.h */, - 6A462A15DB909F68F4A9BECC /* AUInputElement.cpp */, - 60F23312570D43B7F7FC0D43 /* AUInputElement.h */, - 10E7F81B8369A5A923D5EE9A /* AUInputFormatConverter.h */, - 6E1E415B080EA491A7D58D3A /* AUMIDIBase.cpp */, - 7B6DC352755033E8436427CA /* AUMIDIBase.h */, - 3E301CD94F9029D7E3898EB2 /* AUMIDIEffectBase.cpp */, - C89190A10B698C7B1E42C76D /* AUMIDIEffectBase.h */, - 16D7D354B7CBC971E8B0CFA5 /* AUOutputBase.cpp */, - 8921057E004FE1036191B888 /* AUOutputBase.h */, - 81A949AE03BA033D5D762E9F /* AUOutputElement.cpp */, - D0A92955B64EB66E9334F51F /* AUOutputElement.h */, - A7894AD5A242CD86ACE9455C /* AUResources.r */, - BAADD431AF7666E435C6C4B3 /* AUScopeElement.cpp */, - D251BD558FBD32ECA221D81C /* AUScopeElement.h */, - 4697BFC33D1A3C846B2DED19 /* AUSilentTimeout.h */, - AE84ADD347C9AB73ECFCBED7 /* AUTimestampGenerator.h */, - D378EA436E4D111ECE7099C6 /* AUViewLocalizedStringKeys.h */, - F3171B20C2BBF12A5786B1F5 /* CAAudioChannelLayout.cpp */, - 7A65F23E42CEFBDBA64EE2DA /* CAAudioChannelLayout.h */, - 0DB84FE1DF027D2AB0952F18 /* CAAUParameter.cpp */, - BAEAEDCE17A81C84439E984A /* CAAUParameter.h */, - 6050F8DB4EA5F9A4A27D7653 /* CADebugMacros.h */, - A31C49ABA24290126250F574 /* CAMutex.cpp */, - 0337F4D67CD2D5C29939E940 /* CAMutex.h */, - 3A44529EBD28E325DAA12D80 /* CarbonEventHandler.cpp */, - 478D907DACBE0CF918C6A0AD /* CarbonEventHandler.h */, - 7B2E31BD7292002DEBCC366B /* CAStreamBasicDescription.cpp */, - F4050C3BAC97B06A7ED35103 /* CAStreamBasicDescription.h */, - 2CA60524355CF872ADB42EA4 /* CAVectorUnit.cpp */, - 210364718D006CC26958D583 /* CAVectorUnit.h */, - 83281A9109419F0057EABD31 /* CAVectorUnitTypes.h */, - 561A9793AA73B7FDDED14476 /* ComponentBase.cpp */, - C1F03CEB2804747AF4C6BF4D /* ComponentBase.h */, - 68CCE716313990E1412107A8 /* MusicDeviceBase.cpp */, - 4CB06EEFAA877AA4A28FE150 /* MusicDeviceBase.h */, - ); - name = "Juce AU Wrapper"; - sourceTree = ""; - }; C21CEF3B473FDC99270B7623 /* Dexed */ = { isa = PBXGroup; children = ( @@ -2699,7 +2563,6 @@ buildConfigurationList = 5900493D34C3F35BEFC2B3D6 /* Build configuration list for PBXNativeTarget "Dexed" */; buildPhases = ( F33A1146DD22EEF53DEB0728 /* Resources */, - D7ECE35BCBD5C64A95ACCFC6 /* Rez */, 9DB7317ADCFFCEAB747A09AF /* Sources */, 06D721A024B3596A28AB8EC1 /* Frameworks */, 3272AB811807EDC647D52F52 /* Post-build script */, @@ -2720,7 +2583,7 @@ 0DA61024CABBA334F84603C0 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0700; + LastUpgradeCheck = 0440; }; buildConfigurationList = 79EC971C74D382E87C0F443D /* Build configuration list for PBXProject "Dexed" */; compatibilityVersion = "Xcode 3.2"; @@ -2749,17 +2612,6 @@ }; /* End PBXResourcesBuildPhase section */ -/* Begin PBXRezBuildPhase section */ - D7ECE35BCBD5C64A95ACCFC6 /* Rez */ = { - isa = PBXRezBuildPhase; - buildActionMask = 2147483647; - files = ( - 9D042F9D005532F763A72C26 /* juce_AU_Resources.r in Rez */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXRezBuildPhase section */ - /* Begin PBXShellScriptBuildPhase section */ 3272AB811807EDC647D52F52 /* Post-build script */ = { isa = PBXShellScriptBuildPhase; @@ -2803,27 +2655,6 @@ 623AFA9E78826CA0136251DF /* PluginParam.cpp in Sources */, 8BE2A084394DA3E45DDB5646 /* PluginData.cpp in Sources */, EC23F9F2EE10A2DE3CB6D406 /* SysexComm.cpp in Sources */, - 2360F3C87933B5A51B0D4839 /* AUBase.cpp in Sources */, - 26E1D92384FB66ED8FCF5101 /* AUBuffer.cpp in Sources */, - 02B7485A3DD3F44C6058AB0E /* AUCarbonViewBase.cpp in Sources */, - 09E5F88C9C879073B1B103F1 /* AUCarbonViewControl.cpp in Sources */, - EE173D0BBBF66A8977FE3A7E /* AUCarbonViewDispatch.cpp in Sources */, - EB464CA0288DD69ABBAE73B3 /* AUDispatch.cpp in Sources */, - 3FC0533D8E67D63666A51C64 /* AUEffectBase.cpp in Sources */, - 0E0B0D39FCB31A57F5298C7A /* AUInputElement.cpp in Sources */, - AE7F0435D9C8D94FFDA16DCA /* AUMIDIBase.cpp in Sources */, - 3D8568887BBA0D81340FF64D /* AUMIDIEffectBase.cpp in Sources */, - 95D4EF9899B0D0D3FC729312 /* AUOutputBase.cpp in Sources */, - C19B69B5974FA50D116A4F52 /* AUOutputElement.cpp in Sources */, - ED19C7C3EF2026BC9386CAA3 /* AUScopeElement.cpp in Sources */, - B96C21AF3AD25C7950EA6CE5 /* CAAudioChannelLayout.cpp in Sources */, - DFA8CE3B7D7FE269254C9BDD /* CAAUParameter.cpp in Sources */, - DAC2F8A317486D36C0E0F81F /* CAMutex.cpp in Sources */, - 556863C97636A308001CFD21 /* CarbonEventHandler.cpp in Sources */, - 6970EC0E1FEDCF3793098929 /* CAStreamBasicDescription.cpp in Sources */, - 62798B841D9D5E0B71064A73 /* CAVectorUnit.cpp in Sources */, - CCC498943EDC85558AF6D8B8 /* ComponentBase.cpp in Sources */, - F1106DF1AB7F08D4FC6B6BBB /* MusicDeviceBase.cpp in Sources */, 1C87DA0B69D67481FC6CF4FD /* BinaryData.cpp in Sources */, E3FA856CA4DB2009BB0F13E7 /* juce_AAX_Wrapper.cpp in Sources */, 7E6DF76EEA834AC1E96470CE /* juce_AAX_Wrapper.mm in Sources */, @@ -2859,7 +2690,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(NATIVE_ARCH_ACTUAL)"; DEBUG_INFORMATION_FORMAT = dwarf; GCC_C_LANGUAGE_STANDARD = c99; GCC_INLINES_ARE_PRIVATE_EXTERN = YES; @@ -2870,10 +2700,9 @@ GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.7; ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = Dexed; - SDKROOT = macosx10.8; + SDKROOT = macosx10.7; WARNING_CFLAGS = "-Wreorder"; ZERO_LINK = NO; }; @@ -2883,7 +2712,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(NATIVE_ARCH_ACTUAL)"; DEBUG_INFORMATION_FORMAT = dwarf; GCC_C_LANGUAGE_STANDARD = c99; GCC_INLINES_ARE_PRIVATE_EXTERN = YES; @@ -2894,10 +2722,8 @@ GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.7; - ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = Dexed; - SDKROOT = macosx10.8; + SDKROOT = macosx10.7; WARNING_CFLAGS = "-Wreorder"; ZERO_LINK = NO; }; @@ -2906,14 +2732,12 @@ 4AA859F8A477DEBA3D568766 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD)"; + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; 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; - EXCLUDED_SOURCE_FILE_NAMES = "$(EXCLUDED_SOURCE_FILE_NAMES_$(CURRENT_ARCH))"; - EXCLUDED_SOURCE_FILE_NAMES_x86_64 = "*Carbon*.cpp"; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_OPTIMIZATION_LEVEL = s; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -2930,20 +2754,14 @@ "~/Documents/src/vstsdk2.4", ../../JuceLibraryCode, ../../JuceLibraryCode/modules, - "$(DEVELOPER_DIR)/Extras/CoreAudio/PublicUtility", - "$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/Utility", - "$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/AUBase", "$(inherited)", ); INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Library/Audio/Plug-Ins/Components/"; LIBRARY_STYLE = Bundle; MACOSX_DEPLOYMENT_TARGET_ppc = 10.4; - ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = "-bundle"; OTHER_REZFLAGS = "-d ppc_$ppc -d i386_$i386 -d ppc64_$ppc64 -d x86_64_$x86_64 -I /System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Versions/A/Headers -I \"$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/AUBase\""; - PRODUCT_BUNDLE_IDENTIFIER = com.digitalsuburban.Dexed; - SDKROOT = macosx10.8; SDKROOT_ppc = macosx10.5; WRAPPER_EXTENSION = component; }; @@ -2952,14 +2770,11 @@ 93498502B083FC03423F6407 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD)"; 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; - EXCLUDED_SOURCE_FILE_NAMES = "$(EXCLUDED_SOURCE_FILE_NAMES_$(CURRENT_ARCH))"; - EXCLUDED_SOURCE_FILE_NAMES_x86_64 = "*Carbon*.cpp"; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -2975,20 +2790,14 @@ "~/Documents/src/vstsdk2.4", ../../JuceLibraryCode, ../../JuceLibraryCode/modules, - "$(DEVELOPER_DIR)/Extras/CoreAudio/PublicUtility", - "$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/Utility", - "$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/AUBase", "$(inherited)", ); INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Library/Audio/Plug-Ins/Components/"; LIBRARY_STYLE = Bundle; MACOSX_DEPLOYMENT_TARGET_ppc = 10.4; - ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = "-bundle"; OTHER_REZFLAGS = "-d ppc_$ppc -d i386_$i386 -d ppc64_$ppc64 -d x86_64_$x86_64 -I /System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Versions/A/Headers -I \"$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/AUBase\""; - PRODUCT_BUNDLE_IDENTIFIER = com.digitalsuburban.Dexed; - SDKROOT = macosx10.8; SDKROOT_ppc = macosx10.5; WRAPPER_EXTENSION = component; }; diff --git a/Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate b/Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate index 074dcf24691a191de274526eb725eb4f1f09f319..c6761a6980ef390649876afd8618b27d930a2956 100644 GIT binary patch literal 201542 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't-6{l=gkV<7jK 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≥V3`zE9bbtpU6I^07Z~-j$U($^Aa-7apO61 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 Y@BhvV|G)ose&qlC_y7NYxKGmm0g=duS^xk5 literal 201623 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

XU4BI7Mt% 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%0A9{bSWOmd6|Ig{s4=9S0h_8_NnOLJoj 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 z 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 diff --git a/Builds/MacOSX/Info.plist b/Builds/MacOSX/Info.plist index fcac41b..4cf7c15 100644 --- a/Builds/MacOSX/Info.plist +++ b/Builds/MacOSX/Info.plist @@ -1,45 +1,27 @@ - - - - - AudioComponents - - - description - Dexed FM Synth - factoryFunction - DexedAUFactory - manufacturer - DGSB - name - Digital Suburban: Dexed - subtype - Dexd - type - aumu - version - 65536 - - - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleName - Dexed - CFBundlePackageType - TDMw - CFBundleShortVersionString - 1.0.0 - CFBundleSignature - PTul - CFBundleVersion - 1.0.0 - NSHighResolutionCapable - - NSHumanReadableCopyright - Digital Suburban - - + + + + + + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + com.digitalsuburban.Dexed + CFBundleName + Dexed + CFBundlePackageType + TDMw + CFBundleSignature + PTul + CFBundleShortVersionString + 1.0.0 + CFBundleVersion + 1.0.0 + NSHumanReadableCopyright + Digital Suburban + NSHighResolutionCapable + + + diff --git a/Dexed.jucer b/Dexed.jucer index 425c742..efb2907 100644 --- a/Dexed.jucer +++ b/Dexed.jucer @@ -2,7 +2,7 @@ sinBitFilter; int32_t y1 = ((int64_t)y * (int64_t)gain) >> 24; output[i] += y1; phase += freq; @@ -77,7 +76,6 @@ void EngineMkI::compute(int32_t *output, const int32_t *input, for (int i = 0; i < N; i++) { gain += dgain; int32_t y = Sin::lookup(phase + input[i]); - y &= controllers->sinBitFilter; int32_t y1 = ((int64_t)y * (int64_t)gain) >> 24; output[i] = y1; phase += freq; @@ -95,7 +93,6 @@ void EngineMkI::compute_pure(int32_t *output, int32_t phase0, int32_t freq, for (int i = 0; i < N; i++) { gain += dgain; int32_t y = Sin::lookup(phase); - y &= controllers->sinBitFilter; int32_t y1 = ((int64_t)y * (int64_t)gain) >> 24; output[i] += y1; phase += freq; @@ -104,7 +101,6 @@ void EngineMkI::compute_pure(int32_t *output, int32_t phase0, int32_t freq, for (int i = 0; i < N; i++) { gain += dgain; int32_t y = Sin::lookup(phase); - y &= controllers->sinBitFilter; int32_t y1 = ((int64_t)y * (int64_t)gain) >> 24; output[i] = y1; phase += freq; @@ -126,7 +122,6 @@ void EngineMkI::compute_fb(int32_t *output, int32_t phase0, int32_t freq, int32_t scaled_fb = (y0 + y) >> (fb_shift + 1); y0 = y; y = Sin::lookup(phase + scaled_fb); - y &= controllers->sinBitFilter; y = ((int64_t)y * (int64_t)gain) >> 24; output[i] += y; phase += freq; @@ -137,7 +132,6 @@ void EngineMkI::compute_fb(int32_t *output, int32_t phase0, int32_t freq, int32_t scaled_fb = (y0 + y) >> (fb_shift + 1); y0 = y; y = Sin::lookup(phase + scaled_fb); - y &= controllers->sinBitFilter; y = ((int64_t)y * (int64_t)gain) >> 24; output[i] = y; phase += freq; @@ -173,14 +167,12 @@ void EngineMkI::compute_fb2(int32_t *output, FmOpParams *parms, int32_t gain01, int32_t scaled_fb = (y0 + y) >> (fb_shift + 2); // tsk tsk tsk: this needs some tuning y0 = y; y = Sin::lookup(phase[0] + scaled_fb); - y &= cont->sinBitFilter; y = ((int64_t)y * (int64_t)gain[0]) >> 24; phase[0] += parms[0].freq; // op 1 gain[1] += dgain[1]; y = Sin::lookup(phase[1] + y); - y &= cont->sinBitFilter; y = ((int64_t)y * (int64_t)gain[1]) >> 24; output[i] = y; phase[1] += parms[1].freq; @@ -218,21 +210,18 @@ void EngineMkI::compute_fb3(int32_t *output, FmOpParams *parms, int32_t gain01, int32_t scaled_fb = (y0 + y) >> (fb_shift + 6); // tsk tsk tsk: this needs some tuning y0 = y; y = Sin::lookup(phase[0] + scaled_fb); - y &= cont->sinBitFilter; y = ((int64_t)y * (int64_t)gain[0]) >> 24; phase[0] += parms[0].freq; // op 1 gain[1] += dgain[1]; y = Sin::lookup(phase[1] + y); - y &= cont->sinBitFilter; y = ((int64_t)y * (int64_t)gain[1]) >> 24; phase[1] += parms[1].freq; // op 2 gain[2] += dgain[2]; y = Sin::lookup(phase[2] + y); - y &= cont->sinBitFilter; y = ((int64_t)y * (int64_t)gain[2]) >> 24; output[i] = y; phase[2] += parms[2].freq; diff --git a/Source/ParamDialog.cpp b/Source/ParamDialog.cpp index 0c51929..6b061de 100644 --- a/Source/ParamDialog.cpp +++ b/Source/ParamDialog.cpp @@ -7,12 +7,12 @@ the "//[xyz]" and "//[/xyz]" sections will be retained when the file is loaded and re-saved. - Created with Introjucer version: 3.1.0 + Created with Introjucer version: 3.2.0 ------------------------------------------------------------------------------ The Introjucer is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-13 by Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. ============================================================================== */ @@ -30,6 +30,9 @@ //============================================================================== ParamDialog::ParamDialog () { + //[Constructor_pre] You can add your own custom stuff here.. + //[/Constructor_pre] + addAndMakeVisible (pitchRange = new Slider ("pitchRange")); pitchRange->setRange (0, 12, 1); pitchRange->setSliderStyle (Slider::RotaryVerticalDrag); @@ -75,11 +78,83 @@ ParamDialog::ParamDialog () addAndMakeVisible (showKeyboard = new ToggleButton ("showKeyboard")); showKeyboard->setButtonText (String::empty); + addAndMakeVisible (whlRange = new Slider ("whlRange")); + whlRange->setRange (0, 99, 1); + whlRange->setSliderStyle (Slider::RotaryVerticalDrag); + whlRange->setTextBoxStyle (Slider::TextBoxLeft, false, 80, 20); + whlRange->addListener (this); + + addAndMakeVisible (ftRange = new Slider ("ftRange")); + ftRange->setRange (0, 99, 1); + ftRange->setSliderStyle (Slider::RotaryVerticalDrag); + ftRange->setTextBoxStyle (Slider::TextBoxLeft, false, 80, 20); + ftRange->addListener (this); + + addAndMakeVisible (brRange = new Slider ("brRange")); + brRange->setRange (0, 99, 1); + brRange->setSliderStyle (Slider::RotaryVerticalDrag); + brRange->setTextBoxStyle (Slider::TextBoxLeft, false, 80, 20); + brRange->addListener (this); + + addAndMakeVisible (atRange = new Slider ("atRange")); + atRange->setRange (0, 99, 1); + atRange->setSliderStyle (Slider::RotaryVerticalDrag); + atRange->setTextBoxStyle (Slider::TextBoxLeft, false, 80, 20); + atRange->addListener (this); + + addAndMakeVisible (whlEg = new ToggleButton ("whlEg")); + whlEg->setButtonText (String::empty); + whlEg->addListener (this); + + addAndMakeVisible (ftEg = new ToggleButton ("ftEg")); + ftEg->setButtonText (String::empty); + ftEg->addListener (this); + + addAndMakeVisible (brEg = new ToggleButton ("brEg")); + brEg->setButtonText (String::empty); + brEg->addListener (this); + + addAndMakeVisible (atEg = new ToggleButton ("atEg")); + atEg->setButtonText (String::empty); + atEg->addListener (this); + + addAndMakeVisible (whlAmp = new ToggleButton ("whlAmp")); + whlAmp->setButtonText (String::empty); + whlAmp->addListener (this); + + addAndMakeVisible (ftAmp = new ToggleButton ("ftAmp")); + ftAmp->setButtonText (String::empty); + ftAmp->addListener (this); + + addAndMakeVisible (brAmp = new ToggleButton ("brAmp")); + brAmp->setButtonText (String::empty); + brAmp->addListener (this); + + addAndMakeVisible (atAmp = new ToggleButton ("atAmp")); + atAmp->setButtonText (String::empty); + atAmp->addListener (this); + + addAndMakeVisible (whlPitch = new ToggleButton ("whlPitch")); + whlPitch->setButtonText (String::empty); + whlPitch->addListener (this); + + addAndMakeVisible (ftPitch = new ToggleButton ("ftPitch")); + ftPitch->setButtonText (String::empty); + ftPitch->addListener (this); + + addAndMakeVisible (brPitch = new ToggleButton ("brPitch")); + brPitch->setButtonText (String::empty); + brPitch->addListener (this); + + addAndMakeVisible (atPitch = new ToggleButton ("atPitch")); + atPitch->setButtonText (String::empty); + atPitch->addListener (this); + //[UserPreSize] //[/UserPreSize] - setSize (350, 350); + setSize (700, 350); //[Constructor] You can add your own custom stuff here.. @@ -110,6 +185,22 @@ ParamDialog::~ParamDialog() sysexChl = nullptr; engineReso = nullptr; showKeyboard = nullptr; + whlRange = nullptr; + ftRange = nullptr; + brRange = nullptr; + atRange = nullptr; + whlEg = nullptr; + ftEg = nullptr; + brEg = nullptr; + atEg = nullptr; + whlAmp = nullptr; + ftAmp = nullptr; + brAmp = nullptr; + atAmp = nullptr; + whlPitch = nullptr; + ftPitch = nullptr; + brPitch = nullptr; + atPitch = nullptr; //[Destructor]. You can add your own custom destruction code here.. @@ -172,12 +263,60 @@ void ParamDialog::paint (Graphics& g) 20, 96, 276, 23, Justification::centredLeft, true); + g.setColour (Colours::black); + g.fillRect (352, 11, 1, 325); + + g.setColour (Colours::white); + g.setFont (Font (15.00f, Font::plain)); + g.drawText (TRANS("Wheel"), + 368, 19, 276, 23, + Justification::centredLeft, true); + + g.setColour (Colours::white); + g.setFont (Font (15.00f, Font::plain)); + g.drawText (TRANS("Foot"), + 368, 99, 276, 23, + Justification::centredLeft, true); + + g.setColour (Colours::white); + g.setFont (Font (15.00f, Font::plain)); + g.drawText (TRANS("Breath"), + 368, 59, 276, 23, + Justification::centredLeft, true); + + g.setColour (Colours::white); + g.setFont (Font (15.00f, Font::plain)); + g.drawText (TRANS("After Touch"), + 368, 139, 276, 23, + Justification::centredLeft, true); + + g.setColour (Colours::white); + g.setFont (Font (15.00f, Font::plain)); + g.drawText (TRANS("PITCH"), + 536, 163, 48, 23, + Justification::centred, true); + + g.setColour (Colours::white); + g.setFont (Font (15.00f, Font::plain)); + g.drawText (TRANS("AMP"), + 592, 163, 48, 21, + Justification::centred, true); + + g.setColour (Colours::white); + g.setFont (Font (15.00f, Font::plain)); + g.drawText (TRANS("EG BIAS"), + 648, 163, 48, 23, + Justification::centred, true); + //[UserPaint] Add your own custom painting code here.. //[/UserPaint] } void ParamDialog::resized() { + //[UserPreResize] Add your own custom resize code here.. + //[/UserPreResize] + pitchRange->setBounds (264, 16, 72, 24); pitchStep->setBounds (264, 56, 72, 24); sysexIn->setBounds (104, 224, 224, 24); @@ -185,6 +324,22 @@ void ParamDialog::resized() sysexChl->setBounds (264, 304, 72, 24); engineReso->setBounds (160, 156, 168, 24); showKeyboard->setBounds (264, 96, 56, 24); + whlRange->setBounds (448, 16, 72, 24); + ftRange->setBounds (448, 56, 72, 24); + brRange->setBounds (448, 96, 72, 24); + atRange->setBounds (448, 136, 72, 24); + whlEg->setBounds (640, 16, 56, 24); + ftEg->setBounds (640, 56, 56, 24); + brEg->setBounds (640, 96, 56, 24); + atEg->setBounds (640, 136, 56, 24); + whlAmp->setBounds (584, 16, 56, 24); + ftAmp->setBounds (584, 56, 56, 24); + brAmp->setBounds (584, 96, 56, 24); + atAmp->setBounds (584, 136, 56, 24); + whlPitch->setBounds (528, 16, 56, 24); + ftPitch->setBounds (528, 56, 56, 24); + brPitch->setBounds (528, 96, 56, 24); + atPitch->setBounds (528, 136, 56, 24); //[UserResized] Add your own custom resize handling here.. //[/UserResized] } @@ -210,6 +365,26 @@ void ParamDialog::sliderValueChanged (Slider* sliderThatWasMoved) //[UserSliderCode_sysexChl] -- add your slider handling code here.. //[/UserSliderCode_sysexChl] } + else if (sliderThatWasMoved == whlRange) + { + //[UserSliderCode_whlRange] -- add your slider handling code here.. + //[/UserSliderCode_whlRange] + } + else if (sliderThatWasMoved == ftRange) + { + //[UserSliderCode_ftRange] -- add your slider handling code here.. + //[/UserSliderCode_ftRange] + } + else if (sliderThatWasMoved == brRange) + { + //[UserSliderCode_brRange] -- add your slider handling code here.. + //[/UserSliderCode_brRange] + } + else if (sliderThatWasMoved == atRange) + { + //[UserSliderCode_atRange] -- add your slider handling code here.. + //[/UserSliderCode_atRange] + } //[UsersliderValueChanged_Post] //[/UsersliderValueChanged_Post] @@ -240,6 +415,76 @@ void ParamDialog::comboBoxChanged (ComboBox* comboBoxThatHasChanged) //[/UsercomboBoxChanged_Post] } +void ParamDialog::buttonClicked (Button* buttonThatWasClicked) +{ + //[UserbuttonClicked_Pre] + //[/UserbuttonClicked_Pre] + + if (buttonThatWasClicked == whlEg) + { + //[UserButtonCode_whlEg] -- add your button handler code here.. + //[/UserButtonCode_whlEg] + } + else if (buttonThatWasClicked == ftEg) + { + //[UserButtonCode_ftEg] -- add your button handler code here.. + //[/UserButtonCode_ftEg] + } + else if (buttonThatWasClicked == brEg) + { + //[UserButtonCode_brEg] -- add your button handler code here.. + //[/UserButtonCode_brEg] + } + else if (buttonThatWasClicked == atEg) + { + //[UserButtonCode_atEg] -- add your button handler code here.. + //[/UserButtonCode_atEg] + } + else if (buttonThatWasClicked == whlAmp) + { + //[UserButtonCode_whlAmp] -- add your button handler code here.. + //[/UserButtonCode_whlAmp] + } + else if (buttonThatWasClicked == ftAmp) + { + //[UserButtonCode_ftAmp] -- add your button handler code here.. + //[/UserButtonCode_ftAmp] + } + else if (buttonThatWasClicked == brAmp) + { + //[UserButtonCode_brAmp] -- add your button handler code here.. + //[/UserButtonCode_brAmp] + } + else if (buttonThatWasClicked == atAmp) + { + //[UserButtonCode_atAmp] -- add your button handler code here.. + //[/UserButtonCode_atAmp] + } + else if (buttonThatWasClicked == whlPitch) + { + //[UserButtonCode_whlPitch] -- add your button handler code here.. + //[/UserButtonCode_whlPitch] + } + else if (buttonThatWasClicked == ftPitch) + { + //[UserButtonCode_ftPitch] -- add your button handler code here.. + //[/UserButtonCode_ftPitch] + } + else if (buttonThatWasClicked == brPitch) + { + //[UserButtonCode_brPitch] -- add your button handler code here.. + //[/UserButtonCode_brPitch] + } + else if (buttonThatWasClicked == atPitch) + { + //[UserButtonCode_atPitch] -- add your button handler code here.. + //[/UserButtonCode_atPitch] + } + + //[UserbuttonClicked_Post] + //[/UserbuttonClicked_Post] +} + //[MiscUserCode] You can add your own definitions of your custom methods or any other code here... @@ -249,6 +494,27 @@ void ParamDialog::setDialogValues(Controllers &c, SysexComm &mgr, int reso, bool pitchStep->setValue(c.values_[kControllerPitchStep]); sysexChl->setValue(mgr.getChl() + 1); + whlRange->setValue(c.wheel.range); + whlPitch->setToggleState(c.wheel.pitch, dontSendNotification); + whlPitch->setToggleState(c.wheel.pitch, dontSendNotification); + whlAmp->setToggleState(c.wheel.amp, dontSendNotification); + whlEg->setToggleState(c.wheel.eg, dontSendNotification); + + ftRange->setValue(c.foot.range); + ftPitch->setToggleState(c.foot.pitch, dontSendNotification); + ftAmp->setToggleState(c.foot.amp, dontSendNotification); + ftEg->setToggleState(c.foot.eg, dontSendNotification); + + brRange->setValue(c.breath.range); + brPitch->setToggleState(c.breath.pitch, dontSendNotification); + brAmp->setToggleState(c.breath.amp, dontSendNotification); + brEg->setToggleState(c.breath.eg, dontSendNotification); + + atRange->setValue(c.at.range); + atPitch->setToggleState(c.at.pitch, dontSendNotification); + atAmp->setToggleState(c.at.amp, dontSendNotification); + atEg->setToggleState(c.at.eg, dontSendNotification); + StringArray inputs = MidiInput::getDevices(); int idx = inputs.indexOf(mgr.getInput()); idx = idx == -1 ? 0 : idx + 1; @@ -268,6 +534,29 @@ bool ParamDialog::getDialogValues(Controllers &c, SysexComm &mgr, int *reso, boo c.values_[kControllerPitchRange] = pitchRange->getValue(); c.values_[kControllerPitchStep] = pitchStep->getValue(); + + c.wheel.range = whlRange->getValue(); + c.wheel.pitch = whlPitch->getToggleState(); + c.wheel.amp = whlAmp->getToggleState(); + c.wheel.eg = whlEg->getToggleState(); + + c.foot.range = ftRange->getValue(); + c.foot.pitch = ftPitch->getToggleState(); + c.foot.amp = ftAmp->getToggleState(); + c.foot.eg = ftEg->getToggleState(); + + c.breath.range = brRange->getValue(); + c.breath.pitch = brPitch->getToggleState(); + c.breath.amp = brAmp->getToggleState(); + c.breath.eg = brEg->getToggleState(); + + c.at.range = atRange->getValue(); + c.at.pitch = atPitch->getToggleState(); + c.at.amp = atAmp->getToggleState(); + c.at.eg = atEg->getToggleState(); + + c.refresh(); + ret &= mgr.setInput(sysexIn->getItemText(sysexIn->getSelectedItemIndex())); ret &= mgr.setOutput(sysexOut->getItemText(sysexOut->getSelectedItemIndex())); mgr.setChl(sysexChl->getValue() - 1); @@ -292,7 +581,7 @@ BEGIN_JUCER_METADATA + fixedSize="1" initialWidth="700" initialHeight="350"> @@ -310,6 +599,21 @@ BEGIN_JUCER_METADATA + + + + + + + + + + + + + + + + + + + + + + + + END_JUCER_METADATA diff --git a/Source/ParamDialog.h b/Source/ParamDialog.h index 0c3fa08..c5cd896 100644 --- a/Source/ParamDialog.h +++ b/Source/ParamDialog.h @@ -7,12 +7,12 @@ the "//[xyz]" and "//[/xyz]" sections will be retained when the file is loaded and re-saved. - Created with Introjucer version: 3.1.0 + Created with Introjucer version: 3.2.0 ------------------------------------------------------------------------------ The Introjucer is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-13 by Raw Material Software Ltd. + Copyright (c) 2015 - ROLI Ltd. ============================================================================== */ @@ -38,7 +38,8 @@ */ class ParamDialog : public Component, public SliderListener, - public ComboBoxListener + public ComboBoxListener, + public ButtonListener { public: //============================================================================== @@ -55,6 +56,7 @@ public: void resized(); void sliderValueChanged (Slider* sliderThatWasMoved); void comboBoxChanged (ComboBox* comboBoxThatHasChanged); + void buttonClicked (Button* buttonThatWasClicked); @@ -70,6 +72,22 @@ private: ScopedPointer sysexChl; ScopedPointer engineReso; ScopedPointer showKeyboard; + ScopedPointer whlRange; + ScopedPointer ftRange; + ScopedPointer brRange; + ScopedPointer atRange; + ScopedPointer whlEg; + ScopedPointer ftEg; + ScopedPointer brEg; + ScopedPointer atEg; + ScopedPointer whlAmp; + ScopedPointer ftAmp; + ScopedPointer brAmp; + ScopedPointer atAmp; + ScopedPointer whlPitch; + ScopedPointer ftPitch; + ScopedPointer brPitch; + ScopedPointer atPitch; //============================================================================== diff --git a/Source/PluginData.cpp b/Source/PluginData.cpp index bf5bce0..26cf328 100644 --- a/Source/PluginData.cpp +++ b/Source/PluginData.cpp @@ -286,6 +286,7 @@ void DexedAudioProcessor::getStateInformation(MemoryBlock& destData) { dexedState.setAttribute("monoMode", monoMode); dexedState.setAttribute("engineType", (int) engineType); + if ( activeFileCartridge.exists() ) dexedState.setAttribute("activeFileCartridge", activeFileCartridge.getFullPathName()); diff --git a/Source/PluginProcessor.cpp b/Source/PluginProcessor.cpp index 241ab0a..22c366d 100644 --- a/Source/PluginProcessor.cpp +++ b/Source/PluginProcessor.cpp @@ -99,7 +99,10 @@ void DexedAudioProcessor::prepareToPlay(double sampleRate, int samplesPerBlock) currentNote = 0; controllers.values_[kControllerPitch] = 0x2000; - controllers.values_[kControllerModWheel] = 0; + controllers.modwheel_cc = 0; + controllers.foot_cc = 0; + controllers.breath_cc = 0; + controllers.aftertouch_cc = 0; sustain = false; extra_buf_size = 0; @@ -265,36 +268,49 @@ void DexedAudioProcessor::processMidiMessage(const MidiMessage *msg) { case 0x90 : keydown(buf[1], buf[2]); return; - + case 0xb0 : { - int controller = buf[1]; + int ctrl = buf[1]; int value = buf[2]; - // mod wheel - if ( controller == 1 ) { - controllers.values_[kControllerModWheel] = value; - return; - } - - // pedal - if (controller == 64) { - sustain = value != 0; - if (!sustain) { - for (int note = 0; note < MAX_ACTIVE_NOTES; note++) { - if (voices[note].sustained && !voices[note].keydown) { - voices[note].dx7_note->keyup(); - voices[note].sustained = false; + switch(ctrl) { + case 1: + controllers.modwheel_cc = value; + controllers.refresh(); + break; + case 2: + controllers.breath_cc = value; + controllers.refresh(); + break; + case 4: + controllers.foot_cc = value; + controllers.refresh(); + break; + case 5: + sustain = value != 0; + if (!sustain) { + for (int note = 0; note < MAX_ACTIVE_NOTES; note++) { + if (voices[note].sustained && !voices[note].keydown) { + voices[note].dx7_note->keyup(); + voices[note].sustained = false; + } } } - } - return; + break; } } return; case 0xc0 : setCurrentProgram(buf[1]); - return; + return; + + // aftertouch + case 0xd0 : + controllers.aftertouch_cc = buf[1]; + controllers.refresh(); + return; + } switch (cmd) { @@ -464,8 +480,6 @@ void DexedAudioProcessor::setEngineType(int tp) { controllers.core = &engineMsfa; break; case DEXED_ENGINE_MARKI: - controllers.sinBitFilter = 0xFFFFC000; // 10 bit - controllers.dacBitFilter = 0xFFFFF000; // semi 14 bit controllers.core = &engineMkI; break; case DEXED_ENGINE_OPL: diff --git a/Source/PluginProcessor.h b/Source/PluginProcessor.h index da8abaf..cb607e7 100644 --- a/Source/PluginProcessor.h +++ b/Source/PluginProcessor.h @@ -154,7 +154,6 @@ public : ScopedPointer fxReso; ScopedPointer output; - //int importSysex(const char *imported); void loadCartridge(Cartridge &cart); void setDxValue(int offset, int v); diff --git a/Source/msfa/controllers.h b/Source/msfa/controllers.h index 873e2e0..b065fc4 100755 --- a/Source/msfa/controllers.h +++ b/Source/msfa/controllers.h @@ -1,12 +1,12 @@ /* * Copyright 2013 Google Inc. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -18,25 +18,79 @@ #define __CONTROLLERS_H #include "synth.h" +#include "../Dexed.h" // State of MIDI controllers -const int kControllerModWheel = 1; const int kControllerPitch = 128; const int kControllerPitchRange = 129; const int kControllerPitchStep = 130; class FmCore; +struct FmMod { + int range = 0; + bool pitch = false; + bool amp = false; + bool eg = false; +}; + class Controllers { - public: - int values_[131]; + void applyMod(int cc, FmMod &mod) { + float range = 0.01 * mod.range; + if ( mod.amp ) { + int total = cc * range; + if ( amp_mod + total > 127 ) + amp_mod = 127; + else + amp_mod += total; + } + if ( mod.pitch ) { + int total = cc * range; + if ( pitch_mod + total > 127 ) + pitch_mod = 127; + else + pitch_mod += total; + } + if ( mod.eg ) { + int total = cc * range; + if ( eg_mod + total > 127 ) + eg_mod = 127; + else + eg_mod += total; + } + } + +public: + int values_[131]; + + int amp_mod = 0; + int pitch_mod = 0; + int eg_mod = 0; + + int aftertouch_cc; + int breath_cc; + int foot_cc; + int modwheel_cc; + + FmMod wheel; + FmMod foot; + FmMod breath; + FmMod at; - // engine bit filters - uint32_t sinBitFilter; // bit filter based upon sin LUT lookup - uint32_t dacBitFilter; // bit filter based upon DAC resolution - uint32_t mulBitFilter; // bit filter based upon multipliers (?????) + void refresh() { + amp_mod = 0; + pitch_mod = 0; + eg_mod = 0; + + applyMod(modwheel_cc, wheel); + applyMod(breath_cc, breath); + applyMod(foot_cc, foot); + applyMod(aftertouch_cc, at); + + TRACE("amp_mod %d pitch_mod %d", amp_mod, pitch_mod); + } - FmCore *core; + FmCore *core; }; #endif // __CONTROLLERS_H diff --git a/Source/msfa/dx7note.cc b/Source/msfa/dx7note.cc index 6be3a04..c10f18b 100644 --- a/Source/msfa/dx7note.cc +++ b/Source/msfa/dx7note.cc @@ -1,12 +1,12 @@ /* * Copyright 2012 Google Inc. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -14,10 +14,6 @@ * limitations under the License. */ -#ifdef VERBOSE -#include -using namespace std; -#endif #include #include #include "synth.h" @@ -27,104 +23,104 @@ using namespace std; #include "dx7note.h" int32_t midinote_to_logfreq(int midinote) { - const int base = 50857777; // (1 << 24) * (log(440) / log(2) - 69/12) - const int step = (1 << 24) / 12; - return base + step * midinote; + const int base = 50857777; // (1 << 24) * (log(440) / log(2) - 69/12) + const int step = (1 << 24) / 12; + return base + step * midinote; } const int32_t coarsemul[] = { - -16777216, 0, 16777216, 26591258, 33554432, 38955489, 43368474, 47099600, - 50331648, 53182516, 55732705, 58039632, 60145690, 62083076, 63876816, - 65546747, 67108864, 68576247, 69959732, 71268397, 72509921, 73690858, - 74816848, 75892776, 76922906, 77910978, 78860292, 79773775, 80654032, - 81503396, 82323963, 83117622 + -16777216, 0, 16777216, 26591258, 33554432, 38955489, 43368474, 47099600, + 50331648, 53182516, 55732705, 58039632, 60145690, 62083076, 63876816, + 65546747, 67108864, 68576247, 69959732, 71268397, 72509921, 73690858, + 74816848, 75892776, 76922906, 77910978, 78860292, 79773775, 80654032, + 81503396, 82323963, 83117622 }; int32_t osc_freq(int midinote, int mode, int coarse, int fine, int detune) { - // TODO: pitch randomization - int32_t logfreq; - if (mode == 0) { - logfreq = midinote_to_logfreq(midinote); - logfreq += coarsemul[coarse & 31]; - if (fine) { - // (1 << 24) / log(2) - logfreq += (int32_t)floor(24204406.323123 * log(1 + 0.01 * fine) + 0.5); + // TODO: pitch randomization + int32_t logfreq; + if (mode == 0) { + logfreq = midinote_to_logfreq(midinote); + logfreq += coarsemul[coarse & 31]; + if (fine) { + // (1 << 24) / log(2) + logfreq += (int32_t)floor(24204406.323123 * log(1 + 0.01 * fine) + 0.5); + } + // This was measured at 7.213Hz per count at 9600Hz, but the exact + // value is somewhat dependent on midinote. Close enough for now. + logfreq += 12606 * (detune - 7); + } else { + // ((1 << 24) * log(10) / log(2) * .01) << 3 + logfreq = (4458616 * ((coarse & 3) * 100 + fine)) >> 3; + logfreq += detune > 7 ? 13457 * (detune - 7) : 0; } - // This was measured at 7.213Hz per count at 9600Hz, but the exact - // value is somewhat dependent on midinote. Close enough for now. - logfreq += 12606 * (detune - 7); - } else { - // ((1 << 24) * log(10) / log(2) * .01) << 3 - logfreq = (4458616 * ((coarse & 3) * 100 + fine)) >> 3; - logfreq += detune > 7 ? 13457 * (detune - 7) : 0; - } - return logfreq; + return logfreq; } const uint8_t velocity_data[64] = { - 0, 70, 86, 97, 106, 114, 121, 126, 132, 138, 142, 148, 152, 156, 160, 163, - 166, 170, 173, 174, 178, 181, 184, 186, 189, 190, 194, 196, 198, 200, 202, - 205, 206, 209, 211, 214, 216, 218, 220, 222, 224, 225, 227, 229, 230, 232, - 233, 235, 237, 238, 240, 241, 242, 243, 244, 246, 246, 248, 249, 250, 251, - 252, 253, 254 + 0, 70, 86, 97, 106, 114, 121, 126, 132, 138, 142, 148, 152, 156, 160, 163, + 166, 170, 173, 174, 178, 181, 184, 186, 189, 190, 194, 196, 198, 200, 202, + 205, 206, 209, 211, 214, 216, 218, 220, 222, 224, 225, 227, 229, 230, 232, + 233, 235, 237, 238, 240, 241, 242, 243, 244, 246, 246, 248, 249, 250, 251, + 252, 253, 254 }; // See "velocity" section of notes. Returns velocity delta in microsteps. int ScaleVelocity(int velocity, int sensitivity) { - int clamped_vel = max(0, min(127, velocity)); - int vel_value = velocity_data[clamped_vel >> 1] - 239; - int scaled_vel = ((sensitivity * vel_value + 7) >> 3) << 4; - return scaled_vel; + int clamped_vel = max(0, min(127, velocity)); + int vel_value = velocity_data[clamped_vel >> 1] - 239; + int scaled_vel = ((sensitivity * vel_value + 7) >> 3) << 4; + return scaled_vel; } int ScaleRate(int midinote, int sensitivity) { - int x = min(31, max(0, midinote / 3 - 7)); - int qratedelta = (sensitivity * x) >> 3; + int x = min(31, max(0, midinote / 3 - 7)); + int qratedelta = (sensitivity * x) >> 3; #ifdef SUPER_PRECISE - int rem = x & 7; - if (sensitivity == 3 && rem == 3) { - qratedelta -= 1; - } else if (sensitivity == 7 && rem > 0 && rem < 4) { - qratedelta += 1; - } + int rem = x & 7; + if (sensitivity == 3 && rem == 3) { + qratedelta -= 1; + } else if (sensitivity == 7 && rem > 0 && rem < 4) { + qratedelta += 1; + } #endif - return qratedelta; + return qratedelta; } const uint8_t exp_scale_data[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 14, 16, 19, 23, 27, 33, 39, 47, 56, 66, - 80, 94, 110, 126, 142, 158, 174, 190, 206, 222, 238, 250 + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 14, 16, 19, 23, 27, 33, 39, 47, 56, 66, + 80, 94, 110, 126, 142, 158, 174, 190, 206, 222, 238, 250 }; int ScaleCurve(int group, int depth, int curve) { - int scale; - if (curve == 0 || curve == 3) { - // linear - scale = (group * depth * 329) >> 12; - } else { - // exponential - int n_scale_data = sizeof(exp_scale_data); - int raw_exp = exp_scale_data[min(group, n_scale_data - 1)]; - scale = (raw_exp * depth * 329) >> 15; - } - if (curve < 2) { - scale = -scale; - } - return scale; + int scale; + if (curve == 0 || curve == 3) { + // linear + scale = (group * depth * 329) >> 12; + } else { + // exponential + int n_scale_data = sizeof(exp_scale_data); + int raw_exp = exp_scale_data[min(group, n_scale_data - 1)]; + scale = (raw_exp * depth * 329) >> 15; + } + if (curve < 2) { + scale = -scale; + } + return scale; } int ScaleLevel(int midinote, int break_pt, int left_depth, int right_depth, - int left_curve, int right_curve) { - int offset = midinote - break_pt - 17; - if (offset >= 0) { - return ScaleCurve(offset / 3, right_depth, right_curve); - } else { - return ScaleCurve((-offset) / 3, left_depth, left_curve); - } + int left_curve, int right_curve) { + int offset = midinote - break_pt - 17; + if (offset >= 0) { + return ScaleCurve(offset / 3, right_depth, right_curve); + } else { + return ScaleCurve((-offset) / 3, left_depth, left_curve); + } } static const uint8_t pitchmodsenstab[] = { - 0, 10, 20, 33, 55, 92, 153, 255 + 0, 10, 20, 33, 55, 92, 153, 255 }; // 0, 66, 109, 255 @@ -140,74 +136,58 @@ Dx7Note::Dx7Note() { } void Dx7Note::init(const uint8_t patch[156], int midinote, int velocity) { - int rates[4]; - int levels[4]; - for (int op = 0; op < 6; op++) { - int off = op * 21; - for (int i = 0; i < 4; i++) { - rates[i] = patch[off + i]; - levels[i] = patch[off + 4 + i]; + int rates[4]; + int levels[4]; + for (int op = 0; op < 6; op++) { + int off = op * 21; + for (int i = 0; i < 4; i++) { + rates[i] = patch[off + i]; + levels[i] = patch[off + 4 + i]; + } + int outlevel = patch[off + 16]; + outlevel = Env::scaleoutlevel(outlevel); + int level_scaling = ScaleLevel(midinote, patch[off + 8], patch[off + 9], + patch[off + 10], patch[off + 11], patch[off + 12]); + outlevel += level_scaling; + outlevel = min(127, outlevel); + outlevel = outlevel << 5; + outlevel += ScaleVelocity(velocity, patch[off + 15]); + outlevel = max(0, outlevel); + int rate_scaling = ScaleRate(midinote, patch[off + 13]); + env_[op].init(rates, levels, outlevel, rate_scaling); + + int mode = patch[off + 17]; + int coarse = patch[off + 18]; + int fine = patch[off + 19]; + int detune = patch[off + 20]; + int32_t freq = osc_freq(midinote, mode, coarse, fine, detune); + basepitch_[op] = freq; + ampmodsens_[op] = ampmodsenstab[patch[off + 14] & 3]; } - int outlevel = patch[off + 16]; - outlevel = Env::scaleoutlevel(outlevel); -#ifdef VERBOSE - for (int j = 8; j < 12; j++) { - cout << (int)patch[off + j] << " "; + for (int i = 0; i < 4; i++) { + rates[i] = patch[126 + i]; + levels[i] = patch[130 + i]; } -#endif - int level_scaling = ScaleLevel(midinote, patch[off + 8], patch[off + 9], - patch[off + 10], patch[off + 11], patch[off + 12]); - outlevel += level_scaling; - outlevel = min(127, outlevel); -#ifdef VERBOSE - cout << op << ": " << level_scaling << " " << outlevel << endl; -#endif - outlevel = outlevel << 5; - outlevel += ScaleVelocity(velocity, patch[off + 15]); - outlevel = max(0, outlevel); - int rate_scaling = ScaleRate(midinote, patch[off + 13]); - env_[op].init(rates, levels, outlevel, rate_scaling); - - int mode = patch[off + 17]; - int coarse = patch[off + 18]; - int fine = patch[off + 19]; - int detune = patch[off + 20]; - int32_t freq = osc_freq(midinote, mode, coarse, fine, detune); - basepitch_[op] = freq; - // cout << op << " freq: " << freq << endl; - //params_[op].phase = 0; - //params_[op].gain_out = 0; - ampmodsens_[op] = ampmodsenstab[patch[off + 14] & 3]; - } - for (int i = 0; i < 4; i++) { - rates[i] = patch[126 + i]; - levels[i] = patch[130 + i]; - } - pitchenv_.set(rates, levels); - algorithm_ = patch[134]; - int feedback = patch[135]; - fb_shift_ = feedback != 0 ? 8 - feedback : 16; - pitchmoddepth_ = (patch[139] * 165) >> 6; - pitchmodsens_ = pitchmodsenstab[patch[143] & 7]; - ampmoddepth_ = (patch[140] * 165) >> 6; + pitchenv_.set(rates, levels); + algorithm_ = patch[134]; + int feedback = patch[135]; + fb_shift_ = feedback != 0 ? 8 - feedback : 16; + pitchmoddepth_ = (patch[139] * 165) >> 6; + pitchmodsens_ = pitchmodsenstab[patch[143] & 7]; + ampmoddepth_ = (patch[140] * 165) >> 6; } void Dx7Note::compute(int32_t *buf, int32_t lfo_val, int32_t lfo_delay, const Controllers *ctrls) { - int32_t pitchmod = pitchenv_.getsample(); + // ==== PITCH ==== uint32_t pmd = pitchmoddepth_ * lfo_delay; // Q32 - // TODO(PG) : make this integer friendly - uint32_t pwmd = (ctrls->values_[kControllerModWheel] * 0.7874) * (1 << 24); int32_t senslfo = pitchmodsens_ * (lfo_val - (1 << 23)); + int32_t pmod_1 = (((int64_t) pmd) * (int64_t) senslfo) >> 39; + int32_t pmod_2 = ((int64_t)ctrls->pitch_mod * (int64_t)senslfo) >> 14; + int32_t pitch_mod = pitchenv_.getsample() + max(pmod_1, pmod_2); - uint32_t amd = ((int64_t) ampmoddepth_ * (int64_t) lfo_delay) >> 8; // Q24 :D - amd = ((int64_t) amd * (int64_t) lfo_val) >> 24; - - pitchmod += (((int64_t) pwmd) * (int64_t) senslfo) >> 39; - pitchmod += (((int64_t) pmd) * (int64_t) senslfo) >> 39; - + // ---- PITCH BEND ---- int pitchbend = ctrls->values_[kControllerPitch]; int32_t pb = (pitchbend - 0x2000); - if (pb != 0) { if (ctrls->values_[kControllerPitchStep] == 0) { pb = ((float) (pb << 11)) * ((float) ctrls->values_[kControllerPitchRange]) / 12.0; @@ -217,15 +197,26 @@ void Dx7Note::compute(int32_t *buf, int32_t lfo_val, int32_t lfo_delay, const Co pb = (pb * (8191 / stp)) << 11; } } - - pitchmod += pb; + pitch_mod += pb; + + // ==== AMP MOD ==== + uint32_t amod_1 = ((int64_t) ampmoddepth_ * (int64_t) lfo_delay) >> 8; // Q24 :D + amod_1 = ((int64_t) amod_1 * (int64_t) lfo_val) >> 24; + uint32_t amod_2 = ((int64_t) ctrls->amp_mod * (int64_t) lfo_val) >> 7; // Q?? :| + uint32_t amd_mod = max(amod_1, amod_2); + + // ==== EG AMP MOD ==== + uint32_t amod_3 = (ctrls->eg_mod+1) << 16; + amd_mod = max((1<<23) - amod_3, amd_mod); + + // ==== OP RENDER ==== for (int op = 0; op < 6; op++) { //int32_t gain = pow(2, 10 + level * (1.0 / (1 << 24))); - params_[op].freq = Freqlut::lookup(basepitch_[op] + pitchmod); - + params_[op].freq = Freqlut::lookup(basepitch_[op] + pitch_mod); + int32_t level = env_[op].getsample(); if (ampmodsens_[op] != 0) { - uint32_t sensamp = ((uint64_t) amd) * ((uint64_t) ampmodsens_[op]) >> 24; + uint32_t sensamp = ((uint64_t) amd_mod) * ((uint64_t) ampmodsens_[op]) >> 24; // TODO: mehhh.. this needs some real tuning. uint32_t pt = exp(((float)sensamp)/262144 * 0.07 + 12.2); @@ -238,36 +229,36 @@ void Dx7Note::compute(int32_t *buf, int32_t lfo_val, int32_t lfo_delay, const Co } void Dx7Note::keyup() { - for (int op = 0; op < 6; op++) { - env_[op].keydown(false); - pitchenv_.keydown(false); - } + for (int op = 0; op < 6; op++) { + env_[op].keydown(false); + pitchenv_.keydown(false); + } } void Dx7Note::update(const uint8_t patch[156], int midinote) { - for (int op = 0; op < 6; op++) { - int off = op * 21; - int mode = patch[off + 17]; - int coarse = patch[off + 18]; - int fine = patch[off + 19]; - int detune = patch[off + 20]; - basepitch_[op] = osc_freq(midinote, mode, coarse, fine, detune); - ampmodsens_[op] = ampmodsenstab[patch[off + 14] & 3]; - } - algorithm_ = patch[134]; - int feedback = patch[135]; - fb_shift_ = feedback != 0 ? 8 - feedback : 16; - pitchmoddepth_ = (patch[139] * 165) >> 6; - pitchmodsens_ = pitchmodsenstab[patch[143] & 7]; - ampmoddepth_ = (patch[140] * 165) >> 6; + for (int op = 0; op < 6; op++) { + int off = op * 21; + int mode = patch[off + 17]; + int coarse = patch[off + 18]; + int fine = patch[off + 19]; + int detune = patch[off + 20]; + basepitch_[op] = osc_freq(midinote, mode, coarse, fine, detune); + ampmodsens_[op] = ampmodsenstab[patch[off + 14] & 3]; + } + algorithm_ = patch[134]; + int feedback = patch[135]; + fb_shift_ = feedback != 0 ? 8 - feedback : 16; + pitchmoddepth_ = (patch[139] * 165) >> 6; + pitchmodsens_ = pitchmodsenstab[patch[143] & 7]; + ampmoddepth_ = (patch[140] * 165) >> 6; } void Dx7Note::peekVoiceStatus(VoiceStatus &status) { - for(int i=0;i<6;i++) { - status.amp[i] = Exp2::lookup(params_[i].level_in - (14 * (1 << 24))); - env_[i].getPosition(&status.ampStep[i]); - } - pitchenv_.getPosition(&status.pitchStep); + for(int i=0;i<6;i++) { + status.amp[i] = Exp2::lookup(params_[i].level_in - (14 * (1 << 24))); + env_[i].getPosition(&status.ampStep[i]); + } + pitchenv_.getPosition(&status.pitchStep); } /** diff --git a/Source/msfa/dx7note.h b/Source/msfa/dx7note.h index 2adb55a..a8153b3 100644 --- a/Source/msfa/dx7note.h +++ b/Source/msfa/dx7note.h @@ -1,12 +1,12 @@ /* * Copyright 2012 Google Inc. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -28,48 +28,48 @@ #include "fm_core.h" struct VoiceStatus { - uint32_t amp[6]; - char ampStep[6]; - char pitchStep; + uint32_t amp[6]; + char ampStep[6]; + char pitchStep; }; class Dx7Note { - public: - Dx7Note(); - void init(const uint8_t patch[156], int midinote, int velocity); - - // Note: this _adds_ to the buffer. Interesting question whether it's - // worth it... - void compute(int32_t *buf, int32_t lfo_val, int32_t lfo_delay, - const Controllers *ctrls); - - void keyup(); +public: + Dx7Note(); + void init(const uint8_t patch[156], int midinote, int velocity); - // TODO: some way of indicating end-of-note. Maybe should be a return - // value from the compute method? (Having a count return from keyup - // is also tempting, but if there's a dynamic parameter change after - // keyup, that won't work. - - // PG:add the update - void update(const uint8_t patch[156], int midinote); - void peekVoiceStatus(VoiceStatus &status); - void transferState(Dx7Note& src); - void transferSignal(Dx7Note &src); - void oscSync(); + // Note: this _adds_ to the buffer. Interesting question whether it's + // worth it... + void compute(int32_t *buf, int32_t lfo_val, int32_t lfo_delay, + const Controllers *ctrls); + + void keyup(); + + // TODO: some way of indicating end-of-note. Maybe should be a return + // value from the compute method? (Having a count return from keyup + // is also tempting, but if there's a dynamic parameter change after + // keyup, that won't work. + + // PG:add the update + void update(const uint8_t patch[156], int midinote); + void peekVoiceStatus(VoiceStatus &status); + void transferState(Dx7Note& src); + void transferSignal(Dx7Note &src); + void oscSync(); + +private: + Env env_[6]; + FmOpParams params_[6]; + PitchEnv pitchenv_; + int32_t basepitch_[6]; + int32_t fb_buf_[2]; + int32_t fb_shift_; + int32_t ampmodsens_[6]; - private: - Env env_[6]; - FmOpParams params_[6]; - PitchEnv pitchenv_; - int32_t basepitch_[6]; - int32_t fb_buf_[2]; - int32_t fb_shift_; - int32_t ampmodsens_[6]; - - int ampmoddepth_; - int algorithm_; - int pitchmoddepth_; - int pitchmodsens_; + int ampmoddepth_; + int algorithm_; + int pitchmoddepth_; + int pitchmodsens_; }; #endif // SYNTH_DX7NOTE_H_ From d1d506fc61cffd3e0e3bcde82dfe298759793ca9 Mon Sep 17 00:00:00 2001 From: asb2m10 Date: Fri, 20 Nov 2015 23:45:06 -0500 Subject: [PATCH 06/14] Fixed compiler warning on Image load --- .../UserInterfaceState.xcuserstate | Bin 201542 -> 201682 bytes README.md | 1 + Source/DXLookNFeel.cpp | 2 +- 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate b/Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate index c6761a6980ef390649876afd8618b27d930a2956..0353cc4b826b4e7dd671663d9f4d31ebc379ab04 100644 GIT binary patch literal 201682 zcmdSC2VfM%+dsauyH|Gak~^;V-jl1L_Y`_3^cF&Lgg}yuxdaGx2NXdm3M$fs1f(}n zK?KBxg`y&$0)nEVB7zE5RQS){&L{m<*F+Zp?$FVdU*elqp*b(d`_AYh`JB^*e-oxI7b9k>&B;Xd4t2k_>2 z3%n)X3U7_K$2;ShcrUyko{yK}Wq1TH$0y@c@LBjAd>;M)z8GJMKZY;Ix8PgxZTNP4 z2fh>Eh404q;`{J}_^bF4{5AY_{0;ma{3QM^{sDd#{|NsW{~Z4U{~G@u{{jCIzm4A^ zFhWSA5UGTS5ED{DO=t)Ukxqn&wnRrFi|9)9B>EElh+JYAF^U*V6cQ7O2r-42N>me& zm_s~HtRPkrtBBRa8sZ6JEwPTMA)Y3lA)Y1n68nhfi2cO#!~x-${a`ND(O~)npo(PI^fn=_dnZkPML-WJ_`gIg}hm4kt&DBgs+Z zXmSjhM~)@)$#G->Sx8PGOUQDvimWE5k+aD;?AipH9kYAD4$nVHI905njN#Ue&L>w8% z!m)B(oB$`t32|C+vN=6C{W$|T!#SflV>tPoQceYDDyNz=lQWA0Ig2=pImpK?Fre#!lw`!n}8_YM!^ z5j+u3%#-mnJS|Vh)AI~GE6>l%;I-wo^7`-w@P_h+@rLt8@J8~+@Fwyi zyeO}dSIwKoo6UQW_Ym(9-lMz~yp_B)ye+()ygj_9dHZ8tAzl2}Tui{VUPvOtt&*v}XKg55Szm)$dzlQ%Le+z#re;a=%|0(`6{C)g4`A7N3 z_{aGt_;2yw=D))~$-l(^g#Ri3GyY}%=ln1DU-GZ>zu|w&|Bn9y|5yHR6hZMQJ|*Pr zqf)45l$=sfN=il9C_Ck#oRpXHQ6VaWYD0CP22ca3Txt+Cm>NP2rG`<%sXS^dRY(<4 zrBoSJK}D&lR5dk?nn&GF&8HSn4^R(L4^xj)k5Q|sT52n`joMBT~J~>PzYh^%ZrM`kJ~%U8laGzNNmSIW(8%(R`YsX<9%F=@fbiy^MZ@ zewy;1l=-8G`15)`B*I4uXz?EJ3!Qo1nX(x1f(;fMB3th+wE-q+pa_tRP=MDV%bs^B}p4Z)9s z-voDr93fXI6s8EJLYYt_)C!G4yU-;}7lwox!dAi#!cM|2!XCnY!hynJ!r{U^;aFjz zaH6nO7!_6urwL~X?-kAyE)*^jE)y;nt`V*kJ}KNN+$!8H+#}p8JSaRQd`bAa@R;zV z@RabZ@PhDD;bq}f;Wxq`gg*&?7v4_6Q@AO@6mg0oMU!Gmv81?C(o;eyEmPX2bWF)f z>6y|iWkAZ{l#wZ;QwmZFQzoR8q?D&jPMMLyq|8g1pRzb*Ny@U66)CGzYEw3*Y){#l z@=VIJDF;#xryNOnJ>^8o$&~j~E~H#a`6A_N%6BO@Q+`RglZvHsQ+cU^)MlxYR9UJf z)s$*ZwWp?~dQ&q}TcvhL?UdRjwO8tZ)PbqPQb(nZOD#;Dm|C8CPwJG^>8UXFzSIX( z7o|R$x*~OD>JzDJQ=d%Tn7S!-N9xYhXHuU{-J5zY^7bGndD2!70ETpb;%9MP03G^pC!LZewP9%F6ByjQh`(`6-%2*VyC=>X|K=@98q=}74) z=~!vLG%Ou2ohY3ojY!L-mC`C{wRDN$xAZCLv(mlN=cNavhovt{UzHw_z9~H_eM|bb^py0p^aJTx=>_RU z=_k@prC&(DlzuI}CjCx&L;9oiC+V-!-(;8!$T%{tjFt&xBAHkwlgVXjnMP)i8D&

c$`*=pH3S&i&T*+$t` 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ⅇ-gzm7+}@wt)KfHy##ft$dlsn8o* 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

Uj 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't-6{l=gkV<7jK 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≥V3`zE9bbtpU6I^07Z~-j$U($^Aa-7apO61 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 Y@BhvV|G)ose&qlC_y7NYxKGmm0g=duS^xk5 diff --git a/README.md b/README.md index ae3b4cd..c89d954 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ in the source folder) stays on the Apache 2.0 license to able to collaborate bet Changelog --------- #### Version 0.9.1 +* Wheel, Foot, Breath, Aftertouch modulation support * Drop of .syx files in the cartridge manager * Dexed data directory can now optionally reside in the same location where the binary is installed * 'Send current program to DX7' in Cartridge Manager works as designed diff --git a/Source/DXLookNFeel.cpp b/Source/DXLookNFeel.cpp index 0dbc831..e314197 100644 --- a/Source/DXLookNFeel.cpp +++ b/Source/DXLookNFeel.cpp @@ -25,7 +25,7 @@ #define REG_COLOUR(id, value) setColour(id, value); colourMap.set(#id, id) -Image &findImage(String path) { +Image findImage(String path) { Image img; if ( path.length() <= 3 ) return img; From ce3db6b2b15d02e19a6b5ff9b3748d29e33b2afe Mon Sep 17 00:00:00 2001 From: asb2m10 Date: Fri, 11 Dec 2015 00:09:40 -0500 Subject: [PATCH 07/14] Initial MKI table engine --- .../UserInterfaceState.xcuserstate | Bin 201682 -> 201559 bytes Source/CartManager.cpp | 14 + Source/CartManager.h | 5 +- Source/EngineMkI.cpp | 295 +++++++++++------- Source/EngineMkI.h | 15 +- Source/EngineOpl.cpp | 18 +- Source/EngineOpl.h | 2 +- Source/PluginData.cpp | 14 + Source/PluginParam.cpp | 26 ++ Source/PluginProcessor.cpp | 2 +- Source/msfa/controllers.h | 48 +-- Source/msfa/dx7note.cc | 2 +- Source/msfa/fm_core.cc | 3 +- Source/msfa/fm_core.h | 21 +- 14 files changed, 311 insertions(+), 154 deletions(-) diff --git a/Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate b/Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate index 0353cc4b826b4e7dd671663d9f4d31ebc379ab04..c0ced6b7d1f4b42d52c9e01c56bb33377a9be3a0 100644 GIT binary patch literal 201559 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

c$`*=pH3S&i&T*+$t` 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ⅇ-gzm7+}@wt)KfHy##ft$dlsn8o* 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

Uj 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, true, true); cartBrowser = new FileTreeDrop(*cartBrowserList); + cartBrowser->addKeyListener(this); addAndMakeVisible(cartBrowser); + cartBrowser->setBounds(23, 18, 590, 384); cartBrowser->setDragAndDropDescription("Sysex Browser"); cartBrowser->addListener(this); @@ -334,6 +336,18 @@ void CartManager::initialFocus() { cartBrowser->grabKeyboardFocus(); } +bool CartManager::keyPressed(const KeyPress& key, Component* originatingComponent) { + if ( key.getKeyCode() == 13 ) { + File file = cartBrowser->getSelectedFile(); + if ( file.isDirectory() ) + return true; + mainWindow->loadCart(file); + activeCart->setCartridge(mainWindow->processor->currentCart); + return true; + } + return false; +} + void CartManager::showSysexConfigMsg() { AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon, "Warning", "The DX7 midi interface is not configured correctly.\n\n" "These buttons are used to 'ask' the DX7 to send the current program/cartridge.\n\n" diff --git a/Source/CartManager.h b/Source/CartManager.h index 5e58e82..d829b9f 100644 --- a/Source/CartManager.h +++ b/Source/CartManager.h @@ -27,7 +27,7 @@ #include "PluginData.h" class CartManager : public Component, public ButtonListener, public DragAndDropContainer, public FileBrowserListener - , public ProgramListBoxListener { + , public ProgramListBoxListener, public KeyListener { ScopedPointer newButton; ScopedPointer loadButton; ScopedPointer saveButton; @@ -68,7 +68,8 @@ public: virtual void programSelected(ProgramListBox *source, int pos) override; virtual void programRightClicked(ProgramListBox *source, int pos) override; virtual void programDragged(ProgramListBox *destListBox, int dest, char *packedPgm) override; - + virtual bool keyPressed(const KeyPress& key, Component* originatingComponent) override; + void initialFocus(); }; diff --git a/Source/EngineMkI.cpp b/Source/EngineMkI.cpp index ba2a9ae..690b146 100644 --- a/Source/EngineMkI.cpp +++ b/Source/EngineMkI.cpp @@ -23,127 +23,134 @@ #include "msfa/sin.h" #include "msfa/exp2.h" -const FmAlgorithm EngineMkI::algo2[32] = { - { { 0xc1, 0x11, 0x11, 0x14, 0x01, 0x14 } }, // 1 - { { 0x01, 0x11, 0x11, 0x14, 0xc1, 0x14 } }, // 2 - { { 0xc1, 0x11, 0x14, 0x01, 0x11, 0x14 } }, // 3 - { { 0xc4, 0x00, 0x00, 0x01, 0x11, 0x14 } }, // 4 ** EXCEPTION VIA CODE - { { 0xc1, 0x14, 0x01, 0x14, 0x01, 0x14 } }, // 5 - { { 0xc4, 0x00, 0x01, 0x14, 0x01, 0x14 } }, // 6 ** EXCEPTION VIA CODE - { { 0xc1, 0x11, 0x05, 0x14, 0x01, 0x14 } }, // 7 - { { 0x01, 0x11, 0xc5, 0x14, 0x01, 0x14 } }, // 8 - { { 0x01, 0x11, 0x05, 0x14, 0xc1, 0x14 } }, // 9 - { { 0x01, 0x05, 0x14, 0xc1, 0x11, 0x14 } }, // 10 - { { 0xc1, 0x05, 0x14, 0x01, 0x11, 0x14 } }, // 11 - { { 0x01, 0x05, 0x05, 0x14, 0xc1, 0x14 } }, // 12 - { { 0xc1, 0x05, 0x05, 0x14, 0x01, 0x14 } }, // 13 - { { 0xc1, 0x05, 0x11, 0x14, 0x01, 0x14 } }, // 14 - { { 0x01, 0x05, 0x11, 0x14, 0xc1, 0x14 } }, // 15 - { { 0xc1, 0x11, 0x02, 0x25, 0x05, 0x14 } }, // 16 - { { 0x01, 0x11, 0x02, 0x25, 0xc5, 0x14 } }, // 17 - { { 0x01, 0x11, 0x11, 0xc5, 0x05, 0x14 } }, // 18 - { { 0xc1, 0x14, 0x14, 0x01, 0x11, 0x14 } }, // 19 - { { 0x01, 0x05, 0x14, 0xc1, 0x14, 0x14 } }, // 20 - { { 0x01, 0x14, 0x14, 0xc1, 0x14, 0x14 } }, // 21 - { { 0xc1, 0x14, 0x14, 0x14, 0x01, 0x14 } }, // 22 - { { 0xc1, 0x14, 0x14, 0x01, 0x14, 0x04 } }, // 23 - { { 0xc1, 0x14, 0x14, 0x14, 0x04, 0x04 } }, // 24 - { { 0xc1, 0x14, 0x14, 0x04, 0x04, 0x04 } }, // 25 - { { 0xc1, 0x05, 0x14, 0x01, 0x14, 0x04 } }, // 26 - { { 0x01, 0x05, 0x14, 0xc1, 0x14, 0x04 } }, // 27 - { { 0x04, 0xc1, 0x11, 0x14, 0x01, 0x14 } }, // 28 - { { 0xc1, 0x14, 0x01, 0x14, 0x04, 0x04 } }, // 29 - { { 0x04, 0xc1, 0x11, 0x14, 0x04, 0x04 } }, // 30 - { { 0xc1, 0x14, 0x04, 0x04, 0x04, 0x04 } }, // 31 - { { 0xc4, 0x04, 0x04, 0x04, 0x04, 0x04 } }, // 32 -}; +static const uint16_t MKI_BITDEPTH = 8; +static const uint16_t MKI_TABLESIZE = 1<> shift) + (env << 3); + const bool isSigned = expVal & NEGATIVE_BIT; + + expVal &= ~NEGATIVE_BIT; + // expVal: 0..2137+511*8 = 0..6225 + // result: 0..1018+1024 + uint16_t result = 0x0400 + sinExpTable[( expVal & MKI_TABLEFILTER ) ^ MKI_TABLEFILTER]; + result <<= 1; + result >>= ( expVal >> 8 ); // exp + + uint32_t ret; + if( isSigned ) { + // -1 for one's complement + ret = -result - 1; + } else { + ret = result; + } + return ret << shift; +} void EngineMkI::compute(int32_t *output, const int32_t *input, int32_t phase0, int32_t freq, - int32_t gain1, int32_t gain2, bool add, const Controllers *controllers) { + int32_t gain1, int32_t gain2, bool add) { int32_t dgain = (gain2 - gain1 + (N >> 1)) >> LG_N; int32_t gain = gain1; int32_t phase = phase0; - if (add) { - for (int i = 0; i < N; i++) { - gain += dgain; - int32_t y = Sin::lookup(phase + input[i]); - int32_t y1 = ((int64_t)y * (int64_t)gain) >> 24; - output[i] += y1; - phase += freq; - } - } else { - for (int i = 0; i < N; i++) { - gain += dgain; - int32_t y = Sin::lookup(phase + input[i]); - int32_t y1 = ((int64_t)y * (int64_t)gain) >> 24; - output[i] = y1; - phase += freq; - } + const int32_t *adder = add ? output : zeros; + + for (int i = 0; i < N; i++) { + gain += dgain; + int32_t y = mkiSin((phase+input[i]), gain); + output[i] = y + adder[i]; + phase += freq; } } void EngineMkI::compute_pure(int32_t *output, int32_t phase0, int32_t freq, - int32_t gain1, int32_t gain2, bool add, const Controllers *controllers) { + int32_t gain1, int32_t gain2, bool add) { int32_t dgain = (gain2 - gain1 + (N >> 1)) >> LG_N; int32_t gain = gain1; int32_t phase = phase0; - if (add) { - for (int i = 0; i < N; i++) { - gain += dgain; - int32_t y = Sin::lookup(phase); - int32_t y1 = ((int64_t)y * (int64_t)gain) >> 24; - output[i] += y1; - phase += freq; - } - } else { - for (int i = 0; i < N; i++) { - gain += dgain; - int32_t y = Sin::lookup(phase); - int32_t y1 = ((int64_t)y * (int64_t)gain) >> 24; - output[i] = y1; - phase += freq; - } + const int32_t *adder = add ? output : zeros; + + for (int i = 0; i < N; i++) { + gain += dgain; + int32_t y = mkiSin(phase , gain); + output[i] = y + adder[i]; + phase += freq; } } void EngineMkI::compute_fb(int32_t *output, int32_t phase0, int32_t freq, int32_t gain1, int32_t gain2, - int32_t *fb_buf, int fb_shift, bool add, const Controllers *controllers) { + int32_t *fb_buf, int fb_shift, bool add) { int32_t dgain = (gain2 - gain1 + (N >> 1)) >> LG_N; int32_t gain = gain1; int32_t phase = phase0; + const int32_t *adder = add ? output : zeros; int32_t y0 = fb_buf[0]; int32_t y = fb_buf[1]; - if (add) { - for (int i = 0; i < N; i++) { - gain += dgain; - int32_t scaled_fb = (y0 + y) >> (fb_shift + 1); - y0 = y; - y = Sin::lookup(phase + scaled_fb); - y = ((int64_t)y * (int64_t)gain) >> 24; - output[i] += y; - phase += freq; - } - } else { - for (int i = 0; i < N; i++) { - gain += dgain; - int32_t scaled_fb = (y0 + y) >> (fb_shift + 1); - y0 = y; - y = Sin::lookup(phase + scaled_fb); - y = ((int64_t)y * (int64_t)gain) >> 24; - output[i] = y; - phase += freq; - } + + for (int i = 0; i < N; i++) { + gain += dgain; + int32_t scaled_fb = (y0 + y) >> (fb_shift + 1); + y0 = y; + y = mkiSin((phase+scaled_fb), gain); + output[i] = y + adder[i]; + phase += freq; } + fb_buf[0] = y0; fb_buf[1] = y; } // exclusively used for ALGO 6 with feedback -void EngineMkI::compute_fb2(int32_t *output, FmOpParams *parms, int32_t gain01, int32_t gain02, int32_t *fb_buf, int fb_shift, const Controllers *cont) { +void EngineMkI::compute_fb2(int32_t *output, FmOpParams *parms, int32_t gain01, int32_t gain02, int32_t *fb_buf, int fb_shift) { int32_t dgain[2]; int32_t gain[2]; int32_t phase[2]; @@ -181,8 +188,43 @@ void EngineMkI::compute_fb2(int32_t *output, FmOpParams *parms, int32_t gain01, fb_buf[1] = y; } +const FmAlgorithm EngineMkI::algo2[32] = { + { { 0xc1, 0x11, 0x11, 0x14, 0x01, 0x14 } }, // 1 + { { 0x01, 0x11, 0x11, 0x14, 0xc1, 0x14 } }, // 2 + { { 0xc1, 0x11, 0x14, 0x01, 0x11, 0x14 } }, // 3 + { { 0xc4, 0x00, 0x00, 0x01, 0x11, 0x14 } }, // 4 ** EXCEPTION VIA CODE + { { 0xc1, 0x14, 0x01, 0x14, 0x01, 0x14 } }, // 5 + { { 0xc4, 0x00, 0x01, 0x14, 0x01, 0x14 } }, // 6 ** EXCEPTION VIA CODE + { { 0xc1, 0x11, 0x05, 0x14, 0x01, 0x14 } }, // 7 + { { 0x01, 0x11, 0xc5, 0x14, 0x01, 0x14 } }, // 8 + { { 0x01, 0x11, 0x05, 0x14, 0xc1, 0x14 } }, // 9 + { { 0x01, 0x05, 0x14, 0xc1, 0x11, 0x14 } }, // 10 + { { 0xc1, 0x05, 0x14, 0x01, 0x11, 0x14 } }, // 11 + { { 0x01, 0x05, 0x05, 0x14, 0xc1, 0x14 } }, // 12 + { { 0xc1, 0x05, 0x05, 0x14, 0x01, 0x14 } }, // 13 + { { 0xc1, 0x05, 0x11, 0x14, 0x01, 0x14 } }, // 14 + { { 0x01, 0x05, 0x11, 0x14, 0xc1, 0x14 } }, // 15 + { { 0xc1, 0x11, 0x02, 0x25, 0x05, 0x14 } }, // 16 + { { 0x01, 0x11, 0x02, 0x25, 0xc5, 0x14 } }, // 17 + { { 0x01, 0x11, 0x11, 0xc5, 0x05, 0x14 } }, // 18 + { { 0xc1, 0x14, 0x14, 0x01, 0x11, 0x14 } }, // 19 + { { 0x01, 0x05, 0x14, 0xc1, 0x14, 0x14 } }, // 20 + { { 0x01, 0x14, 0x14, 0xc1, 0x14, 0x14 } }, // 21 + { { 0xc1, 0x14, 0x14, 0x14, 0x01, 0x14 } }, // 22 + { { 0xc1, 0x14, 0x14, 0x01, 0x14, 0x04 } }, // 23 + { { 0xc1, 0x14, 0x14, 0x14, 0x04, 0x04 } }, // 24 + { { 0xc1, 0x14, 0x14, 0x04, 0x04, 0x04 } }, // 25 + { { 0xc1, 0x05, 0x14, 0x01, 0x14, 0x04 } }, // 26 + { { 0x01, 0x05, 0x14, 0xc1, 0x14, 0x04 } }, // 27 + { { 0x04, 0xc1, 0x11, 0x14, 0x01, 0x14 } }, // 28 + { { 0xc1, 0x14, 0x01, 0x14, 0x04, 0x04 } }, // 29 + { { 0x04, 0xc1, 0x11, 0x14, 0x04, 0x04 } }, // 30 + { { 0xc1, 0x14, 0x04, 0x04, 0x04, 0x04 } }, // 31 + { { 0xc4, 0x04, 0x04, 0x04, 0x04, 0x04 } }, // 32 +}; + // exclusively used for ALGO 4 with feedback -void EngineMkI::compute_fb3(int32_t *output, FmOpParams *parms, int32_t gain01, int32_t gain02, int32_t *fb_buf, int fb_shift, const Controllers *cont) { +void EngineMkI::compute_fb3(int32_t *output, FmOpParams *parms, int32_t gain01, int32_t gain02, int32_t *fb_buf, int fb_shift) { int32_t dgain[3]; int32_t gain[3]; int32_t phase[3]; @@ -192,7 +234,7 @@ void EngineMkI::compute_fb3(int32_t *output, FmOpParams *parms, int32_t gain01, phase[0] = parms[0].phase; phase[1] = parms[1].phase; phase[2] = parms[2].phase; - + gain[0] = gain01; gain[1] = parms[1].gain_out; gain[2] = parms[2].gain_out; @@ -224,16 +266,60 @@ void EngineMkI::compute_fb3(int32_t *output, FmOpParams *parms, int32_t gain01, y = Sin::lookup(phase[2] + y); y = ((int64_t)y * (int64_t)gain[2]) >> 24; output[i] = y; - phase[2] += parms[2].freq; + phase[2] += parms[2].freq; } fb_buf[0] = y0; fb_buf[1] = y; } - void EngineMkI::render(int32_t *output, FmOpParams *params, int algorithm, - int32_t *fb_buf, int feedback_shift, const Controllers *controllers) { - const int kLevelThresh = 1120; + int32_t *fb_buf, int feedback_shift) { + const int kLevelThresh = 507; // really ???? + const FmAlgorithm alg = algorithms[algorithm]; + bool has_contents[3] = { true, false, false }; + for (int op = 0; op < 6; op++) { + int flags = alg.ops[op]; + bool add = (flags & OUT_BUS_ADD) != 0; + FmOpParams ¶m = params[op]; + int inbus = (flags >> 4) & 3; + int outbus = flags & 3; + int32_t *outptr = (outbus == 0) ? output : buf_[outbus - 1].get(); + int32_t gain1 = param.gain_out == 0 ? 511 : param.gain_out; + int32_t gain2 = 512-(param.level_in >> 19); + param.gain_out = gain2; + + if (gain1 <= kLevelThresh || gain2 <= kLevelThresh) { + if (!has_contents[outbus]) { + add = false; + } + if (inbus == 0 || !has_contents[inbus]) { + // todo: more than one op in a feedback loop + if ((flags & 0xc0) == 0xc0 && feedback_shift < 16) { + // cout << op << " fb " << inbus << outbus << add << endl; + compute_fb(outptr, param.phase, param.freq, + gain1, gain2, + fb_buf, feedback_shift, add); + } else { + // cout << op << " pure " << inbus << outbus << add << endl; + compute_pure(outptr, param.phase, param.freq, + gain1, gain2, add); + } + } else { + // cout << op << " normal " << inbus << outbus << " " << param.freq << add << endl; + compute(outptr, buf_[inbus - 1].get(), + param.phase, param.freq, gain1, gain2, add); + } + has_contents[outbus] = true; + } else if (!add) { + has_contents[outbus] = false; + } + param.phase += param.freq << LG_N; + } +} + +/* +void EngineMkI::render(int32_t *output, FmOpParams *params, int algorithm, int32_t *fb_buf, int feedback_shift) { + const int kLevelThresh = 507; const FmAlgorithm alg = algo2[algorithm]; bool has_contents[3] = { true, false, false }; @@ -244,8 +330,8 @@ void EngineMkI::render(int32_t *output, FmOpParams *params, int algorithm, int inbus = (flags >> 4) & 3; int outbus = flags & 3; int32_t *outptr = (outbus == 0) ? output : buf_[outbus - 1].get(); - int32_t gain1 = param.gain_out; - int32_t gain2 = Exp2::lookup(param.level_in - (14 * (1 << 24))); + int32_t gain1 = param.gain_out == 0 ? 511 : param.gain_out; + int32_t gain2 = 512-(param.level_in >> 19); param.gain_out = gain2; if (gain1 >= kLevelThresh || gain2 >= kLevelThresh) { @@ -261,13 +347,13 @@ void EngineMkI::render(int32_t *output, FmOpParams *params, int algorithm, switch ( algorithm ) { // two operator feedback, process exception for ALGO 6 case 5 : - compute_fb2(outptr, params, gain1, gain2, fb_buf, feedback_shift, controllers); + //compute_fb2(outptr, params, gain1, gain2, fb_buf, feedback_shift, controllers); params[1].phase += params[1].freq << LG_N; // yuk, hack, we already processed op-5 op++; // ignore next operator; break; // three operator feedback, process exception for ALGO 4 case 3 : - compute_fb3(outptr, params, gain1, gain2, fb_buf, feedback_shift, controllers); + //compute_fb3(outptr, params, gain1, gain2, fb_buf, feedback_shift, controllers); params[1].phase += params[1].freq << LG_N; // hack, we already processed op-5 - op-4 params[2].phase += params[2].freq << LG_N; // yuk yuk op += 2; // ignore the 2 other operators @@ -275,18 +361,17 @@ void EngineMkI::render(int32_t *output, FmOpParams *params, int algorithm, default: // one operator feedback, normal proces //cout << "\t" << op << " fb " << inbus << outbus << add << endl; - compute_fb(outptr, param.phase, param.freq,gain1, gain2, fb_buf, feedback_shift, add, controllers); + compute_fb(outptr, param.phase, param.freq,gain1, gain2, fb_buf, feedback_shift, add); break; } } else { // cout << op << " pure " << inbus << outbus << add << endl; - compute_pure(outptr, param.phase, param.freq, gain1, gain2, add, controllers); + compute_pure(outptr, param.phase, param.freq, gain1, gain2, add); } } else { // cout << op << " normal " << inbus << outbus << " " << param.freq << add << endl; - compute(outptr, buf_[inbus - 1].get(), - param.phase, param.freq, gain1, gain2, add, controllers); + compute(outptr, buf_[inbus - 1].get(), param.phase, param.freq, gain1, gain2, add); } has_contents[outbus] = true; @@ -297,4 +382,4 @@ void EngineMkI::render(int32_t *output, FmOpParams *params, int algorithm, param.phase += param.freq << LG_N; } } - +*/ diff --git a/Source/EngineMkI.h b/Source/EngineMkI.h index 280510f..8478b90 100644 --- a/Source/EngineMkI.h +++ b/Source/EngineMkI.h @@ -29,21 +29,22 @@ class EngineMkI : public FmCore { //refacter this when it is working const static FmAlgorithm algo2[32]; public: - virtual void render(int32_t *output, FmOpParams *params, int algorithm, - int32_t *fb_buf, int feedback_shift, const Controllers *controllers); + EngineMkI(); + + void render(int32_t *output, FmOpParams *params, int algorithm, int32_t *fb_buf, int feedback_shift) override; void compute(int32_t *output, const int32_t *input, int32_t phase0, int32_t freq, int32_t gain1, int32_t gain2, - bool add, const Controllers *controllers); + bool add); void compute_pure(int32_t *output, int32_t phase0, int32_t freq, int32_t gain1, int32_t gain2, - bool add, const Controllers *controllers); + bool add); void compute_fb(int32_t *output, int32_t phase0, int32_t freq, int32_t gain1, int32_t gain2, - int32_t *fb_buf, int fb_gain, bool add, const Controllers *controllers); + int32_t *fb_buf, int fb_gain, bool add); - void compute_fb2(int32_t *output, FmOpParams *params, int32_t gain01, int32_t gain02, int32_t *fb_buf, int fb_shift, const Controllers *controllers); + void compute_fb2(int32_t *output, FmOpParams *params, int32_t gain01, int32_t gain02, int32_t *fb_buf, int fb_shift); - void compute_fb3(int32_t *output, FmOpParams *params, int32_t gain01, int32_t gain02, int32_t *fb_buf, int fb_shift, const Controllers *controllers); + void compute_fb3(int32_t *output, FmOpParams *params, int32_t gain01, int32_t gain02, int32_t *fb_buf, int fb_shift); }; diff --git a/Source/EngineOpl.cpp b/Source/EngineOpl.cpp index a43873e..aa1796f 100644 --- a/Source/EngineOpl.cpp +++ b/Source/EngineOpl.cpp @@ -71,7 +71,7 @@ uint16_t sinExpTable[256] = { 937, 942, 948, 953, 959, 964, 969, 975, 980, 986, 991, 996, 1002, 1007, 1013, 1018 }; -inline uint16_t sinLog( uint16_t phi ) { +inline uint16_t sinLog(uint16_t phi) { const uint8_t index = (phi & 0xff); switch( ( phi & 0x0300 ) ) { @@ -169,7 +169,7 @@ void EngineOpl::compute_fb(int32_t *output, int32_t phase0, int32_t freq, void EngineOpl::render(int32_t *output, FmOpParams *params, int algorithm, - int32_t *fb_buf, int feedback_shift, const Controllers *controllers) { + int32_t *fb_buf, int feedback_shift) { const int kLevelThresh = 507; // really ???? const FmAlgorithm alg = algorithms[algorithm]; bool has_contents[3] = { true, false, false }; @@ -211,4 +211,16 @@ void EngineOpl::render(int32_t *output, FmOpParams *params, int algorithm, } param.phase += param.freq << LG_N; } -} \ No newline at end of file +} + + + + + + + + + + + + diff --git a/Source/EngineOpl.h b/Source/EngineOpl.h index a8d6109..dc1784c 100644 --- a/Source/EngineOpl.h +++ b/Source/EngineOpl.h @@ -31,7 +31,7 @@ class EngineOpl : public FmCore { public: virtual void render(int32_t *output, FmOpParams *params, int algorithm, - int32_t *fb_buf, int feedback_shift, const Controllers *controllers); + int32_t *fb_buf, int feedback_shift) override; void compute(int32_t *output, const int32_t *input, int32_t phase0, int32_t freq, int32_t gain1, int32_t gain2, bool add); void compute_pure(int32_t *output, int32_t phase0, int32_t freq, int32_t gain1, int32_t gain2, bool add); void compute_fb(int32_t *output, int32_t phase0, int32_t freq, diff --git a/Source/PluginData.cpp b/Source/PluginData.cpp index 26cf328..69dccac 100644 --- a/Source/PluginData.cpp +++ b/Source/PluginData.cpp @@ -286,6 +286,15 @@ void DexedAudioProcessor::getStateInformation(MemoryBlock& destData) { dexedState.setAttribute("monoMode", monoMode); dexedState.setAttribute("engineType", (int) engineType); + char mod_cfg[15]; + controllers.wheel.setConfig(mod_cfg); + dexedState.setAttribute("wheelMod", mod_cfg); + controllers.foot.setConfig(mod_cfg); + dexedState.setAttribute("footMod", mod_cfg); + controllers.breath.setConfig(mod_cfg); + dexedState.setAttribute("breathMod", mod_cfg); + controllers.at.setConfig(mod_cfg); + dexedState.setAttribute("aftertouchMod", mod_cfg); if ( activeFileCartridge.exists() ) dexedState.setAttribute("activeFileCartridge", activeFileCartridge.getFullPathName()); @@ -315,6 +324,11 @@ void DexedAudioProcessor::setStateInformation(const void* source, int sizeInByte fx.uiGain = root->getDoubleAttribute("gain"); currentProgram = root->getIntAttribute("currentProgram"); + controllers.wheel.parseConfig(root->getStringAttribute("wheelMod").toRawUTF8()); + controllers.foot.parseConfig(root->getStringAttribute("footMod").toRawUTF8()); + controllers.breath.parseConfig(root->getStringAttribute("breathMod").toRawUTF8()); + controllers.at.parseConfig(root->getStringAttribute("aftertouchMod").toRawUTF8()); + setEngineType(root->getIntAttribute("engineType", 0)); monoMode = root->getIntAttribute("monoMode", 0); diff --git a/Source/PluginParam.cpp b/Source/PluginParam.cpp index 4699ae6..b6646bd 100644 --- a/Source/PluginParam.cpp +++ b/Source/PluginParam.cpp @@ -584,6 +584,22 @@ void DexedAudioProcessor::loadPreference() { if ( prop.containsKey( String("showKeyboard") ) ) { showKeyboard = prop.getIntValue( String("showKeyboard") ); } + + if ( prop.containsKey( String("wheelMod") ) ) { + controllers.wheel.parseConfig(prop.getValue(String("wheelMod")).toRawUTF8()); + } + + if ( prop.containsKey( String("footMod") ) ) { + controllers.foot.parseConfig(prop.getValue(String("footMod")).toRawUTF8()); + } + + if ( prop.containsKey( String("breathMod") ) ) { + controllers.breath.parseConfig(prop.getValue(String("breathMod")).toRawUTF8()); + } + + if ( prop.containsKey( String("aftertouchMod") ) ) { + controllers.at.parseConfig(prop.getValue(String("aftertouchMod")).toRawUTF8()); + } } void DexedAudioProcessor::savePreference() { @@ -601,6 +617,16 @@ void DexedAudioProcessor::savePreference() { prop.setValue(String("showKeyboard"), showKeyboard); + char mod_cfg[15]; + controllers.wheel.setConfig(mod_cfg); + prop.setValue(String("wheelMod"), mod_cfg); + controllers.foot.setConfig(mod_cfg); + prop.setValue(String("footMod"), mod_cfg); + controllers.breath.setConfig(mod_cfg); + prop.setValue(String("breathMod"), mod_cfg); + controllers.at.setConfig(mod_cfg); + prop.setValue(String("aftertouchMod"), mod_cfg); + //prop.setValue(String("engineResolution"), engineResolution); prop.save(); diff --git a/Source/PluginProcessor.cpp b/Source/PluginProcessor.cpp index 22c366d..bc22b70 100644 --- a/Source/PluginProcessor.cpp +++ b/Source/PluginProcessor.cpp @@ -194,7 +194,7 @@ void DexedAudioProcessor::processBlock(AudioSampleBuffer& buffer, MidiBuffer& mi voices[note].dx7_note->compute(audiobuf.get(), lfovalue, lfodelay, &controllers); for (int j=0; j < N; ++j) { - int32_t val = audiobuf.get()[j]; //& 0xFFFFF000); + int32_t val = audiobuf.get()[j]; val = val >> 4; int clip_val = val < -(1 << 24) ? 0x8000 : val >= (1 << 24) ? 0x7fff : val >> 9; diff --git a/Source/msfa/controllers.h b/Source/msfa/controllers.h index b065fc4..ce6c511 100755 --- a/Source/msfa/controllers.h +++ b/Source/msfa/controllers.h @@ -19,6 +19,7 @@ #include "synth.h" #include "../Dexed.h" +#include // State of MIDI controllers const int kControllerPitch = 128; @@ -32,32 +33,34 @@ struct FmMod { bool pitch = false; bool amp = false; bool eg = false; + + void parseConfig(const char *cfg) { + int r = 0, p = 0, a = 0, e = 0; + sscanf(cfg, "%d %d %d %d", &r, &p, &a, &e); + + range = r < 0 && r > 127 ? 0 : r; + pitch = p != 0; + amp = a != 0; + eg = e != 0; + } + + void setConfig(char *cfg) { + snprintf(cfg, 13, "%d %d %d %d", range, pitch, amp, eg); + } }; class Controllers { void applyMod(int cc, FmMod &mod) { float range = 0.01 * mod.range; - if ( mod.amp ) { - int total = cc * range; - if ( amp_mod + total > 127 ) - amp_mod = 127; - else - amp_mod += total; - } - if ( mod.pitch ) { - int total = cc * range; - if ( pitch_mod + total > 127 ) - pitch_mod = 127; - else - pitch_mod += total; - } - if ( mod.eg ) { - int total = cc * range; - if ( eg_mod + total > 127 ) - eg_mod = 127; - else - eg_mod += total; - } + int total = cc * range; + if ( mod.amp ) + amp_mod = max(amp_mod, total); + + if ( mod.pitch ) + pitch_mod = max(pitch_mod, total); + + if ( mod.eg ) + eg_mod = max(eg_mod, total); } public: @@ -87,6 +90,9 @@ public: applyMod(foot_cc, foot); applyMod(aftertouch_cc, at); + if ( ! ((wheel.eg || foot.eg) || (breath.eg || at.eg)) ) + eg_mod = 127; + TRACE("amp_mod %d pitch_mod %d", amp_mod, pitch_mod); } diff --git a/Source/msfa/dx7note.cc b/Source/msfa/dx7note.cc index c10f18b..34548f6 100644 --- a/Source/msfa/dx7note.cc +++ b/Source/msfa/dx7note.cc @@ -225,7 +225,7 @@ void Dx7Note::compute(int32_t *buf, int32_t lfo_val, int32_t lfo_delay, const Co } params_[op].level_in = level; } - ctrls->core->render(buf, params_, algorithm_, fb_buf_, fb_shift_, ctrls); + ctrls->core->render(buf, params_, algorithm_, fb_buf_, fb_shift_); } void Dx7Note::keyup() { diff --git a/Source/msfa/fm_core.cc b/Source/msfa/fm_core.cc index 29afb1e..b083ab3 100644 --- a/Source/msfa/fm_core.cc +++ b/Source/msfa/fm_core.cc @@ -90,8 +90,7 @@ void FmCore::dump() { #endif } -void FmCore::render(int32_t *output, FmOpParams *params, int algorithm, - int32_t *fb_buf, int feedback_shift, const Controllers *controller) { +void FmCore::render(int32_t *output, FmOpParams *params, int algorithm, int32_t *fb_buf, int feedback_shift) { const int kLevelThresh = 1120; const FmAlgorithm alg = algorithms[algorithm]; bool has_contents[3] = { true, false, false }; diff --git a/Source/msfa/fm_core.h b/Source/msfa/fm_core.h index 1eef6a9..b1ec263 100644 --- a/Source/msfa/fm_core.h +++ b/Source/msfa/fm_core.h @@ -1,12 +1,12 @@ /* * Copyright 2012 Google Inc. - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -45,14 +45,13 @@ public: }; class FmCore { - public: - virtual ~FmCore() {}; - static void dump(); - virtual void render(int32_t *output, FmOpParams *params, int algorithm, - int32_t *fb_buf, int32_t feedback_gain, const Controllers *controller); - protected: - AlignedBufbuf_[2]; - const static FmAlgorithm algorithms[32]; +public: + virtual ~FmCore() {}; + static void dump(); + virtual void render(int32_t *output, FmOpParams *params, int algorithm, int32_t *fb_buf, int32_t feedback_gain); +protected: + AlignedBufbuf_[2]; + const static FmAlgorithm algorithms[32]; }; #endif // __FM_CORE_H From 627d7b801540dd85a64710b9ed2ad4a7165f129a Mon Sep 17 00:00:00 2001 From: asb2m10 Date: Wed, 23 Dec 2015 23:06:06 -0500 Subject: [PATCH 08/14] mark I 9-bit engine --- .../UserInterfaceState.xcuserstate | Bin 201559 -> 227922 bytes README.md | 2 +- Source/EngineMkI.cpp | 310 ++++++++++-------- Source/ParamDialog.cpp | 4 +- Source/PluginParam.cpp | 4 +- Source/PluginProcessor.cpp | 5 +- 6 files changed, 186 insertions(+), 139 deletions(-) diff --git a/Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate b/Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate index c0ced6b7d1f4b42d52c9e01c56bb33377a9be3a0..9eac424bc796530d987b6e7cb397d96645a56022 100644 GIT binary patch literal 227922 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

nhjP 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 90 ) { + TRACE("SINLOGTABLE: %s" ,buffer); + buffer[0] = 0; + pos = 0; + } } + TRACE("SINLOGTABLE: %s", buffer); + buffer[0] = 0; + pos = 0; + TRACE("----------------------------------------"); + for(int i=0;i 90 ) { + TRACE("SINEXTTABLE: %s" ,buffer); + buffer[0] = 0; + pos = 0; + } + } + TRACE("SINEXTTABLE: %s", buffer); + TRACE("****************************************"); +#endif } inline int32_t mkiSin(int32_t phase, uint16_t env) { - const uint16_t shift = 22 - MKI_BITDEPTH; - uint16_t expVal = sinLog(phase >> shift) + (env << 3); - const bool isSigned = expVal & NEGATIVE_BIT; + uint16_t expVal = sinLog(phase >> (22 - SINLOG_BITDEPTH)) + (env); + //int16_t expValShow = expVal; + const bool isSigned = expVal & NEGATIVE_BIT; expVal &= ~NEGATIVE_BIT; - // expVal: 0..2137+511*8 = 0..6225 - // result: 0..1018+1024 - uint16_t result = 0x0400 + sinExpTable[( expVal & MKI_TABLEFILTER ) ^ MKI_TABLEFILTER]; - result <<= 1; - result >>= ( expVal >> 8 ); // exp - uint32_t ret; - if( isSigned ) { - // -1 for one's complement - ret = -result - 1; - } else { - ret = result; + const uint16_t SINEXP_FILTER = 0x3FF; + uint16_t result = 4096 + sinExpTable[( expVal & SINEXP_FILTER ) ^ SINEXP_FILTER]; + + //uint16_t resultB4 = result; + result >>= ( expVal >> 10 ); // exp + +#ifdef MKIDEBUG + if ( ( time(NULL) % 5 ) == 0 ) { + if ( expValShow < 0 ) { + expValShow = (expValShow + 0x7FFF) * -1; + } + //TRACE(",%d,%d,%d,%d,%d,%d", phase >> (22 - SINLOG_BITDEPTH), env, expValShow, ( expVal & SINEXP_FILTER ) ^ SINEXP_FILTER, resultB4, result); } - return ret << shift; +#endif + + if( isSigned ) + return (-result - 1) << 13; + else + return result << 13; } void EngineMkI::compute(int32_t *output, const int32_t *input, @@ -148,44 +194,50 @@ void EngineMkI::compute_fb(int32_t *output, int32_t phase0, int32_t freq, fb_buf[1] = y; } - -// exclusively used for ALGO 6 with feedback -void EngineMkI::compute_fb2(int32_t *output, FmOpParams *parms, int32_t gain01, int32_t gain02, int32_t *fb_buf, int fb_shift) { - int32_t dgain[2]; - int32_t gain[2]; - int32_t phase[2]; - int32_t y0 = fb_buf[0]; - int32_t y = fb_buf[1]; - - phase[0] = parms[0].phase; - phase[1] = parms[1].phase; - - gain[0] = gain01; - gain[1] = parms[1].gain_out; - - dgain[0] = (gain02 - gain01 + (N >> 1)) >> LG_N; - - parms[1].gain_out = Exp2::lookup(parms[1].level_in - (14 * (1 << 24))); - dgain[1] = (parms[1].gain_out - gain[1] + (N >> 1)) >> LG_N; - - for (int i = 0; i < N; i++) { - // op 0 - gain[0] += dgain[0]; - int32_t scaled_fb = (y0 + y) >> (fb_shift + 2); // tsk tsk tsk: this needs some tuning - y0 = y; - y = Sin::lookup(phase[0] + scaled_fb); - y = ((int64_t)y * (int64_t)gain[0]) >> 24; - phase[0] += parms[0].freq; +void EngineMkI::render(int32_t *output, FmOpParams *params, int algorithm, + int32_t *fb_buf, int feedback_shift) { + const uint16_t ENV_MAX = 1<> 4) & 3; + int outbus = flags & 3; + int32_t *outptr = (outbus == 0) ? output : buf_[outbus - 1].get(); + int32_t gain1 = param.gain_out == 0 ? (ENV_MAX-1) : param.gain_out; + int32_t gain2 = ENV_MAX-(param.level_in >> (28-ENV_BITDEPTH)); + param.gain_out = gain2; - // op 1 - gain[1] += dgain[1]; - y = Sin::lookup(phase[1] + y); - y = ((int64_t)y * (int64_t)gain[1]) >> 24; - output[i] = y; - phase[1] += parms[1].freq; + if (gain1 <= kLevelThresh || gain2 <= kLevelThresh) { + if (!has_contents[outbus]) { + add = false; + } + if (inbus == 0 || !has_contents[inbus]) { + // todo: more than one op in a feedback loop + if ((flags & 0xc0) == 0xc0 && feedback_shift < 16) { + // cout << op << " fb " << inbus << outbus << add << endl; + compute_fb(outptr, param.phase, param.freq, + gain1, gain2, + fb_buf, feedback_shift, add); + } else { + // cout << op << " pure " << inbus << outbus << add << endl; + compute_pure(outptr, param.phase, param.freq, + gain1, gain2, add); + } + } else { + // cout << op << " normal " << inbus << outbus << " " << param.freq << add << endl; + compute(outptr, buf_[inbus - 1].get(), + param.phase, param.freq, gain1, gain2, add); + } + has_contents[outbus] = true; + } else if (!add) { + has_contents[outbus] = false; + } + param.phase += param.freq << LG_N; } - fb_buf[0] = y0; - fb_buf[1] = y; } const FmAlgorithm EngineMkI::algo2[32] = { @@ -272,49 +324,43 @@ void EngineMkI::compute_fb3(int32_t *output, FmOpParams *parms, int32_t gain01, fb_buf[1] = y; } -void EngineMkI::render(int32_t *output, FmOpParams *params, int algorithm, - int32_t *fb_buf, int feedback_shift) { - const int kLevelThresh = 507; // really ???? - const FmAlgorithm alg = algorithms[algorithm]; - bool has_contents[3] = { true, false, false }; - for (int op = 0; op < 6; op++) { - int flags = alg.ops[op]; - bool add = (flags & OUT_BUS_ADD) != 0; - FmOpParams ¶m = params[op]; - int inbus = (flags >> 4) & 3; - int outbus = flags & 3; - int32_t *outptr = (outbus == 0) ? output : buf_[outbus - 1].get(); - int32_t gain1 = param.gain_out == 0 ? 511 : param.gain_out; - int32_t gain2 = 512-(param.level_in >> 19); - param.gain_out = gain2; +// exclusively used for ALGO 6 with feedback +void EngineMkI::compute_fb2(int32_t *output, FmOpParams *parms, int32_t gain01, int32_t gain02, int32_t *fb_buf, int fb_shift) { + int32_t dgain[2]; + int32_t gain[2]; + int32_t phase[2]; + int32_t y0 = fb_buf[0]; + int32_t y = fb_buf[1]; + + phase[0] = parms[0].phase; + phase[1] = parms[1].phase; + + gain[0] = gain01; + gain[1] = parms[1].gain_out; + + dgain[0] = (gain02 - gain01 + (N >> 1)) >> LG_N; + + parms[1].gain_out = Exp2::lookup(parms[1].level_in - (14 * (1 << 24))); + dgain[1] = (parms[1].gain_out - gain[1] + (N >> 1)) >> LG_N; + + for (int i = 0; i < N; i++) { + // op 0 + gain[0] += dgain[0]; + int32_t scaled_fb = (y0 + y) >> (fb_shift + 2); // tsk tsk tsk: this needs some tuning + y0 = y; + y = Sin::lookup(phase[0] + scaled_fb); + y = ((int64_t)y * (int64_t)gain[0]) >> 24; + phase[0] += parms[0].freq; - if (gain1 <= kLevelThresh || gain2 <= kLevelThresh) { - if (!has_contents[outbus]) { - add = false; - } - if (inbus == 0 || !has_contents[inbus]) { - // todo: more than one op in a feedback loop - if ((flags & 0xc0) == 0xc0 && feedback_shift < 16) { - // cout << op << " fb " << inbus << outbus << add << endl; - compute_fb(outptr, param.phase, param.freq, - gain1, gain2, - fb_buf, feedback_shift, add); - } else { - // cout << op << " pure " << inbus << outbus << add << endl; - compute_pure(outptr, param.phase, param.freq, - gain1, gain2, add); - } - } else { - // cout << op << " normal " << inbus << outbus << " " << param.freq << add << endl; - compute(outptr, buf_[inbus - 1].get(), - param.phase, param.freq, gain1, gain2, add); - } - has_contents[outbus] = true; - } else if (!add) { - has_contents[outbus] = false; - } - param.phase += param.freq << LG_N; + // op 1 + gain[1] += dgain[1]; + y = Sin::lookup(phase[1] + y); + y = ((int64_t)y * (int64_t)gain[1]) >> 24; + output[i] = y; + phase[1] += parms[1].freq; } + fb_buf[0] = y0; + fb_buf[1] = y; } /* diff --git a/Source/ParamDialog.cpp b/Source/ParamDialog.cpp index 6b061de..3b78420 100644 --- a/Source/ParamDialog.cpp +++ b/Source/ParamDialog.cpp @@ -70,7 +70,7 @@ ParamDialog::ParamDialog () engineReso->setJustificationType (Justification::centredLeft); engineReso->setTextWhenNothingSelected (String::empty); engineReso->setTextWhenNoChoicesAvailable (TRANS("(no choices)")); - engineReso->addItem (TRANS("Modern (Direct)"), 1); + engineReso->addItem (TRANS("Modern (24-bit)"), 1); engineReso->addItem (TRANS("Mark I"), 2); engineReso->addItem (TRANS("OPL Series"), 3); engineReso->addListener (this); @@ -635,7 +635,7 @@ BEGIN_JUCER_METADATA textBoxWidth="80" textBoxHeight="20" skewFactor="1"/> Date: Fri, 25 Dec 2015 14:39:14 -0500 Subject: [PATCH 09/14] Added new logo --- Resources/ui/GlobalEditor_864x144.png | Bin 27571 -> 30356 bytes Resources/ui/source/Dexed-skinman.skin | Bin 22615694 -> 22581614 bytes Resources/ui/source/dexed-logo.png | Bin 0 -> 4757 bytes Resources/ui/source/dexed-logo.xcf | Bin 0 -> 61559 bytes Resources/ui/source/render_template.png | Bin 61375 -> 63796 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Resources/ui/source/dexed-logo.png create mode 100644 Resources/ui/source/dexed-logo.xcf diff --git a/Resources/ui/GlobalEditor_864x144.png b/Resources/ui/GlobalEditor_864x144.png index a23f739008524903b012967c14f8aaa454c071f7..362a3ca291e91a41be75ec8ca75dbf9a4d86b3e8 100644 GIT binary patch literal 30356 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 diff --git a/Resources/ui/source/Dexed-skinman.skin b/Resources/ui/source/Dexed-skinman.skin index 215ab48dfd3705f9a798c99916e918fe6af0eba7..a7faf9a19ff42b956106d043a90a2f7545b9f2d7 100644 GIT binary patch delta 85714 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 lxtUF6cs!RcebX2j}x5 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 delta 93657 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 literal 0 HcmV?d00001 diff --git a/Resources/ui/source/dexed-logo.xcf b/Resources/ui/source/dexed-logo.xcf new file mode 100644 index 0000000000000000000000000000000000000000..f0e7a8a5feca2dcbdc1e3e47b3dc98da31b9f2bd GIT binary patch literal 61559 zcmeIb378#4)&E~JlbP)MPPWOu@9acC9h8vF4ZaX~1qB04APNbF1Okc^^+n``7ebPm zOUN<}$}R%RCW0c0ED{kkA|MdXwHIjDnC87`gmRGWLf8& zH|y-0v1iYpbC%M`UE)Suu;AizYbr08ckZ0CMz$F-`|LC4ojY%SY7=g&HG&fK#rC+6Qp;>917n52zeICsv1$~kk- zJg4RY-9K;k>7;A^9tL$hkMZ<=nfqK4ELQr=>J)$tZYh`ZvBF zoJFW1EJ~;~W@+-23aGwWOlXzxy0LY_LtNixe4A!`+h%;bW_IfU;pNsDdW#LGGB`3g_%9?gP#1C z9(>^B30CAktGN2s?*Qk|SyXeb`p&Gm3+Bu^ch0N}DlfLa zbndLVXD>udR1T_{J9eQx@Qhg()QmlA&itA)7tEOlL>A2FzCV={h0gcqjJo(27hbSn z&g_f9*X#vE&zQGp?0NIfszD$ws*&JP!bNk=LS!90sadI&d```rv(H&jIq9%JNjDi# zsK+^Ts0bp&Y9W*-f8}5IOraaoTgq>utDi(TgD{tH$^LmNE_SZs3c?D)ZG;~Yo+7+R z*hpxiIrr)pRj1lc|6~DKR@*%MY57`Q@1iIk9QQ7g zkJ<#a#Wwt#@l$NWzr7Dy8wUP4MG}3aCa7((*p^8Ka`1iPzAl%A>CZA|?$I!c2gW^JZZXW@xQ7d~Q9Ly6#&gIrEbi*UTojLp zJG*dQ6pxBKxo~$BkB&RKFcZaN;tqCwY~0@HxVW9s@o`(D6XG_OZ(`iqg?plSQrya( zGa1U`4~$#7C>I|TSGaIzWR%o{<8q}Q61Q;Sj>ssfhsI?tZ1R-oVR5NFS(NDEafyqv z@ev{sBOq2b*zQ7ln_yc5bYt zb#P;#jjp2`4c+THxlzz2_CrTPbFK?Cir5t$LG&5uaA=lYuHj1V?uHTFZIoyaHp2&s=6CAAk(p3sXiO{t=!_IAauTKuZTzWT4zS2uS3c+IzNdE_^5Zrhy= z_iTT6-Ouj4=DcYGC5_7_&%ftQq;YQBPcL`mF*bob zW;+5Af!zBIFObV0M^qw^mwSPHycft_-t_|cCNGeyy+H2#ju*%)y+9t3GaB9D1@a^> zn4<^1Kt9q7rU$^}g`u&CdNsh!Yw~6;M z$_>%T6z-v@Q6?U4k(a4fw2M#6c(k1=hmUH&Es3J7=mZQ@WBov7gO-M}jBBIh2}-`5 z;}`IgNZ!rq3r4ufuvu53cO3{D(%cM`2N~PKMep-DNrcl#3s>ej<+PFYP;%xtl)r|=gBP+Z zJXz|=m7aXlldpQR(35jKIS~?ms;%VkQAmeu=HV~)mK+|9c*#aTnpq(^+(UAB<5xOK z4wp#|=XQRpgXHjglEa(klxdv$okp*x$4U<0CpnzCv{Z7qPICB>UXsHLC5Ja0Dmi?j z?)Ieea^Z#PNb1>$y!n=d*1E4VQFyyS4eFdJq+B{_VdIh{8{%ak?oiM&g5{@moB{g)~7dfH?p|jsn`9{%i_c8w=(=9i`!qi-OJ+6 zX)lY9+u&t!uji;MvbggTUKY3gjhDp(HhWoobZA02TH$4J=S^M~&-Svoau z<1R0RZ}DV?m&Fy^{CBw7lNwKkK#;|6B8&f~t>sBB`%Dv4;j+jcGuGvH5i5yWYvwi5 zWp`^}>Y&Ilmu*s{vm%3Cjw^9@@dN#!)l+c-+5X(fHDJ*l$9NLcN+M~pR zLQ+SIWdMa8BNiQxN%>f@sCn;bScPTk&DcENvkZ$9#G&?424k6u@6yzm)I@23OLPV} z=Hy%+kK$ns2y*p`z09N6xtIwyY8y)hqokNLf>z7KjGb4GRN8hjBx$@`bLK`KZYfOU zpHYR;78djBB#m5}LaW@C!uWE@hR;JDawPg(%vV~K{85+XexV*EeL4# zz1vbUIp^N9h7W1ik~m9T8bcT@F2s}X(#c<@5%^>g-=-wao z6g!DfTI?j&7eDwMQ?Zj2JIVh~I>|>m?ZTi`UZ^*sOAQn;$5a2;`bHb&v9lEPIob8U>m zRV9V1V0dB!c`@O>&$IZxT>UZ^?pbSR}~9A;jx=EBv&zx z=1MNJ0k(=!IBa*f6s{^MTn9WSg{w*m*O1qwa8*g+8n;0TSCtg5k(;D&X(uKe@{Sa) zDk)q&Uz5UBC55Z?Q&PC9q;QqoDTPaHbcwXADk)q?=RAwT)qR5$t|}>9cQQMGL*e=y zlLI&ut{z*tJ+tQtwIB*tAcgCx1qYX-a8*g+I$R1@ZpRe^y~0(+d?74ZOQCanYdd;{ zOKH)`Qn(%(>=mvmGKVc*lEM{UTH+NhrA22-;o3XhD_m7fGs4mrrC#kl#w%P(ivB|> z;c-;izB4ILO24|$D_m6?IwmRM`(EL)gzKeHz1Pz#TveC@y)P~2bgy6$pQY>1mK5R- z>GCwb0QwjoP-`{OTCY=8xi9MCnfcg*QnjIzibk@%%T$AL;o!bVt%Gdg+uv*|*VQD|Vouc|Dhb2PRyW#pVV5Zv zW){1lt|yAGu>)Nn*f969KL7OUROeKG>BL!mcf|%u_uaxL?vfg;3%mJfT~b5E?$DQ+ zp6Zw~{rDMug6dRswL+>#X zMhj9cQp`Z#{Et*w>aaMv-AI`Ga;h|ScpScZe5xc>5|yH=hg$igH++|rwl2Fzpv%Xv(vY#lFz z6xLp~GCGLaqE-k8#(k7oM6-)Zb~%ZPDA$0vpQ0j~VfByuYdT{j^dtirpu~QEPC}oU z^Q6&}^^gyVgcS`z=b(Uua7{zdDJVc8T0^XWhG;dheSlaUbPVTyv<`%bA3}wQn}b%tfpPRc1VH>QXc-(F zNB0I5kZ|XXL3sck))@&&ZV`Zo?KcKx0eE=ch#plMfQR>P2ugze@$hR>n&Bb5D+rq7 zVKY%b;{^{-2mA1lyKNsH-u*YjL$o;EC0&3+Nqy(^J}}g$JEix5;R<5=z)+X&m@a^! zQ@VhJ%hMgw2@>kk?b8Vo>eKDg9tlg~3<*#}Lb`2QqT#u8o3wy%XS#J-Kv8o5=Zxr{7HNR6bw#=?4G`8E3BxN;}u_?IjMt< z7fqXga?KaUl-Pig*>?Y;i6v-0ed6qfhG`WVFj~KizL49t<_Lz1@JQ|Ee-*Igp(kJt(cH+&`j7~k%3`@f6-(U$ngn1xCH<>Iet z4FZmh9`~q7Nxbu>|C)39%o(3O^UF)_c|l7`eBdtAmb|6q(lCzoeM^qK)2{->`n~Lp|9KSR*C(rzV1RV_Gc$z|7L>5q8w-=2KIlaG5c*prr!+ER{Zq@rWp z5Z603lz`ST*c~7;NTeFlClwvXXYHFBL?ETo^-twPG!^x>zf$|V%2aPI}RPNC%vgwAvaxWTDDZV>!b)ZM|lrMDZJQizV$mZeg9y5XswZkX5}u#}>^8(X=0>WpU0n3()W{So+|wbXcXGKI)n5}o9aSxJbSkxH2C)2oJCLW`I^RC~kZ6uj+$R;MP3kJPzl z=6OnXTxz0EXZgN5HKD*yhBsIQ(RIM0R}eJ_9U_AvVZ#bRLs6g+MAxgwD+WRW6xd2g z*s$6SaQ&1jQqnNM^;ZOZ1koCf3k)DjJusk2s0Z6aaADyBw5 z0~R;IiY|)iMF1rLH$k*YU6NRSLibnZp)WFyehFD=`Vs5=H0rZp=_%r(qh99TZ#2Ni7u-=#HK1R+4SxFMJv?d^-FJcmb$qI;>wJ1f?lA2ueqFLJ+Bo1)cO@ zLbP1CNh4Xrf*r12A<*a^P?L_9ff`7?z#{^9$aA^CqbT4}9>7DYz%xjxB4PbfkTWEW z;DKKTdWJv^J}L=fMmP2lsTYWp*d3z#fKD1P!7mYhu1=3oCRV`fN2;8lXLk~Gh{0&7rCo~v3hR_;FiM^ejOtNiybwz6bXL|upk@VY!-?ksntwSn37>G5epP#o?aAOywH-9nJ|=iT5Ax*g333I zgpETbgyQH&0#h8#6p-TZt#$%Z99?B3%#IO~;^=2WQXHKoBr$93BqYUrdy$YMHb5y3 zpDGoG;^=H6;d|XAgkmp}sIiXGFvb3j4%aa4KHo^VqqpD`N4E%0ar6nnDGpz#kU)x~ zi;bv4AgZ%gYVL*$ud`h;Eg9qv4%bSVpmM;dY;C;lb>;d7v1qQg5WlUfjYEJ{*n0;F z;ZIg8!-K-vtuZ)=#=WhC6SZh_Oxz+47gp<*H`@tREngxf_atf)S*{eMYU6T1(Wl$S zm||u}3sHmj#uahyOm~tp{frb2K(&msw>kHHrF>rBY$gj~nfFRvudTXoLnnc${abPC zI6Kz4)0J(xB+NB&8?_(e=YH}vg_E2cpHo^Oano-niP5*a-Xexi%Ty(uKM zSj#F@ZRu}Zc(g|Ol4|zBs~OEv89KUX8k|%U4#q-{%O?Rcmd)%2f7Rb&L-!sv?Q}h1 zx(XFWitCAuQ=MZv9;5Y|Qqok7e+U)=N_0F8oncfe>lUM8mJ+uca)+`s&_bt(Q_>c) z)zi7XT!+_`SsS7ioGBj7xX(G?mYge&j-dv*>Xi}APfYa*7e+KYHMYnXLRwefM^{eV zMY|G_b`s9`L)?x-#|-(XAh*Wt#p|WvB_R=M6XEA~v7*Vh(o3SJzJ>GIQI7w)SZkXS^GCiMeuh+%@LWpV@6Rx`ji6+&Uv?Gd*Tp?Vr$?T$pV=cGk_wLrSvrNf2s((yaqM08j0eIU=fb!bX_PO5sZ3?6onyPQ z7gtHk#l1-bO%aSKrU~DVw@noqcd-)NPYB>b4&HQH8YJ@kbRkSUYHzhLwpbBUg=x+v z&NvEBjPj!x%U6PwG14ahOuB(2)DwVZ-1XwtD6K)48DI04*D!4BUJ77%vMUYy@YKNd zy$wtE0ZKPCHLNKBDq703GHdn$O0UUXod?t^Js`K*@YK@YOtc}7C|J&$2~jFCC3!MI zltq4+Aj-8*l3U%9YmWwoK|sn^sI-I<#@ou3AKgnw>Ei1U8!7e7@}x^ z$3Rf%uD1*s<4v)7MQ0YIlZ5vhqAYQT0Hs?1R1n^fG0F=86w%OV^aqeMjOH{%K{p6V zLAb_{L|qM1gJIH!sla23galGSwxP}-H89AocFr&rWEv7o4S*$8s4~^nP$%9%0>Xl5 zWdT&uV)LNVSI+~9Qmxn*0WAeoDc63eN;9g~Bc$qKP$xjp)#=e`kE(h`>9D>|iOY1^ zxW#bNLP$*R$)oC8|A>N=(&ffxpwi=->X$bI6>n-Lq;x%7UjP;3`N(u`c>z=wtxrJ3 zySZ3TTbrc1QiXcV!)kOoyfeX+GKDvIOrb9jx!ywxH2{5SgP|&1ZhFhF3|2hm?gUdx z4THu6Q_8>IODW6#h)F4KMSlx~tH>$KOM;c%d6&V;@@^Nb($OP=Q#xE>uu5}830S4W z>r76iqjiE6Eo-oXz9m?t!#abNuWFBYFwB((t8^l&XfcngLFrrqt8^AGLMETmjA|yS zD%06z38?gy6Hu9!%h!|S>c=aW7J#L1od=d~$V)5fn0b)-bT6&?q!|TO~(Og?xrcqaP_(_nv;yMO%}!|cCtp=c1%ZQ7_F=wNL>u8U77aU zM<1)ycDikx-G(L`y75YEL)Hyq_rP*}qT^Z)q6_Pdk~)bfcNob+T61xeQ7%p<+MLvu z7C%VwgA{wn|K3C1ES%l=pgoIzg|i&JR`#AeGCaP9qTY5 zrZXKT#B`v;gqTiqNQiNg10i;+39;>ap4fjIft_tT`;gyE80JqtAj)hrfxR*vdO(!1 zn}8_exC5e$-2_CL&N(2;*iS%|al!#nwosyslMRS6HWd(MoM}Lmoh?yzp+wmdiL&oY zl(D^lDC7JBqKqvDMA_*QW%DG;IJJN%L*^pNrb(2YCQ-IlqKy3p#MPOSUzbXhaY_NU zk3`vOFUqESQO2nRiL~f`FT*bJsYiJo|xc0fkWoB8?;K3<4lc)2o`8C0_IRnsHGVlVpdsDlXQG0WYl8T&m4^NGm+L|WKKpM zn2<4)Y1{H0tzyWEma260=#%`&iS)MJd7ty+eKV{S)Vpjh65iG>5S z3`Qf=5E(PEG!}WD1WU~jmF9{XvfuyEQgZgc(f+UJfAO;wKO1-|_O^dqZ>x}yJVYDl z2uT^#A|$ngj*yg9Eo-&fLq|wrTHD6&p(7+^UyG2`E;>RIBU^+d+vo^M3~dpTY@;J2 zd;LN}lAUyfBnGz#NjB3Fk{I10B)`{2LK4GUgygS!Nl0RRi;!GDTtX59T!iF?F%ps( z;UXlrOpuW5{f30(#vu}t7~>)&UpqiTa=C=$+BOoB$4f}wQ6eFUVJ<@QVhPEcBqXzk z+j6ReU4-O%c4Qsax(LayNl0R_i;&#iS3>eZ&2(&i z?MMm9>|hDWA4^CE&SAZakj(VKZkL(Xz^XAmn~e7w`x^!EL?_rQ=#xjfLKB-xT9N4rFY76tzRS-7Q3Es!d0r~I}(u_qgft%73dFRT(~~UPXkG9OKPLkC=7RP@;5-_owbHopW{kuE31g(pqZuRRf`l;= z8)?Q!+>oH|VJFQPi7OJu$X?G$CBz*GVRO*2MbCe8Bb zP-7(SNf;wnXpH3e1Y;y7)Qpj9G)B(W7>T12#z-uwSzox8fiYU7F)}w$VVZ+#z;)785x&KYTYdEaB(#nBk^GZJ49pT-5Mj`WQ^p9M$wgGu?dPO zD0T!L*DA__58nhI&QBwaT)g3*stH1WQZWP31o?KO%p&bLV?sh7%X!iW;m9LXT~V^? z1myopLZ9UWi5!V=`~OBh@V@;M|F1%DG;^yjea4fdE=kRrRTqTr^i3kaCdA~3G9g1^ z7S+vJW$1}qS8|?H`v4H{-csxJcC0frq8(bD>*T5(?|wcsWce!zv*rdZWcSH-*f+4c zMcIqrnD1Zw#^Atub+I4+i}vHWUKEXiAggzm8jYUxU-ddq&hg|ZPbwkE>Rbz>oFp+} z`!i4O^kk(cS9o%fCue(dx+kZ2a-t_QJelgrG*6EAXBYnUuh)V z(b3E5i@mJg(ALZ9E4-}EjP$blu`(~KT9)?gPwYIz%j)e1dRe{gQRk5f-jdZnK~`roHyvTF(oRBFXEuH3^hs@y)wuuicHJ!N%DkJ^ zUnAN*VJ#!E_5MKO4Zyk2%)xV>WIbu}WVa{lA()6q-emCaM=0RS{tfSY(&$OXlcY%d zm-El7!fFHi&;wQZjIVss6iLH~u(`yJy1A^(nq4H7Dg3k?o-gGa0V0ce_MR4NQy%x2 zaySK%D-0apW!ZRwXp`P-?T5?HChPgb<#&_y`4RHN$${pP@&(5ME^`3R3cWc1=ZL`= z{CMVeaQ|3&liLk5o`t9^EM+thCK%>Q}3k)wAb zH2E=ex`gD2)mGffbRg^=GAj%HfS(XQM@yz^`xDJ~?LmJ2mVc~#6Y>&ILMEB!+tA!C zHTP|p_&ij)j%&#`A|e3WztDIcBC`o(-f5ya1CXc15H|uuyc0%#*@8B*sUg;$IgVi2 zC3z1r|BO~2`F14ML{6PJlQT%Udeq3Kvu5%Z>0Lis+bAl}keq$Cc;a2s4vA@&TJS)L zEds~Id{V(rB|=U5P>2;970T(FLMmiQfw1elh-DWV&qe@d_g9zTR4YdNgN^9 zw`52DO&*aX>2)^0-Rqp1xcD85-*LZ%lwyDU|Fl0|;3eNFo*WG^xq9QG?u(E^r+K-0 zz9--C#0=(Ta$?`{MI&LRg@3{jPd@9(GEdeT39}u%T-`1yd5Y(MDgF-6uasQf)!NI| z^CcBO@8#;T=6~%eAF29*t{lvy4Y^wNB}MK?A_FB?4`CXI?5uLX)}^24V;Ae%XPMgB zwIPzDTMzJZ6_0MeRQyLJUak^9Q*!ic7R?ZCw@dL;nF1o#%thP^3DKrcFcC~r!r}HE zo4ccneki$`{hXJp=8f)SlB?HLc)4m$>@*&RYlnHcYAJ^xS95#6)y~UR^M`kjzNz_&Y`Yp6Lv6h)*b9} zjoeeJVQ8|;uGf4A%kk`Vc3*QDA}uX~*JKNx5 z@QtS9*EwcNUE=Vi<5Lb-FMNgRMcr4V7Z!a_U z;htv|raCn&&#RO}eT0>o0^dpe5TA~ZrcYO=2Kz{7T}XH?;AN)}NuJpew?p<)UNm*z zi}t;=d0{xhdaP{U^CgzSyz$MeM7`xOpj=x3NgG%(MyDtNo&iL8{206yjZg8`Pt(L5 zXmWee_!MhR^3KDNUpXnN#%T|Y$8DlSC*hgspcLn0)mp?`!(*2}{WyFDVKyoAf4VYG zidv>PI?E>;j=}t7=Vn?$;>UpdDpH)Lwa*|@p5jDpm6`Qd7u*=3)tN_tY5_sMj?e{@ z1kf0+Coh`e|W4eQ@2Iw7!1j}Pb|D;xL{ z_WTI}k6w+_AfCELj)bgPCj|%z`5pqp%V|J4C4yDavJETvNG$_!tftLjlpnMT0AD>t z%B*mXx>pb%8ORS5U|T~J7|Z>DH>{VZBw#E5N3y{O)D)+MlFY%tY9Uz(AXy1v!(zb% zFGpnokMmBQR)P;|tCUfCtd$zCPrzejfMGWAB|#~E1?ngjr=FYyZu66Z`E9M`DE zaGt&raA)D|2&66>eGXL1Y8w(GA++%62J?0@T9u@lXwNS zOkUC6at-s3qC|z#QS2rAik(!Lddc5FzVh;ukQdHs2#QiiLs2|lAUZD1i`Bdc=WA$k z@SV1oj8FTf5GBI|%ql4P#5DNkR#BcbDGk2s(v#D|cj6VY#{c^dLhK2z zy!C4Ni4eTaYm|$w&`tG1caorTctD%~DJQh$QJFg z{8q*vhfC==D98Q^b|94czs1dj3tPP?Gm%-S8{riDNs!sW`3uJPuTG-lxkQ$>U7WXrEfy_CXM=Z-H2ii3kqg>4usyxA{J>>uGf3$ z_OR4=nde9xy2rENx8&zOE4R<}xARPlG3}Wkx8$e(O}zb!{_PZL!25X?yA>-ZWuL9G zFHnX0$$3NhBIZ8S^8udE%g^A6yt&VIqtU%Ql~bNKo1-Iy;Uh@_!^dhKwMvk^0f!Gr<_>Qt&z7zv$$NMU z(lGiV(-{K891?(Wl_p!iC=n=1pNh-yT_o?J+=uTe3OOl6ALbot-FKx2K`Fil!jIc> z*&A)ucpcy62r=tmuPD>;g2E{zgl?(g_wvOvkHqoE?1nv+lGr1f;+J*pVu|U?X!-E> z<@)liUsLK)g7tLD5Zxd=GnwpR6yI0fai|$qAFE2{Fy_U(W;Loc3x$1RoNk&PC4U9* zQ&mUtJ>^-778Tz^dEmD)BY?N`419N`^AU3J-FSie01s7!Onfr&UB&YiHTUX5CR4h6 zB$}a~;Ca9xrjzBMDHQ2QWU6|DzXFQHbRcyy&5>lGDSY1On0#U#OFopQcg{cxz&{Mo%)$ z@NM6h_EvN7QLyYAkJ=vZPgB{zHNG#}urd9l^6KmL`dq6JqivTJoFs($--6Q%W5XOp1tv9CF9%P_^--UPY-=U^=9Z` z-Xg~_qOU`Tq@piD@RYidW7?2qM#7UCaZZEN)CY}(b2N{`$JW!HEP|jR{|57L$O2i3 zAIB^pdP+ySnHUU9h390M1j@DNbp@zO2gyT~3z`yI6Z9mqq5xLuI|*2O2FQ9qY+%*h zq#Ib3Cjo2sz~r^ZY7ng`U{(3^ShcqmBHWxnq;sNN>C<+yOnJDXGv;BbJPF^yN?M3; zAwg%y0MU@7carj|Cw3(FngV8tTv@&eYoX@x_q9FxC~3~?W`<$`P%HwU8SK4cU_v7vum>obdxjGJZj0b54Fma zm$_2n64dsvOg3r(TV=|_mJ7@MM?lot`x4ypMNDZm=yIV>pUs4Ang+|`RhbeVr?AVU zGMLEah5~l`r%5$=s}d!+9gxOS)S0|BpIatxQLLAG+@=%U4#a5}xsbOo%M7_ZdZ&;J zHRM9K3b|=KV}aZ>4#Poi8fQr&;VMI}e1rkuGSMJC_ZW^p3Zqwixssl*=c(zpp_GM> zNdbyFh}}Izsbi%IpRdm}9o;Q_+)g6Z$c}pNaDCOUNEMdmh;I=5=08~`)=aJ&M+&JA zNXJ|xmest zxdX-S6pQyVVD}rD1YRcYHkkxwCkuaHkrny#?02$)h4DCUXW<6Gh1rQ>H_5d8xpL?3 zk(aKoOAm%-COFK&rX3zszEF4`>rU4D{19Y&FXdux&8Q^DilT z@$y@2n_}C1MBH59`@kul91XEPb>pG~7twuA^S$VNPrl(vohSEs@}d##ep;Uz;>l+{ zS?0-FBijA6K6Q#GcNo!jr}e4Nd-9a;QwRG#B?C!1(;>c3{oMDd&-y;a=B4#1HZ84B zea-i&Q+=OeXVUr<+mY6%vY+#PimgZMQ*1b@PuVu3^(k#Gs!!RD;s8Im9wB$Y@+M@Y zw&LNqk9Pd*2-N;$|Kp$^bZk|>>T1WNK9Gd|T5jJ_sAfNV6xr`z@Zx4af)wo~)?cNw z-#|*ppZ^pRmadESlSqABMmwPT1*G0?uipgaI4C+yej_xOMLl4)S=bCELHc-?{C;RQ z>p0Tdhvk)I1Cj)8>BEwW?TfbOSE6vnL;?p$ZEF-sm-Q`qfR;LJe-!<|(xj#|Z{1=e z^DXf?UTkCo^uHdG8@-&^?8&R_VyThRY(QL;T@G-aM0DOFW50+q*EoFcsR`gbPWNwI6Iwmm_zOW=O^zEa_-J z#gON6oF4FLjh@rbI6NaZWKory4{6Tj3TfE_*Hqwkiwkwfde0rIM{_J8aQ$9G261-d})%yjmvA|^t+`bxxYM8CQ=5U!p!|ZFKu#l!k)ya1jgpgjHl~V_dA*5Sp z-5@iF!0`h$zzGCK5ll>ZA$XqG6Rc7BGPO8q;7;~#en=#_PA_V{wQrKz< z-6y30REoP!=B1WUwq6?db!N^$pzn6o4b70DM{8<>Jj^>Mrzm}AO+w`ahFH|z?>BYpyU;~W4>4lz%fz)uxdpCct8rk70mUck4XW*wiN~7 zF)09;x1s>dk^*3Eny|#t;@Wg3{2|sjC;(Wxq5xo#g93oHD+&NsIVb>FyrKYLnS%m= z$twx~);TBu*u0_u$U+AnQnGplsxs5TtCrclq5zn&&hWhHYfG26+2M4lG^6%1?k$pH z6BJQU>rc>$KUTWOa{y4U7^mZbGSlQF8#j%XUj*JbN`4Yp0vIV9Uebr-P9e9QjB>V+ zYl4wy23zOW@_%j*d9)nwf0d_iJkW(ra+J^w7tV}!LtJiaHjFy3E|6>FhabM_ip^1M zj{glEk%iZ{Hh+dv|Pj;pgAKcHZr7(JqcjNUCtS0*B>x#)l&p zupGI_=txH16&a^DSc>G#Mrda`9z~m%!xou}=X564+pX^62z0pDo5ag3pX9;XqF={3 zScKL<@$cZK$M3_ja+s69cAm-p7hdakVdKWnsMMD7E5XG&{#$&<>`$I}eha^;P#5PG zd~Ut)dYyBNgxB@$o$KBtyk_lC_)Ws=0^#)t;q`mM>vQze@G1M5hjWD2S9%Dq?RE;U z>jwz0bvh#S`at1zwD9_TADt$8Os9<==_tJZr||mUWx^|B1-x#a;m>e$iu{fq!fStd z5ei>Q39mm8UN?TZTzEZJczt7DYvHxzkL>cUK7;>se=s8Akvt-C|6e?uZ zo|FG_-4MR7fg6^woOS)NVyPUi6*zX4I>ALKfx0elt<$eX_e1X%|m$ncLAAv^{c=%k9lc znJDAe53;+mVMue=%FbHtOO|4D7n}Rv5ZzTm_qRZIQ}~Mu;#kqJ?Hdv%RT3tj_8h{* zeiWxl!leCc5++p=CI>Z1gj7kGoaZ@&$xS?sG=vE&fC!T+36pNGNSIVfm<)bf!bB6B zaO5TllPU?5ahoJesw7N?zae2#C1KL<4-zI-5+DZn;1MPVuS34VB1|e4?nEDgN0{_l6H1s=Ntleh&4fvngvnSAiz7^` zBux5zdy9lgm4r#llOD8R@T`(BIbiN%w&__VVbbf&+u!rTr1YTqcf4i7q^a+5i*9;$ z2g}AtlkSI{G|!|7`c7Y$*@K+1{m|@}QYEQIRHiVu_jZ~ivwly8Yo!rA?M7^t%j1sG z;5hu_XW%&%nmZ4(XMSPzChVaZ&0hTsROd?PVMEP8b}NR}oIPFtA5ccKa6V?&e8xMl z&Spe=^8~0)u`a-Fo6qHXR%ygMl2=a@gRoz@1W7%N*l zZMgxSb_(wa%AnD+L5qNPdhbRk?G*h03tigjH$g=}J8ioWDlPSgK}%@#e9$VOowk1m zN;^gO2CbpdZ-X`g?X=@NP_@(jL0f3FE@&6fPCLJAGHY5-jeZn# z3}~f41f2p}Y1d6gqlbdd0j=~>&?TUicHe9?dN}AB&`K`{-GYzWO1EMs`4?L0NlYq} zR@$@zUafRnx(pgUjnO8pw0Q-TRtoRHs*_fF2J=r^>Ae+DwbJ)65T%uVooD_Ol zFf_e(+k&I}meSewwCpqCQ|Day{pWWhK(=Mq|NQ>%edqdB-?{DX2OfFyk2^R?v=qRh zKW4W5YjEueR(QH!KJntOn3Es)4M1a9Azd9x4)GSwsb7 z-9yPe86<+QU>Oln2gUlhN)gJ>V^$a?Ngxbiy zgW4z&C%NRgR<%m=1>mhR%0Xq6qp!#{s*7U%L}sc=dKOhtB6Z+KtBXu%DqSC?QVmj< zLHnc!!&6S`q9;=qW#EJ8Ayi2*zKOk^x?p=Voc|=+r@^+ORN!I+n5fEVGm=^$)7u-R zJk&-%!)-2q_YN_Ne<5@0`%+7zHWpUK(aov}J++rnwmPXw96nPD?T1h}NOg*-1a)E< z=xCI!R_YW-kEl*q77RCv#RBzV3f0;uJFe7A-jb*g-Mf!bb|tA;9R8+E9|?hRm{1o- z*IU(c4i6s~8Qy{23JaNLH+a%!HWo|ef1}ozl4|S4+fw z?k?Y;0j;Q(jaKUNOTI;A{1)Eye$t{`2=CQzl4HMOxt{V3YW^eiqrNog5@q_%M&F=o z6uD)mZ_psTbGL6$Z0bnAYp*pZ{wOHLJ&o3;(TZRsS2DgyzFRyhXpm23qA+A^dLAv~s@@2EJ)!Hb(6F1hLAOtzVu;EDuq<0NLgETWG4! zH?p~3$XuIm<|T5*P+w?fdAOiGXOdb{53`JT7dJ){k0xD03~2`^R}KJKt{i;hmap^2 zdXIvD&l~-EY>#cW5Q~+*ZD5o>?bl;5$F~iPZp#2aeMYUPm;f8ocpAwNiyT_Z&@m&ZHeeYQ#&n_Z2@mRIdB! z#P+kM_?;k;x{+a9A2r&ky6s+Fe*{kL*3VWrr9cm~1)@KhS`0&1u5EDzGF?B#oON1L z(Z-N1sAwz5R#Vh=wv?j%9`C44OVxf61r<(~^?ngWdpXG>%J7((mtRC-!lj?puyvHE zHLuuD!LR+t6f*c%C}iE=T*xdFcj>qTKZJ7I;@fe^Tv!0mJlFuBNw5JxGhhRNroRRN zoBJ97Y~l+5PFJyQ;%fl#6JG%!Kk-GUXaWI$)ZF*~)|G4Xvtl#_S*mEspSg+cFNAqc zTbV4~X0>#y-fo;WG?}hsWm_5MIqf-O<(k!E2J4;7Te4crC~(?|U};nijMyzO&bB0& z$z-*x!E!0f8d;V#w8qIqM()(qV_40|vYNr0jH6rI8fli+(7q?j8d*BC7CV{IWVNh8 zNm$m6}V-vPR`8~w|6M!V~- zEGm`t*G{^Y!N|%wZEMZ0$vW1BdvtEh&$Y2C^)v0-(xzf77h4(h{F`9e&*_mEvQ^Qh z3ld|Bb|f#%b0K@V$cZVE80Y3W?dT#grbuF(k>^78b&(iTBr!f_a$<@kMxA7bIBoDE zC#FbZ9OF48#%e8uVsc|Uy-18Hk{E3EA~B|@mD%q_PMF>KC7wfKtkgp26iEy=evuec zBr(|gMPf{m#3)-Mi7`bIV)fxospd*bnZH3EK~5 z*w1aUD~!bW!-c&hF|;+@J& zG1=u;IwUmu#H~N-CaIR)-l0udNwO_qtt2(lhAbgLTRANu?V-_FJ7U+jjnmrEqX<|n zJ!-d!Wg_nDV83dm&83kNcGu@THEn+Y2sjs~23ZAK-EM`aq9MHh2w}?Cu&a+1fQ+ zvaM^lWKY*{$$qZkQk%JkOYP)>%U8gq-^c}*$@vSvm&w7&*{_$ zFxQ?W!+)L|?KuGdnBPH!`_DWl-2<3w!xE=338&*8w!aAAe^B6#&2u{G0nD|X$uSS( z1bF944(DGTL4T_W#~J5b3OY35heNw~zH~A7^nx!Tw4Ofe;+pxDgD2`*1p&W^E+(`} zcnD(6r;G2~jBnG7Z`+J-*No>ZjXe{>POX2gc>T2`=zaR@Mi8&Ga2MgHgl7q_5w;Ox=icc^7(f_LIEpZXa5`Zgp_XtBp@DE0;irUW z39k{h5n}4mkuZQTo^X`vRNKjQBXmhZT#Ogn;~$EL3fj8@{Q1EC=08^)`E@kigA;%mp6>%AAg0? za&5zBoO^E_;dKJ1Y2RzwKhMU6&TYJmz%a1!Cc=G$#|hlC@omCx=QfoSx)X*H4k8>w zm`SK1EF@e;s3Y7&xR3BSVIARZ!fxj_mlL`Zh7t}U97C8%s39yQTt=uP+(fvK@Hk-| z;cdche)OrF(48=pa1h}b!c0O9VIko%LLK2I!hM9t3F`=N6LwSQazb~)P{KikV+b<| zHH3wP%LsLZn+W$29#HR9qBRs`-p>D7ZN;zgs#c%m7XIT>purJNpcQdyr5WZ)5+dJJAcgAog>P5yf z@7n!<`2Y)(gak)A)6=`Vysma181xS3D$?`4I;1u3mlI;WSmW1aecsw^@k;GR)BBp- zuC!m}20ngT%lqWsR<3Pbtrv6L^cveDuIFZiq^>>tlHyJ>%{EWblI zuRgo@$#51$cveyL+I+jLl5NK7qxN2>8q+gJ_BE!57LS@`@Sjz9dEKp^|JikE`s*om z_@C#MW<#)B67yd(JlY43dehpim6{!=a*perIU>|x5vs`Kz}CbYd(flxq;4QWI!vHR zI6_GryxDEZf}g;+dy9|8l`-9!mHZy&?K3u)m+9$##9oQW_S_WmkXDf$Sd*)MRA8nKoc=~C-V$^b=ojSDd zp7qD4P3G{+*`NAjI<Q8!>vx7Akvp&Zqb$&j7;wZIpywz4dM{RUq05#t!Q&Q}R7+YyCca%sbCH#>k zx?}Hp?v0>aCb7#6M*IB&Nw!tD39T>YYr+gyFGjf$t*dXFVqH@^P(MW5#(gIH56rWD z^^xI=B~dW&wx=!CQclPvDVtJEBy|B=Ce?{@MzcA(SDgX$+Dw+tRm$D-2SBR3ws;1LaM z*vw{;wd7RZ2s>ejJA6Jtb}mpHBIwYvm90)jcizQ$c07n6H`({G$xS~n zEWxiMlJNO&MhUS;M)BW={Lc8cPHB|;;pMcve>W6UO7B;uW|t0pBj)5qP#3SZ^ykC! z;?J48CN(V|_Zo~d^c#56v%3;yJ26$+Q_<%8E?XtI*-dA1?^tI#Z)$tyDMFjY?fU%t zc9X3UA=wX)pH(hzY4B^=RJk1bSJ5Ks8EnCl?9SSj-gS}3Lb}5E;}qI+aDmQG+MxAj zSi{@T-1LSc+$cJa;LO6%^vJVYAFdIHC6me=^~{ws@;CFHAiExhE6PJ0q`4fVcUz;f z6a&gTq|+zg-}yLQqUdZbt&NM0Kj#3)8@-O8Yg|=kWdO@`YQdjxbjDk~2jS&TOWxW!X@kfO>Z5!*Zg1Rqb0O$_n%KqI6!fDkU~TF)30p ziTRzXsc<>LX;16eIUzo*qBHqi*4G1MNrJ_5U3yeUcW}eQY%=eQd1~Ed!M<0Pj$45> zLFeurgzzyXMq~yf9t*mWCR}6#bB|#+gxmV7VR?Dy%yYHVzeXrSo6ZR~o!eX5AKgpT zZ@0keU_{dIU;gI6iNCM4pGZ#`#iUTf?g=F?j^Fo2bR&~QR3eJ0UboU6>))oW75RJ% z4m_~wp3GbXJkjBku2bR#C+wObx{&N(xH6cX%Pm$h@~P++318%2pT8>#%QbN|YQTfW z&t-L_GxK-?Yeuns2#mmU+JRcnzaz|E2y&kiPaG2ofBf=KiJnX?xvG_}O?cHpqkO6X z)wXKk1!b`?P=xDZ_1t6l-FKGNrSr>aQycmgDjuvnwkCWdBQbMe6|E|kNM zSd@evX^VxqQ&u6XFZjmn;#do%joBTrFz8uA`meC`Ws-BwuP)uDmBO)wgIhm5 zH{Uz|Agg6+2Uz*9zl!(KZe6KE+j6i?*ZPUJ=CtT%iX5pN!Jb`X6xfuulQI0SPWLmC zBFoMSF(Inb&0s>>KyX*<9bvm-TtZd-3V;=ztsi^QVr*>PCiKBx_?xpHltYt zeX`H5P>aK;?SvSD%Hsm}Jl67GC7Fl9ZHW3TSc*3+l#|l7X;XFGi4slX5xt|pgY?Z{ zQDQE#T_3sMxybHPj;5w|lBKz9d=eR&=#Cbt`1xxQi_%XfQjY7@aN7kj@ydmf`FY*Q z>9mctU$5rcmNt~4C7o9+o@HlyjnX>dtXMgH0f>@=A%k5CX0^*#zxb!%8O~#NmOpmWt ztmntB-k2NmYm<9FQ#I3lk9Nvtj$}VT3)3 zS>oNcQMG$&OtojzK{5)nvWhQ?eC)eQlW*O^U1#0XI%BOIxe&NgW0Ziv%)E}Dl$?=L2G3LB$y=AmvYR5?sQK=(~a zh}Dr#GiC>OUq1)M+uz_b_e57xMc%94>0i{ zrFkq-$R~Nm+Xv9Ma61wmfXH5MV-#=`Y7J7zqq+Z&xzB{Q<1HLu6Sj3V-wowC3eg>| z_|!u5J7Ifr(T`M$wIwQrMFNWbkP!9m3gYL@#K^*<#taTvUZ^FzU2*;}4Om|~0(&_9 zn279u&t)WznJjTfT!VSX^bR#Ygh0l-cw+eEk`1Vz8e<4=56EB@8t`W2b44jfA=W1U zN{SXqL;8^AA;_XbPuf|O{~MvDJV>|MGf2ocX%hZJirX%+8{&5(c8gy4oqgPA*)E|v zb+~ou{0D8%7sURzmwJ{?nmgE-m$M)?=%Q1llRsX6`B!Jf2#hGPFRV--xAHDY_N8SD zbTR=q<4g%<+bah#BFF}2S0_y7-9~>qlTc>)BA+`tf4C|?7_z3#+X5bBcG$AUla))^ zL2oBuJ~0YdzBVU9t9=02z`8vVy%B?k^82$NY18jMom{;X+O}l*_gF=j%=eu%_p>o? zX0c|E0h(KqNEXLD{CZ*gWFL*ZVGfWl93=blGdNGvRN2n^7T-!Rb@z-eLj6z0P&YWO zaAKch4X!5T%gQ(|?rHfgpZe9i{%~{#z;8@kjxx{=YB;tS+Wxn`i?6)~DzgJB8$3aJ zdfXTXJJgS_5$3k&KHSRK>5@`i8!9l}rGoA|lTs#=@^yE@S37v#WSkVhg0Xr~;`N({ z4PZifPtNT)`YtvlToF)NY7#QWO9DFo<3b(2Q5umhAcI}jP#8sLItf=iLZU2>MwYS6{s$e8{UB#HMIaSVt0^=tTQW?J$Il=pPhua%I{MgP!WENPl=@IG%lH00>0FNgR>Vk!p8do=d)yhE zx@n?p)qRVqG$sbfJ~Xxtdz`pr=+{I$F{FO`SWACq>+dMy@6T;Ft6{tCr6CSZYEL*r z-SQ)qcI^2lBCLTSNJmLeD=y-`N%udkuK4M^>*;yuB~>+2@GsNauFs30e)LSGV6Qzu z9usW4Sp(bc03L>6QL^A`wSWo9{Hr#7*nr>0Tn?)e4(6ULTYBFjKaFo4uFh%7n|Ta% z9gE^laTD`#uG;!**o`;&Innv%4u~N?DZO?ifd8SK<`GH|q=RDe5zKCSySDK01g5xA zCP_A2$T7xE0{W}bP#Xe4V|727Lto#K4IHjdp3GZXQ$4N5ZDoQLe4YH&Oe(L}!korp z%&!cP5j?g&Sy#13{~v3-10GzVM3Ml)R>YOE-0=$S3d7gkDmxrjel$gG$IU@VIgQ6C{pY`S##@=l&Ujwv<-#|w6KjJYWR{n2Qs z1z|&DXA&eJrwIoG(bcJwmEd^Be~$ME91kItH)LVEb!BhUIcQV+7hT-V7AnYvDiQzK zBoUl2Ux|b-H^-$*+w0j_b(dUMPzBjFu(~>VvUzC@2cBkag6)5dy(WnjT!P~HlECp; z=*LUnOMC=MoQ~wh9SaLG(Id76TAhN8P}u{S9nsHW37f+6Lv$rCF7*c<8OWVnm`rk~ zd-I~6JHQzJJe+=;^`Kz^5-e}(?hM0pproG0Wsbn`^z(jIk|HqlX09Vm<#5TIWaGMpr z0huw0@q;q-M=3&YpGu-?EuO)J3?Miy-_T;u_%#3@QU_q< zW@PK{c;d|ysjQ0fe_})$g5(W#o2|O>jtL>$YQZabM;r6ExLex6f}za60HK}oiNhZ9NLp2P&Bmu#CXfMrk2?CCMwU(f zeP&vOA`##Bz1g+$x_-sEB9(#<1p1G1`Q?o5x`1pSRXw-)AnqhgBdyvzC zkFguWrsT+9O;7Sn&2>OPOJUdIUg-TfC_eocf#39dr~>ZJFJVD?8r$}9ey!UFh<#6S zmv9$+?Gvo69;flG!8Nb6;M**ctCvGtm(Ut$jh8}E1=0wSiwLc~h=AP=EuT}*`HHiS|1<k1I=m z;$`i9XT_f?nWeiNfsjPIm)b9$>W;jyS8NVC;a>0CVxHrvG-1jN_c=V;C4WiD6rn(zbC1V z33zqB{}?<&&1Cz@Vb4KO6@irEB@O-57~vnFI887}fhW6lV$oL)(x&8kADU+{GjOwa-^nCw>wxE@k@Z&BmfTC>f3S#(R6D7vjAU!So zue;d;YNu#GSC#V#XQ9EilG`7%VMj(PtM0}#?MjN+)3R)q?FDmKwnHTscud^>leWsv zAl~gAooRdy(iZStdNrZbHtGDtZ=P&Q+x~m;r7EU4LZ&QaHjuJ94LKwdaywW6GCqO_ zk9H2d+kz*$c-3;b5{7bXm8}9757>2;$>4tDAB|Z~h?P z=05yx_O=8sC1t-Y3Nz9Z<%u-4lG~9vg?H_!coB15{ zP0JCc@X%7VR#V2GjT%>M{<8qa?Y^e?=vJG$mn z$Go#p(h>Il@`O^iv2>JK30~U!4v`vBNWc#wGK1Y#_KDRV3tAlx#CsWu?HTLHxyHd_ z1J(bwe*7|Fwplm)?#;j`+s%>to}gpxjNeOn-S^>G+kD$hPo@Xw zS!kzR1fx7eoL#YYy)lX6YFn*Cjui32lXX@$m*?WyHqlFuf@W6d(xzIbW10~~cyh&- zU(H5`XG?_8JZ;q1YAfSBd6*>UPMFyEjw&B3mqb$5_7}ek386%++iG$bG7S(=ebP3{ zIgmo8a?+@$z)1DCVBhMr$wFx(dzb?VSi!3F=S~^$AjKQ(^NAq4{wWO4?Kl$^SP%T+ z=EP6&FmWIci7e-6#*!FUjC6uZ_YtRRCQ4R6D#E|St1r~8zvh>dd@TOB!48%h!5ghR zN`Pqoo?)8jbqcW!AT?45YF3sN@z(JS;cfn0+EmzUibu$PuFb_R(XM!RiW05`XZb3` z+6zW7;`b5|-&fC-wg)zwwZtEOtV)MAfTZQOe9$%LG#?^@Vhi{DieR@gNqppp{ePlC zSrN0-3MDk(WfahU>c0qxVfbASTAwWCDWtQ5ub*9lU1Y4c=2nRB#)>98mlTFl3`L#` zGHQ!b2^VA*usW4qk5b>eFc+DEa8?_u}{Uli9WWxdELd4bk>@7bC)j8%IX(uT;Q*q8p7m z`Yrf~>&;@a7|Q#ZEMKjp$-?~yh!yal#!n2;f5VAY5zsbn(f{;18M|1phVxF}$>Ox` z#oq7r)ZE;Vf_=mpMZ@rfHgd>C_2n$(xryQ#ow*{W`MTNReev%!->^Z%U$Q{MrNfoO zWrbU?({_~CeD2M=RXjtiJd6nIer15LjfYDVQC#*j zU`J@Rx6`@SS~cIf`_129l}6!Clbs8-=B8t5Lq_h#VU)8+!<_U6R|qQPZ%BTj+l_GYoxq3u9fvoHLUC~Rb}+j%7Jv< zU;aMbyma*~ijg$JQZlFNP@eK5G_OV7?T628{Kpp)9hc|@0-nGEn4~)U?cxJ+0?g?@ zk-}CM${FK?yE~aKdk0l)W#yK}H>u69a)V-!>PVCMsv63vCuk%{LOG%bUQH07RX<+x z{CEPd8HTeIoIq5Y69LZQv7t?uXj_F$evO#8_0Pv(VM}!zww(sb^u`X$6y9i~=iF5ji}!BgTy!BMxwT+}^AVMxh~%``G(TvZ|A{KzPOgqOnMh%z%N#M_Z+tJb zEtt{)ol@XtH^ajI3ULte*q95svT~&J!F>fM=VqitDFqO}>#3Uz%Mt6-T|vK-HjH}L zZZZxK{C-hi3)Nh8DNEXlvtCkPj~kK?o@M4j%A|F6c@Pj zxyyNZoiwV`QTsW1!fWWNScUwS&FHe&oucVi0@z1}o^=~*xcLmt{NkC$g?bro*BE;U2CM^z(U#ZqG#MXue}4vRNOtDzV3Nl zoWg*u5z@|gsq}upb$qQ*PoZ4+;X(H_FClzEt@U4UV1GTCF(X2;;$}v|?*xK3A;`AOYw`ih3%WH&+%niNR>U&=sO9@0hp;t=xHlS3J`{&V*` zeb^D~E)}sf8~@?s0ofy`Nf7xejBS&T&KgBB;BL_gCyGo@lp^FhlsGeOqBh*U+ri&N ztafp1rhB3x!UST@=1a*q7S`?2$fIIuog`V5#D1&%!kfcgv(nsk<=#dL_f2i zFqiMZ1qN&?8s@$D5Dy<&o(j&6Fc4nUXSb}pc|)|6x29dFpz@^-Mk`UQqxc$&@9J+E zc?c*WAsPq^hh1>oQOuCfxbqsAbaXM27JF?D$o2XA9?IJI`O#>uE%(C)&huB}_&8;P z+mA$huc0H-sk5A~89p@ILe=KW&YjGg4M?X?5=8O5t(|RCpJM=to`}*MZ`V9b(YPM3 zJ?9y`+SxS-qV-hp>e7HVRIcW_gXkCDsu}qLqr?AEOOr0nX|+m0*^<9MOjXTt!9Ib? zM?$CaO=2R#k0M~CEJxbwhkZ>S@x8o9 zBYNso#xk&tfeC$xAE%gEX?H}toH>iq7vYBHed2#>6pWG7pK|uZA_vD}=KXlZVb7tj zDt8;Px{;FC0I9w-!3>56xmueRn}zo$makP}y|1*3$eq0=@dpBa zu2Y`z_*G5a69XMqs@!8cPE{~=P!Rrwua(x{7x#eV2>!^}J5_r-g$#Y> zC&H6Ed=IS@8DeE?)DSkM2GIR)W0_jUSp|!&qbTihm;g3_tk=7JC?gQHPu~_6F4uA#%Jn=K%xYNK zDJDL@4Zt~LpX)jmSZK99AfoSZG2CfD5~|c&H5s_nXMSE6keok zs->tCz_w6MIB<4sT%6O6!^m^}qe8d}ZIgd0>RUvT4=nZ?jDR>WE3YqzyB9C}GN)UT z+W|_XY9RUCG!OAOvs=5G!&{m5Yk%$ zJJ))T*yRQ1t15fC-K!}5>okX@0S9&>l_;>iGVt_Vo-Pj1B^*ct*noWXr*bYH%Oi6| zU!@>cCZD>^4(+x*2dzohjyCHL*`I$Vyr6Pw{dUFg2WNrHtT8}c#V$Sv-~;fe&<2jg zZz>ksev$mk7&afXZUN=^jojtvoj93fBS3$$37Bz6{C)Dl-8N>}nFD7Dd`aO7`;1z^ z9zm9M0${E{k9RNK7|)Ni`=`y*Ok_f+88yQo07GD~?}1wv7%L^jjJW1vD zSK~0gqzHLwF56-$z>56oBA)BDO97hZ-!4M5CDd*4(|fzws$X`)?Z(LZ4(K!*n`HW> z#nio+PK=k!rE498TPrA2i-Uq4`S0ad|9&{2Weu%(^!y26iK^Zr0lsFkfbYI;1Ffrq zhX>r?RR;YSpcl67o?zqvv#hiawoviAS@W|j;#R=lE`g1{XRIG#HP^;P0-a%*B5 zQ8@)Xh&QQ>SCgdt&06qR;as-o=m<1C0E~ohuqzw$(&_2#R3aJQq#OB6)?#L@@m9dc z4(JRTivf?6rOyTekMuL3)QfbX<$fP(-1{v!tb7u?%??6r&k5Gp8#BZ>{-F`*I{ia6 zZVwRo1Ckj@A5tJE?A(5gkkAm4+ecT3Bkt!|%!)SR^y!3%v|_2iuIiq0LhC{AQzkGO zmICQ#z#r(31>p049?Or^_w~Br) zLdNFsfkC1iHtWtIP@A<8zBcg%d7HIQGi$xo1&XnHrH(Y93?B{j(DQ2?piu)%(Elhy zKOL|kf0aS+GXLYXZ@7@F`l^--Yb@RY6fN!b7O{9|~FhlBGsXL$&Fm%OUFd4SDPbV1>gPp(D?%Z%V;(1IU z0)TJ8`G9Z$jsOAPg|DJFA#~=dp2GbP%XSV8W|J#xhTZ|Y3UpPi)^yFeuQ+~YLJT(j zTDx|`LEPoVY5l7yaDTJEPFnoOnf~Y##){zmqt8dImv{83fdO*~V^TYBjrov^G*R|!%yW|+q^K->P0^14;hcS8OKCo-7Q4*h1) zAcNtGujWDKqdzZ}eQLVYcQY}(;3#6|Etr>D?5(p$fG6>e0ap3XOy`g1xCoxx@tg%1 z=HX?SkaVCB(SP9O?}_IRUw~}1+u8^Ft?@YsKSnS`w)?Mw{!n`+_ug!e(*#(s7u}{A z1w4AMpdXeN@5fz|0d__BO`!v`7VzbpV6qEfv1QyyRfo6>L& zYGLu?whB%lX6!$GYm}nMq=FU>ia#fauli%+KN6g~_ijf5LE?;;AqzHPT9=Uoma19` zMkh1g7Cux3@$x|GwpmLUU?1rQiJ=PvsH+`e03COl@$>baHtbZW+x`I*%z$6W1vc*k zPSJfPAsjf`|DIyU(W3PP8(_Q78a&xPMTU7OC${lDBWb431T3nkVsxRsC*Qt!oFcK? z3fKa$t02_|DbkI}F!p!u00tTKfGSeizvB}ZVM2|d1=o)C5h9M!E-qr|11b z3qXd`Bc9hOk(W+n)3b<$Ajgg`9L7AfA7H_HF>xckWPvS9>9#c8v86ruV4#7sfZF^s z-a37cUrO)B>+J-0_?fQi0}~!3dQydcbUmT7dNPK4LE8^JTCgTvDyZ?VJO7XN!aiMi zv(v=xC-OFdc#Y}^&F?cEV#QXlg4}xTNMapGg4Sl+hK!(#Q1yq!240{{CxQ=if&GU+ zyGf4pa9<3~A2c0e##U?${LkCz>kP$!+@yzsc)JumN%KF~<4nY;B=2bNh6wR`mCIF_ zkZ2wgq8Qzd3ym#9(@k*nPdES**qqy2V~_ab)pRxdacR02=zqHKc3Td*7g%y58-4Es zbYM~W>KX^)&3|Qx0iz9iLmlpneqoZFiid1=R!ABJ)^L8km?LBi35f@7GZzX^rA zPpd*1&4r9X@{TAtdIN+u-Im}e48WFj;u?&0=)&Ap0V`R5=CsL2n6cHC_PsHM#|2~GU)XH6Zyq@+dcUI z1Q{#V(EAm5H)^m+zwV|a-8n&-`lFe2x_bXQr+zvZxESB#NA9{2ovmc&{8u`5{oYW{ zetVlxH-BLl`WW3eSj%-_TeO>re?+rS{MLy4|2;@Q;&Su$6q=WAX(leDCx8{DsLQg< z`KpO@3`O@7U})Q7z;6Dl8*!kUcBx%A4%62=i*9eK?40Hj?4FyVI|L1Ku@~UYz$nYR zw;){%Y=52}C^xnhdnaW_A0xf}gGOr70oz6w4}`#9{+bnp|ECKN6mXuM-}U*or*nM` zfWKU;<4LPyADv3LrRL{&{c^qJfM{u|diy64j@^1fsKi%34)E&D0|3>;> zcm^UJ!7gaL?b-_$#fYAlBEof-68WkRS1lbY+-+I2RCbFUO-Qwj^h1@IIe^#qDFJQp zLAx?-)VYEOm)<=z?M#r+xM-BUfD|zU12zScu|_(zLB!_HNSwtjMxLbXI>PfqGYT!n zs*#u0*%#W6R7QYK3S`I~p3ugX7uan}=# z=J-9NKp|m-MgvwC=Q36LX~QD(kWfVa6$D5G^q2*SfUc*SKMx1l8F)I#ZBJY(vQO;9 zTr>wqs9Ua2TWct1VuT-1jm^4XRZ*=61`)*zrERz9E) zIk+1bV&*^_9VcH05Fhve0N?kdI3MmG?@WLEH`nR$mx68AyZq^J2Cj0d4|k1Qh?)Q! zwsBrnLPxUf=pdau+FUu7z^exo7D`J*b|(Fo`GAXH5)a9s0ekFCh4l zRb|lR0GFZTQJBi5tkkmXo!WQ_M#%Vi21sC7VN1Q*f^X;s{%J%4Uo31VBUayNix&>JwVp`7Kj76{Sf zY}!Swc*Zkr^^#r`T%_*z7VZ=zB}_e@@sVtUG6|pCf;Uv_%szHpn3hA}NS#(bSh+bv zRf3qIgC}K{KTnLJUfcmxb$E=NdfIRggrtpf6((8);y(2nK@b3su@;DN+M}fWk%^alU;OnmAQcN?A(njHQC_B1)3OCyE_`YmT$Hym!{psaIup9CWL08+QMB7rz;0r;SqzeQ z6;2J8pI?O&yK=P-*2e1kt}7ZvdZ0%q5S7UU3tL#Ax>dmHi)`Mdb?+`mTA)?BhW8nN zurIq-&=uBukS~W%v|{?K3dTBM^*r9Tc^@BDlRcf8zBT(ZzE+}BzJ zlatLSNoXap+&zI{HwFV3aah^$-#?~lKLTqpfy>spT=Z4#xe3qJxnO$cK5zr=p=)|hto`exT7OzjkT_~s1 zBjlK|`{K3U?jzFqP0=FHlWm%mKFRrSi^Y~6t<&)nn=?^5-}SicCL;K3h+^}hGIFvk ziu*!;S2)D|WL8>#7=L6$!+!N67JgeVNM%oXvF@18+wI|Y@oIMo$S=Gui7ZJcM&sd2 zXg)WqmF`8cc7x=h=|_2TT}+og8$rF2+t@V2^XY5rI{Hq%qtmsUr1SG_{-Ogfd7_wh zBi(8j&XBdiK+{V^N|0XUzL~v1BR}f*0#-J~73>f5l??Fq@KyktEBZntZ&cfgoPd7c z+aGAq{cpPcysdrcCoD=q4SUGP2pi|J9y66w zUi0Vh7!jy00`5lY^UKYPC?AR{v5}x8J6b-wT*Aj6~q}>`| z5LXldGVAwE{+kuZN{P$USK2^pl%h|kzzOb`^B>p|Bx+8;MPLF zM20Nx*GRQ3l=qS&rP1;Lapod^YmFerL7u=j^ONXuF{?2buJ}ejvt#$E7{Xcle33nf zDPA6MMFgh5V-j#(J_&kVP#v$8V9Ks9eOa%xixREy*xXPIQ8lz`nyhd$0?PoMWPfwf zChF(|UT2F2pTGj^geZAhO}fs}$cagK473T3$-ec;YxN@btlSBC*C;P^xnn)V`MlDAUDx4##@Vf>HVjv%d?2{DFU$@8?17 zZI=hkNv7OLHe8`JAwrN@Df~#d*k^abMR@oj<|D$Z_+|VffbGzpwwkO1^M|JEnk6S4 z61sE9IZUBky%t7xPjzO_AwSQ2)W7-wTJw7Wm;mwX_VNbk zh#*c46_;DZz^0f4cAwfI*YN@qSoq zJTf_pF7EV^0*nv6XK+e!b2DHP05Lt%E1yM@s49JZ2n$oZfYue{Cb&U z-;sr!XG+j&_H12peXD{gUUIXu5_^*xMsKj|cUMmF`VRaWvdi)=&&HYf_KIWuoFIP6K6oyO+B7FybF9)(V2_C*LQxi#bBFn|VlagPyh}2emZ?`g+E2oa_SV zzV(5VF)Mo0P{VtM=U(?d-TK>eH|bR z;)d2xDuc17cCyA7HYK<}jjw4I|48^G0CY2^q-h0=bZMR&%|qx=f-B@&aKlr%d3vmuE(vD+tr-YlxglVl_`}~H-ymf z@7;+Myg!m1@9EXS~( ze~93&+bAW_-&|C+F0FOpvBn{y4$4l_4mL3Oi{=d%R^K53*C|rfKyqP9hTg#=z zLWoBLid5@?|Is`8p*K>kn&Lz0@aV%%lhxcatb@_MTQvh-A`K3nxr1so+O_A&j+%1& z25v9Qy4B8?4-NaFbJ4xk;(_St;k9hLvE)tNrOxtCp2~vT5q$VEJ2G&(_&G1pbLoB1 z$AQ|@aeV!56dMdnI5WaU;4F4|(Azlh_CDf>st3L2RRkQRd+nqKzH*qvN1QXJE6@m4KT$ z(d1mnl;*WH^@akZ*OX;?sI{aT7)`SJ)o%1jO0>>9ha2M}@exGHm zy#$rJ1BaX+YQ^c~W6_VUn}OOuI%UiE?zXthSM}J&P&eA9BvQkV5kcPb)+F@x^s{hw zZD`hG9<#R7unA#-wt{)F%cTP-jo`|qLG;#$WDL6NAx)lIE3(|EIzO={rWR18jXnJ5 zO67aZeqzzjN%(`Iut&0;Pk45fVT;7yyKR-Ja3k|4`+vGVDU(CK;Ez)95GCTkSaupy zjoo4=HJBa_V|QdX^xl&=r~8F371}<$zknABc@++e!PWOPW zb(8^Wsr{xo58tWbmXy1}`|5oNlc`MYLGa_ab%RPX)rqh5`h6$My~g`!U{;g1&JQ&C z2-V9rx|U{Y;!%#u$bCBO9>Rok?Xp{L{xw}f^D*`D*jmcnOE&e}>QSo}cb%R^85DK{zpY7MD%3~LjVl7(!nHy0@(rQmv*KW^J5^vAa z6hGG`*Y)UxVtbD2ky`GM^F!$Jb=!4Tfz8HW>!nN!B>8m_`kuc3T(X>t3Y?SL zZZ$g?1i>_ZRo9%u5easA=Ahl6GgkGdGzd!59+rGnutIG5<%jP;g)YvT zyhjQ21TM;PS(IlnpQYp4!Y)BumBx|coD#7V8nT3TkCYEjrzkNBZk~FK-=N`pSAv9i zL%Om~h?7~Tz)hEx_00-R*VcyhaEZQCS2dX-CSF6!^DTBq@;pBuQIsfLW;r_wM#Cz;l&e zD*XUB)Ct>-w?z|i11#&0OR^6?oBnxu)-75=C)CJSNNyDVV2S3i`fGBYwy=@PFB-qk ztFJ}9NOmA6Tl`~#5Bdy@{KcuTyix{-rw_oOHn&^OO7{ zjC70_u5KCRGZ@Hc0FDVUlC+&(g45)@TPXX8S9d%1%N5H@9L{FJ_EsIG;y(L=NeyvM z%)OH_HR2#dJAl2lv_wcQ{j;CItE%a&8;YN&T=h7ejZ44nkHQXaPRvg_r_n@v`H0lu z?D6SZd2kL`9IoThc28M+93+$=g%TDoJ3SNVm|L+}8{Y7|6YPh`*rTo|o<|@?s*mmJ+3uDxG z>_*yA2+}LCR)1ps~KlLI7-16j`5Z4nct+IW;)n@k#PkJ#i3UgZ1jU&hQ zy+yo5HiDJ|y8AZ(|CX8_r$mc*@4_+SZn7N(glRP5?r+FVw6l4sBog{|4SaQk?pMDn zuJzPkq=_krX@$rDVIEdR`l!r6H8TNd40*~$=SD!DVaZj~2z7)8kaV>`GE)n355!HhUL(^2{^DXkDv+Pd3 zAQ`TX=cM%Zg0KFVN3AeGH3F6==XF&>mf973K84S8s?{E$R&?~(l~0yKMt%DV=BFz} z%6Ufp`o*a=-sYbxsr#j;K6smxE5lnx{UDe9#Q0vGAJl5k3L{HpCbB$zV>b*BfAwp% z*4ue$BSu*btiGjMN3~V(#QAo3mXB`EqSt*c&$oG(jHfF*oLLG=BEZ#sE{QgQkV+rY z);f+6KP=8Kt}cFolmM5HyGsdPQVUCpkk;(c2b)y9k!|cqcAF*s!RZl*>R8&W#h`n+ zIEJL^$=sonwlfozmc^JcmzY3C9$aAEz~>OdPFf;<3LL@qYNTV)Za9GIw3NH(JC`R( zWOhJDd42)vqO_ev!7vnJ`d5z4Q-=wT5TyBecI4)>2P*?|f$z9qohK=}m4o(YWVM9w zG@t}~J(UF}?1jI0Soq!1o?bd{>jLL%=mCj3AekmnRR6!@xj^EyMadxdIt2RaOQ=>SZ%IOE+ z=BA1!DOiz=IWp7ya!kB0q5^+Wp7!%e`4qc=HlCkNDFkWy zw?s)i)Q4Ht-n8?EDG!0GM@UN-1IyQZvCvI3Y@K);n8PAbunCVtLBe}>vF~bwmpaq} z2j6 z&s_q~gt~#RAA0{Vw7nhLfU|JtbnK40D~Mnx4LZ`^JXFCLPC7WBUuarZoc(AR#KY-) zZsFCNW=D-nktIh*PJngKVmcMM)ypR5-y`rUoX5)RM(`?zX}P6V!>OF&u`a|`d=1=k zIz+{x6Dz0tukY86JR^J{rt7AQ`2G9wA`&i?N_%ygr`GWoA|FR8IMv>Wq>0BOPR}n# z^`)Xu?k(I^*y!$18?$|boxV__2R})YNWBr`Y?*9;i=OTi+j|K~L3(2*V?tf@=-+g3 z>qe#2?}6in{~vpA{tor~{{L4JH3`v3WR&7r*=5Ndm4p^$8DuPDp9z&MW+t*!h>Rr^ zm8dLXWGKvp?6OqW!B~ncW1qo{F`rA%p3m3keY}tF=O6gKesLTfM>F$yT-SMB=Xssi zdEV|2WI3ud;W(e2MM8hR@}BFP#amg!N|x{S>u*e-`{%j@oaG30s3w#W3i2yZsSUdP z;mFC8O<^t8kE^Kmo~KcgAUR99wyz0$435aAZQ_jH3r(S{k%k6Q+0JvfC?8qyz ze{wq@G{(!_fVf6G*`9BJ+$5IIov#6#U~kNhzF<+|L9E1ia3NX}tLu<$v&+_xV3V)- zZt}Rt>cgWi3@!gDGRYBW>@KjoEY@gB>;OFn@#rfD6y6twe46dYo;Nel zuIk{)YSlp6*b`LJG4X3^-GVq6O{mj{&py;K5F98_m>jL4^N zGI5ZAkj1gJxNXkGU!b&j?$89;kmYDzZSxX?s^K8Iy&)gmYehVTPNvL1!^ z?O&MC5+;{ZgAaG@J3uRaI->YG?!ki*;YPBZIH9=_`YezTfM8Ts+g=?F9oq{^M? z+Xg0kxBmhY!?wPH3)PpquXrPUoT&);uN#Zx{y3$S3Bypy|T!Ff6}KO`@rOu$6g1w zcrx*)$&zl-!FcWm!oII|8RZKkx|dHr4$J^$p{5<By$j%y&oTb`EWZ5EGMUB@ID2 z9Gm*eyMYKbu*^N;W6?Af-{hHg!60JB{vV@`(2s=i)jPdC2Bxjp%O7;xw16a0U}zh3 zT^b^6aX9}63^q{oE>H}j%Owo6)m|viTAaH*a*A!VA5SkVuK#vXS9c(|eQ@pP4X#w` z>)!|I(qe%k^Vk~8XZahsNI$!T@SUf8{xN%St^Kv`_+z;c(7be$K-fKapGr$Tz8i_vDTS|kr7<0g>A$mTvzA>3~$9wWPX*o-1huySw&q) zy8sKq$Ls{jL%~@v+y9F-L44u_v3iNv!qVTd#C@9s5@lgXJdV53Y?(t}kGG4dnAgI6--ovXJh#1UgZ^cUBsA@pNM8_%52y!2Lhas%7 zcjJ69I3*F?^Smj)^LB-=rQzrsy|>H&qzSvgEN|nfcFO=wGR1-R*tKAO?CaaC@#p_} zGk1|jQ}UC7$8rfv5v8{AB@sHyj)&?rKE)jEW6{n*!K-*@dAC@eI}I9fO~#*!;ukqv zi@>#q&*v9Bx2NVn17#a0L({is-FrP+$^sNq8)MVEmLlnSVsSPjzq$pZW-_Tgh`8zJ z5puX^C{yl>=~#dgic&|s!~hKT(vG=Fzkt#$PAX}cP@v8b?P9>PgGFrg800(Ct~J*N%2S7 zdXtp2LH~y)?8Nfn@R2v&AVw7fr;~SW7$4ENYPtxbNQpe#pI6vg#=T%iO8d0c;795287(x7rtLpGZ zcPWVeCNSb&Hcb!W1aL$HZF74Hv0W#M93;#UYbgr+TBP8-ACj&%9Rw-IVqR^T%s^AD z=tv8!%AmJc>MHM5==VzK=XJlp-8G41c}6;d<2m6Dnoxql{j~q=Tqf-FZb!kC1v`xw zCZ3WM7gj)oRh1LuV;s*nD?4##cE-r%XU*MA(y=ktw9rI>S*D`{kGGrx1&yB1xbGh2d0!x+$En?`-C|#( zK>xZknsrHcVX3A;N>KbNS0943t`J$u?)3`8qOSZwZ-CzJ)@f*ih12Ql`K?!UuCF#g zYp@quc8>lNx4`a+G`4P>y_sZf7hur0B`mcGq|E>uK{|a~Ds2vBAx;eJYxz|ZT!aCJ zXtxVd?8{dN8ufM?y%u;X;3JSA8$ZJPg!9*-8%91gv{i{G{9ZYOk$1z<@VmAC0#ALk zZW#I)^wzk9{18~7sl|_|g&f)2Gop(o8UF7Ffi+g%5Tunx_$%B4Ptod*uPVHO42_{p z=&fbx9Z2S8=ONab=ZR&N*#e}>e1FMD_X_|e@|z#LU?e}B7ttW$XD#tu_ROJ^hu-uV zYe>%ClMJ7CURiRoW$d?OlpX3F2}bx=>444^q6_s>Eqi{zUz9VdM%EdiM#-bN3Lz_R zHAi@Fl~dxXq<=L)|F{6%NVWK&!LS4UFDs5Eruy~*Ti1~~&9Di6%Ux_?;yOWK?=rHH zjP}a5wDiilyd4}2d3|`13z*zLnT`EAyAhI0AG!UGC8};$X{<3SBRv0pqHl>Wf|x0L zKQ>u^eEQ`TORFqv@q;BovBOf){@3LGVSIJgHu55eP`+r$BC#4k9S9$q7!Yx}(0pOy z6jJql>YqSI>CXP3(A};OG{j|a2l$E2`3o3-vJ07i1NrVxp6r(+a)+{tZJ<>oAlyAX z4q!lN!b*}STJjd__8A^!OBuqy;0Z@0kMa|_8n3wIR9(CGiQJhZ$yIHkHoK50J=aH# z`t_cM=6~GPIesa<`09siIC8ZF4Vo>QKn);l0I|KI0d z20S5H^A6$GO4)(UbmMu&qw$WMWAU*!{(YJ(mH1RXFi;(jWg&)!M}u{^5&=-89TY&8 z{qaj#QJn`HTf-f8jNK)CcpyM@>TG?4f}Q3jbpEMu{`|`kwO#oecS(-Vj?Ejf`njGc zC2m4--oMX*;#S@tK}d8Mcd2$g**Ij9zpZclPhm3n@C>)|+?LwZl!)gqlB?dSfo?2{ z5vT?Ir}(mpgP{rKWZ}aC^caX=>-eYJP{K2=hiT@a{ zTA@CmnS?imeL0^}#sB0$L)dgh-<1W&>dGL;g_;P%@t53?n)2)Z!{{UU!JvwO*ha?EfA*DK zNYlOM^3fhYB? zkpE7QM9V2_dVHdv_HP~$bL5xTr9VL?KR2N|A>x&NQ-;E6D$#;g;j~b>>HfY^el+f* zF=`;-@IAZGfZYpnOofpVw~Q=djMCSCJXzGXKG#>?lw1b5EA%(&(naO;O;hn3%zG_0YUPmcLlfUIT23Hge0ADBXa^PHOG$S4`?igD(3%wDpBYohLYSj>Ube; zE?GZKIZ122RgQY7Tml2^(qrEIQ?rnh1X+;>7c=`nG+ExexsHh!dpu( zAKXapvbk^IZs1^`QRBD3F3K#P8=Icq)&~O>OcyDqsq*D9cRpQFhJC*b+cEL|7&~O^@bkjOv+;+*>$uQbniN5 z;owm_9@-lzD1CvAOd}1>ypdvMZZCgC=Mz6ogi%K( zHwUKpQn6kU+09Sr`Q&`!vpH zb@x41yg%J3Q65)%(6g^!hyqHm1bSW+$le`8gx}U$Y$9%su`8cq7-KrU^0K|L73Kw~1CRlb# z@ZF4*S2=2BVf5qbodJ*jFnLE;FP=%eA7oGc9z+Q^XAT%28~ z^N+g*z44!YwK^iY&KJ*)`K{{FSI_U;CRDR8?3$-!ZNocB-LDZou5pH+YB9w+cJ)hR zr)KVN$@u2&cIJcEsrcAsMv`;mn~i_Aq#}J{@c3z8$#h*0D^mG^Lu#1HJ+KCFGvf@a z3R^H56CnEFw#(Wv;%Z$`?H8Ziz3gh#oJ-W(`xLOk3@DEx!M8P(Z`euJ_GbOwb?$#j z7I7h|-3l4s3cgg!dE0fnrp^h#WZs3&VIy(&{t*yNFyAib6ZBLmK#Y^$ocW#W~rvN zadJsPg_`sMIbB8`=}d}tOM+hVVZ2|kDUUlW;|3W?y;^S}AsTJLYPPqr!a-ckcFzq> znO$;mZhP1o;6^$u8DB=1-I*@9TJMdp(KkNkQg}v^GXBh) zq%L;L)s3VB$lM&2e}U1sga-=W#T;BCF(Y70&HS&~>h{QzmJ>Ppsi`ksz*Epu$ zN?W~HNWeas;c^JN`LXPoe)aXPmP|~Gm_7Sb=EfvvAU;;%n{rv(=O%5Ra0%yl-FKVC z2KT=}Wy1j(I0VJ(W*6c$E}vSWypYYRQeJ7-{!2*j$MNjMV@|D~dP9|vF5^#4pN>ly z)eF?yr#&b(a{L>etpjbI$K{nZeqPZWO8$VBzG$K&e`^IRbN-l1*nR~?e}~=GeZqpD ziJOQIrEZ7TPNRLl3E0fjf7KdA&13e6%K?u3MI-hmoBr@CFz#YXn;$ZIxp3V=d|&PU zthi&p=SiSQzlKv>@3iyvi~5?Kdc6{g|WsuPPE9Vy^7}jd^w70+EKe zn_oC3fYuiL-Ba}6KfgOZ{`+SWe*Ir#`0p6}*AD)>4E}$(6*#Bq-P|ZnG=C(>?oED( z+fB(yBxqr%7wYsP(N~*CzV^5t-%vuO-&_WZNa|s=%_{eS4xh=E^FW6 zJ?DMB8$$xdU$t_l=Bcc-4d^XBZ@rhDcr)=qF~qs|AN?7pqR;wk4^2Z_w>ZD3H$28; zMK?N?d`-v1JN?dI;mYEghUP}Tl}B%twbp@B!1Oj-je!21Jp*oWuiJIT!hO1rHT=lH zOcfVsPrM)dxQKZTqY5qbM}3QR%g{g(dQ=h#j9=$0VP@dw@7t7CoeDMhc9z@I^^9|u z^d{ffT+&)-w7H}+!rS*%C{9-+A5pd1v*db_$pA&`^k!7PZSpDIC3LFV`I_bh0ZepP zd`cHmHjge1*PD)5=c%F$W>no=1^M$Ob3?H+pipnaa>B7Kmb zzt3B)KvdZ1ipJ1f|edOut*f;X>yAFPInUcg{5~&}Y25 zr&p>{O0Op67w}B!6X#%F%$3NM>sD5Nr6>1Jy?!BKpYdRKGVEw=r_zy=A(4I+tw-}x zT%X>Lc(ksgr1z*j@;{I>v&nuakf*EH&;sT?R$`|J!bcVC6nmpa# zxX_0{M)x#PVU+F85=YlCx0_B1IloZ2eYKr*<4Yhc7@i&o*J7Ak>b)h<>I$i3D+Fg{9wHYly>UxNjbKFY7aCK`-1uDT2Xu@WC?z!5 zf1>^@8PvH7x~wz%n}=>C<SZooyx;AKj#u{lbibW9^t z8(FFarRC_=qlaD4t^~Dr30+N>J^Wgxu+N#;D@TLP;%PEu97fC9wu>H}Nc!aIdW4db z!QN12Z!8lqb1t+lNP)DqT=uW&=9Y{WGK@2Xrmm)4D3IztXLxMNk%gv)-g%PoAg*9k z=wYMN+6(27ISi1edcN!HL3W3oh>3?Hl|U#KXXcJ zCMtaWUuFA^9rD5{$5JF;k>9P1x0RNY1nm^I8#`5->4KYVoJfe#B%6`HPhc z0j(sh2AcKFudB~KCZO}o88%O6bZWkCL^H}tA>w7XGAn5B(c@~|0fP(Ixs90XWx))r zbR6|i9_2dEwRY^lukTCY&rDcK>O(yjyVZ^ni1PcpcIK&ghv1F}Nih0%&2`eEKHkaA zKlC-S>SVSAs7btc$2#qS&!f2nwudWLng6L2%x%NE#F0iIuiSgqBVzIp_0luJED%i> zn!Ma7y<*=2J%CzJ-s@6WCDw=aNGKJ-cU_Uqv%+`j#jxV#8rNUO$bEL8A%7g@3d>L7 zOMq9c>xyyt`kz=w?53Ye25B7&9{9+;J#5v zZ?`%Y{ESUl;WuHa^m9lBs6*Gwp5!b^zRh|({MnZh_2FB9_w{zQbE|hAt=QhE^nR8v zmy4ts(+asP_0V$PEo6gcS5;GnN+=4xI&e9QZUK*q>Y`i;!UtY@k-QMh_On%eeBI() z+(_lBhSf%-YRkC)j*9Zj=19Cb9(B`8D*a^e+srpSl)!~gP)YRJ^qfWst={^%vH}#W zyQx2=X{xnls<(x?BZigC?@k0{%~t-yw-p@|s`V|!_~SuZ14d91c%Az!{glkomSqUl zKHsb=AL<0x0c)-#HlP1?-dsSwLXT*is=Yra^cTVnKZB_!ussQC_wonFY!>|L>hI=W zR+43ndI!Kc_wK$1jw+ zB=qbh$JMX`STgTklQjE@A0y9G_#*Qqa%M?fQ;tC6%0-AOWe9EI+(Y2&4_(t7&Tf=` zuGx2_`<&XTJ=fGk`E!VWIYd9Swylgg+2?ie4YvCGIbz&2QuPy(F4E#TfMj#q=q>fX zY~8V!frCJ}F35`RKB6um$&zU`R9Uc9oWJ~Cqd%fF6JP*jH`inJHTX0BGt;*DnKgmh z`(^uXy`E~gui3|1A+XT||M2`hqy29WaE(g2W$UZeGlSLHz8kF%BF;WRJWX1T)^Mu) zm4}x*V4EtZ-FH~k{s+UH5n_=HZ7QD8aUo#1O;}oLij7$<9Q+j!Uc&Re~plSEJ_^z{dCfMC~p{*erV$+x^ zH14U=hjI5XQH6oSV-faAsK>qisNzYHER>*@Ftg{fo5zb8m$^a&k<&|xqdb($iN57n zH(=!HQU0vRcHzx=Pn`zVkrY}*D@yF`cUN0H_4gU_*eQVGyd= z_rqK!{kb_($X=ab>{nFxxedyVz0wKkw0}!z;Lk?k-mBVc1DTiC7cC8o^X;AC2t_zq znSJJ3M!cGtsqWL*9L_C`gk`Q*>53vN!P}X9UQ&(yT`itrO;eyetb}VH`}2xQH|}ao zgSbKku5h_fr!FwYfx!OZf_5hON9JD~{g?}JCAG)Zk%owR7Y~r75TDYJf?kA-8bz%<0XA$PQ}PQm)fQVHXl!-oJV7A{{`V=eM-yWsb?^4{ z5Hn;-?ntv*88TC2bvTCGNVWpDSloa!nytWBh#Q=CudovBxd%Zu+S9m1(@m$4Lce#8 z6Y1JKCVHU_V9GVVdq7eiO9K6jlS5X6zg950`FwfE(mJHyj0>h#Y(+&)G)d;Dx0!|% z*S&#PFv+W+(brHRZ>w}(_Hj7IKW~n|JH;9n8{2T-z9pli02^|?b1wRLpYAe&5tjeu zP@d@i9#M#^Z>GX>fH^hm3z1#?K2WvkaQC#KL6R);6M10NWzAsqEROm5c5$}}V)3QO z&vrV9_nz!12Ba&`1a2h-AfVTGDV}C!?TLTG4*4s3!l0YyoF}{Nty|321?*q6*QUT< z|A^c83$;KfNux%a*K9>HuIn@cGa3kg5$p0K$b`=fy6#p}cq_?a4!-#LPGK{b29-v0Vt91A*K5e z@w5qZ))|_$IzNF4dr+Eb)85U2uq21{QWtcu0jN>b(RlddSB=t7rTcy)9ZwhLIi7yM z3cJ@WdP||)U-chns`$^4<0#Gj`Noz!76eTs!DfZ9F%~Ox_}iuPL!;XYG_I@xf9-MX zsoydevN;@n)N8`p@`MF}X_D0SfiBoR;V@8Wls2RK`d34gbRRa_1(3XH?u0vc^OI2< zbO2AAUE0Tf`ki&Y42_eObvOYncCCC8>vB45tpP46Hg$I1mb&hGfC!i&)=9r*%v73m z@1ZhN`j6dcZ_PawPY-=;$-3Tis}iByw*io45>bGt<_lgZRTCXngA5uv^*Vz8Ix93` zj{Iw&Xkw}^VkaNL*hiAEQ@#6A?*h`h|D~gbHoK}J65Lhh{3x}m(i6Y)DPvg)G*9ad zPOV_X;96=;Q(4XB@~Qa@XE-iw;fU}wuxj71;}@@CYmUqIt1bDA^EBq}#Fsu!DJ@9p zGD^xH0y-@yo6P$x%K>jA{6esCXB@vD0kglQ|5HoPEeQkr(z8kWZW=!N}u%4l2!sBG9&?Rrus{J9cE1=~BqQ-PYpw)}$2-_R<( zH0AY%mYXrge%!v-b>{aE3c&~O z$x#9Ze~Fl)ft->|Uh46&JMR+c+zQjS7D89@GoMt}8Ru%i>+qItoy62g6+L~zP9aQG zsUVUjy1C1F0`sYrp3<8&%8%>za0cYab|rzal^&$F?zJX{o2(bVf|qln=XL@!%=a&6 zHYqnVg{kqD^VpTL(JOkQ3CMk&%}5v>Ef$kG=y-gY#+7|C`GKRyO&!v&C@yjRu9fX*nY!EL znS0T)FsCbcAiz2^Cbl8sMSRtx8!=RGJQno^PjgoAf+=`;H%`?dOQAf<-4oNyHTNkB zn&qskn{ZYZ8Ex$?4t;aPJ?0HizU%-1Psd`g9{O~fU05pkQf@DD&Z(l08^(ip8?jyB z_22XNlER1zn`9_Qpt-g925)v|=%YU4d*Mg$&(Zv^()MZ|B@f6KY#nx&R`DW>f#S{u zVkTv3bBbvQnY;q9MXSK|7HkmFGKW<%;w!N?7ojr8=W@8yGb?xDdtC)u*SCOT32RCa zoYFwh%*A)T@lc&*?VQF9m4o)&8C7B@c}1Ards&7;wePmH?`Fhz@x^$3iQy8RUh>0K zeg`nE{X2=YxP@)q;O)Le-Maw)^ef;DP^JtA8XrK83}_Ir-bhi(QuD7{YpHz+?V=;{ zStDuf{ohrXWZWDmXCcFWzaSrS;nfwH^pGc2yOF4u;NAKI!(8#&-=G3g)z!R6d%)*( ztemUpR7f*-p?4g~Qnvn){Fg{c62al|gZWS&<(FKk#$f<{w8gppbZZO4%7_@J0%sL5 zP-$Fw(`4(F+AB+M=_m}9>`latV%`AS+a43ilEcQ2%{2TN+=RK6hN#2GLSxKg{G6O( zWsqub8~P0#k7)LWf|1G=si$>z2aY5j&x_N9vz6e_RN$Nig7IH!8HttHFfe&1=5o%a zXMVaM)W>W0iSL@8evauA3xfY67uBmr^9&WHdRMr+$qoZ4M$t1>uYRo<~;~CJ$F{}9zdy10&Nyw zFoP_)6xy_D_c`C-akW+)eRKX^yj#05ok|lU@^4PvA%3K#q#40D$Jo>y^y|OR)32AV zJ&rb@3n`|5c1B-O{CY4~f82%TCCMaCo+JBsO68?!!sV3VRVr|V^0f5f!puacG2>?0 ziP=e|L>@9FrM}pcSff4IcT7xW|I7?$P-7v>zOR_8&L*~l>i5!S> zAQ11n&^!ofig2^j5XYhKB>Nt+(ap>o6quH?OWk2$m!O;eJo2!+wPf+UGAPu#{UXm8 zM#_x=oIe`*5h~M-KwL!k7dy_Hyk(nz!84~z2fwROWKdL4X*J^8_?zy!iyH)wc2mnj z*Ff34G+9$Av>q>?US5Sg)ZtZpiRUVkFkLinCb=EXmay}o_^Nsli38m?vl_2ug1k4M#Q z{Q-@8@0%d!WJUx>+-+y14I;S(VRq*%B=60Zs!!Ge%CTcHN^hLN&S>g~K*#m>e*tw% z*LtuYW}|Y4D&9^6B8u3_=`^d&mpB6|%gXcdayEjE5+0yG#8%kKBN|1%>=unvfQSt~ zWUGCj1;ozP0XJ{hqP{Bu(_cUu{Mg9@)EN(UHBFUY=;nWtkIObaHx%f!$TU7q)bL1> zQ7A-w+9&<~P+IQ}6JUos2qK)m%!th@Rr5V*xP`ANkv-&DzmxG6^tJc8ZLH<k&^ z_981H+V)3bn?Xxj7exJoG>g(YbOLf|pdUXM*+&d80KZdux|g zFq08;kd*7UZ`4IrxmbwTd9{@s)6H?f`DiVvRUY8p=fT%q=bB_{j~0+6 zmSjAJ$%x~#mAvO$bl|>kqvr`AT1jB$e%loIqB_)LWL=aW#>&WeYhMY9#wQ1S+YY^i z%-)ISl_pky<&Qrmlq0QwO1M8fF3p4wS@Z#CwKDm*BZa~+iit%DLcky|pRRsz*|9oH z*qT}U#d;62BTB(lyvC^y`^AM8-_-x^B9^DxfB+=w1$Nw1bno;O&HBIDGw7w^qQ zi0KBpXt+~L*PJ%;R&Wm@cS0MBhIN02XVsu#RmawUMe#>%(!N${WVS7l&EX|a;~q_9 z;^fyCMJ|OG4g`3YuYX;t-5NC`l>E%!&idv^-_exoftJ?3GcQVC>^|i9^D$3&w#ZY_ zWV=Ki`J0m;UWfbf+pK~V1gh) z<(fXVY35s0`1{@Bd}tPP{8Y|Rz#=RF3+lGVDQoSV)wmEX9DCJy1P>#hf>cKRfWa&2 zQaw=|7LMc1$)J3`45}%4@HNiqEdsfe*aU1U*UJvRzlWVOrza4o<`e^*Yr`+Xn)H}|r z6$rh9zX4uxZ}04}@Z5lMwRhlw0~)jQl;3T_V~c(`RG z28HWedcq6mA6Ti=c6UM)(?&k(t#7Q16vH@*b|D*mfUqXtmZ`NPbY?&$N*V}zzWbQO z4K|+P3!R%fVSt24-qU8+IT^&uL&8(pw*qKM8#=9TpxDYoLFq+Es(A@2){A4#CHqulwx> zsE_h>l;K)AZJ~a2gvHAHA!D6A-@o4>`rXBGPD#MBoPCB2{24ngN-J&grf?7;$rNV3acU7tf!md*Vhv81q3&r^(`~@EExSc^Yx4^q4KDaw1w2;8 z8U%CLt+o~Ms#)A}XYLn0zrrgm`yII_KvL}Cp%OpQ@|JCzWaV21Q4!f4k(K{Qw;= zy=h$_lDsPPTzvCeKnBEgn%cz7SDzWu7iZ4 z+hZP%N;`e>l=Ya6h9f|<z4TYA5+m|%AWxsLfR>vBR`f+E zDHn-}dO$LgIplrv5D18_p|l-?TJXRmD^sz8R%rt}JQAj}v3E^V6*o;%Q58fEEAL6y zsVPxe{AIu_7cPnvyS{%C!Mn%$d-ArO5am>8_{P7b=tPQxM$R@-Bn>}F`D*%%Gc`qi zH|tS_|2WfqV=9%F9td-SW$~Sa@x>V)XbcJc{vbm7qVAP_y9B-qB+6F=I%Cg$hP3HO z4KO<6!pUpX4JYEnw{BMs(c85WU43h$vA@&`k(}8j;CA3MoX7V7`|3sQ;~_scf|oi( zmQ10@w(^O#b(Vu~qs^UfU5;zVjG{`}p)Pg4QIU1(c4uc-s(sccZt#T(e;nAH1CyRrc zhEMJVNy}}i;>Y%!jIZ7t&&;Tg|BNR=(WaHjEhif;2z64%2rxIBc`BWv<=iXyBHsY2 zEDase<3Q-?e}f~d_HVrX%2Q-bY}X>FH7}z*a@ue-&&(c{!}mMtz>H(5xL$HE$6e}+ zQSBIzEPnc-UF3Wcv17f9y75wPoA4S23KbwR;APt6OgX1wYwX;DQDhXE{8pKo$0@b24QT zmu^;l-;CB{8Vt?u-uw$0Dhm^{S*HJOpdUG4-z56H24`S7S9Vx8wDcf6uqno{qkAqe zIB;wl0V9IUUesrG@#T#{%yJa zGxbC;uqKt9qPc?DP0N)!9={eb{_PSQjoaS4-C##sc{$bo#1gBhPWDkUdugeiuJ@An zVk)PM9Fht=8w6IC?dG>G=t}YUj^r za%?jDDHJrU#3JLIS3Ae_CaL|>^B=KHJS+lSBB$?=TzYhAz$O@}xMObLND>;7aeKxw zDYRT3prPjO9R1t*bkEX@RFO0!=7F)y3v1!3}vK=(dR18Q7&zUN@8;>VfoL16))wq;>=1BR!jHb(`ax` z6(P?Rc^CgPgwpYK(WU^YAUxflC*R`j7HxgMi1AB`st_T67jIjX<*d<6|5B(E&v|na zvQ0XSm*lnYUYuq|V7;;9WQ3dR)|vjBziJ*6#Ma<|X5u(gCDy*1v&xU7l1t5o{RVHX zJaeq=&px^SWVP5mL`0T*CPiU@o?2w}CC+$EErchQX2`890W_dXZQKT6V6}pAdfw}9 z;8c%KRL>{^F8ayu{m^^~DqSvN_S@!mA#c9Yunyg=MxX50HDz8_KvQ7F4#3uaK?zu; zX_5CIWZxqRTTXsO7FJy040*lBSY-1%6fckz8vBo{>~V5!UQaRSSg7hfDIFqan6T<- z>N8d|D;LFF&~Mk=1H}b_bgS~1ex%P`DZ7S)eu~#WrCFC#>3v%6Pd@q0+}WN9(`DY9 zuja4Rvs(%^F&VwHnyRIn!JUAc#eJ9dIkV@GOP3=nGTRDqK`*({?hb9AV^=571U14r zbeB<;#Cn^0t)CTQD2UIr60!d2)-K*xR`&jf_^u93zaz=&ojM=0O_U#OUp57J`h(-} zOsB6q|58hfe}YO_tQSfy(+H}AiumMY_Ws)5Q~ThZ6?3b3sOcl&V8KQQ8|sbO7Q-$8 zTQZXEHTk{tUU2V(XBPMDpfYUwvqW8*b|YayGy>Y_70zj{-as z<&}P?{=kd(hyiQ~d&nazUrrS)vuFCs7 z14Uzvd)sBaY{$sTM|q8v<)VhEvyOGg8X~h{^0?bd&==^nRGCP>>EwvG0Utj0Uq?Q% z915jCkJbJG9;4OXIHQKqvR3QHtCC}(puM-ykDz9_JCCVlJa-z~*<$+? zY{dA~Nf}jdx3HyzYEKQ2ombe_x0qeB;|Rr7HrP(APtCb+tiO>c+9J_&j`+ozQLaWn z*Ap5_AER%%bHP7c>R~v3jl1JQ*|4_xly>6~L~!q}Xn5J1SQo$-Znno|E$F`K*rpHC zJWKT~vZPlbP)c{0TJO2W@>A8bE*;9rC_eWWEoB1}iFt?_^2ppE{?1S9fE8o{fPb0n zWf@@XF4=W?KqIj;r0b_h=eO_tP>qH9vlGu!c@k8E3wO0BXhuaU&Ly<8wOm>b#rpw@ zfO^@k_`xvD{kU@yoQ!)Wr;jthsrZE+-*X_tVtcG!m2zZS$bx{adnF`*H@z?v7zR$k z`MrzVUBR)+Uaz=wXWNl`T|U1+$WJi){jw^_I`3jp>BTd?Xe1@ZCC*EVGJby#@?I}6 zjfSt=x^Hj&1TBf+F0lPxPZ(A)cPS)aA@h5_$5?JI6D%hMNlOBf8>Y`#zwP3L*R${L zVwCSH-MkT)QHCfZ;01GkWmqrFk>>*Kg@B`4}LZq{50TCH)` z-i7>G1kRE@*Wj6NlxM9hzV5tlEPd2l`!ooVEKxz*mi{*X$_V4OBV65=H%~hMkJkng z!rduRFXuqv$NsAjh_yGz06Ow%+jiTIdP2w5pMV4P^+RPtbKQp-V(p$G1rBJ>MF}Re zt5%p6j%%YIo>4^Fo zW}e^fW}FX1-r5cXw@Gur32DXKQ7AA|V`~%0=A5ZbT-nUuZ2UxQ1cBrb?9Gmsg(){; zYAqk?x@R{t&m{Sha}&(;uc?bFjqQ9WddX&Jar?NO{7`G4lZuwm)0ExTh6Uhq6MA214o@5(etI(voJ=uT1*y*&{OU)tMEosn(u=mQJ%4hzW=gSQFX1euL-w>7wMu|u6f zk3u54I<`&=J5z2ZSsPG9nqO-lrxr{B3WTQS40$ED$hCH=Xt|~Ye{rfaAhK?$rk`tN zcUj1fJ9oD6J>9q0sJ%`5rv|gqVl*lPxBQF$g5xfn^L%}$0yL*`;;FAW_J=}_e0<%Z z+!W?zRRPSG_o{nr-qt(j8F#~`mf5)%)wW(4M1GEu`O8(?BM5lCGL6(A_UCgl8VaKC zBhB^nkH@1E{@1Ghv+G6a#wW3EJHw>e9?wDC6~T>qA783yS@xVx_;gh!47yF^kUg@cIs%p9Z@kKQKBs#)O*@-VLjE6`D(D{ag@aV?n3)+4|Rxx zk@y|`*_S{(Jro7F+G}*k#FsaG$X>T77y)MuQ~_QO$+*o;ZemePMA{|`>FAQ456;$A zPFMT~X8<5)NpaE(W5G!CUG`pBhrhSHYFglCD|M~Q=Qa8zB zMi3A_Qu}|vwjR;j6N~ zeSUV$@pINPf5=9|&$Ir*=4(>ag4>R(=i5R_A#;PbVZ%Z4ABIs(4R37XV{wNlI*u?(Dj%v5 zpLH|pen(m)Xg?hx){l6@sBX75==08+{1I)QuFeF4S~Aw7P6 zAUz@b9;2To0IV(@Uay*L_`Evnz9K zR}JE=peM(L1Jn$@S>M0TMI?$fSD_xV8tDa+I3)Gp0<8)9#&7^xNS8IKRUUEUwz_E9lA>^XvG!v5-kkhCp3z4X!R`vqP z12?a)F}wWrrrhd*H!oz=gos2_fXnZm>Pg1f`D z2NPGtg+!ztJ*1#8Px2D2< zI=Lst@jdH(-xfJpfk0JaPmi77S=|R+a>K2GhuomhTXH;vKk4di@U;Kwr2j1EeT^S? zBiWF?W__rfyBRbv?X#eK$Tj{KyQvVv@*0=$;{%VR+!#t{L3^(YpgFYYX58s!oZd zzt!v6%)n9a#h&~6JLa!zeAnt9-xRDbq#H?WoGxc_rSO-xU7hOl{BXIw4@)>8|K99- zMn#;M2(&G;9e3GoPnwB{!k#?Ke0Lov^Ui*N>Akzy#X}O_JP{)#OU|x%$iRfKOJt4} zN9y5lg~cUszwKdNE6S}<@oT`m!+r0F+n1rd+C@ma>_P5YYP9ZpXwhi7VQsS%KW}s) zIc&&{Dpt5tPkK&d_>Ckf6RPKpx3arwkJZHPXtRU|IK_brka!#-u6mm&NX{gb`j*uL z@l07%Hjr|`=j&bbz#OkLn9u!ccE+OrC8|06SuJRL9$ce%;gf^bSPE^my^cI{nV0PO zu`863nkA|T!=~amr^4NLt6M$fREY{;P=$KE*-SO`N&kOEr6p)dXN*`qnRU%s7EtHQl zs>|ykBN1>7EBs|vtmWU0;hF9x98a$}id#V_bY>GoL#4vSFbj~(cD;A^TTZ0NH}+gC z4;i17nW%07lJXg=p!7W7S;ZclHi$j+nfg8?C0?LdUi+*1hj3!DSWx1@fI*qU$ zf=i;nH>7rH^-n^;y0)KKeRA|syiStNY`F8ISEXrA7j$gpM5azrtcZnLXv6-*uKLT( z_E(LqY)uhX_IWaeg?W#N?N2QYUEKzeA3qlNJ36~|ty&-8H>Rjybl&emg1leIlofd< zZp+yX8c3xL_|THpnsi3FS4Mbd_mOT=tCk!001XK8E<`1(ZN1^Kv%pvEa&6QS9zI;k z{8WABFYUE*DZ<&GeU3D^Ohh*9IPRLSF_f5mLt9QS{V+CbH(87LBWICq8L}KX-)Te^ z*_h_62XONGw%hltNUZy7jQleEH9bG-H&-$7a9s;shW){uCv$qJbnk3l-Cb)R+6N>y z@4Gz2R-ctoyep1!HV#PbLCT(?e=U!#NQ%f;18FFrNa{x*U49K@RF=+KX$K0tcI6t} zBoRfIn2pTwOR(b&9)%H1pELe$}ukI|))Menc6AR!U zj_7H2uP8lYFJ`&aRln8H4?-6`EUotH|KaPn5C&g+74=|XN1jFBkC4W#=^JV*KuQP8 zes5gi_YO2F-^3ogv9yBD`+vKoti$oAzrNn#w0Ss+aePVfnGF`@GhxH}IT``)@?+CEU;QWE?!HT~8f%najFDR`6Vo9z9+h2ZT)0 z7Q#dU+EkXKHV&_&-unV zto6<{%QK%jAE1!lT(*9%-f1nV#sRtJ^Euk%8Pb!J+&R9Tza0qvaR0HfI?ztX$7k`A zSzyd}CSU~1I`U{kR(Ma@CFMyQnNU=2I%IyHc)ue;%QQwC;?Ql+Giu+l?U4KQv6%C! zUU>9eS=p-iuVr&>B3u?VDvh<12z9n11a>ue3CeD^I;*fSPkSCm9yo61T*+}t{dtHQ&nRvfO zeq38ep18Pw&y~Hj>{wexgZ>@PW9qGD2%vgRccX^0!_w{FRy4@%JfbW590@i~qk*O(0SLutXZwGm z(ItX#Uq5D3R5uWtevS|a8pFRkZ=W^3J0Zrlz3lBc)8ZgvkZJQdnmwbjkbl#8`7H3N zO7jNJ!)uh)x3AVFE!8Z%ll;u>YFc5tipGW$G(3XC&-=u|tW%cmZQqh*y2Jujx4f}2 z4P|}yF6~TXA$S-psqSGr&_jAa=W1l1QbIslx&b?>Y>1yff6DCU_vZvJ$OH$}) z#qsa>mr}$wyh!{w`nC^z_MXkWc{eqWz7GX41^3N5icN?ovq-r-8OO>S?>#Kk@+~^c zn!)e6v9tDXN5=GeQ9}U%ca8|@EhhD5Nf%O~3wMqhBM6GwXN_I^oFcvKjBFx`=UTj1 zoYdn_e;F~IoXeN1Qu`02=D*5JJ@#eJ2&-TrUHUs#-&4Bh$$vLJbD+hUes=tjM)5svbV;Yynv1WfO6TKa423$?r&+u(U#P#M3uf8 z89W|h-`7)pdM5tlT`lFyRM~D$nG>JzX|UOX)%$10>xNn0V9!q`xO}%{D`!_aL7jyo zgdzQ1@%7~AOP*RCX0nANG$6<6gBr9GBHguW8}7o;j1LVtQN>m9nBsb8jRZ`w#FMl2 zF*1RnF&)RAaU*HX*!H%n+4PdYpK|l$A3GJP$Azew5lt$qr)!J3w&`;0l82=yE$2N; zsM3yBR$m7#)4|WK$$E$v9gYV+nBkEndevELz7rsl!f(A+hJ0=4F%8+ig*(*xMze-I zz8RxZ`KZZ3k-bF+j)uy0lk+ZP~#KgU*Kp($aH|jH6hbs8-@fH z^GF64yKe-w>IfXC$;sxm`d|Y~#Uo~BgX3%9{Y_T|m|0rpw&kkqo`azC{#_F}kc`5> z`4u;s&!n2J3SI-Y!NBbW63IX{ma&8GE9XB=_8lAnWD*|z9~jhsVRW5DI5f#uw&tBD z_^?WuwYd|B=-zBEQR{VYd-j}dm5`WGwi5*ka?!@TJG`gk7G-8tkYmepbDeD(G$EJ$DLqyW8$+l`|YO((A0k#wv-f0jC`(T0qUFAH*~4C0N!cIQEPW_~ zPr-;GlgwU%*1Rn8TP)yQo|^5S;-zV+_P13YW?a5oJM+Hu$FC(eGgH@bjQQ=O&0k3+ zlt=6zqyenFes;PZqmrLkDi`qm9h*MJg`~tmq zt>bwJ6I4{CV5RaVWIgyY0zU$QMp!-!wkk0e_C%a#>7K`YYdv%-K05SRS4wfy?Hdm# z;4U1iUG^X2en^Jx&p1gQP-q(Xu8aQ=J(CzMGE6?B)<4Q8wXNohmll!QZdjkci2+M7 z!++lNsRjEbZ5w7p>zK!A)j!=XWb+e9&M(hLE-mF0m_86uAb8)5TyWF6#^V+`-c7Z+ zfox~LA~#SS1B}EO=h@8aZ<1SzE3#{PpG`S=H_!kUg7494t)SNi@p_-^Zs5>Nt{Id+7Fv@!yHsfm5w6F`~25a=5C61npz^4j%*vLt=WT#N917O zvB^BE6aiQ+2*o$ZP4o}_AKRVVv?dPnFCpxDWKYI*O0l9=Zl+|}h~EqJ=RfLY=&cAk zOY+aM+?SG(nefT7tSO6s7EeXFw_3<`9Zn*mv7`>YAxk147-l4rWtYpC!l zTfU}$d@8rfdjyeDefq|e#@(FVg@RM#i0yoz@haH~PAnawD*X-sA!@6cl@ zuzG;_ct6fHV;5S?#JL1pmr$FVN}M&d%Je_o+u4~8mH?AmIAk-j6?3}8=%v6#_YR-McnYr%^h*Zfbswf8EAbRa&`hOXI<&%`u0q91%sPgjBa;bx+E(a zw$7dzuwgm7Z_0UEd5D99t*kjn^I(4gy0QJ~F_!A7L^2w$$CvT03U8YC`uY2zq z&n(@!+o|>3Jou;^dJk$GB>f@q-d49+y`-!_;1roTNy&1a;$Dw0ZmiM6tSbFD=~%3( z6d^^{+Yz+>0SE)^4Qbhsk3y$d3>r|Dh8~+o5AI6tRg@lnktRPMQfrMDF?ufP?=+iP z-m;WMMFCXdwDR#;k(wow+)EBRK@P2GOYgqRK0e1fRsNGG!lT5r` z3*?s5;YQ_5Ag-AK4{1@8E~PvM?1D4+DNC)f%nNT;+f{*!*83V_jns`PB$CM{gS+M> zA;2y|TJ*&ZCE%9KVCcv@1E^0IY?GG^p8MfS+?kM@N^=+U%#yW#V{gUo+7|d3K@4x> zQmn2L_JJmVzcy*jIGRlzrK2B0-#n)Zj<R*_l4so1hs_ zC!xNkf}MUj4&>x@!^r8=+zgNgE!0n6nV%+^?jNlTX;Of8pZ0hJiEMIL>N_q=hpbhD z+V;d7E=;u!bPIb;kvz#WR~wlE(*4WtPb_~vjtZU0-0H>B^|vpuX|-djR3Uz==p z+v;^+F9Ufwp1v4pYoj*Bh>VX7SGc@Z%1YVF8^^4UM%UYYx_}pNa~&eM2B3g(8;t~7 z62LVm#ThZ)$J+9nAD++Ya{vC0kLo`52W)2>E95t_rMt2_~%krvEQ6Q+DwBAB zQO?!wrR+G)2oBqsn+yc#eT$ey{Grvc#E)=Z3j}(m z98XI(R}@SVK)V>t;Kx^Z$E$kfJF)0bJX8Bl-c4o}PoU=c`>+Xe4_eDlZjZA%t`RR* zIf2vt?Wxg9g2rA+@W`}GYPJ{Aa5Ku-BI&xA5e;MSFZP62VD+z8Adlsx07PvuAJ{m+5d1X};eI&-{W}$!ssw0*LOdel+3}B9 zz7IH}Z!q!`JtKD9Q>!DJQrN2a6{DVtk+EmS1l7nLe~H;I`nlBRWv;%eG05lOE+nu& zaczENfSt5(-9fMX`1VuuLzO9OcN_OE0BpW*c;iI zE|k#9w<)wL5-Eiu(NR|pj*nJ&qqJ5uqyB9e<>(R42s`8*Rt(P zRW5!-AoyCs7_~u}|E1oCq{RSJ4J!M?45;wo{RE{}!fSw*pX4W5i^zHUvVJ-g$rMo( z1gadUyL%XAwceoIhzI`G()uP~_7laAK~pWsgKdQhyoIt)lk727qiQKRiI4gWx(&0Q zp)9~`*856V?!q)v95)DbA^YN)b|p;sP38V(*PE=KdNq5gbxgz%u)%AS1+A+obC)1= z3xF96CJgVV$l&>_Y5mpG#hbfdT-iFC$2_&9a)5jUB_XSC7C z&TrjxCkQKftD^4RmSD2+fCryJEWeO_N z{5&vbYCM}BWAXIt_8+VHytGY@<}uoTZ*`tG)*nc{n{xwU8*+;ra6>~MNWkV?=F5B$ zUr*{C1h^lU

2crhWF(azR-aW2aBaTd;)+TMexs~WX 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 literal 61375 zcmZsj2RzjA|M<(UBQ(y)I3*2xE1M)0Dn(}|XYXXM2nlgfSw*N+R!+`#wzEeW*BK%E ztZ>G0{_higzu({E|40uHJ^H-w{eHb)^Z9yxJiDo*$#j_W@PPvdn6$25zJ1^THR8Yl zsv8V+;9p+dw>%5J9dx^`sdgZ@oogEWKx3_{t$N@T8cd@R z%n%-YDk9=jxI}pHL5@~-vDv8mDgy7^uJ{kLPI#IoxG6~lZYiWLYrZYDTku^q@ie)+ z`oqwEp@KL+OWN?8t{64Vnh8jmto&qXzoTsDWjJs4n;bK+lSo<_u#O_#IRD|sj|rw$ zzJ%*ynfINlxlV_$s4?(SLF+o@(w=S34sg4rrjpVJ*d{A4Ups%S{!LKH7;VY^f6lls zK>6<@Di$m8CF{z#j&^_Z`4%_Nwn0J9odI|W{doI}+s#mMgZu4O13?#Q+?oU*vUaA# zMcxm)sF`+yfiHvwuLy1EgpKSxzzD6amMlN)`|Z@OD6m#Hp!ZPs)!wsmGM?Axe-6-= zFjzBKb+pvmK0j;;HW|`CU;SBKP9jW<_+^0Ftq)&@bo{`^l4B@ja9k26+AbsP#!%5EpZSa%b;P${7ri7ePyVF7^EIF+mX}aM5?N@OeEqznz|AZ!@}`w$ z^RC>`*B1jnE_ok$^D$iSII~}Sfu|g?lPRk*^y3!cd$jOCxw!_)NG6x?d*o^M3_d4W zU-y$HSE-dD*3>tGP_p?#(etf?vYOek?A-LH+~o>Q>V2a2kG_|Fc+P|J(8@X4C-nMI zO28;&UPR%M#C)A=c&<ye*#XBi)-^%)?`pM6w<`_$ymG|m7#c67lZvVQi z4b4+ZOkKWctv)|rvMz)(8^3_u+n3oy5Qa6xSqcBJJKu;LM=Q={ey?)sooPl((yvSK zV}lp$u_UB4`FqptD)S)QFDrRjPY8+O4-hMD z9d?U0Pfhp}5KT|9obzZIHpSvx>00cA0aJIBzj18OEs?B7k&&oS@whPY zIGP-h_P2#=9<0s!LP@X2-P)H**7Xhiq8Z&@Q2o^-`A(V&Ikv#6RemT|UnEifk7|_k zpJQhrY}8FPZN)-2wZ9SEAHA;Vpu>4Yqqa?Bd+v&4>GHNF)o?&81eh!Y4jG!%*(3O@ z1TOMmb=vCt=FFWnd>kpSs{K%|R2@{pKfmm#e{XX6j+#|MXKKuJvbi2M# zqCsiyt)o>l2-PSp>O?KI#HJaxRsViI`vQ3kJ}zz z=VUTIpKEw2o-Q$Q)C*S2i)-c{Y_^RzUU7L^x5LA0 zLUNp+MBw(onr_C%cd|$e#mL*adDKlXRkWCqX5vv6F$1l&2Fd&(Jx#&)UeZa#(MU-4 zF6svU$si0a_-K06h#M7n8oO(F)LS~^JbpNAVL2cOWT<%Y^sgSAMa=e#u$<#;?YJ1Q zt8@q=!S^_p;xY0EZ=b|2x{t2Q)c2QP+4*Cu+v4HZ?uKGhSnz%r>p!xbnp!b&H}68_ zl7t52?yQ06`QYBPlls<^6-z4)8T~rJS9|?}_IXE*{O#8jm;J^q81Fd*TQub`dTCMOZ}~Mo=6ui$$l3Rp9WU zHYdjWrc#B65qj2rDpo0L4YG)xEnQ4Id9EnNDz$trL*uJYpZrjY|NOizTRd;zR{rQG zcC~)zWzw%t34eV_VWb6xkZiMp zZx2rf_rCS?L&;qTOJ!{!OeHWQSTtV~dzuPR@#f69oKpx!UY`DQzS01BGyqA|N zj2xLf%{=^adt?pMQt8z(8PO3xvTU^;g&XtkMCozth%lS?m2dwUy^4#|Rd|63%Xjfu z3Z0CmmEgK~+FVfMzqj?03YTvr`;89O-+BS5{q_kBYQb-o-0f~);%)0XC>pqQlbGr~ zwfWnT*PankJWoHoS;k*l#&_;L_$)7R$|xxiN{hWI^VAVx;BYck&(a0WIn`>WvO$yLon$x zz5C`%ct<=OR_iWj7uE>7ztMplnd0zUC>w_R^%79mMF_O{=a|g2V_Be*|8YPE2jok2d*VgK#Rcw1)KPw+UmX8)VMa|-SW{L z*H9>kl5SzMI?LmG*_rXzN%o}=yz3lkjOL7~g0+}+{VVdf!$ir&WRpGwa1+8h7At0n zc`9h_eX(&;Co-G5Q?zJ0sI^Qugy{mr0l!)GZHxNOv0k7m=N*<5ef z1HLR?@BVAALUUzo*T2Nk0LwJ*y3G)Y^5KoAl}I?=tR`kJZ}>lFx($;DS%+;lZs157>}Gc2-$42RBp7b9#7c4;u!-T^li(uEN#w8ibHBryZ58dRYQMm45dQ% z^k}oOn1!m<$4@G|sj&E!HI;@WgH!g8@rdW{XW`Vm-&m?@XqeBniI{kGzQmfgxLD%P zn(!9iMv%VfqZgiKHsxLlGQZk8+B!RW&*wLydfrl)!4F?Ob{Wv1voFSRNZ`|GP3j?X^6Q%v&Mz5$;W zM&@4ui>-jgrV#K9o^MvEv~)abUr;Pk5vV?;Vu!N7i}Ch0+XZ81+FNFd-$TrAfyKns zIH+(pm@M~Q{x^Dw-gmv&q`^z@u{T2Y?ayo$;a7iEX9z(QzH1Nz=;9q4r7WiG;^tZm z;r=x6Z4J0$JfmtW!n~DB>ZPM$(KohcD?>58ea~_cncwgd%Q+wb|Ne&G9{a4f-=Ov& zgwqmUm6(fKlTC2-{Wx8#|HT1w8~&CB&V2>$xW;b|R$~Ox*Hi!Btub<8?^)pa?O(?s z+T>W<{G^Y6b;;L;T3JO9wvSj1plutfdIa!Ag(x3Bl+OxkQ$(vKp^1tE5ybd0L;`}4 z6n}YsH#JdBzJ1o-E*YWyFf04uS;Nz2N2r8uI>gZ?Bwp~{*`6+Pmi7O2 z?Zw=rA$*Pou6+gmHlDJzAV%Uz>=6@;LqnLvzV+F_)Y(ZZXOPP318rRIDgi}zHPu4vY3EPr^SP*mb}hy)EPk+b=4!ob(CYYW;z zQPL=P)W_nxy)MUcY(-_ag;aoMHWLN#B4A_QrAiJTuteXS?AO8BS2D6EuE&B@UW^V7 zd!n5dMT<&2`fs^&w5YKd1;i(?U|kOCN^-bW#m~ipUt;2_4!HDcM8`!q%JE04D=Cvh z-5}XvM-Q&Z3eUL$A6(<#y;E@7-q8P*T^G30iC0aWBl_?-?aOhdPJiI{z&T@cQ7Y07 zxP`Y@ap;-cVftyxWn={z!cA!56<6SMyRrk3T1i(>^>2p*? zW!HtyG4j;ivq@sa*(aXEdCcYxvrTVSy*iaee<4fwRF;u*_IAWy*$IIt-~0fUtd+KJ zR#Cr!ed-I?2b{FjmS)xVF8ORd0vw>yZNx#_FNi$new1UM2}Za3c~F+N{;@*TB?#*0 z^Ucl7UHMskq(jvnF&#RO)Xu#5ao^%^!z|h^#7S2^M_DC>hm{X>7Tgz;1UX{Gka;uO z!gIS)OExT52JUzhp2G@f^1VJ1sTG{i1iq*^ZX7~5rbUIO-nz5zWqVZ`ID0O^zZ(hK zzkg;^*YaEeLbDwz4t;#(7V+oP^Z1m(71G&3_Trz2RaMK?D+p<>oRF{Q4p|65EI_h} z{U1wZ1V$fLq~Ck_SXW4V^12=S{ev0WP@gL%M5VAZ_}sx&()l*ZO47Flv&vvuV>V|V zYiO}Z!r3K(o1e6&Y@|#J|-*9s6^jB%f~d5_+4HCf`Z_!Y6q`50pL?hd%lk zM^I$Cj`lBuA2Is8dlhUKvJ_8cS&K56n;xwz7m8AaHoT)njc<@a&_1UAZ^gnOLb!Tg zC!KV2(tsg+jO+4u6Q`f>2U*%LQk4l;eOlrsMB@NZ!#8ysZEI7H3`gzx$;@ zt!6>pk08WB!XkCyZ&{`mC4LiT!Q_;Y?dp*}A|gx3UK$RlO=udLe21DFFu^QzM^Ua< zwh+b1h$@ZlW|=qxl$oN>j3Ui}nama@YKhE<46c7hLWy4vQ{eQiI#T%YT?>KT+70`} zfTw);32-T*yP_=A6U96ULpA|oA{Hf zb_E?&m){E2wMyYgJa^E8Wz%csrQ(mIn`Scg^&>Cq5C7-bN>L+`3M>sW&i7QQfe!7P z%J-+0R2=qp_Lk34$Fx04RP$sug%o}?)wJArS+S;SiLXo!Q2uxlm~nRWr)(Y&dNQO! zyeSvXBFS2}n9?hhYDOaxlCMgQd&IE6rUghr4{17bI>9WoQOBO!lw8b{*$|QwgWDud zqvkp_6dE`0Mi#W4G_cgI*zrO`T{a@J#z;+)LfSUk0(f6 zY}ua(A>3ck0!y5-i>1xG1V0eDnUoh7DkcgsH-*;SfHuG&7B~0oa6(KxC@Mtkn0YoA z_IShQE5|q)SD#am2LcfIzui<*c9T#!pC}Zf0YpgoVwcpT=5T-@GLHY-&DA3aDX$)2 z@t?(H6mTB459?z~q(Z7sA2CUGG%k}es_;8FC_4SKQoB#h=Sz03o#m?5N}=i5Z3$-4 z4K?OC|Foym7+diO<)hk)E(;NEM+UM+Rq1KghTUrFi!?+`T<)WNaK@Ys@AfsTmKl+K zo`F(6t&Iu%zH0(Tzy!{08s^1?iHRP1 zU1Vp zl9x{syV3SmHl7v19dxlg+?pl?R2M<{bC$zxJZXFeh98nYf?$ ze8{_y~JB;{F$isNG3iRMB^;%wqCmq`3jT!auC9-JsGiUrW4I3ifr9vaen{ z%fkP&uLl6Mh>0VsKOaHtX>a;93z)@oLHF{FiYe_$#DZTVJ~FjSF8<_#9d!rQ!MM;D z)1$YHWGz!mmWc$S?ttM|x%YQNA4~uO|D_47(m=c=yG_=SrOTD^1@)+Y-eq8P6i>mh zjDlH#ufKP=Z@W*^=p;h&b^W$7DjK|vzE|Yfnw2=HdJLWHI2RBd^tdS)`{)nv&d6CD z$*EXGe(twL!R)ZNyGI*dG;?iM6J3#X2bL923#tbYDQe1vK+Y4MC>5o8wBi13SaR@w zn7w8BO9k!J6H6E<(CuiKo2$DGQ_t|9YLNC`_fba&w4t{C-1|-jHPuW1?JTqQcIC-d zhn_#7uWtUbsNaQ%n)>of#vskx0k2|LZ$o*TKHRb#v0FhFx9(Wf1 zDAm18Z(7|ECjaMa;WyXS+$oD!>T^O7##@R6s&(Ncf}W0o0I6tr z^iLxyaBEr@r@ zayGj9XHMk+CwOfT+YhnU*gdPgtO^|wL{sJWhrb955W;-BxU zBem>aH`TE1dWgS{vhD_F1MJX0U%4rE6DGfw{k?$KZ>Ow+Zr$E&`?e_3e^W2DRm68z zW22)W^0Xxbbe-cMQ#F5BkPRbDfQq#y0^?L$I*tpRsO}WOjHfS0+#Fl5=)+qqak5kq zWVk-7A(u6~U{uN6JvGx|3^&O{neEw#AVyF+Z#ix8goy5xE|U6fqaBh9amTUE)n9nM zf7!*+<_cT~vEp{Y4QOS;|EjE&0G-5sk>va&h zXvG03j-wOT+lx1b>eL)H_pZUpR)pE0nHSPGGzzvhIs!hjVHYpvXXTa)?UW1@pS}r% zS`=S%K$4E-m?mnJRpQN&sVB_yPi}^$x_)cYk-Yp%t*W{M$_PHt?+|@-)QELRvDc66 zNbMlTyzfr6mZT^SwKS6s1YQu(6cLEoEzYX+|EMvGB!D|{|B{|BKuCbV#&7d6Gs|hS zp1OJuCcnHA7um9YG^S<9$CX%}>?FjwQ!wQ6koESE--vf%DxU>k-8a2Wm-mOO52exd z@u`eRX&66cvD8du86rrUlM4*Rkt5_{2lFF|j=wf{Sz$l|eEkh5|jL0(=CdyZ`jC?#5B85 zWWmeVqvut;)oh?Qou zpM!LnqNiv^D%UwQzq=^%Ovd<)U|%v@dMMVh$`~&MntdT(S6RGAQs6YDH;ow#Yw=?C z;Lu!NlwZoj@ZwEBdmKWnFVpl}6VP82TnagAd+XWW#Pv1P3-%?yqSQI?Qxvc9zv9+n z|CazgX#iVKl>Vx?{IM@-{9%EK<4=Dvo9{JGvzyTdUreYtDo-3sO;s1OD2iVtDVgx1 zVZn-(>;k6F`cwvS*{1f0gF-V;`kpm%Ck{SbroYyAVlUuQ(ptiNhu@cVx1*FK92>1@ zcim%|epvR0ibvmDPlUaJ$j2g$Jx=pQiVk%maS?NYv^kzwqJ&eASprqf2ToN5G0 z({tkbL^lWzC+cjI)&_lbi9>7UkwZsZ4KJu2B=-&^W~RP0lNFSopAsGm^mVdz#eJJ? zj4pj{^7JPh%fQ*jBght4{@(l&-R~|HOQ6U2+4@#tS@?;;yQEaLuq}g zUDYZ}JbeAZ=C4&ir&}sFUy=UjKtY5_=4~PQM`MP-4M7n7nr7tg3Uwv~v*LPz!}ra* zE9g&ulcCG68dT6$8^O0FjU=4?a^S@0vi1Y!j12B5*x&O!S^gEriDgMzEE;oZJ|E0c z##}c!7O=j(01X^HF#Kubt@B{2@_b{x<<@p#{&xdwOExnvrzLN-GF~NXo5E$?n61+F z?}r#3tS8c<)Mc~V14wwyNavNUfx%P}@_~yp%sb@KN#+xMWBD2^EqRUZJ4j44W@mJ= zz&UXFbvemK3+jcWM^pLu-C+A3i$Jh*Hs{f z16Z~FdkodH(T{3b-w3flzgFwF-SF2JHoCdx_ZvhGV2aJ1)VM$O%P2`*`Fzh1`;GJx zjjC0?!}#NUW0N^g9nZ}#I2-Jdm#Ay70x>#fc`ps=@Wip8Y_0|`Smek%E$C&Cc$f^7 z+G?Lc=KIsSB3di?jvf3mUw{CJwvd&?-A3*|9}TcCgBfr6bVYp!gQMJ~FhB?b6*n%s z*3G^w$7y<@euX0IsBo6?#`gx8gATY`pEAxdDty1bF=t?GsKBE|u%%v53MFR|l4 z`=@h>C^%#oBFS~80Do^iVpELHA67Qk8xytthF&B@to)~ z3!xFkWFOBq0@+b|^|a>$#Cna2BcQ?l+X0Wor15%7hcQYshP6_OoNt60R@ltbkUMz= zW|ZtKtH7(2xn4nE`F3zCXw4F`yte%NnC=P{doZWS*k;zUkIH)K>S>m`zC^1tzpmYpvL*;mZ3pF3a4}# z1j!mIWz!9wKp1>;^JVjdQ1RvYj)BAqlF7n3DjaE|ywa*e?#YLw-hXMhUVNHnIM3idKcTPlfn@G*LAXh45EQ>fE?qEHtt=L=Tn*%?oaM zQ*9|;EQ=Cdt(tyHXi;Rr624vDiacOl_=_5c*(P>%TQ|C_&}(8BapG@sZPFltm(oO# zX%jFV*>4#Cr}qm%2dx5s10dl0o%9mNI@}i6ly#}^y`+^;I2-+_VzrHJg$gIie#=q?MwRc!OHU=JATCv6B`5ENbJ-pJofIovn#~Cb~RD3slI4 z{fT1`!FPCDhZV*0=>`{T?fJ+Ug{`bpDkEkzpdKzi5@-goTZjJ*)aikS)QO>}@p*_+ zwicSsH+ej45TTmZ&VCi`iIcf@B6FfAl%fnBQT2MqH{yL;uN^_i<*=rKHh{}!IZm;=AAv!ybTsz}2|G@@IPjlT*IEPPuXKGzqErAjQZ-9|YGllAq72pPA~ z6TUZwvjN8s6#&&8C>_t%_q0q*lI*-$OCPY?A4bR>4s+It>fQbb&J}O#ZfoII`tKF1Gph(UF;1)NZjWLIW?kgjDm60A+AHUtYUA{ zy+*vP*$%c*an!I!f2tsrdUlG@xi+7o>OT=*@xhZ@$L#WY>BJYo!^01|HgbYMr+bQ; z13kU4+!xV-eCtU(3BJKyYR*4nxF2u!@YcemHXNMTQNWI(HhLQ`x3YM}u%Wjz7}Fn+$)x?xzYbxq~wI4L3naTxsBZ4{^cR_X2N z62}Is#tFT55Jk<23*jn9g0i%DzTHLuIdYaJ@mELgmKk{eTaNuMsf zQu5QKV8Z_fl>H|n$WovMUH$cPc*Cu>YHIkv@vF7$ z|9$D*?AYGidt$xV3GF=Tmh94qIeFbR!^=!ZW!VLecU!$MQ2h#IkP#lU1 z9J+4`1yT+1rtB2JwkTCfm8f&-e#RnASJt)-tw=|;zvoRF3_wT4xWwSC6u|KNXTAOeC=xqDb@!|`NmuvJ3I;FIT9eG|li<|Rbf!TLcHdO=neGgH z1L?VIsS@IY;bFtiyRB){8=RF1{6Np_ssJyh-%Jnz)}K~ zrMLoM79?2{GeMK=kQ^C`E&^O?yB-mH0BU(~7rg$rfYNMF-Q7ck5+N!w*Ml4)xSU{P zB$>NrXZIEWyp^KNH};hIuhsqkws9Q$F~1gq@WXtZv40==>g%ghhfLg2zv?LzVo$dB zO*w0B9IXL8>(*Ng`wSxe8lWzA%cbcDiA+-V4QZguEcZsGVa=A!|M{c*qv)StvPuV9 zKJy+By*<@8H{H9VI>0-TG#{Vo??w0sDx8$ZB6!%E&EJ3jVJ&ERf|QrI)_MdA2!XGa zQpW#7j#W}!dwqvHX+eycf)|j_E5WD+h#qp7=!K3u{*IJoZvXEd_Vi@$EW1SI#<83| zTRB0CvUR{vnhu>R6SL`&uijB4q5WTy_<9ad>;IhK0W#!6(?9%|sX_;L%TK+8Rw4CEw6zUGNz!W^3 zK=Hi?z{7w0E{xqUI<1>YLjV2ncWPXJ04G1P{?gQgGd3Ttf-+YKAb?u7xRAVapp*sy zLMkMYKV+X4z7)8=N8m2JQVA3Ls3N22z>FB*{^1OZlH(uHZ~4K|ckS~7a6}aL%>G`LF%~J6xUU7% zT-f^#KTlvkHf*Zs4=G#q0ju=?0xt2w?j-^dQlyX$V#b~n_$b{c3cdcXMQ*{88}zB+ z-k8f}G!p1xy_}HjJ6gZ&VncH;*)Bey1oOZCDohNtI)E!j0;3Fh-?Z0BOuuFidy+pA z-Bt!{;ocF%xPQ$JCWLFCXa4c8rMuGHI}6wYMX4viSpb*N*uTvH*;{$*)Rg-CcF!B7;Fx$!1pW7KRAEi{qN=2#qM6t4ZxfCE(hoqa9S`> zZzUnvT5-C6Z8W&k6ZWLHRS>ED{0SWj49SY-T9eRw8~M4rk@5t7FY(=zLHBPdK?}q< za559L%j>^(Mxz?!zzLG%Ct0uCGe|N$x2tAO9Rm3hMafOwV;4_Y{xuUybHp4>lk7&z zt8vriI1=KdzUW?O1jbJ*flYF?U!h#MDiyBFsF%%Y@Y^M$5`@Sg#&L6VihqAm6R;>q z!UUUv?a@&dr8J&6>nP$mU(^5d#PW6X{YLdkYFdf#D`vnQ6J(Ka_GPDg1@HC5mJ7SI zfIHilH6>-*lQn?nH=s3Ou^UHY1!_0ES&WkUj1?sIy41Hm9>qq>J<=9^xp5^)di*0$ zihgNiJxgyM!|b+=dymEs3pUp}(fV3u_^aQqp9{uOMwK(b403tb{tR*AjRb*T)8tAV$)&&@2%Y@)ad7X!zPA0Ne~nHTI4QlmQ5j@&)=RY8mN!=^XoE z#P|LmDpugx>^pGmwVtQhcP#qt;(&&Oh>QZ_2O16}6)LvdrF(!3eRu2j9x#p43Cb1$ z;~Lt}9YMBm77EfxKEb=ZsN2s$HVG}ALHrd>D8*TrQnJZiPa#C}Ja$hDEu`or{64Fx z!F>PEMA7E{L{ScfippilimZb%opI$76(_DmK>f*gNtiXGqh_R+ztNU%>1>VJ6iLLXZ! zFj0uv;v}=;z0y_+6c%&lDecWOHDs@4M}Y9G3Nl2SJH{^;F87A~K z)zmG5iH}p3dFBr-@p3(&X(yC&ea+t5|Lr3r=pw+Ue8v(pEzP!@{a0i_>{oKp2-&iGotsMpySJ$(_$kh_63X3a%)`OOtOvMK)c> zQ5!gKXFqi2Sa5KBc5;3Lq0YDZ`O%gUgYfC4Dze*Eh1;PS@QwC zJYUz*$m{QgmK#n1GsU+lbH6K8{U4dK3eKi_r5BUK+fI6c%$|W$dOuFTr}#)4t_RLI{++SN8^L~6xs zJ7LKWW7xkr6Ti?Buo=f|IlMDO4PNoUV%>9jM0eX3Ys9h8lBv z3G^Uc&rbD3B{e+z*%1`QiJF^25FQ-W5c8I&qFaozxh5~RPciGRbC}N>tp!#*yv%s& z(_0rp@2Is4kt6d*Sbn|=v4AkfTlRsi#$_1jRa?l;mH zQ_n@)BrX(hMx62*!Ln0v=K9Wj&Wv~$_LY`poibK^LACYrJD(Pf$@u7qk!ADAR9`FC z-;lHxznRa7jdtiXDVR_EYoIdmfPFs+iH)2RqV-+E-wc!w_nh4{MJ&;938>u5cH%^NHp4~ zV(g3H1#`xOLOgu6r=dI1x7hK$(;$|aFS6E?Ywyy;X3TuNe|-fl-*IY&LEYr3?tdW^_0;m_FM~4a6nSe z)~?1I`vnB-c(P>*sD+3bKkbOER|yMbZRQCi@{cHKMZh>ok@sZhwl^MI4rj< zN9v7$c15`SW-P+HyRU^pv5RtC;}6!VyQD*eLPSVg>>_yEh@qD%4MPiGElITmE^L2* z?hlYI0I(y)3}1(8aBbAEc@KEZYJ&cWQYBl};#|b~KtiZ^xU-%ge%$$dWfk>7ht)r{ z^{Wh)#q%q1F@lv^T}q->)r_M)5CpVX2syG+MQqLm<~2wX#NXEX&x&COo+Z+rBDE?1yY-5>(maQoY0 z&wFMIAhkl`huKC@p+GBVgg`VuB>#PXE&)_UXv?wYG?1#+s4E*{t0xP$hG9>N+nqG; z*PIVy&|L2ebW4{Fh&-j^TxYSEN2?I7$17Z%SnQzLLD+D8&lD&aQ9*q6(sB8c5j6+C zk$YveTZ6MWiJwwf?*@6p!zN>+*A=3bt!B})R}U=zttt3btxNX-NGP2|xJuYWpKN>f zp**S8%TRv09{Ts6krf}CUOG<7oCNC@aj&>{*8?mQ7Xp$%3I)si#B5$jArE^+cl)Eg z{F74i*WQwls>%?~J64G;gW-4nqx#ze3F=T>v^C=pojtNh!QQ_3YAq(AS!N zp0w%kdb!Gf?JDuH|Ifj|g~4NfCRwDp3Zo3t{9WSXt<|;=F}nQ-_l-_s>ZEP&OSZ5H zj1E)+QQ#m?%wV?A1=h4$+TcGwsVZTBi^&=@0% zlr`d3Kg|9~#rc=N>WjTkR>*oS+~naumsOzX;mgD%`~B9wezpZMGA(#naGkX8{lpdv z>*R-=#uqr8WUBWYUKi^HHM2X?4jhdW&?pTU-dzaUmg;+xI1@kra&D{H08v&x^9t8q zvhEpgP?5gwJvll&U@)OP89k`)Zm_nDo@Dne-)3}G4mA6?ZCXwjkX-f#GvBv>azj5N zmpjD2HG4Z(nYC90+z_~ktnNn?gjJk{&@!Q1P!(8oW9K6h0;vLB^JnvCI&)IZAkHF) zAPrvGYC#Qp;-&GfPpvIQy@rMnqP|VTR-(hx^>@uSV+rHM!aHjx);B&B&)4GwO^LCD zSE6`Z!f^b;%bl(6EwV+?*ro8sUrM2(fwr!x`Ke3A#tNBb&eI#d@pHud*+#CidCQGi z-)*Nd#C5hPdX$N&c5U0Ee+4zjf8ExrKd6K`rwS$wEeTwd`I+r1+C-%mEcC6FALq+c ziU?c*yg+GzQqhXjpHGYMDxNl(SxxeaqbOw>E+?WSMlihx;JC>|_w`coDlG@tex>Z$f zxUWxW3^)&Oi5EMQ-+1|n@H`m~n*26dWwBH?XI3twz-HP=*mD16J+M>dPi%eNnwmWK z$8hiV6LroY9f!WA%K*VYDiEmThd{UyK~|TVhwvd-Vs)_z6?~w>WK}xOfx*!6r$Mg~ z%qWf?RbhtFM1O~*#LtyY&Y~@a+o7U&j+2&$qE)Rf;&T7n_H*~x`F7~ zh~XE?McYI9jiT6zwx4Eu)t-D19q5BpsL+{=aV0zVb{Zf?(lUgmqP`GTbw4>I)9V2o zk1+wRLyPU(?QdfGOo+0{Ai{<>46kUE?-ju6qc3_AqJ~%N*cu%^#WH^CG2cyG2dLl$ zFCVB~g?2{Ve7)nqqY$7xFkd*i%4bjTbb>r4k_gsijFTNd_n^ZA`7{}%>X!I`={dJH zN&7muh1m<*X9p3gHsHlp`)&ljxSBFMXAh7g|49IIm7?xa<9Kj7qJFCA1ycsZa)Wy3 zJs1iW)?)uUhE~FusCt;sp*Cq;qZ5^3=5dm&!B8-J#I)jDaf~9*ri(PRp&?+h`OI>| z6CC=c)sEVhsRCVls=Er>D`n4eh$;Z_R9N*(cW3j(Fa_iY88gD6DVwhpcV0H5ZG+uG zplA^RKI%OLl;mPiYMkkqCYCr$i^@NJ2T#@2|2c#~3Hs(8^WBqLuvu=7mb~T6^FQZ^ z3S{p&&zS8^#O}%VU7818yu!F5W0`Z~pt*FHsGQ-+jm1N0_L$CAm$ht7Hf{ zTou6waDxf)xiXPW!>Mct{Coq;gfJB@7sMqF)MN}VUosw|!IH+9W^+dEHfwl8O?T2b zzUD;DYwp!Q2U}7a=bz5bNt%0b2cR1rNR04Rvw``AvVigKAyx^6jx8Mh-jt-nS&)6f z?0@h8u-WylucV1Q2E?T{+B5V)Bv~{9h?nHdL-Rlk)SvHv034#P~~B45IaxPON&6S{BQR z@&xkwCTT06BCoV4un}`~xN@G{ljjAm#8}60`x{jVF(c?_UTXY(H#Y>#X!x}FaAF0{ zyi|o=L(AekIAWo7bcZNeS9fUkaf`(-1)CfaTzvS`zT2}NO({iVZUuvX?iWnXdbD}q zH>7bqW%I_yW?N-=kqrw^!McvJ%88zOOkT@E5#HV`?rGZF$i{i#MXbuoC+^l8OfMwu zl#xX8gi|c~w$Od!Yqi@;l1{bbqr@%mUp!@%G8o~&*7iK%++nvOlSt(U&r_Ft7B$nB z?!EbFqxq8s`+8rfY|>tG9vaoF+yqmr+?RMa>z@{qhxbFm;|vTizbz0AD$$XdOng0hp5 zg0lx2hKZVW3EZj>-?Hy`GFj(dT#g{CYOn)_;YubiPo^mUv(3j82cd+#tHxnl4nOUT zdWRH(h<}F@d7cX4>9;}kks9X?K!Ui7^s~|dH%~S!kxO1JOeIYDXVhtHId|8t0l4?g zW_9>{ghGgFh`3*h!-kib(QA6it*FOgEev;xckZnxnJCcLjemel9`6VuMVly>6)Ojr zqVGE`g`VKQ8jd?fw!N_q@RoJkm|O2Y>L?g+YwqrEA?Y z$ZFH&8%Zv`KYZa{Q~VIQ3?X0UW9RS_R`I}zIG#1By4FLVb38}H0_HmnF+*~H?MUGu zzbo*+)zIIS`KO4lW)!0E2frv;snJCSmGmmH-oJtTnw=*`bo8s}Sd|-Y87Ir1RP01( zQ6nrMpZoJM1Tc%>mq!AKtE6IwKDHp|YQMdBF!vaYN2|du8S1Z%%>|Al0z+gv5IZc+Fd^v#2Ff?SwNFY?x8e&cgmi88Z=wU}YH__<5r8ICQ` zy~4nO8K6|&)@(iz=^yXKt=j@#hDN3}t9^fm8kVF*&Ec%{0228cSIKi}N*y@Z@Wdqs zT#M;SjRJD+?wjcF`=Rf^ka^AV=rBIU5i{d32Iu-=-rBDGEfg*PmP63tpJN1XzFfh8 z_MO7hZZ3qF+s-75PLB%3b~Ed>lMn=Ck4K@YFVUiM(-=2Df}Br|Ki&~@2M(IE_PF$m zxarI{H%ls;0B|`)BA9r-p5;^J{Z{Td*->ad_osPPJUmeeIkEs|H#GdZ=+vTjs5^?I zs`O~SY+c$i;yQGaS#RC5b|(KcLgN=FW+?a#?b#{bCoM|%a2@srzaFkmB@8-sl+2MW zc1D*iTi8Tz97aHv=K?2e&q7i7S>v*Yu9TU*PW&cohdbd#^0ec}zoFprE8urP`>R)l zu8Sr^HCGCkc1zYm%qBJzIR{5S-|Tss4}RCgcmG1m@0$Pz0N8SuYk0v~VfhDv4G^^4 zP&$jwOLns#2_Y6mM3EhZz+CWt`0M#&>It5yik@vA1$h;X*4PL==-LIUBhemwFGs9- zQwXR~SV+du`N%Q8_NNzph32iRn^Pe1OZSYep&dpvAj+80=Nam6ImApWdery7xa7+d zQha84lAj)>J!@bYNM24Yc*?T{Cnjs|Nc$4(FQ8=+&$MqfE0sti{wMwo(Hb&S4cSVO-wRKB;se~x5XE13L7Qd7vB4vfLH)64mC z1(@FUyKdnFQ)eh>ksWd|u>eusRvd|YA!F>^2b^G0F{3NKw^n9lKJxT~qQKGKQ6FRQ z9<;8~$kdRV*M7b6gH8e)obc>QvHiIxLg#h|1Y#>D&F%0*PxC9O67h}0r8~143}tI6 z9Vd1SVd{$js0A9lsR1L4ib($%qVDlN%-D<|YM4CHHR>vNW@)LBM-bqLMQkPI$Lgzi%eBBU`wygqVxH>hl#b!IU@$AsCx|iV za6Bu@g;)L+>&RivLBb{ZO}eH21;xcVLT}7~F^#M-dXoIde~p-e&)Q?spry`Tyq3U^ zRF$d)?@3~V)xQY+xN#Qeo5V0CvmlQQ^^ZKQ!Enc818t<-4MFsoZlehwPY&yCMP=9& z^F{~5VFf-VU~+Daiai=R;!(yFMA+V#gBCAxW&L5Xh|gGN{+Y#q$ch(jgSIEf0SgD& zJE79Z=sX1QgB_m8+w&C-|C0NP1A$%aCeFT5}!SBbdvGOx6i5j@nydz@fIz z9Ew@Wyl@H$erv|hAIe5QBA&ERsPd;7s?fjK~-8;X47XVN-Xsf5 zS-a)+BiPp>t+Q@qC0uZc*EXOHZ9fI&rw-7>_gT{uFq*E-cECZqNoy*vO*zs>FO z)QQua52UcYHtP02u7@>H0u|yedhRC}uO1^EGN1hnAd`-|)ONgE0>gcV+j5Fs(c$L9 zV>awmFa5O|g=L5D7{{m(f5+(_*Q|Bn4p0Jv#SuSCMo~qGn61qb0%bZ)M3z><%yWXU zz1B>Pn=i?0ArAYlIVij3^_?kMFfBV%(vc!u8PKN#h>D5Ne1RrQ-#8Bv!^~@!u7p(O z`cQLAC`2+)Is7z2j?*er&=6Jtd-|P~^~;tu*5wjE&l6Ed^+GFIGE3TuI;?e>%7kM^?uL#h6Otv z#_YtE6=3cYx=U%R0bxwaH2WmLEZ|cwr%yJJs&=n9o|p#2keJ1?G?QCugH zq0~NlqcbW?VN+f2;f+^}$VH)GDUP@J&mdK$7Sgc5VE*w{`N+AVc3vj~tX``{%G2Y} zvVUF(_!l!@6yhTKU~%^b8n2@BRTSrn2SM;dTM%_X{uK(V{04a?fS7rg=MV#uFe#R_l|eye!XzwmIT9F`Jr{m|RFYZAgUOb#rPxFbMPfr#jXi z8S#}24^|lC>>ATpy36`ka$Cg|FO1yt9wc^Mi_*9F=YqsZs8T0IpJ<5Z>qkH*xMwz0A&gzslQJwJuclGP`<(t~2IQ^`CBKGe1Ivm)G^z zgC^eMqG_xMvsoL|zXl~DMlRxDRp32>pW z_w8fyh*0u~{Hv$OaG1Z(KX-0Mu!hTX_nTM?$w4cZB@Xdq{#ct+QCujVR)W6%;0s76 z+M4x08!LNjD!$3RW)4x7_yzWE6aKoTLK%wXW`X6o~4H7HD-UD z`|iEr8}nE9wQ=`H^ks^V*8btd0gqtiWZQT+)DJ4-ncm7g+z{y4Ih8w$%3Z^i?mJ#i z1mePqT+$(bb-a1sFqi>GT(=Hh8aYulzTr12S~T)PQd$3Lz+|8<+W*H`x(cPM{}sOG z2yNo+Kdb>O&}|~Os&vMV$Xdz|l^%8NS7Tw;Kb%w+w%siJ{-O6_ai&zqz}|i(XCrm8 zna}XCZ<}S%=ESK0;lo>Lh=fx}&>AjVGF1_`|DEJv(W3qmq!J8y+|IUHV|4rQ)|V%c zUd0moJG;A}M8dW%H2BMa#J>_3SYY{HE_?uoF=*KU3<>2+bmS?ghZ%aPO?<-T#0msK z8zZI4^Vl3&oZ1I!g`9Q2U-blcjJW;EAc?GCP2+H}TyK4!!0nm9c4wP#x>9rM~IaiF5;D+S)g3AlSX3B zbjQxxKciCdplJ7=@jo$CI_iZPv^?WDYE$;I z#Iyb2XCh+NY$O48U2*;|kJyD3iP znl4e`UPocDDN0qISiG$S?OG6K(KJ0D9LkZ0fUw*}M8HSG$_DJV9?!pV%rVQQD-HBh z0%@h);9~Sk5O5U9@lUnA0PPCA{MI(0G+7^0glw;||LrUuvM4L<)V6F%QV17_4?F9< zz5JHh^r7Ld4ObU9r9(F3-)|EV2!XR~*wYZL-O^!AG~KSO*Y0Pdz@lQ#joh?VOp`w$ zqgixep7U?FQYMO{tM3c5(sP~q+}ljh1@8RInt44rUKe3_357&;ug-Z+Hj3QdQW;7h zXS+{t4La~pXH7Mi+~;Zr()&J~Ka3KVuG^{KE#czAo@G9J;I!`NU%cc9)~n1B%$qVN z-`-SE4}%;&$KT&Vs*M$a5-S~;?`#QBf_>Upv9o|dvR}3_<>bSY0BVw6?Dax^+LvIE-p)0mGV8pXyfFuz{C`guA|;S>YU<8*=S7WZ)F zW6lw**t3VBwRPYm5L5nS`3<|L=*pA%x~<2)G4m)93uYtb`_2j4C$vtq8O!c!OmJam zn{63*GDMoqpW6cicIzK4UbUp9jT~<~DHD<%x?0~jdLr!d^=Y?M$g!wp;w@#N7WPA@9&@Q$ zMR{GjF5R-eJ;Y2>R7+s@Vc=POsrT?9Xz?rH+Zkw` z{C=5V`2FbuhxjA)ihm!j^Vvd0bvwOPMA`;r_(z;Jo&JtY=?m(JBnGa}jr0C0{RGfMsHSc-OO|9r@gL|+m_k+d z-v?5eP;PKZv95!^2E~9sE0^VPUd_Jp?hsEAAM~H>tWfTL;N8XrATG%1z5b9KnXxDu zY+tCzBwJ&ktCCoul63xGFZ@oR%VFxN(isW4(AtFyEE=W~!P!r&j>6!obMY`Cr|PqX zf1Bo^=s|XvccZw`F_*-rNmpSJ?k8}o>8$LwnBsGj{&ga!yDZhabpG|+A(6zZfAm;A z$^uEAaK5XIsKviipxZVaT@K3*F;=3znE-1`uTt1&3_?KP(^j6NaM67_H^DZ z|3H!_Dh;!d2kwW$*52>*q+!&Ma>1Mgds&?EWcYuWDk_-vf7}GFikqx+Sz$jg!vwnq zS6}wb>=J18ML;Vfy|261p9vq`3tkUBmpth;fQ|dUxBhSM2Jz_P ze>di~(5=D9%*D&s(kW$G7eh(^u&>@|j+UMK8JqH5ff{OE6Aqx2ko_9nMa2CF?P03x zRU9lh(!1AX>i<~%Q(dArIbZHCrK3ChA5bc>f29ug%)dTBUC*Uwsc(E6_`SKdYp4OI zW~13O?>|3}7NIql;4!u!_a_M#G!`}G9Nr+{Zr$v5&qr`KhAMQS*tU+eIUB^n?*G0s z$26a36A#K3Ex`FwP>K>q_`LSv1L+nqp?39W12Jsv*~iIF$>4vtN2Y`!17gtI=C>B+ zhxPLM{f?##`=n4SN>?kU=N_%AUwb`a`4J{TogEEnIoL)k177aTnm+~!`PuvzA!9dL zkS^UYzaGF9wi@BJxgvs$qmq^`NnJuXNued;-#Xem;AiV=2N3o%fj;*5fc@gKiUeZV zSlYfjw^m6AxXijU{txxc$?Ax#e2jl)s=Kb;&+v^wAz}G%JHIP1b!0SjEe2GnY#Td^ zuL(7NR3%Uf_Kdk9L18VQ9X4h(CRQ8k9g8Q*QrNSUr4Qy7Q2uf0;{LIKy^ga40!c+=f#BM11Gc8m|Yj(w} z)%Y~O?I%UuhkyDpb3BZV^iXvDowJe%tUt=$i3VXgE;P1_C; zvoEV$Wss%F`Cs7VtUAGtg-W;jp&>Nd+h)o?Ydf71aXAO|YUi=}pI)v)eOAW_A z9W&4h8c{o9NJJ zdYwao0zlfW@o$B4{&|)nK!JoQbvR4}{KpF>>2`UywdcA-(t{J0$3oARZoXkS%i1rV zc}p!pU6M(5;)sD1ueomu!_)oV;bK#pD!?jD+VMwRosA=bgK(AMQ#1IHhBFD9n=%#s zv*cQ-Ylm96b39WRRxUgzol1B%eSfl9D-KIi#n}IBETkUaM2!DW-w*P`4(NUk>H63p z1&SE2_8Pv^GF@iixmQVj6R5rJo~CPy@hWKDdnI?vKKP$Q13(JYRZ{ZfMm{_{aoVV? zQsmGUgv@MGd%WQG^r?3jr7pK$n2nK`fS30-gMAYjc1)R52T(dP>-!8Z9MW2 z;v>^8xhB5Z`)8!eHT`d|h|45OD%H7u_*}S$z(#@IS=h9k472lAT4?vdHu9bi zz++y@2|7YD19i2%wUhBFBkJ@EwGN-d@YMP_G(=nHBvEH3aCKts zn&|u8{Npy=i}R?+%9~Vks)b>G#a;&ku6y?1e|@5B4+MKBX736;*@EDUKfN6446NJ) zFkL${T+KMfRy8TWsF{KEXXB#TU#s3kBp(h|HbY+My?SWqzwa&4SuK zLb}B#ab@Q%k6pvvF!$V`>hK@ett`UJ2tSY5jtpL?upG{E(b-!deiT9Vm9Mm~P$_k3N40x6;t~s|b8XZL_*= zpr4jo_t&V7t!(w$gruLzogP!#ET6Qi9KsCX!UM){=!yS$-MqD}x|@sHDWV7JYY@Iw z7HwTiaQ$&t@{j#O(6N<2=}8@h*R~+T$~P5P&xcbVvjl{aZ|!ki!yODJ>GNF_&m&%( z<9J$;wo6)<>YdMwtOIlb0Kh)7xbF1(3HLtHGdh&A)FA=$6Wevx{(Q$P0C z+pJXFj-p#PIZ0|@*D@#6@2^!4SKepm4Tw)M5q-9O2z>HH2vYd*m|-1YsQ9wY@n?U$ zun&HgIev}DP@rZ0igy+9O5K*q64#GrWv;UZH^m#C)iL-o8$R!Fz2jrX>KkildTPJj zLa(p3&?|H*pO(GRnSBZwdohqcO?SH`?#v|Nq#H?P<2AX_q{ym%h} zb)?a6F8zOhfF9fj*8lg%fBWFS^WeYB;J>Ee|4B>O7CYzu8Ix$z!}B&5Z?cx)H~?G) zBMADh|Nbyr^prbI=cZ)c-&xv3xE2fT>8{ZGLW5T1IzsbPObksCXIitO>ezg<4ATAF zG*a&09e$W1r#Di$K`~`lFP8qPsn%^jzmiVfo!H;bH_w~gykgMKA5}*LnmKssPRG*L zEH1H|{m~|d#k>jkMGJ#crzFX@4=L?BOTL@{QZnh(UlX>zn>~||0P~frb-wRY?q@!) zWAWvllkIa)$J-^v99_RsmwrL!$X&_dkPAQBKCWGGefiOKkz~StzF67&$otx~AI%y8 zb}N|^{dJw+_uZJ4Lhu&-Z4;4Kh+`8Hb)LRl-|wQ@u5UNmWVt-5yS@GM7TFj%S}Oe5Y*pD%fFV$JTEBh39Cg%|>=|g6i(3g{}Wp|90!o5+V5W^M1d2 zYH|o^UYHFKa4QSF*tGMDr9ht&Bx;I=>?DooB8xeZRXc`jzm#%^mYlgT6(c}Ir(v+h z?xFd+G#l@H;zHznR;EB*AWhI*B75`6Bya?&zv}Ketq>=$-^b4#^_ZTk_CK*W~IrJ5|(&5J+!HKOT$3AwIGe%d!E(s*SF+tGK z>(EI*nfOS@-Z0mXM4BuPEjO#UnI9iFye4hi@kxl>cyDCprg|mmGbOp3;)kp#HGvHb zoeM6pqiBSxXCM?t%ydnSAxFs$x;@7d`@A(ojw5Fh7b6DtmR$vce`e+pT6EONTdgeY zcGcy{Af0%L*r5<}gpyc&OLW3uIrZ}mT(AO;CU%Pwv;!EamxrKcPPT!5}jIGPcBOqf#J;+{f{&j=g}pQI>1|C*43Yo83s&@lpwo z+$c}-h--53XhToO=mq7BvR5?8WJCaFV6552_i^{!q2&I9-oXM?TD)$ow&EFDSPY8B z?@S&PEvf-!7O9|=cbUh_Q?^-m$m&hpjQt9>@kC@<{ zMq|v$@z}`Zw}b^-XH_3=)Z>i8o##O*u(E0cwA8!eczyF+bG*-?XB|i17($GtY2QD= zp4c9r1NG9b;2~l1xm2Jogp3(FT5h?LjYqQ6Y&v0N4rf0Lu_A&QZi`z1SDVX>TXjK^ zm~qW()L{w)$t8q5BE(1c4i?-LpIz%SjhBp5A6iYjfKM<+)0bfi@;E^MPbF>w#QKbX z6(T;grQ@(Z4~LxN*l>c_l;ZSm@atRHy++bab)Px5@@^p=T_{346!9gI%{cfi-zsB7us9d9ATZ$Ctw zLqY+%y3P>2`mT6N-@Mg_U*3RK9|D!89d3a!*iu$U4M0UkKsbrC&0l*tAYo$Cmn*L? zx>%#JIDZLNogrLAHU5$SRb*$irc=jZW!PS{9E>Wl;#(Alz7i1^+SQ>3t5)S8xvF)9 zesiYw!Kk%{=3>ctBN9c_tK`|YhLlVpykQu1hvq>2=x*~qmeE}99Xu_Fg74kH5A~wK z0GBzsDSYw}*S5E?qcrSN*H$Odab<dwy}qTB0~5vN@*2*;d`?(vqq z)O-*|$|qk6e-!tP<>_L~d2P(uhJ}C*p^j{|5!79xh51jvdsF3iFQDenq!QKhyU@Pb z#X4_`&ls4`O2;QlvaoX`ckTsa;v2B{Q19UPpWd2Z%@si1+lI{h3hkAh{=C{zBZ6?t zWXJ7oqUs${({$FERk@vV4TfY(cm0O6t)|N{}V<9|Aw&<0m znX42;R&&Ml_+O62k9SiHUcl|sSp8a-`uJ9j&SRpR&|iZe;NKMHcz8Y|wmN2-umhzo zO?7yewsNOy_uj>tEm`&uU5(~#r(U4!vR9BxY;3kPfw9~{!aps4w7(&yg|20{9(609 zb3Wx<)+7js(a9t!(V}-3iY$^xAhAweyt0Ip3LREONgX@cvt2H@a~arPdiFrXmj9() z`y%Z+UDS3W$yKU|U9_k|6go-qwJENm?wU1@d2Ux7#pY>3wm8!o1+H0firt3N9FN%LC4MMsu{+m|z&D!eO+Y>7@!U zBfE;jfFYSU&sa2HTXJlc!k>l+7R3it&ry*h&#$=k-|^@@S9ZQR;VU%&FE%=4DL^u| z*MboYo)(|sJX58#G`(dL(krT=8+F-y_ei(_Z}jcOr)k30k1}B~mRz_Q6fDg@6U9+CQ6vP4 z#tao`8!tpM%p_Ib6hb=AHi62jpv4IjjyYuIi{|Gd9rK!5^Kw*ED=_BeynQ{>#b$I7H73r1NvXmdnvDaQzsAUMB5D>zA~{nF2SeyP zRu0uEAH#E0E>$yjFTYqVLP>Pga1@=l*D}4MT5)DSKv$<6d76jSo@l%~f4*+(ScmD| z2>EVKq$2L^D`D%yN0KCJISM6qiX9(~f=nq~Fj1Ev?UzJ)A_|R@h9ZKX{lPfp$IWMp zBz5qd=LNsqYW-k2maq)iOH0vk>$ALlvon zZ02z`Ai@^xwUS@y;CiPBwQy<$LU8l6XMV4zWB<6Whx^BDUx)1vH$2ok5hh(|+k1Qb z_m4SKn?75z&w^YUOY#ia#Y}WodN!_b1;GSm|#T(k8z4Xz!XN!_8 zEet;OC2VIXk2b{bheW5@iuE!rlOvg2Sow~uR0dO8=II7y;z&0TWENOQtk=UoU8Ron zT(kIi`I)x6kX$Q828V`G&#qLa+*TCmIACXw4ayl<%7Dw^b3P=vYS0#O#|J|4v##eh zwI0Xavj6o*Jz+VP{Ou4A%3@QqgELta_jp*;dZNCEbKv<`sc$}mu5nt)qqVV*iDb5+ z+LE0?FRB?%qd0klGkK&UEso8L-xV(NQS#FqN1ysPh<3y`**PI-X} zdK}B-vu{Az=r;m!E9>paunv3LX~byMVr9-+>`VaZXR+&7At2FZhu9Z;0_uPGqbSm` zOVo2jh+xl*RaeKKA4bE|f;#w5)Mz=Y{@5XHr5OcVp=W(_lA|f}-Fh351L0wmOpB%$ zE9;`6>Kg)GGcAMXtRIcTVxU|&;Vb$$VYbF@(PRQ6-a}>1q%x8BV@qtu6hNi7OBi(U#@XWLvQmXVrIZXH4 z>r$`-LFSZ3fq?h@GG1qi1RNc=9UX0N3WXG-&s-% z$?#cB726D@I}U#vKyb2NYPx8@6t?yTt+V(DH|94(p9rQ2f6hEmrf^EmmNIo@&}+67 z6$-Mbo`5VcS!hWxZfmV0vTK9oWzEFvS6mk{4rES=$jY3s$NErdpaglP$0N_sJRDfI z8kv?3{@B@|VOZG}Z3v{Q8*QC}@Jc4>CXX<{s$t7z*dwT=^fI3L_fxu)rLz^oe~!vm zxWHZBUA`er7iNbgPaekXyefO|2tXx|0KqLi4Tvkk<+{*;&X9ImhII`SN=DkFnh*ds z#+SY5+0k)A)r7U3MlLi|tz^b)=%`%-D-r ze-$3WtruZoZZ8q77w|{y(DrAG*t$H9?PvnJ?(A%n%I5<7){4rRU^ch`hbPKqwD-_q z1$KVW80+=UYvvHtferwrvIeRUXwrQgx{N4=G3qR_rd!fBJ#vS!FuVn5PEs$L56Hst zib*6QCadbrg#1vEd3tEgye`hhFz1*{L!7SYaxDV?h6s8M)@#>!y%%i@*@-HQffE$F zJ@O6Bi}V3r1r8sPxNeM*4(yFF3#@n%V_xQtH*C$w6~aA!UeQW938TsZRjO`}VgvJ5 z(IrT{h@uWM*0&3k1<5>HqgC_FN2}l{u_)TKGnE^~8&TZs!0HU2z{aijaEp;49{vIe zO?5BjD-snd>^ONpNW%4@LdeSSJAVKbE}-Z2I34Si_5!Ag3O#U%`ne>c+@0h^hFtU` z)aA_jcRAx(?gj(dv^Wuv2XXi7IqMYQkl0w@u2~gGbimKL_G=1+b_9Yzd56+%X)b&zbs|gh4BmH}C09CR-s{Rk6NfOmOR~ z_*6h3oJ|49k%#inBj>T09qrT}3>^}V45eM#bXKwn@bm8*WqT0ew6`<8K{$D3HpS^h zOXEWuX2EKzeGiYnZ1zEUtVKv@;ZDcbm=wGW2>AcjZR!7=5uF*MUCHoR`7z(al6WPqE#*Hno(O!MEL?gjFR z?b`43FbfZk!gA54ml+khRBd21Q@wb*D$pJ zN=kF+?v%4e0Jh-fW-#p7p^SM9omxn|v`xK2Y7@CtR%A$TjxO|y-Fc;8gg`}oG%)wo zx8F2C$#BHQBr5&x67AlYJAs40b~;L`663r%l%D-IXh;}U6?19Pqr*1tiW2 zTHd9-rK!xb2(0qA5g4mOA9q_LJeUl_E2ohJ(GdLTpF2BJSen^zh=)3UY;zTf$gO4D zN1urwg_)ldM==%mE~oqLM?4fv#fr3~mc|ko6`LLSdx0*U zoyi9NT)VQ8G>(#h3UxzSNkb*BT0eOwKHKCTGUQ{>(QbzGQ`=!emp)f;lCw^VeC~5n z<#M`yj3yJH#ts2kjT2B3B$;=i{Uq_aKH;3`;_!a5eJQoObUSQ01Hp&>-3NN?FmoXU zO1pz!K9NVTc5P>BhLfwskxAC3!#ygAu)7Qy%0C#k6OZp$y%WWlqpNc+kw-ah5Yv2$ zM&XSr)>{(xd~FizH=OTPo(Y?M)ZOtCS9Kzg_V!dpw?ZA_?1tS$1-4&%Z6;)ZYH#m7#G`R3>Yd$*TrMEOTH^|# zt+7|?(tqT3tQs?(U3_s%@^uU#_HPMzHEguJw6OCxZhu!(yecs>dN}0QY)vfW77wSL z_mUusH+u+m?<=j`U>cGnL~aPD*APGUO5Ga~L znuv40S6I~9{rSTC;S^L|p_^Ail#fMUG2db6+Nn5}WUQ3Q;L_V_#PqM7xf0atxEsG0 z4vfVmi+z3heU`kFP!Zp{yHi%evN7)fSP%Wl#m^O>BGxY%pV>TRWf9h>)i2Uyn)LJ< zik5O=bu>l`u;Ba$fcuv^s>wa7u6TUO6JxcRd}oz5>^s2;Z#X@Nzq5~0Ed;_tw?sjk z`?x&sPT#R;%-h=KW+;%FscshqssXycmcM+coFnwMFu~3;6>PUlwQmh>3UXuo_-X|; zs8Lwn{p8LHs$zG}eA2E8eY_EC=jXn*EyHBzrB*F_2W>!Ah$=1xglCuHJVj{#XmK_J%GFVuB5p{P&UI5M=Z&%LtMuDrU+IohGVfw(7V>B^O zD)1;9%+E;!5xXvJlo5t_h?SX!R3krct zM$m20go~a+4?NHCG4xm4mr%PuY?hMy(2RH&w88%DNID8DE-X$Coz^iGdcrJ6U&GL) z!&YT$LWy%XlVg9L4*ZVAyf=WrJ_)}Vhy?|sTi00Of)8=X0X_`6kLvZ%Ra`AlOg3>^ zg<_}A-|v*`$Dn+%>rApRzJu2D*c_yQddQ8MB8y#?VNQ>EIxTzdf_0LtBxyGF>+O$8 z^rQC3V$^GcmKH_houjhOpN0=z5Yw{$Y3y4V!HP~;-H`#8_@Je26J42>H~64KM;OJf zMKUJbbl_oElDm?4Rj@f-=BYN$UjiIP0QI70=g4G`h0^{==gsL!9B-8*$Jz%_H`mWHYhXD!~#$VSOS4e~o1y8D$a$^E`vR=4tUX_azRReMgLW81)+fI$!2Ck>y zFc&cE0Q^<%otET)w+tB=_FyAF0@HRl*e3N>b3YPBp8&p;h10j2gB};}m^b*LDo(~Z zN%+b9>WCCy;`-(ZBX25XhIXYV?va+SE%1+K?r)C_kSd^@BB4kv}0 zqPp6GfEf7KeBEy-e<#TCnlm8$iB?4Ad%77MKFY$E_vqT=elsRi#I=lYdx;$YXa}TL zw3iVYavv9_Z_9vO!j!JKHzf!04-W^SHU7keqqAoy!$I;2hM+3+nx2f}J8>ZR*ZA`Z zfKcq7bk^9|+dLIlqp+%$sF2&-*+z{Y%}(tyblvR}$bCI9o&7@7Wt`fUmMp!q-O>Jm z{mv6^Fnask@ezmQ<|sVODbn33Uh=vqG_ldg=hsf;MJwCdzWcK-JB%f$^1qt~&Rre{ zQjrhzIhYLe3DcC=BKBTnG->8D#5 z=o)dE@$iX8tl}ztC#_S^nBCAGmJo*$dessQxgAzQV^V!88d4-IvUhShj7)Vo0sV6G z)xLxtn<9^Alb)hoy5h>kn8dWpH>Q4%*AEFPo2mQje>dvO@A1k&IqWyekrgJbkoc); z%@&eV;K3RokkA}hhJYD-{UWR;A$ zKrx|5!b~SEmVP&GxN-zl=8BG+LAPmq*&neWp>^%A=R7s{tEzY>7OuEv$?rXrwcp*f z&Fg3a0Anq~Y-PWbgzIBZLraVMLI3^Stu*2Zzs_^mh_k$YX|rDl1>n3aHsUB1_{))y zY&cO`hO!|1osGprUh?)}twUf@Od9mwls=*D4rk3#tM5^Txk9F#`Vx=s%L1&f->fP=aJKS>@4$B_a*V)CpKUsJ(B7`b`<-uw#jcJItUvU(JVZxR}ZbU342MwP0{Pw7}b z>n2}aD9a@m69ZLOZfxSOKeHMGdCuZZOdz;uPNO2eppCLM9%r5$Vu zC9uipddVhm7Vul7Xi^L*A@n`j%_FPocM0n)Mxd>$@($D?WZw1sV5A zPcY+~W|Y*DLoSb;_XcqzIsR=z9GDrcp3WB%`?EBeW)Gc?V@a)PdtnFh>U%|M zg(tW<{G&z?-9!>8(KVd~-8kwkYs!$J(ANB>`4=jtL(q6`C}6_eV^8qx^kMtiz3m3b z$bz(y-0mQI^DRL>=K(T(X|@_b1xxEg?n1PfptVc7_UyLgt3@#tig=ixy%^su{d#8Y z?zi9LSj^-lEvJ@den=>J=i3ioj6tU9o0x)Gc)IKRhcQ4C8J5YB&FAZs;n8ZXT7Fp7 zk*$c5mak-H;k*#C_4?EKw8+=cZAy+3ptSUVyo1}R_7s~^@C2!u+n$bPb$95^d{rbf zS60WV+R0leTFUa1bR}n+XAvzwGq=lX)oK9Vu!V?5#2~z=H}*FISzsD7{qhgX%71E3 zLc8qlpLD>ATWy%m&YPnr9cR#_Oq^wPz*nw+{ccyJdaQ zWWskmnB^9Aa!Uutdbcrm4i;OHWh9jFg%kDVW$&RcAG+-ViuRh6-0&X_1^;~OgHMA| zFDfy~$T`z)71HbfZq6&x44Myp2_5Vu_=9S)-=aT2i!uy^L$og^LK%oiH$p6dUM&>| zd8@x04BcO6*L^$);q*<@*@0TNkZs1j0}syq7;ZOahWQbA1J|})Q_;&pJ2d5I&5HF) zTIO6%`=&oM8?G<2c<2-x%OA-SCR4zU^u}0JP5hY==J<|f;sjT{Rf76mD4M+s1G*Q4(^ZJ6e$d-8;IE$9*rrf#5dUt=RnNtlE zj6Ac4T`l%^?592cKKTBBH*JgsCa~OwZGF!qD_`Un!5UZQmE$B51`cC`1Bhv}wy|A^ z?E6Fx8UVGr?c&f8U;My1))Qhe>c2E&b_7+Ajr+z^vn

!<9Ab)bl<8cqQ-ZZV!y1 zVt)FAgD+k(it}=PaI-0I{Ly~N%C1iz^C2*pB`Zze-1JSZQ1r>JD{M_Ys99cuX)USRMEv7bWdAv3DM~*W>KSnqL}@s3w@LbKF_BUE)!{=G+kLB?mW! zuTSmq5YqmNbD+j-6y5tTf)cUs*zJxCg&DeL%ZaU?&`q;Ux??22lpzGRHT1_CPEu#6 zFs3!Agr>pHlJN+Ey$YjN2?8YWtH{5FJj1i$Hef*8&c(b``n@q|7qO&+jiGUWK(q8j ziweK&&s01tVOco%^Mzm=uK!QNMFhG;z4wQBzkLV)%*2^!EoY8{+Mah8gJ~r@h%c`Z zl`5e?nwDgrL@Kl4>~L5b|2@9;*30j88piT+21QcP&+#r}Q+YJGW~tu?Z#Gy(1^la0 z5kO%peiP#lbz4J(v-0D9hZN!<*E-6t#XlEuAg;y(J-%>ANa$|(?kZg&Y*{hW(3XGH zleDAu&}b_tj0s=*gm=>uv-4==4kvniqZ)aUkHN3Q=Z=`|qjZ?@uMWnGyj;a@eh1f6 z`ILvG;8S0PU0)vcM3Fh(AHpgApN4nd?1-#ls+beepC=*R^cGujKx2}&a`}Nzyr9|Y zemNj2(3Hy#c@XN~mlREw%zdz%gd2Yq69hEE{CNP+iqzc8HPAify>zsxw^r(mQyLPs z`sNNsz@rK=`u!ziWo6}n@_C>uIxDK4IO#VpfUD5GcaNWez9m}RJ!+IF&i48cG?RGc9nr@YHo)WjAG5?C0A72y40#6P zoYG_S9LN0BQhCR|bbWP6m9Mtr3|iU+q!%oUIUu_zz3BDFCmU%PA1<$H{_&VNB^9PY zZR>=*RNvcj(&ldUqyHQd+*}E6C1YK3o2Z{>Tx}Alt-u-jG!+VhZf^!_1w1xB6@6|! z4z=FUfrKx7A}a0ck}evBnb|1uL=fK`2~XXx#f>8qs^`Ssj+!pxf}Va=@uHB;%i*otVBt++%j# z>*7gnO3{2!d8WPc2&H8@w+~`k6^q|gXWsQtw@$ci(b^Qs@p}lAe>?Se z2*qzdwGWnG{UjdS$sgujHobY!^^5n6*75iY(_W9Yy{&}rtz(9)HxaS5k~#ItpaB0Y z)(h*{-Es#4oL&!BtHPZf191JVg3!;iJZ5VEX7D0kr3&rwX$d9I!TalTWP_|4rNF@M z_X-(1M@=H&$p3Zn{$<-uBZ?D5j+JJVusOXiRDgbS|Kk&jZil2AojCK1GycK!4eskd zTS7}4XI{=|Fk3J?*0N#4msT~5Cj<|!0A<`Nz=`t_e0qgr0D+O}nbIoqu^x8Amm0ze z++C%$M2U7#yb6yv1bE;Y?8OA?N&pH2$lldA%#-w7u+R9z1VJ&JIMa8U*?2El#X`nCL_m37^ znhjGE!Z%t$P`9DsX9Igk!-q|vHRzh4PU+l53&I4OerUD(-VJ{<>Q%d!jZ3&{`fH<+Zc(m+W_DwyK@I$8+hSeRxP%?^aW9+dy_4 z@Pz$oW6@q05nvD>gF#Fj0T2!oG8tIwBYxxQH!FZtz`e5{UjHW0R#G!ya+lprj3f?a8?|mk6SRdivp&^vR#l*bs|J^2Ca0r?k0dGty zVS~MSvp=>&KwkC+PYX|c-#0g|$EO~18baF&V?dF-SApb=D?eK+&70>cD|Y$LcNsd$&O@D1ZN?re3gJB(VK~k)b zZ5ittjTj#el-wXoi%0bF+Q@eRav*=wH3tV>uaNy=sYvww9h}N%)iB}=x6j5UODTSx@r=LKBY9P`$$PMERdh04dUAsJ7B|SH{!hTi;k$MpO5to1&%NU;qF83UH3% z!%N3|RjQ;G&DQy`Ca=kV0MVbai1Tsqyo~c~CEbUNUMRPJiTA#GShgWn2%r!Dj2t@c zgJhI-)9okrY7p1<#SYq&WcZychj`x+)vI`GwByjEOi<}%zY?+hno))$f|z6vQS-k- z(A@{)@9TIQc;%|^jR^t`gW_&U%*M6a)<7Eb2%&B|$rTR=#&2oKgzF zaC4s2+av1FI4BYdgY7N+hEFK9y&aYlcWu2`CEd3D4;|b3A2k9t> zkpvAJ@;i2@?Z(wh+KR_BtI9`Q1|PI{KdF_@T__j&1W)qo^csydxsl1KIb9S!_Hd!a+Z ziC1OwnJSha7Rx&YK8fn+mpGRI7^OQGjPm-j^JxlkcIZwn(N10BaXe8d!B%-$v zFPME+8|Qk2Yo~i5#09IAzt^-&+(*@^e?l&i#=qe4Q{%8sX)9h#D z5XZ^J;^!LlEIE|aJeU{)drey{zQN0ahd5baqN8=X>+|(MsQ#2Ezacc%FF`ZP+l9Qs zkTIe(`caoowtw+w_fmEL{=%h@V@YoK`Wmm6J(!;it^<4Bulh7u;dGoIqZ0yZpdHHn z#9T?;b`oSG<%$*gI$;C9U|XLu$$G+_p7dqj>&o0wk$Bd%2iqSx8a|=IzkZ1UoYa7j zVcZiH33whT%s$ioWN7oumOmiL-}_t&j`6}Nj!CGaOfjc9`7Y}#_e4e>rx%={cb;}+ zr5`y78f$iZf<2kt@J^fWH)bF}8%RDtpJ5pM(Osx^H4uS%G5$UB1m$Nd<}#;B*1Lq~ zOOJgAdd}>PNP&XHsmG%Xgl+SwtdObzNl2*{cQ7%5o)o%QnJfNzJ^ZID{R{GE{gPN$ z3ZrSnWrP3indx-b4hzg}y!cI#{G(!MpL5*Yh2GyAr~Cr)ZoWci>v34joWSkf1TFsa z!Gz#4snN?J&yS3%?#5Iv0&0Esm$td1Ip6{w@A(Xh{;X+z5)$&tD@C zFA=n)M^kw`dp7(=d>i8%0Zw`-3#tS$pVLCEW`I2poUonv_+X7mqQV@f!^tdW^6UbT{T|7Q< zTMt3R_jEkwzb+KBsrP?bD#u`UKttB5SXNGL7#R&&iu1C%&aE{Y8@`6CuwMV--!{jV=jTQGc>cHQ z?k-KHI6#@@+$bde_T8o@eAp7=i0bFPht$(f^yIacb%OGq)n@m;%1hZ4msI*IfoeZf z<9RXu;OlEVvQK40@WMqSr%ab{Wm4vy=#pS+6w%b2FIha;;Iu75Ce$|2$snV-G$X;b%4`9WXkOJW^M&thTUx_DbURA$Ja73enA1T-a*5d8wk%FNq`+0;CN!lPv62 zX#fcJ_tFq`TKHIr1x8Ke;rfv&3x1yU*+&1`_S#SmHr!5{6`kZquvu;W0K5RoG7Fj!{SL7_ z)qIxvYNS)TeG#>V;-wUD?JoZbRR(O-s+Y>L(1{ff7W+&TP}%wF*Ie4{N5{szOWnFM z`YOZ3!dzAP2YHUYIRR^|MHkUKKI2$ zKjpUv);n0)kO~3KiT@Ajm+{>p&R4Lo|pwJ>f5r@3q6q2Ls3)s=7?NVh_LE zTsIYMJWm^zLyMsO-06w59uHXhj9mPdVBXgM;Ojl(n%P^=R5l5I~CjPTQCL8t8j7u5_Hs@67BAE&fww_cHdJYBVB z?!hi;5r&A$a z`)As&{Qw2gik$_nz}z~<9=xh-%g1_W^FAg5=RB2yKhxg?^TZo}HeG5wo_zUzoS0tZ zanw}->0o>I8cf=EX0R2F_O$F8k*}c6;_Eb&43!Gl#tUSFSt;8B!lBT8|GsWdAw8?E zYtc{Uy!_X9pr<50#_la_cFljQ;?e3}yAEw^;rXY|)GY=OmGd@SxVg#odvbv~$94x0 zei{4e8jD9}Zq5i!ODWmhysQ47w6UuIx@i7s2*1XnlCF%XbR`f;eN% zH)-L|PXLAMo|P7$O1-BVgf{!v?g7=Gd2=75o<|cLv5rrUQ9TW#Uuovm<0r7rV@v6y z0MlH&Oq9Jp>e;AJAz3-W=~N1&9eFyMkfbcR0t&$`kbk)eq3C#HmLj%#2@_;d!7#zm zy9UdVzr$v$WzBnIedbbRoEpqYe$3JOdK^1>LZ25=nHr|Rx0ks@vcE-T0j!a@>I4Iu z8PJQwAZ3{`0Qh|8u{(CUTnr18M7U1FfIwi8XTxCsWrwi7&?UhX1!5PAsJ{B(hQlJ6 zC8@rq&9|>h2D017EEL~oC`k(qm88J{Wme9%84*7;i-H>lmo7p$E3=DzuLsVB(!nkj zD&hGD%1yT1L&_*KqvmQe-(5udCsUa5t>rdh*Qg+e!xs)uQLF#(Bc+QMH=TXl&u=3Y z8~w?DEY{y8^7LzX}4)*mAz*_y|1IQDHa4Sxc-q? z<`cX1n2c>xy~)2@&eP(E^Q-*vIoE5kNiu!qJF*suS^V^T4>y43>|V94#V7Bnf0ix8 zMGxdhO^TQtoSpvWW6{nCd}fc;eqoUrp8M^&$g-e_r)%)5V6`PoAck6^wKxG}UDFDmlwY>7sc%ll|Y~PAoBF_GMa+$J1s(s<)nAa^7}e3Kg}r z5~$ST@SphL!Wv|70EFRYjx*E|!8d;6@9^Yb4TT_^$ zxJK_EUnC!&V;AsffYWLEX?ppX{%e|qRg*e2klf)p{c=jz49)m>3g`{t&F@2j?hcwR zN*2bC+U+aQQ(lr7U}3IqiuXN$vx zJTv-TI+R<|bJj;aaWUO|2C&fPuTJ-Jj+eY@#)8qUo}-@i0_bgrBr0?1V^vSbw>1=B zwF6vCa7{y1)t3E~?;S-e(L7vRT@BJ^)(oy(-2f>(e5FCz8@j{G6*RHYmJX~2;x?~aa#WY*S&q6} zR8j~^zfiyP?)vV(`&%6L6q2V#-U1%wgUgIXm(r|cD}-(24r94GSSuUB49Tb<0u`k0 zq>?gi)iHcDCb943H95YpQ@ycwAnE@V$F#Lf2VMx&_Daf8=^o@_@93M|#UvnieP#<& z*jgr1Jm`&ooN^oA!ewkKZcQfRjw@Etj@d9C09v+#7b#xmgFQLd^tkUmOtThm2Rr@ojoh6_8;gRnrQ46C z_R@npC7futj=j=k+3k840hjf=ISa19x?EvsRxL+2!aH%$3zAdmq( zj|!b&s}EBan=@4=%XA_N5HZ_+DI3Q+cRz&aMWujd7HC@9FlunpgDax=5nG; zVIrTuXol0TM$Ojdw3<~bmumr%))Ol+e1leQ*$7V8#HpZif1AA_@*JY(hBRRi8X0*sS)=B;&h6Mzy z27qMrGmcG`N#h&QU<_`U6ZQX!wf(Cg_7A!Z=vr$*MI-X7UE^8r!-L(2A~m{E>2ejv zshRQp7~0Ak05XXh@ip%ZKGKP~SwE=%=l7&dwD{eIh%7L$F( z_7_3qfrYsDc{^>Z+j*<<1C0v)S`{ zu-(G?%=#GVv5kEA86JyWnyr8vNtPffjMOA^CW3`4GdYA{-2AY(APWN<-1DI@>V5 zGI{~7S2nWpMg<}A8qiS!oJBS9wRY~XgzqFo@U_ALyi-J9WpIOvjm%j-z=0BMlV8Pgg3P(Hf^j7*23cA1dxnI~*340or=g86e+xeH#P3|N9 z_%DR9b6xHXR=k}l=#{u25v7UX^-vYsm2mb$yBoJ4fttL(i=-C(LS^@(l^0`qUFuUy zi0>ZphLpc_e<@QQ(i^BXkJ*~ZJ>D|%D{Y*sRPV830*<1BS^sXLU0SHP`9-*G_{SNX4Ne(sZ($(&1mo|sbKkoNN5VgtFrwa zc8y-`SoOr{8iBnteu_Gg@wPZuigi9U*rQ$oJW(a_^%<~7UeXXj*21j&%YXKW|6hCL z+ZQThu^Ta_>w1E|U_Wmi4R9}n7zqhG=X!r}rS#q?QQ-T>lb;NJt`VPlMt{yNY zJ(wY9AkO~gViz&?Dit1(rkz|F%&73&B@vH92eGVTR&;8-ziqeIKaU*p-PnsZ@=Fdr za4(G2BI&r#Z6W9obo3TdsaFv;MouGgZ&wa#f7BZ$1}Zv@lP7eh?<7`430TwHoB!Si zrbQn7SQqG{Bfi66+D=g1XKn`;_yy( z%IPJ~(mFEBOI9XwWNHC9x(tw`(>6)28QzTK1oAi>aVej~dzr+&No?Ev zV?<@P1N(kXWTkQ$p@K{#ay^*Alya%;Ij18MiYF>SY;9u>760YZ-WAR+7gs!9b_<(6 zga3sBF!P08bB>U5ysSm1jUfHmhdvmjk}m$xGlB7TFD=|`=`-vl!odr*hLyOSf|4o@4vSZGOj(Sa0+2GhTP#jwr^h7~`Ic@aIg@EQwYMn#89=ay2Gfw| zD1dm+hxnKdSG{#sfH2(oYIRE%|1{KH;_=I~AC3Dydq|xafMe_sXG13~Y%n_khEqCw&58BS8`f@$;;P;A-^#B$8N zeXQa2iotdv*x>P!mDoy*?VH@~_Vl@Q+b61?H;L7b+ol@Iv2iy8Kq|a0rF8WCE$SF4 zXpvbDb*!Uc6I-J_O}bqAS7cAg-<%fPd*ECctreu+J{|nN^6lbVL4<@B2nPO+CKTwk z7EWv948$$OVRf=;-lC!K)etWRmDa-4soL^}OpBO3OL53@bs6Y!L)Xp=x(AKVrhqA> z{JUEna2Z-xWP4Y`oszu5*^;v4SrB|Q>)A3T{tYD076|b6TZIF4OF#ovVQR8{MnmDg z(PipJnCu#%T$cfspdGR#m>@vB4BYq4!Hor0GK+DIw7o{3x{S$xuG~t=#Mj1J~krszy`5h>{k5h?cO3Nwr=UE-AEhEB@f&Q?Y3!2vA_r zc-86A`o3pj<;lp-i1^j{%EGhQ^Gi=*uNjtQ@!6gjC|?akAXi@eWOvTC2zu>O_gGlr*RsePC!A_(Y@uDLKAH#fMxDiJ^I#2|y3s$rWQbg8J-11ENk zyyEZP>N(RQ3a^DiFt}Trzk>Ug2l8uaSV%$zNomVPCC+Y$=PO$ZfBG>4+EdDxC>X4g z37gW_6nB5vEB96kf}o=N`s}oEU$#dg8al|3r7c%?!asWA-B&@q6?(9|)0n(Z=* zCef|*_!TH@vDvL)wq@!AIJ}J&c$C*E7=hL(k$87c%qsLH=0LuD*t5hMhP^C)y-IUD8 zV+QB048Lq(xkWyP)>{Z(RS~j&Ah%R+mFTTVPC!izOlv1rM#Pr~OH2n^9~4cZ5zUFS zD?P_WqdKL&UxIa6^cDxYp({`1e%RiSnodrhX4fq*du8cXmer63G0gz^%qGZZCg$Tr z$_Lf){#gviS)Z-2`-#Har|+}(*@3g7$S%QwZ@Qco&2l@#%fUWLFkNAQ9-Ni#;PF|3 zsGjtneG@%gDY_e+mHbyCXCa`ibG9Oh%t6iqGT*m3nBy=fB*H~{bXaLn(N)(uNdr2h0p0S7KPOU{R#L%=8A%6acmv+*XZD!FH+{F-voZ0< z96)7O3|fl80-55@JFR`%xfFf^n3`|8_ut?tJqN?~Ao*M!J~ z2v_4xz)?%RzzXyaxQGHg1PR~>zHxvaO5$vLnrd%auc<}#Y}Lxn>G%ii=joO$Q4 zdnUpnEk752m-EWM5MjX2$A0MRk<;bD87YPt_2iK+r5q9cIylvO)B2Y#`|BgI$O*WU zwNnCWa$s6Fu`({c{JHb;Y_jE61zFGS;kiE_KGOo1ku<^JdN#?d1!O0IX;U}F+9?B2 zTbQQD&m(vJZl8ryYPbG;_Nr5if4a!+;slK@`aRBcUff*P=`C`(Ji&Ket{Pb`jWOutq;VY5rF&FsmSm0vIslBZ2 zV{(#ZQjUciuVGj3x*UJCjCB8>uNJUi;P(NbEC;7%n-bZVaKohd)RbWQ7=`PdopqWltLbvC7yPSgugB9r$wcE zkJdv3o(m8|4PD;cUM|;@7~Htky_v{dEv>522bYdKe&uyzBPBt8J4FLkYO$~PQv8bu zE@_QSdzE;+Ot{VT{n#|n70OYskywDL)x*SU;v2wI2W*@VPU6w6I-)dWMO*4uxPZ8> z#eOeost?|0qn~kzR(Fj_J+=+&E0cF09Zcc|CEU9I(Er$@l4U;GOwSbc-g@y-fZ)u+ zM<@!JQ8))86B!fPY@_^;7HudW*x@Jz;^n(8zTlC&xg>F*4t8135Xu}=`lpBeAm9%c z^sncvr#@AwPRr@S6G+?-HFsn>4o^=DYX>P(Vp1L5uvh;|g=Cg%C2dHrcVB5T9!YOx+kTR3Taxvsv z6jUVGbWX78P0i(F0P4K_2kNYGS3a9N_1DFxB?+pt8nP*b{E+4$2?$t1BnYnVx}Y9{ zbVkVeO?YlW#I-vDIfj7QdE9$dqq5j(&HxVxNdJVT6i0unB#u?FlAA=4xxgmaQ+NkuIle?A*PL;_7}(_$s3pu!vi$2b}tz$QF2 zK}B7_sxAm%6O4&xI~4lbR`|KPu8jxJ38c~izo?$*wNYHHP%>$e>7Eiu<&Y#$a5Xic zFa-2IyPhCW;rY0d7%%^?gzNvtG(QS12kWeT_YrjyTN@(tEMDd%5~Epbi~r5U?;i(z zkBP8_QJ(vO^pb*W0%{CS;@u=!E0gCff9Icl;q=eTC0BQpSH9TLpDEY9?U(wR^LN7T zv+_E-JJto0hDNK$9;nB9lRSDop793I06qt1%_yZl)bomG29S(6`YS} zr1w*Bo1cPA5Zq>Ya6VT-%-*$`sGm`w4a_QYDL0EZolQ5L{yzW;>t1IYV>}g-_#lFb zPPldR!2|n?_KbY+p|8AWXL~7^{B4og)rtG&$BWt=uN}Wk0%xbnfx9VHdzk2!Ir-(S z?(tPeDtDoK-E#DJFthMDeVG=lf)1JWiVUp%Z@Z$~U?uJjASmKM znF=N-3`DU=>D?R~SMR#aGVDE}ACF|@HRjbx{6GB*|CNjk($MLud+~7u566rcgnTLS z!+?(nr@0kV$8HCwx;O%=Wk{JdiYDY4))!9qO&f|^i#Nm3q3)ug?yDh9hxY!f`Wiz; z;EjHF5NHqR3BB-s8JDh+wDy5k3Y-@dNMME^(0GDFRd1h2nL!4o+Fr+c_xJ z_!|7XGjZfq;~;VN&b$xHyP0W(&HDwrg9!25erS=$;RJJOwRtdSfd`6$>YkwGA)^F~ z94(%I%!sL-)WPY3fP~MAX~=_QYk9n)CnYYMlijjU_QF>kO{Ir306)r`mEUijUqfygW~u~Z;rydG%nUiLkZ zDz$I&#q0|mA^B$axTAQs)Hmu))EoUDZlgn3H&p&Hk*{9Q_Ii9VX&<{ z7Ivv%^4kpv=0K+So#xC5-It7`#!D&yuA>Ox)kooPE~ow3MnSg1Ecay**ezXXpRUWF zK|ueO5Db)>v8BMD$`=tK30{&W01erH=gt+E@?8g^dH)2i$|5NPjlG6H)8j76iM>Ma z%&yGStyNpXRqyk+GahYhIo1N6BS~rF3scha z&tB0NuPR$NHgqsOhub{(5aqoWD-nW+`d_ZFx0YIw=4Ll<2FMJCm ztX!6tD-?wZ#%m~qgJ7u{Cd&*`<#2(rM6HZ(APbYntLr2(CF+VvsVb|=$~&wYpK#@a zzPLydPteM{xv{IEHOl*kPw=0zK1l5yKH=&8377)_hJSY~BfK)_uVi+r((}_1*@n2= z3se*5kLIYm$)ImUm9sa1Xes!Nmx`ZCjRDTa?Zwl0w%(RVgac5y1o^wC9GF%$hbHMac#t(P)A#O3*3sqvVeuY4&U4Rlpp>I1(n&T&TMIna5; zeLcAnPZo}pm96MB z_dO;Z)6<5s=knYQ0D?JpzVC#ml->y>22=@_y9`}?Z`to^7Y>hq?Yzt~pbMsT{HMM! zG6=#R^)xVT4(KR0dy<$#SsLTaJ zHI7@it4YkW=MwfEznE=E(5^l#-M+YO?IY4L=ee=w63o!rDRxQSlJ0l#%KoE~!Itgk zBdj>Z%+pusUFcN1_lE0xj;R5A$E=7?dU~x%(-CASEoNZe&&w;6UO8x|#lIR5gzm3U z)@wI_8qCl!&#IdlP#WCPU8~%28x^{Q#JitFI z>Vz7&2WvPtcKBNDAD%fZJLZJi$?YXW^wfQPj9$xBLG zWJrUOi~s;I3Wxi@vRp~**9GAQjJ{Ab?cY5FeN^}c*56C=FWlYL6bktu^m%s6K7j9z zt)6u0B|)>g zmrM1I8Fe1~@rvZhER2=%?w4DkRZ-$M>&c?|%?<_~?mKa?{SU+-aV`?PUB*&=#@`rm)m~crN@VGJMTxK>+~b=5IQF zR3W5lGezU=Z){O?X6i@X;H6Gg6}e^N&gJ6OlXSVE0nEU40*IV4~OE`w99S;0fk;1~6@bc99-5XHfd! z6rQbj^wht5JzN;zbdIRt=oru2J<^wncE&3JlkIX)+9KV$=Q7H{9}ddY&;FulgTvD{b-|e>)$TQKWDaG z9AoPhAkskqVG=YGCohp)fKu1<<#}q!Y4D>wpVX~8@0r??IatTJQ7bj}sG#aa3zdZx zHUE_w+Go!tXQb%>W{QY}s{kMio#=iG-uTM%=BzLb_N z8`}%^w~E_K0_foPrkAV zzOUGTq&{e{ba7?8Snu8MU@i{G2reJLX959u>&JZ>-Lo9jcq|GebJ{&TuNBw3Sb%8! zqm2e<5|0QDfV%S!4sKN6P)7MzEv^@E>jMT~cS(d&JbHo1BdT-*G#U(m0-zpZWw)Cf zB%~xA;71=*tp#3uP$3~E}cs-WTp@+y^5 z%Wc{$4R!0CmVwO!R`;?T^BeA!>gP@ewo=Oe6;r|d{(?ih8&sULuEVJ%OcZV#p`tX{ z@phh2y;De2!AOOHe<8yH=?Z<9p^0P`xD|Erj)7j1Y}T#>8)(rX#>XOVF9%KPUW|(e zoi{P_FVp4N>}hk#p$^Gj)QX`0&K;i-&@uM9mL=B}TQA^%>}uWicdRqb4CpXSMMo`ws$){~ zmq`}?1;3WF9W^K>RBWET;Dtx(1wXyq_|p)8_`i?95nq{HIOrIWN4`9`2)&PcB2$}b zI6zV6a95sDTDfk+1Y6KS7(6(K$A2E=&t8t6-1>*oh862G0w@M8Vez?}s!*xl`T8C|n1=MIJyZ ze^pEOO==6ou4??*w=|}2a0~X{84kInnXvqyT2r8hHl_0u=Vu(tGzWjz`FYu1&VeOf zUwznul*{&;fEj;qt2DwSW~n46Jk$<$0deqN4~3Ny2-trcR9=>A%RK5qCaJ zTT?y}IpO@t(7Y;0dF&1v0Ew}R4`}(}&z=|s@cL&S*No3p zOSgkHMX!PxuE*Tlmo%8#f$wAQ&Ms|-(;}Szby1zTKwvu^n|2(&(=I~CQ&9e zPr(0^=)&(ubdKgaM2g++su{vuInS$N6H`0(6~U)#yQf)8AuOlTK!0p85?X8Y-W+h# z=sn&?@kW1nWpN=ww7KQp5qC<#>_)=uGlZ#F|1h9yEl8UMoMZ^pD=S*$bU=mVV z)$tUG#CM<3XAIYUrvpyr!M*+YoBLkckFB(!cBHP;sz5t&s&SAlS{C0X=hZ-?*S?0s z!`CRnVxl7Y=Ntoxpg$GxzFsxH-M+4OVNCvI%67W&_Wm>LN?i$EsD*nRm~&Nd5-39m zc5?Kd!!A=nF3!hK?iB;h>AHrXEVm?%vglW@v`wbPI=}4a90B88ThxjEp5va?mdHKX z-f7*5swl%cvDnm>!#_=F$8d9y|N+HLA%?7|kqd zAeOB2@@{q#zo@7pI;Xy%x!|LXNBUgLDAl*S*#^PPG<(*5hWZ>JAC{d+c>b~Z?j7OjgTAgJ@;Hjmk0JqJo02V zO)#EEAgYZED&;s9-$y~xRa8-<3761f2b=k=PaGruI_3CzCj774-y;-WWEPW<9mz(* z9v4iy)}aeM+Hssr^*@woD;p?{%XnQ2i^_B-9+K{qZ^YvEn2?#O%&TnpqF?bV3a7@2fqPt4!&-$f;7`!ZfvnTVC$U~; zy?{w6@)|IR||G_Czx7VbzfZ1JGsY`v+_*lfld2BnXhNV zVcJH!qd!c1pozJk;uyB#Bsc#SfAWpVu-_-IJ><8B`@QB*dRD8hx^$;8;D3wB7k&JW zC7qp8I7h7T{7}75`(plHiMJ3ed|0(zZRBR#U`Y9)y>pW935B1YOp1xa)A-Jbl@Zxi z<+b>R5&zWfvkxs#q#W2|u9hp4od>y~cr0ViZ&Z$_f4+VJQ{lWA^?QlT;_OjSnlos3 zvo&tHp<->z^)7(Z>!cTp*T>D7nc}za42&4F+vEH*QKNx8ijKWk8!-WLB);jaah2z= zjMbU=lBSFM7u5ENY%_yZF(*e!qWqIs@n?Kdc=K$=dhnGi%*1u+*Z;I@m12R(&B~jJ)Oj7t-#P zPq(=8(>~9dwFWaAmO(^_#rGhNL?`EOGn$;yY$SXZIcc~Rn)CvWPd@EzF+zHdBtX|L z!hv;|+?Rr5GD1eT8pi4sE!Q-ThByrV#-3-r@a!*X+)0$^M7Yy<_-lK5uaD7PUXzYw zlOoQWTwWigrZtYxWL*fX->+KF!CD9=ojYi%UO-a4sjQ*l$Xp~EH_oOGYnN7pO~n;A z`hF&l_QijCF!Y)=7=9wb+rB5vy_)%9V-5uB+$~`-=m!}L_Zr|=KHICb?;^m^+07K_ z5Y3=_p7H%qJird^dL_&#_-F`YrW~t%r8y-m`g^y8$}TlEylwE@1oBT zN4TI0kp!DS9s93Ja!c|pd!tV@aTgRMb{M>Q3r=pd*5;nO*dZ+e-w!WD%Q|AARl&8m z)`#LURiU*95~g)LnuCEP8VMKKMyxNvom0wHDbDHhjoUJI&Os?6Ap&XwgzI$3s!P_h zm+HMN{c8e~4pR?5VqeO)6!VVdQ4N{g%6P=?aJ|OC33uy)@+DbQq4LUQ;}Dn5INwav zco4hd-um;6>N z3UsE$a9Ao|=SS<7qh}8x?qLj_I9c@@#Bgahdn3Bo8*SjLY22Vxd^3-)aks7eO0~zYGEE%i zK5~55;cW{VsuwP)MH9o#>LW&v3bZ!F&4qKBrLQ>_b;PAJ+iIbf+ofiF*e&D^o=jE8 zh`&1X?fNx;GyT%c*B*<&T?*`fz&)6aR7XNS)lO9wI4$>(a_ad)q~Y4^3S7{!6N+>3 z>(1&PJ46UZZhl9n;CeN-Pc(uft$zNXED`mwC0uerPN*%g?-N6++bFQEeRnflzUY#h`BJ4!si&qNbRiL)hCjk`rhfwjb7K2cFBhZG#~%(wpeqG5VG!lLXcluwuIC1=3$fyZyHvQa0#t{P_f8?2PA($IL%-mPJicj3lc{c8w z9s7wLl~J(`b!+Rdj*<89EBBC|YQu*+W^o<~&@op0jox$*i+-4QPmuh1S$C>2$6JPe z^4;v(cVVyH<2^GpGr$>H8yTT4FS}>@D7p{CXZY-|=QaCNqA9DN(l5unY4Du?F(@@$ z43P}9%G*aXj%}a6NsSc^r$CIt#uj`f0+;4FuX@gYd2)687gyzh9!=PgE=N`V_inCt zs`aYG#qJ9S4ESwRb=|MjLECdYW$Ylw zNQ5=2`_NLWLt&6%Ny262#kIQ`Dm)FGP+e9j*AxkVu|W?VcPL!sQD(j)Eu)%?a?^W} zfYYgA?)3k2`~ERP*Ra9#caeN7mfTbmvqbU>CgWM6>6*;X#HB{0$Qm*7F9s6{JS*#a zJ+*JuMw2L5cd`zB;60NrNht@=O~NVdAF$@W?N#+`bfi=gHbNHXz&gR5Zk8~a1>HH# zT+j-Py6DS@;X)1Tdc($5YgH3{&Bi2CRb?Bd3MU@zf%{8kXz)&cWL#xyZ9`pStvv6W^~S#Eg%=5+DsdVaxc0ClBYJ zF!KIR@(|x@JVI~1u0K_(m(BE1>Bnz-{1GKAXo7#wfr|LfkyB}p@VBJPo9fgWr-kEd zY{!Z5D8Bjsx5hF)76tCVfTybto93<<`IMV=P0IM`htlHTS&`x|u5G_FX6_jZkBLh& zw{>)1iRzN{d^S2PG_Elc7ywCrk#Z%(py&?Q#7xQ3-LBsW+ax;mKTgit2xSeMdRbhi z0UiY4=g_1UB8keVlH&i@es6{r&64IDlhm-FTEFpFp;n9BR96{9#|;bEDZJx^js*-lv6ri7Jq{kLoMj~$dSKsZelxc^4aUMfDE-hIr) z<>nak7l)kT$?rnh!?i5yvsPdDcjv++D5$CG?oq36<3q24#|QWg zzTfT4YUEuW2ycKcrEat^|A zCDQG!^%$c+=Tz8y*z$Ssy=<^>+Dvzz`RlimPe?FY$o(%@Uy2htQ9QmL|AWB2q-=78 zIB1Gt^;)@RcoMEclN+Uyp(8#?mi^o_DX>3NGD<8ktm3&8`y6Y4ZB_CUcua9p`(U|a z2Cn;);PJ6?!=BgMzgc~d8o71RVzbNnR}A%|I!NHv9b|!-cco)iIiw5WTaEM>ohX*wb}c@e6Je<}7J7fCZ+Puu-pl`R+eF-qU43tFBTQCb zu8-Dh&1aeJEvz$8Z?CJ-yntrAtJ0JbG`_VWCu?gz4-}kH4is7@I(6at*jnapKHR6y zd5yA5%Or09JrDt{Ybc(~Dm{X|8h-ptK~wnfCXJ2l%VP1-hG%XTsPV+&JdK6pKw|96 zddwU4KIvC{QiTvHgZ9Q-sbLnxn9-XCJ@;fw%Uyy?5o$760pm+xHN9Xpo36#N*%6kf z$HMN99C+ie5vY% zP1qojX5zVPVR>Il@LwzG28;ZzTCa)a2ILPHb4_=j&F%gzL!c=*5O7F$>yVp)ztg2Z z!S`=Wh0&s(QcNY;dAjCYhzhH;o`LEgi>6+mObjv@Mf2@c#KDbjMLWL4LStb4)msC_%7mx}mE4>0tnhO)oBwb|RUPjX*>0^5G zL(Z{fU&5ptI6)D{Xk>D6M2nB()M?MkhFs~nP`4Yf?XWZv5Efhgm-qg^x)N#lr`bH3 zdqP)3yhf+p`&DROvKsR?T%FwUR<}m5D4p}j<-VY`+>XgvrWI1H*1GR_ajERPxe{@s zjAShk# z<+>=hJUA#Vzv@!PWE*scn&s7ST~vQ7O;GG#RpR>AR+@6iiiYD4=YnSSMitNtsl=T7 zYWcMM8IrY2_?2(Ul~>(24UbLt&6CJdVvCQ_RPz0|4cXp=FgJSGHsy8sS>#DxgD0-N z4LScUw)$tUU3&}bwTfx%(z{fU7rJ0_PT5q0CYsi2TrCW<#izSp`o*tApzMlwg_!-! zpEQ~71-5@4aKBebkZ|I5syQ!&JiUKi<_np%gf#G@P}KJEm0YEy7+hx^gGE>91P$wZ zPPXmcHVc}C>}UG|uljB;7h}>{OV8Ga;52QUK7iV{E7zUh$YRQ?^0U@dZLVP=+Rmz+ znAotvajcy?3(wn_kPlw*->Fqu7B!-Dtu#U$gC*mQJw+W#qJT81h(gX<^ z7`Hod3Ef|f?DrHbCb@Pbt4WdDW>~1dhL^th+r*Q)6H%L-so`swM1=C-qN=nCsMTC6 z#f9c&_di@K-Hr5~ND;bZODPMlB7Fdt8ES{DfmDkvGQ3K?-H_Ms&31m4Gh?k-D@IS@ zODH_XcT-z1CUdh(u%FWMGoMe#^tm+rhBQ2kZkBEl8*C$U&Nw*lFIh82)Z9ckuCnAb z_9e$rZOblG?hf5dl|l4aq$ICk%8Q;|m2E*!ao(Ly~{ z;<=nNY>~nE^L!|jr;*h}sak!?gcj48ea+wkm1}Q;Nlq2tjexbbAL55AYI#hD>(meZ zd4BH1H0qci{;);+Y$l{vmaR^(Z+uwZ(D^DG*E*fb0ga=dqg$?f*5YPYOr@|wp(MvI!q%&1JKGbB;6KDL#(!*z|Y}r_h zQ!98|Dw92W&-cfxHof*rS`^9E9Z<-t^s*^#Fo5&kU>J`th)vv?z{R79JYasy~ z*G>E7!5Q?P)sej4YFX?wWr=>rj&thIr*VP45b zA7EXT&u8Q<>5N<)G@x}Tx=JmrKY3k*+N1^DtMZrw9N9&|-$ikJoj>;1UMOFUNgTSh zJ|842=0CUdZTEhxdk{kg6pqyxK|j8dQL#mO8er~8JH`c#oq}IDs2v`Pzb-OL_>0zL zbmr3=Q7+WaRby)V=S<OC{Q+`cY89juJ(EP8lq>VxGK8#sUiG=%D)@ElW|0Ca z17c`vF!m~^-?@7o)hrvP`_AZ*^VRB?(T3k-=!>%$;4gp^nDl}M?Q%c|Cyow(XnhNc z9%jVZDDKt=9VBnCX-1!u0+Bwm-}aYZuj`otzYW+5)mL*Tf<*NYv6kUqwK^z)IE zrDtyn+JB8D$lAmIM^>xUb+MhdJUj7K6)qREkm=t-_^3B*S=CJMo_cZ$P5x{^lThX~ zJh=lCv?&sx?S5(bbj9#n6aBhn#)r(PhlSjA%jK3Mcf@~R=C(DON)cQhD0Zbc_ANiz zQi+?5hs>qOq)HiJ?Ku1M8P1@Fsx_x*{)-Lt#Gef7Pm(mHFmOmYI47AunfL!GnmiP` zepD&foTKZwB&k0a|LLe@Pl)g;wWApCH-PgLyeQ?2bY|GE6&s9KW&Ub$!kmfC#Lhy4 zrnp-DVl~ftn)LA_$aVqTs-F%`rr&eF=MI)6Rwx*wl$Ft?j;^H&zd_(EgA5i5k?FvZ zc^OifJzd?UT*9E|2pW(~jl5xmVetm?5;fjFK1>AlW-u!Q>^HOBGY01#cZzVOOW^>+ z1v_jL-*3VUPWNK9Eys0=ec0Jf6rn;cISUySg1V6YJJNZGScS?7V~`C|qNg)iD-Id@ z=`Nn~>Fn~y^!4BeEU(+-bNi)A?xQ^X#QL*#OQuW4yVz`ASR3xt5J!siCXf9doyHe3q#{8ZE!0+?OEqbc8;g(e z5k(q5vwtpBogao<{z$$z88wwv8dOnaksWK&LlV9_k(^WcC}tg{=%con>O9QgBv2Ou zRg6;4nBX^XD*Z1Pyo%3px<3fJZ}+y%v-1^RH`O-I(4mkauSvU9{(CTA`0B4hg4r0Ctw1r76pCBE)nYdTIa+a#J zM0B|ebET(Uv=6%;K&KmZozN)Uvb&hY?shDYX)OB zsxvu+gw5*a4-luXV2#^o@yi#kV^*cQ=@(rJi1Y9~s$lbJ>qJ zw2EYn=)F1i2GXxylM_AAkW-16Hs5guF8y&M-;MQcqL%;G3S^bgD5t%ME!m^Q4BsS1 zM^aQ6H`F?8N&F0;oc+|Fg= z`I*D)75B-86jI9EOuaGH7K;6l*zi^}U-T#{H?n(Gw3o{L87xmSjuoBj0}dkoHd&5D=KbWdOY312$&Ji^2qDU_X4^ z-eo6#_f>l*o2?@bXzXUK5N?JHeCJnJL%XeIT)6-GQ2n@$(2YYLP}z&<`U3M$!hq(G zU{~$zUUf=X(0YpuHIUK^ZRWn|8;jso`pIn0Y3#YgaJCC)G-^UcBc^BODzXl!o()Uh z(b;O)#_5ndt9N@LH*6zp8PBEF5WeB<5ZHWNSWm96q`W@U0dzyDfWo{=z~ zDL`Z6B`6}w8ZWG9n39sEujUdI*H>f0Bf8H=^InW@mA+uUJ70<<#7NA>#WW8Yiz9}{ zD)5_B(rEpClz}3F!+gJwyeVGLeQ`vY4P3f&;iVbn`Ds?Wml&4881aTTztp@}m*U&2 z*D&!lXO59o(N>$i(&kgm@De95R;L=otKNYNXb7b_MYujfBrGSM&EoG$kU5TXNEvCZ zwZdY5u`B-A^2hTB#I$uRWZMf1^T#&l#ida;I0Y8Yxq||UITODod`1}2^On1VbF60^ z-!izcJ7wnT7?YAf)}SV>hI-Y!qI8+CEQkyg8WKZhY%EFz0y`fob(!zdcAx=Bsw_&E z9qclfMeqWog#-HLyPG8uccn|*a8P`sk;y+RgTJwdqGn{s?a7NY5IPY*CaEM(gsd(E zAi>B^?ANq@RTxpLu3EaLg9Dv62Q@GV>Y+4!t(n-9vMHgFd*r^WXoS94r-}z|+}B*d zM)h#J6HPA9lVvu;#Z@6*j+XYcg;r%2eVN>`u$nu*snj51aYCspQLM(MP+LG)>l7g^ zU&?E!d%@kMbR;jN7E15|7r<2e)5z`zUh|B)mAo|sYY0>|_)-EPzv!A#f{uotq`4pT zP{xTHuO0k^`(>I!Jkf1Ukd`QG8spv#kAX7SXOfzCfZu;s@FaqlNQtbg_KU77faUQm z50N+Z?f?b=$7DbjtpM!g?^6vNEvI14-Ijdz5*O>4Et)Po*{rZ!45sa{jjd{Ipn3@dddZnv>WM)t5$^E)Ue&2U4zx>eDc)x?{VllXKSq9u9 z#OTR=-HLY!Gc}jR&BuGbx9i~PK#zn&Ts31)uDjrA9`73ad&5>dx?OfZ zIT;mdbE4XXgtV`VO4S^Hf0g^eSJj8Q_=M-qee$Lh^a>;nw~(xHCF<&rX+8Mu=$=&7 zqdA~M){Vt(S5^9-J>lXOrKYUvpX*mtIZRM#qxw14*(hn{7+592?ndebx=-)pgMho7 z?4m5mb)r^7v)*%3a-#jiJEI}1vZS781{relxMa&av(fzAJ)qj%W~K&fZJbUp`EAT~ z5GtI(Gi(~Tprl)gdkl!YN0gU6>SYPiYK$TQ;30}4nZ;OLcfGx_h%!Rek|svr?!*z| zci{HoTbD*>*u?OqOp&5`1s9K_-J(CeLh1nhl*AbAheuPo z;`u(0$Y`9}k~`7y!*)3D(kqUzQ1`6HvP7K#`{$1g1~fAI+FkjUFC4X7IK2*t2c|qIK3}W+3*SpGN|F@vS7~-VIbyPlNOt zR_VCfm)U|%&`@Ybl1gy|p8)oAzMPwF;tUZMQv^q5CVWd9z2DSG3pfuc(pRm%Pm|G? zsMT{1p7xd+J~!o-U}Hz8#8fTD10bD$x(>zqZPdd99z~HJ`oC*j=4`P2Gy0xrF2^ym zb=H)?qYzl|h{qxg%PN7JU)6j5#S6XovA4ZK!9bJ+8Hoked+?<*0EyP-k|j=odau6a zh-Ta}6j>K|@9dei8MI=;6jLmt$1b4C@(1w){xU{IWEMuUK0RG^qm3^HIT9TL(dLcFY4c`%42Z=%ds4fcq)E&D)OIx6@T~cu=xU z-=gj!tbpZio5@o%ByZ=EBO}UHEQd0(!m%)xd#}W9wpM0vK~aU9-kvWc8Mjw)+*&k; zz!?MuRXvdlHEi_IgQCrBFpyEG4@`_h4MZyy!ll=Yhdk*@n=_7>V&ON1iv%{9>6F# zeqH5q@l@u5{vPab=9HpYI_DU9bJpgd>MsF6+F1Jpw^jhZE0o1ctg~VGB&V^Nr&->K z7cXl^4`VLLZa1y=ubr2O1;#Bj6SX|t=`4uL63cbqZXclztD~K`#K#)oN*x|O^x(5G zyrD4jvROK&#L<@?Tu_Xj6B31nPhA5+p+3%AY2T$9!g!$U%<%bs3w7# zD9?v<(82)LP=scP z6-RG~ThRe&BR2+YngYMnT+f05`G6#K9x$rWm%lW);V$epCp|6}6=7I z!hrv@Z^+cd8S0-i?cZTrx7>t@2&W-&y(%feOZP29#v^6ZoslziL>mwqKJFli>D#Mv zwz=`Iy^9y7#!68jlpk_92S=Wg%EhL|^yp6J85P8`uZ51TPmhhxvXzr~RPuQESr`l~T z#%AdXo Date: Sun, 27 Dec 2015 00:52:56 -0500 Subject: [PATCH 10/14] Feedback levels + Dexed logo --- .../UserInterfaceState.xcuserstate | Bin 227922 -> 210409 bytes JuceLibraryCode/BinaryData.cpp | 1509 +++++++++-------- JuceLibraryCode/BinaryData.h | 4 +- README.md | 3 + Resources/about.png | Bin 23143 -> 24863 bytes Resources/ui/GlobalEditor_864x144.png | Bin 30356 -> 30438 bytes Resources/ui/source/dexed-logo.xcf | Bin 61559 -> 62448 bytes Source/AlgoDisplay.cpp | 36 +- Source/EngineMkI.cpp | 4 +- Source/GlobalEditor.cpp | 48 + Source/GlobalEditor.h | 1 + Source/ParamDialog.cpp | 44 +- Source/PluginEditor.cpp | 27 - Source/PluginProcessor.cpp | 7 +- Source/PluginProcessor.h | 2 + Source/msfa/dx7note.cc | 8 +- Source/msfa/dx7note.h | 4 +- 17 files changed, 902 insertions(+), 795 deletions(-) mode change 100644 => 100755 Resources/about.png mode change 100644 => 100755 Resources/ui/GlobalEditor_864x144.png mode change 100644 => 100755 Resources/ui/source/dexed-logo.xcf diff --git a/Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate b/Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate index 9eac424bc796530d987b6e7cb397d96645a56022..02047b5335938a6b35354c7ffccbc2c79562a397 100644 GIT binary patch literal 210409 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%0Drlz)=A{%>(RIO= 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 L|No!x=r#WbdmhxL literal 227922 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

nhjP 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 e`beoTmZ>=W(1o6taPIVKkW}E^M&*#K8+R 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 diff --git a/Resources/ui/GlobalEditor_864x144.png b/Resources/ui/GlobalEditor_864x144.png old mode 100644 new mode 100755 index 362a3ca291e91a41be75ec8ca75dbf9a4d86b3e8..eed278412e80f8b65894cb91a312df173737456f GIT binary patch literal 30438 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

LN)(|4y^n^m0t4dO=!oEfW_S(|8C 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