From b2517b47ddc163a87e03538a28f5655c7cc8f9e2 Mon Sep 17 00:00:00 2001 From: asb2m10 Date: Fri, 24 Jul 2015 00:21:23 -0400 Subject: [PATCH] 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