| @@ -65,6 +65,7 @@ OBJECTS := \ | |||||
| $(OBJDIR)/juce_IIRFilterAudioSource_807ee8aa.o \ | $(OBJDIR)/juce_IIRFilterAudioSource_807ee8aa.o \ | ||||
| $(OBJDIR)/juce_MixerAudioSource_bc6f772b.o \ | $(OBJDIR)/juce_MixerAudioSource_bc6f772b.o \ | ||||
| $(OBJDIR)/juce_ResamplingAudioSource_8511875e.o \ | $(OBJDIR)/juce_ResamplingAudioSource_8511875e.o \ | ||||
| $(OBJDIR)/juce_ReverbAudioSource_3ae42aa6.o \ | |||||
| $(OBJDIR)/juce_ToneGeneratorAudioSource_77f504b3.o \ | $(OBJDIR)/juce_ToneGeneratorAudioSource_77f504b3.o \ | ||||
| $(OBJDIR)/juce_AudioDeviceManager_c24db832.o \ | $(OBJDIR)/juce_AudioDeviceManager_c24db832.o \ | ||||
| $(OBJDIR)/juce_AudioIODevice_f7da876b.o \ | $(OBJDIR)/juce_AudioIODevice_f7da876b.o \ | ||||
| @@ -514,6 +515,11 @@ $(OBJDIR)/juce_ResamplingAudioSource_8511875e.o: ../../src/audio/audio_sources/j | |||||
| @echo "Compiling juce_ResamplingAudioSource.cpp" | @echo "Compiling juce_ResamplingAudioSource.cpp" | ||||
| @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | ||||
| $(OBJDIR)/juce_ReverbAudioSource_3ae42aa6.o: ../../src/audio/audio_sources/juce_ReverbAudioSource.cpp | |||||
| -@mkdir -p $(OBJDIR) | |||||
| @echo "Compiling juce_ReverbAudioSource.cpp" | |||||
| @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||||
| $(OBJDIR)/juce_ToneGeneratorAudioSource_77f504b3.o: ../../src/audio/audio_sources/juce_ToneGeneratorAudioSource.cpp | $(OBJDIR)/juce_ToneGeneratorAudioSource_77f504b3.o: ../../src/audio/audio_sources/juce_ToneGeneratorAudioSource.cpp | ||||
| -@mkdir -p $(OBJDIR) | -@mkdir -p $(OBJDIR) | ||||
| @echo "Compiling juce_ToneGeneratorAudioSource.cpp" | @echo "Compiling juce_ToneGeneratorAudioSource.cpp" | ||||
| @@ -32,6 +32,7 @@ | |||||
| 6DC6DEEE8A1A6092830A79C8 = { isa = PBXBuildFile; fileRef = D86718CE7E5DEF2071AC3D17; }; | 6DC6DEEE8A1A6092830A79C8 = { isa = PBXBuildFile; fileRef = D86718CE7E5DEF2071AC3D17; }; | ||||
| 2862E190ECA33D2CE1458B51 = { isa = PBXBuildFile; fileRef = 9A8053936C35A19B9E98623A; }; | 2862E190ECA33D2CE1458B51 = { isa = PBXBuildFile; fileRef = 9A8053936C35A19B9E98623A; }; | ||||
| 0791EB173E6A9F959E692AA2 = { isa = PBXBuildFile; fileRef = E2A56C23BF2BB466BB273E3E; }; | 0791EB173E6A9F959E692AA2 = { isa = PBXBuildFile; fileRef = E2A56C23BF2BB466BB273E3E; }; | ||||
| 3B64EF7F57EAC5C51460059D = { isa = PBXBuildFile; fileRef = 5403C2A4DEE7B9B3B34235F8; }; | |||||
| 16D537EB6D3BFAB3AAB54B11 = { isa = PBXBuildFile; fileRef = 3988438157D4B75177703F8A; }; | 16D537EB6D3BFAB3AAB54B11 = { isa = PBXBuildFile; fileRef = 3988438157D4B75177703F8A; }; | ||||
| 0C22446F12486AD139A640CB = { isa = PBXBuildFile; fileRef = 6841D6AC927D02113F3AEBD4; }; | 0C22446F12486AD139A640CB = { isa = PBXBuildFile; fileRef = 6841D6AC927D02113F3AEBD4; }; | ||||
| 95CF50482DC7139FCB40EB1C = { isa = PBXBuildFile; fileRef = C7DB1BB9AF7FE0A2AA38D767; }; | 95CF50482DC7139FCB40EB1C = { isa = PBXBuildFile; fileRef = C7DB1BB9AF7FE0A2AA38D767; }; | ||||
| @@ -420,6 +421,8 @@ | |||||
| C63D6EC0555C13C1B79A6AAD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PositionableAudioSource.h; path = ../../src/audio/audio_sources/juce_PositionableAudioSource.h; sourceTree = SOURCE_ROOT; }; | C63D6EC0555C13C1B79A6AAD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PositionableAudioSource.h; path = ../../src/audio/audio_sources/juce_PositionableAudioSource.h; sourceTree = SOURCE_ROOT; }; | ||||
| E2A56C23BF2BB466BB273E3E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ResamplingAudioSource.cpp; path = ../../src/audio/audio_sources/juce_ResamplingAudioSource.cpp; sourceTree = SOURCE_ROOT; }; | E2A56C23BF2BB466BB273E3E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ResamplingAudioSource.cpp; path = ../../src/audio/audio_sources/juce_ResamplingAudioSource.cpp; sourceTree = SOURCE_ROOT; }; | ||||
| BE5DB55285441D501FED3C00 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ResamplingAudioSource.h; path = ../../src/audio/audio_sources/juce_ResamplingAudioSource.h; sourceTree = SOURCE_ROOT; }; | BE5DB55285441D501FED3C00 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ResamplingAudioSource.h; path = ../../src/audio/audio_sources/juce_ResamplingAudioSource.h; sourceTree = SOURCE_ROOT; }; | ||||
| 5403C2A4DEE7B9B3B34235F8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ReverbAudioSource.cpp; path = ../../src/audio/audio_sources/juce_ReverbAudioSource.cpp; sourceTree = SOURCE_ROOT; }; | |||||
| 0F70C4D118AC7625B4C42CD4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ReverbAudioSource.h; path = ../../src/audio/audio_sources/juce_ReverbAudioSource.h; sourceTree = SOURCE_ROOT; }; | |||||
| 3988438157D4B75177703F8A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ToneGeneratorAudioSource.cpp; path = ../../src/audio/audio_sources/juce_ToneGeneratorAudioSource.cpp; sourceTree = SOURCE_ROOT; }; | 3988438157D4B75177703F8A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ToneGeneratorAudioSource.cpp; path = ../../src/audio/audio_sources/juce_ToneGeneratorAudioSource.cpp; sourceTree = SOURCE_ROOT; }; | ||||
| 6AC857F51FD805D7BD3EF712 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ToneGeneratorAudioSource.h; path = ../../src/audio/audio_sources/juce_ToneGeneratorAudioSource.h; sourceTree = SOURCE_ROOT; }; | 6AC857F51FD805D7BD3EF712 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ToneGeneratorAudioSource.h; path = ../../src/audio/audio_sources/juce_ToneGeneratorAudioSource.h; sourceTree = SOURCE_ROOT; }; | ||||
| 6841D6AC927D02113F3AEBD4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioDeviceManager.cpp; path = ../../src/audio/devices/juce_AudioDeviceManager.cpp; sourceTree = SOURCE_ROOT; }; | 6841D6AC927D02113F3AEBD4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioDeviceManager.cpp; path = ../../src/audio/devices/juce_AudioDeviceManager.cpp; sourceTree = SOURCE_ROOT; }; | ||||
| @@ -435,6 +438,7 @@ | |||||
| 11C1A96A35A2F03F8C34BD43 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Decibels.h; path = ../../src/audio/dsp/juce_Decibels.h; sourceTree = SOURCE_ROOT; }; | 11C1A96A35A2F03F8C34BD43 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Decibels.h; path = ../../src/audio/dsp/juce_Decibels.h; sourceTree = SOURCE_ROOT; }; | ||||
| E68EB4BC75216B5B56E3F937 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_IIRFilter.cpp; path = ../../src/audio/dsp/juce_IIRFilter.cpp; sourceTree = SOURCE_ROOT; }; | E68EB4BC75216B5B56E3F937 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_IIRFilter.cpp; path = ../../src/audio/dsp/juce_IIRFilter.cpp; sourceTree = SOURCE_ROOT; }; | ||||
| EE2259D9768027C2C001EEAD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_IIRFilter.h; path = ../../src/audio/dsp/juce_IIRFilter.h; sourceTree = SOURCE_ROOT; }; | EE2259D9768027C2C001EEAD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_IIRFilter.h; path = ../../src/audio/dsp/juce_IIRFilter.h; sourceTree = SOURCE_ROOT; }; | ||||
| 2C55CE1674244DB199C3033F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Reverb.h; path = ../../src/audio/dsp/juce_Reverb.h; sourceTree = SOURCE_ROOT; }; | |||||
| B457515938E7141D5E79B671 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiBuffer.cpp; path = ../../src/audio/midi/juce_MidiBuffer.cpp; sourceTree = SOURCE_ROOT; }; | B457515938E7141D5E79B671 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiBuffer.cpp; path = ../../src/audio/midi/juce_MidiBuffer.cpp; sourceTree = SOURCE_ROOT; }; | ||||
| 0604C2E17F0E0DFEFDA19F8D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MidiBuffer.h; path = ../../src/audio/midi/juce_MidiBuffer.h; sourceTree = SOURCE_ROOT; }; | 0604C2E17F0E0DFEFDA19F8D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MidiBuffer.h; path = ../../src/audio/midi/juce_MidiBuffer.h; sourceTree = SOURCE_ROOT; }; | ||||
| 891E0B1AD09C0EA44297E0F2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiFile.cpp; path = ../../src/audio/midi/juce_MidiFile.cpp; sourceTree = SOURCE_ROOT; }; | 891E0B1AD09C0EA44297E0F2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiFile.cpp; path = ../../src/audio/midi/juce_MidiFile.cpp; sourceTree = SOURCE_ROOT; }; | ||||
| @@ -1158,6 +1162,8 @@ | |||||
| C63D6EC0555C13C1B79A6AAD, | C63D6EC0555C13C1B79A6AAD, | ||||
| E2A56C23BF2BB466BB273E3E, | E2A56C23BF2BB466BB273E3E, | ||||
| BE5DB55285441D501FED3C00, | BE5DB55285441D501FED3C00, | ||||
| 5403C2A4DEE7B9B3B34235F8, | |||||
| 0F70C4D118AC7625B4C42CD4, | |||||
| 3988438157D4B75177703F8A, | 3988438157D4B75177703F8A, | ||||
| 6AC857F51FD805D7BD3EF712 ); name = audio_sources; sourceTree = "<group>"; }; | 6AC857F51FD805D7BD3EF712 ); name = audio_sources; sourceTree = "<group>"; }; | ||||
| BF8F3D00CE4E97468E8BBC55 = { isa = PBXGroup; children = ( | BF8F3D00CE4E97468E8BBC55 = { isa = PBXGroup; children = ( | ||||
| @@ -1174,7 +1180,8 @@ | |||||
| 812620B53BE820D26A63B65D, | 812620B53BE820D26A63B65D, | ||||
| 11C1A96A35A2F03F8C34BD43, | 11C1A96A35A2F03F8C34BD43, | ||||
| E68EB4BC75216B5B56E3F937, | E68EB4BC75216B5B56E3F937, | ||||
| EE2259D9768027C2C001EEAD ); name = dsp; sourceTree = "<group>"; }; | |||||
| EE2259D9768027C2C001EEAD, | |||||
| 2C55CE1674244DB199C3033F ); name = dsp; sourceTree = "<group>"; }; | |||||
| 99B60B012D5CCF0BD861011D = { isa = PBXGroup; children = ( | 99B60B012D5CCF0BD861011D = { isa = PBXGroup; children = ( | ||||
| B457515938E7141D5E79B671, | B457515938E7141D5E79B671, | ||||
| 0604C2E17F0E0DFEFDA19F8D, | 0604C2E17F0E0DFEFDA19F8D, | ||||
| @@ -2063,6 +2070,7 @@ | |||||
| 6DC6DEEE8A1A6092830A79C8, | 6DC6DEEE8A1A6092830A79C8, | ||||
| 2862E190ECA33D2CE1458B51, | 2862E190ECA33D2CE1458B51, | ||||
| 0791EB173E6A9F959E692AA2, | 0791EB173E6A9F959E692AA2, | ||||
| 3B64EF7F57EAC5C51460059D, | |||||
| 16D537EB6D3BFAB3AAB54B11, | 16D537EB6D3BFAB3AAB54B11, | ||||
| 0C22446F12486AD139A640CB, | 0C22446F12486AD139A640CB, | ||||
| 95CF50482DC7139FCB40EB1C, | 95CF50482DC7139FCB40EB1C, | ||||
| @@ -162,6 +162,8 @@ | |||||
| <File RelativePath="..\..\src\audio\audio_sources\juce_PositionableAudioSource.h"/> | <File RelativePath="..\..\src\audio\audio_sources\juce_PositionableAudioSource.h"/> | ||||
| <File RelativePath="..\..\src\audio\audio_sources\juce_ResamplingAudioSource.cpp"/> | <File RelativePath="..\..\src\audio\audio_sources\juce_ResamplingAudioSource.cpp"/> | ||||
| <File RelativePath="..\..\src\audio\audio_sources\juce_ResamplingAudioSource.h"/> | <File RelativePath="..\..\src\audio\audio_sources\juce_ResamplingAudioSource.h"/> | ||||
| <File RelativePath="..\..\src\audio\audio_sources\juce_ReverbAudioSource.cpp"/> | |||||
| <File RelativePath="..\..\src\audio\audio_sources\juce_ReverbAudioSource.h"/> | |||||
| <File RelativePath="..\..\src\audio\audio_sources\juce_ToneGeneratorAudioSource.cpp"/> | <File RelativePath="..\..\src\audio\audio_sources\juce_ToneGeneratorAudioSource.cpp"/> | ||||
| <File RelativePath="..\..\src\audio\audio_sources\juce_ToneGeneratorAudioSource.h"/> | <File RelativePath="..\..\src\audio\audio_sources\juce_ToneGeneratorAudioSource.h"/> | ||||
| </Filter> | </Filter> | ||||
| @@ -181,6 +183,7 @@ | |||||
| <File RelativePath="..\..\src\audio\dsp\juce_Decibels.h"/> | <File RelativePath="..\..\src\audio\dsp\juce_Decibels.h"/> | ||||
| <File RelativePath="..\..\src\audio\dsp\juce_IIRFilter.cpp"/> | <File RelativePath="..\..\src\audio\dsp\juce_IIRFilter.cpp"/> | ||||
| <File RelativePath="..\..\src\audio\dsp\juce_IIRFilter.h"/> | <File RelativePath="..\..\src\audio\dsp\juce_IIRFilter.h"/> | ||||
| <File RelativePath="..\..\src\audio\dsp\juce_Reverb.h"/> | |||||
| </Filter> | </Filter> | ||||
| <Filter Name="midi"> | <Filter Name="midi"> | ||||
| <File RelativePath="..\..\src\audio\midi\juce_MidiBuffer.cpp"/> | <File RelativePath="..\..\src\audio\midi\juce_MidiBuffer.cpp"/> | ||||
| @@ -162,6 +162,8 @@ | |||||
| <File RelativePath="..\..\src\audio\audio_sources\juce_PositionableAudioSource.h"/> | <File RelativePath="..\..\src\audio\audio_sources\juce_PositionableAudioSource.h"/> | ||||
| <File RelativePath="..\..\src\audio\audio_sources\juce_ResamplingAudioSource.cpp"/> | <File RelativePath="..\..\src\audio\audio_sources\juce_ResamplingAudioSource.cpp"/> | ||||
| <File RelativePath="..\..\src\audio\audio_sources\juce_ResamplingAudioSource.h"/> | <File RelativePath="..\..\src\audio\audio_sources\juce_ResamplingAudioSource.h"/> | ||||
| <File RelativePath="..\..\src\audio\audio_sources\juce_ReverbAudioSource.cpp"/> | |||||
| <File RelativePath="..\..\src\audio\audio_sources\juce_ReverbAudioSource.h"/> | |||||
| <File RelativePath="..\..\src\audio\audio_sources\juce_ToneGeneratorAudioSource.cpp"/> | <File RelativePath="..\..\src\audio\audio_sources\juce_ToneGeneratorAudioSource.cpp"/> | ||||
| <File RelativePath="..\..\src\audio\audio_sources\juce_ToneGeneratorAudioSource.h"/> | <File RelativePath="..\..\src\audio\audio_sources\juce_ToneGeneratorAudioSource.h"/> | ||||
| </Filter> | </Filter> | ||||
| @@ -181,6 +183,7 @@ | |||||
| <File RelativePath="..\..\src\audio\dsp\juce_Decibels.h"/> | <File RelativePath="..\..\src\audio\dsp\juce_Decibels.h"/> | ||||
| <File RelativePath="..\..\src\audio\dsp\juce_IIRFilter.cpp"/> | <File RelativePath="..\..\src\audio\dsp\juce_IIRFilter.cpp"/> | ||||
| <File RelativePath="..\..\src\audio\dsp\juce_IIRFilter.h"/> | <File RelativePath="..\..\src\audio\dsp\juce_IIRFilter.h"/> | ||||
| <File RelativePath="..\..\src\audio\dsp\juce_Reverb.h"/> | |||||
| </Filter> | </Filter> | ||||
| <Filter Name="midi"> | <Filter Name="midi"> | ||||
| <File RelativePath="..\..\src\audio\midi\juce_MidiBuffer.cpp"/> | <File RelativePath="..\..\src\audio\midi\juce_MidiBuffer.cpp"/> | ||||
| @@ -164,6 +164,8 @@ | |||||
| <File RelativePath="..\..\src\audio\audio_sources\juce_PositionableAudioSource.h"/> | <File RelativePath="..\..\src\audio\audio_sources\juce_PositionableAudioSource.h"/> | ||||
| <File RelativePath="..\..\src\audio\audio_sources\juce_ResamplingAudioSource.cpp"/> | <File RelativePath="..\..\src\audio\audio_sources\juce_ResamplingAudioSource.cpp"/> | ||||
| <File RelativePath="..\..\src\audio\audio_sources\juce_ResamplingAudioSource.h"/> | <File RelativePath="..\..\src\audio\audio_sources\juce_ResamplingAudioSource.h"/> | ||||
| <File RelativePath="..\..\src\audio\audio_sources\juce_ReverbAudioSource.cpp"/> | |||||
| <File RelativePath="..\..\src\audio\audio_sources\juce_ReverbAudioSource.h"/> | |||||
| <File RelativePath="..\..\src\audio\audio_sources\juce_ToneGeneratorAudioSource.cpp"/> | <File RelativePath="..\..\src\audio\audio_sources\juce_ToneGeneratorAudioSource.cpp"/> | ||||
| <File RelativePath="..\..\src\audio\audio_sources\juce_ToneGeneratorAudioSource.h"/> | <File RelativePath="..\..\src\audio\audio_sources\juce_ToneGeneratorAudioSource.h"/> | ||||
| </Filter> | </Filter> | ||||
| @@ -183,6 +185,7 @@ | |||||
| <File RelativePath="..\..\src\audio\dsp\juce_Decibels.h"/> | <File RelativePath="..\..\src\audio\dsp\juce_Decibels.h"/> | ||||
| <File RelativePath="..\..\src\audio\dsp\juce_IIRFilter.cpp"/> | <File RelativePath="..\..\src\audio\dsp\juce_IIRFilter.cpp"/> | ||||
| <File RelativePath="..\..\src\audio\dsp\juce_IIRFilter.h"/> | <File RelativePath="..\..\src\audio\dsp\juce_IIRFilter.h"/> | ||||
| <File RelativePath="..\..\src\audio\dsp\juce_Reverb.h"/> | |||||
| </Filter> | </Filter> | ||||
| <Filter Name="midi"> | <Filter Name="midi"> | ||||
| <File RelativePath="..\..\src\audio\midi\juce_MidiBuffer.cpp"/> | <File RelativePath="..\..\src\audio\midi\juce_MidiBuffer.cpp"/> | ||||
| @@ -148,6 +148,7 @@ | |||||
| <ClCompile Include="..\..\src\audio\audio_sources\juce_IIRFilterAudioSource.cpp"/> | <ClCompile Include="..\..\src\audio\audio_sources\juce_IIRFilterAudioSource.cpp"/> | ||||
| <ClCompile Include="..\..\src\audio\audio_sources\juce_MixerAudioSource.cpp"/> | <ClCompile Include="..\..\src\audio\audio_sources\juce_MixerAudioSource.cpp"/> | ||||
| <ClCompile Include="..\..\src\audio\audio_sources\juce_ResamplingAudioSource.cpp"/> | <ClCompile Include="..\..\src\audio\audio_sources\juce_ResamplingAudioSource.cpp"/> | ||||
| <ClCompile Include="..\..\src\audio\audio_sources\juce_ReverbAudioSource.cpp"/> | |||||
| <ClCompile Include="..\..\src\audio\audio_sources\juce_ToneGeneratorAudioSource.cpp"/> | <ClCompile Include="..\..\src\audio\audio_sources\juce_ToneGeneratorAudioSource.cpp"/> | ||||
| <ClCompile Include="..\..\src\audio\devices\juce_AudioDeviceManager.cpp"/> | <ClCompile Include="..\..\src\audio\devices\juce_AudioDeviceManager.cpp"/> | ||||
| <ClCompile Include="..\..\src\audio\devices\juce_AudioIODevice.cpp"/> | <ClCompile Include="..\..\src\audio\devices\juce_AudioIODevice.cpp"/> | ||||
| @@ -483,6 +484,7 @@ | |||||
| <ClInclude Include="..\..\src\audio\audio_sources\juce_MixerAudioSource.h"/> | <ClInclude Include="..\..\src\audio\audio_sources\juce_MixerAudioSource.h"/> | ||||
| <ClInclude Include="..\..\src\audio\audio_sources\juce_PositionableAudioSource.h"/> | <ClInclude Include="..\..\src\audio\audio_sources\juce_PositionableAudioSource.h"/> | ||||
| <ClInclude Include="..\..\src\audio\audio_sources\juce_ResamplingAudioSource.h"/> | <ClInclude Include="..\..\src\audio\audio_sources\juce_ResamplingAudioSource.h"/> | ||||
| <ClInclude Include="..\..\src\audio\audio_sources\juce_ReverbAudioSource.h"/> | |||||
| <ClInclude Include="..\..\src\audio\audio_sources\juce_ToneGeneratorAudioSource.h"/> | <ClInclude Include="..\..\src\audio\audio_sources\juce_ToneGeneratorAudioSource.h"/> | ||||
| <ClInclude Include="..\..\src\audio\devices\juce_AudioDeviceManager.h"/> | <ClInclude Include="..\..\src\audio\devices\juce_AudioDeviceManager.h"/> | ||||
| <ClInclude Include="..\..\src\audio\devices\juce_AudioIODevice.h"/> | <ClInclude Include="..\..\src\audio\devices\juce_AudioIODevice.h"/> | ||||
| @@ -491,6 +493,7 @@ | |||||
| <ClInclude Include="..\..\src\audio\dsp\juce_AudioSampleBuffer.h"/> | <ClInclude Include="..\..\src\audio\dsp\juce_AudioSampleBuffer.h"/> | ||||
| <ClInclude Include="..\..\src\audio\dsp\juce_Decibels.h"/> | <ClInclude Include="..\..\src\audio\dsp\juce_Decibels.h"/> | ||||
| <ClInclude Include="..\..\src\audio\dsp\juce_IIRFilter.h"/> | <ClInclude Include="..\..\src\audio\dsp\juce_IIRFilter.h"/> | ||||
| <ClInclude Include="..\..\src\audio\dsp\juce_Reverb.h"/> | |||||
| <ClInclude Include="..\..\src\audio\midi\juce_MidiBuffer.h"/> | <ClInclude Include="..\..\src\audio\midi\juce_MidiBuffer.h"/> | ||||
| <ClInclude Include="..\..\src\audio\midi\juce_MidiFile.h"/> | <ClInclude Include="..\..\src\audio\midi\juce_MidiFile.h"/> | ||||
| <ClInclude Include="..\..\src\audio\midi\juce_MidiInput.h"/> | <ClInclude Include="..\..\src\audio\midi\juce_MidiInput.h"/> | ||||
| @@ -265,6 +265,9 @@ | |||||
| <ClCompile Include="..\..\src\audio\audio_sources\juce_ResamplingAudioSource.cpp"> | <ClCompile Include="..\..\src\audio\audio_sources\juce_ResamplingAudioSource.cpp"> | ||||
| <Filter>Juce\Source\audio\audio_sources</Filter> | <Filter>Juce\Source\audio\audio_sources</Filter> | ||||
| </ClCompile> | </ClCompile> | ||||
| <ClCompile Include="..\..\src\audio\audio_sources\juce_ReverbAudioSource.cpp"> | |||||
| <Filter>Juce\Source\audio\audio_sources</Filter> | |||||
| </ClCompile> | |||||
| <ClCompile Include="..\..\src\audio\audio_sources\juce_ToneGeneratorAudioSource.cpp"> | <ClCompile Include="..\..\src\audio\audio_sources\juce_ToneGeneratorAudioSource.cpp"> | ||||
| <Filter>Juce\Source\audio\audio_sources</Filter> | <Filter>Juce\Source\audio\audio_sources</Filter> | ||||
| </ClCompile> | </ClCompile> | ||||
| @@ -1380,6 +1383,9 @@ | |||||
| <ClInclude Include="..\..\src\audio\audio_sources\juce_ResamplingAudioSource.h"> | <ClInclude Include="..\..\src\audio\audio_sources\juce_ResamplingAudioSource.h"> | ||||
| <Filter>Juce\Source\audio\audio_sources</Filter> | <Filter>Juce\Source\audio\audio_sources</Filter> | ||||
| </ClInclude> | </ClInclude> | ||||
| <ClInclude Include="..\..\src\audio\audio_sources\juce_ReverbAudioSource.h"> | |||||
| <Filter>Juce\Source\audio\audio_sources</Filter> | |||||
| </ClInclude> | |||||
| <ClInclude Include="..\..\src\audio\audio_sources\juce_ToneGeneratorAudioSource.h"> | <ClInclude Include="..\..\src\audio\audio_sources\juce_ToneGeneratorAudioSource.h"> | ||||
| <Filter>Juce\Source\audio\audio_sources</Filter> | <Filter>Juce\Source\audio\audio_sources</Filter> | ||||
| </ClInclude> | </ClInclude> | ||||
| @@ -1404,6 +1410,9 @@ | |||||
| <ClInclude Include="..\..\src\audio\dsp\juce_IIRFilter.h"> | <ClInclude Include="..\..\src\audio\dsp\juce_IIRFilter.h"> | ||||
| <Filter>Juce\Source\audio\dsp</Filter> | <Filter>Juce\Source\audio\dsp</Filter> | ||||
| </ClInclude> | </ClInclude> | ||||
| <ClInclude Include="..\..\src\audio\dsp\juce_Reverb.h"> | |||||
| <Filter>Juce\Source\audio\dsp</Filter> | |||||
| </ClInclude> | |||||
| <ClInclude Include="..\..\src\audio\midi\juce_MidiBuffer.h"> | <ClInclude Include="..\..\src\audio\midi\juce_MidiBuffer.h"> | ||||
| <Filter>Juce\Source\audio\midi</Filter> | <Filter>Juce\Source\audio\midi</Filter> | ||||
| </ClInclude> | </ClInclude> | ||||
| @@ -32,6 +32,7 @@ | |||||
| 6DC6DEEE8A1A6092830A79C8 = { isa = PBXBuildFile; fileRef = D86718CE7E5DEF2071AC3D17; }; | 6DC6DEEE8A1A6092830A79C8 = { isa = PBXBuildFile; fileRef = D86718CE7E5DEF2071AC3D17; }; | ||||
| 2862E190ECA33D2CE1458B51 = { isa = PBXBuildFile; fileRef = 9A8053936C35A19B9E98623A; }; | 2862E190ECA33D2CE1458B51 = { isa = PBXBuildFile; fileRef = 9A8053936C35A19B9E98623A; }; | ||||
| 0791EB173E6A9F959E692AA2 = { isa = PBXBuildFile; fileRef = E2A56C23BF2BB466BB273E3E; }; | 0791EB173E6A9F959E692AA2 = { isa = PBXBuildFile; fileRef = E2A56C23BF2BB466BB273E3E; }; | ||||
| 3B64EF7F57EAC5C51460059D = { isa = PBXBuildFile; fileRef = 5403C2A4DEE7B9B3B34235F8; }; | |||||
| 16D537EB6D3BFAB3AAB54B11 = { isa = PBXBuildFile; fileRef = 3988438157D4B75177703F8A; }; | 16D537EB6D3BFAB3AAB54B11 = { isa = PBXBuildFile; fileRef = 3988438157D4B75177703F8A; }; | ||||
| 0C22446F12486AD139A640CB = { isa = PBXBuildFile; fileRef = 6841D6AC927D02113F3AEBD4; }; | 0C22446F12486AD139A640CB = { isa = PBXBuildFile; fileRef = 6841D6AC927D02113F3AEBD4; }; | ||||
| 95CF50482DC7139FCB40EB1C = { isa = PBXBuildFile; fileRef = C7DB1BB9AF7FE0A2AA38D767; }; | 95CF50482DC7139FCB40EB1C = { isa = PBXBuildFile; fileRef = C7DB1BB9AF7FE0A2AA38D767; }; | ||||
| @@ -420,6 +421,8 @@ | |||||
| C63D6EC0555C13C1B79A6AAD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PositionableAudioSource.h; path = ../../src/audio/audio_sources/juce_PositionableAudioSource.h; sourceTree = SOURCE_ROOT; }; | C63D6EC0555C13C1B79A6AAD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_PositionableAudioSource.h; path = ../../src/audio/audio_sources/juce_PositionableAudioSource.h; sourceTree = SOURCE_ROOT; }; | ||||
| E2A56C23BF2BB466BB273E3E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ResamplingAudioSource.cpp; path = ../../src/audio/audio_sources/juce_ResamplingAudioSource.cpp; sourceTree = SOURCE_ROOT; }; | E2A56C23BF2BB466BB273E3E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ResamplingAudioSource.cpp; path = ../../src/audio/audio_sources/juce_ResamplingAudioSource.cpp; sourceTree = SOURCE_ROOT; }; | ||||
| BE5DB55285441D501FED3C00 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ResamplingAudioSource.h; path = ../../src/audio/audio_sources/juce_ResamplingAudioSource.h; sourceTree = SOURCE_ROOT; }; | BE5DB55285441D501FED3C00 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ResamplingAudioSource.h; path = ../../src/audio/audio_sources/juce_ResamplingAudioSource.h; sourceTree = SOURCE_ROOT; }; | ||||
| 5403C2A4DEE7B9B3B34235F8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ReverbAudioSource.cpp; path = ../../src/audio/audio_sources/juce_ReverbAudioSource.cpp; sourceTree = SOURCE_ROOT; }; | |||||
| 0F70C4D118AC7625B4C42CD4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ReverbAudioSource.h; path = ../../src/audio/audio_sources/juce_ReverbAudioSource.h; sourceTree = SOURCE_ROOT; }; | |||||
| 3988438157D4B75177703F8A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ToneGeneratorAudioSource.cpp; path = ../../src/audio/audio_sources/juce_ToneGeneratorAudioSource.cpp; sourceTree = SOURCE_ROOT; }; | 3988438157D4B75177703F8A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ToneGeneratorAudioSource.cpp; path = ../../src/audio/audio_sources/juce_ToneGeneratorAudioSource.cpp; sourceTree = SOURCE_ROOT; }; | ||||
| 6AC857F51FD805D7BD3EF712 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ToneGeneratorAudioSource.h; path = ../../src/audio/audio_sources/juce_ToneGeneratorAudioSource.h; sourceTree = SOURCE_ROOT; }; | 6AC857F51FD805D7BD3EF712 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ToneGeneratorAudioSource.h; path = ../../src/audio/audio_sources/juce_ToneGeneratorAudioSource.h; sourceTree = SOURCE_ROOT; }; | ||||
| 6841D6AC927D02113F3AEBD4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioDeviceManager.cpp; path = ../../src/audio/devices/juce_AudioDeviceManager.cpp; sourceTree = SOURCE_ROOT; }; | 6841D6AC927D02113F3AEBD4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_AudioDeviceManager.cpp; path = ../../src/audio/devices/juce_AudioDeviceManager.cpp; sourceTree = SOURCE_ROOT; }; | ||||
| @@ -435,6 +438,7 @@ | |||||
| 11C1A96A35A2F03F8C34BD43 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Decibels.h; path = ../../src/audio/dsp/juce_Decibels.h; sourceTree = SOURCE_ROOT; }; | 11C1A96A35A2F03F8C34BD43 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Decibels.h; path = ../../src/audio/dsp/juce_Decibels.h; sourceTree = SOURCE_ROOT; }; | ||||
| E68EB4BC75216B5B56E3F937 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_IIRFilter.cpp; path = ../../src/audio/dsp/juce_IIRFilter.cpp; sourceTree = SOURCE_ROOT; }; | E68EB4BC75216B5B56E3F937 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_IIRFilter.cpp; path = ../../src/audio/dsp/juce_IIRFilter.cpp; sourceTree = SOURCE_ROOT; }; | ||||
| EE2259D9768027C2C001EEAD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_IIRFilter.h; path = ../../src/audio/dsp/juce_IIRFilter.h; sourceTree = SOURCE_ROOT; }; | EE2259D9768027C2C001EEAD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_IIRFilter.h; path = ../../src/audio/dsp/juce_IIRFilter.h; sourceTree = SOURCE_ROOT; }; | ||||
| 2C55CE1674244DB199C3033F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_Reverb.h; path = ../../src/audio/dsp/juce_Reverb.h; sourceTree = SOURCE_ROOT; }; | |||||
| B457515938E7141D5E79B671 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiBuffer.cpp; path = ../../src/audio/midi/juce_MidiBuffer.cpp; sourceTree = SOURCE_ROOT; }; | B457515938E7141D5E79B671 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiBuffer.cpp; path = ../../src/audio/midi/juce_MidiBuffer.cpp; sourceTree = SOURCE_ROOT; }; | ||||
| 0604C2E17F0E0DFEFDA19F8D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MidiBuffer.h; path = ../../src/audio/midi/juce_MidiBuffer.h; sourceTree = SOURCE_ROOT; }; | 0604C2E17F0E0DFEFDA19F8D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_MidiBuffer.h; path = ../../src/audio/midi/juce_MidiBuffer.h; sourceTree = SOURCE_ROOT; }; | ||||
| 891E0B1AD09C0EA44297E0F2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiFile.cpp; path = ../../src/audio/midi/juce_MidiFile.cpp; sourceTree = SOURCE_ROOT; }; | 891E0B1AD09C0EA44297E0F2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiFile.cpp; path = ../../src/audio/midi/juce_MidiFile.cpp; sourceTree = SOURCE_ROOT; }; | ||||
| @@ -1158,6 +1162,8 @@ | |||||
| C63D6EC0555C13C1B79A6AAD, | C63D6EC0555C13C1B79A6AAD, | ||||
| E2A56C23BF2BB466BB273E3E, | E2A56C23BF2BB466BB273E3E, | ||||
| BE5DB55285441D501FED3C00, | BE5DB55285441D501FED3C00, | ||||
| 5403C2A4DEE7B9B3B34235F8, | |||||
| 0F70C4D118AC7625B4C42CD4, | |||||
| 3988438157D4B75177703F8A, | 3988438157D4B75177703F8A, | ||||
| 6AC857F51FD805D7BD3EF712 ); name = audio_sources; sourceTree = "<group>"; }; | 6AC857F51FD805D7BD3EF712 ); name = audio_sources; sourceTree = "<group>"; }; | ||||
| BF8F3D00CE4E97468E8BBC55 = { isa = PBXGroup; children = ( | BF8F3D00CE4E97468E8BBC55 = { isa = PBXGroup; children = ( | ||||
| @@ -1174,7 +1180,8 @@ | |||||
| 812620B53BE820D26A63B65D, | 812620B53BE820D26A63B65D, | ||||
| 11C1A96A35A2F03F8C34BD43, | 11C1A96A35A2F03F8C34BD43, | ||||
| E68EB4BC75216B5B56E3F937, | E68EB4BC75216B5B56E3F937, | ||||
| EE2259D9768027C2C001EEAD ); name = dsp; sourceTree = "<group>"; }; | |||||
| EE2259D9768027C2C001EEAD, | |||||
| 2C55CE1674244DB199C3033F ); name = dsp; sourceTree = "<group>"; }; | |||||
| 99B60B012D5CCF0BD861011D = { isa = PBXGroup; children = ( | 99B60B012D5CCF0BD861011D = { isa = PBXGroup; children = ( | ||||
| B457515938E7141D5E79B671, | B457515938E7141D5E79B671, | ||||
| 0604C2E17F0E0DFEFDA19F8D, | 0604C2E17F0E0DFEFDA19F8D, | ||||
| @@ -2067,6 +2074,7 @@ | |||||
| 6DC6DEEE8A1A6092830A79C8, | 6DC6DEEE8A1A6092830A79C8, | ||||
| 2862E190ECA33D2CE1458B51, | 2862E190ECA33D2CE1458B51, | ||||
| 0791EB173E6A9F959E692AA2, | 0791EB173E6A9F959E692AA2, | ||||
| 3B64EF7F57EAC5C51460059D, | |||||
| 16D537EB6D3BFAB3AAB54B11, | 16D537EB6D3BFAB3AAB54B11, | ||||
| 0C22446F12486AD139A640CB, | 0C22446F12486AD139A640CB, | ||||
| 95CF50482DC7139FCB40EB1C, | 95CF50482DC7139FCB40EB1C, | ||||
| @@ -155,6 +155,10 @@ | |||||
| resource="0" file="src/audio/audio_sources/juce_ResamplingAudioSource.cpp"/> | resource="0" file="src/audio/audio_sources/juce_ResamplingAudioSource.cpp"/> | ||||
| <FILE id="OwBLFkBfi" name="juce_ResamplingAudioSource.h" compile="0" | <FILE id="OwBLFkBfi" name="juce_ResamplingAudioSource.h" compile="0" | ||||
| resource="0" file="src/audio/audio_sources/juce_ResamplingAudioSource.h"/> | resource="0" file="src/audio/audio_sources/juce_ResamplingAudioSource.h"/> | ||||
| <FILE id="c0kck4" name="juce_ReverbAudioSource.cpp" compile="1" resource="0" | |||||
| file="src/audio/audio_sources/juce_ReverbAudioSource.cpp"/> | |||||
| <FILE id="e6MDHO" name="juce_ReverbAudioSource.h" compile="0" resource="0" | |||||
| file="src/audio/audio_sources/juce_ReverbAudioSource.h"/> | |||||
| <FILE id="VfalfqDz" name="juce_ToneGeneratorAudioSource.cpp" compile="1" | <FILE id="VfalfqDz" name="juce_ToneGeneratorAudioSource.cpp" compile="1" | ||||
| resource="0" file="src/audio/audio_sources/juce_ToneGeneratorAudioSource.cpp"/> | resource="0" file="src/audio/audio_sources/juce_ToneGeneratorAudioSource.cpp"/> | ||||
| <FILE id="8tIYggXl2" name="juce_ToneGeneratorAudioSource.h" compile="0" | <FILE id="8tIYggXl2" name="juce_ToneGeneratorAudioSource.h" compile="0" | ||||
| @@ -189,6 +193,7 @@ | |||||
| file="src/audio/dsp/juce_IIRFilter.cpp"/> | file="src/audio/dsp/juce_IIRFilter.cpp"/> | ||||
| <FILE id="Vu9xVqUfN" name="juce_IIRFilter.h" compile="0" resource="0" | <FILE id="Vu9xVqUfN" name="juce_IIRFilter.h" compile="0" resource="0" | ||||
| file="src/audio/dsp/juce_IIRFilter.h"/> | file="src/audio/dsp/juce_IIRFilter.h"/> | ||||
| <FILE id="niPdbF" name="juce_Reverb.h" compile="0" resource="0" file="src/audio/dsp/juce_Reverb.h"/> | |||||
| </GROUP> | </GROUP> | ||||
| <GROUP id="XmZUIie8o" name="midi"> | <GROUP id="XmZUIie8o" name="midi"> | ||||
| <FILE id="aVLir6CLm" name="juce_MidiBuffer.cpp" compile="1" resource="0" | <FILE id="aVLir6CLm" name="juce_MidiBuffer.cpp" compile="1" resource="0" | ||||
| @@ -184,6 +184,7 @@ | |||||
| #include "../src/audio/audio_sources/juce_BufferingAudioSource.cpp" | #include "../src/audio/audio_sources/juce_BufferingAudioSource.cpp" | ||||
| #include "../src/audio/audio_sources/juce_ChannelRemappingAudioSource.cpp" | #include "../src/audio/audio_sources/juce_ChannelRemappingAudioSource.cpp" | ||||
| #include "../src/audio/audio_sources/juce_IIRFilterAudioSource.cpp" | #include "../src/audio/audio_sources/juce_IIRFilterAudioSource.cpp" | ||||
| #include "../src/audio/audio_sources/juce_ReverbAudioSource.cpp" | |||||
| #include "../src/audio/audio_sources/juce_MixerAudioSource.cpp" | #include "../src/audio/audio_sources/juce_MixerAudioSource.cpp" | ||||
| #include "../src/audio/audio_sources/juce_ResamplingAudioSource.cpp" | #include "../src/audio/audio_sources/juce_ResamplingAudioSource.cpp" | ||||
| #include "../src/audio/audio_sources/juce_ToneGeneratorAudioSource.cpp" | #include "../src/audio/audio_sources/juce_ToneGeneratorAudioSource.cpp" | ||||
| @@ -127,7 +127,7 @@ public: | |||||
| //============================================================================== | //============================================================================== | ||||
| const String getApplicationName() | const String getApplicationName() | ||||
| { | { | ||||
| return "The Jucer V" + getApplicationVersion(); | |||||
| return String (ProjectInfo::projectName) + " " + getApplicationVersion(); | |||||
| } | } | ||||
| const String getApplicationVersion() | const String getApplicationVersion() | ||||
| @@ -10273,10 +10273,7 @@ MemoryInputStream::MemoryInputStream (const void* const sourceData, | |||||
| position (0) | position (0) | ||||
| { | { | ||||
| if (keepInternalCopy) | if (keepInternalCopy) | ||||
| { | |||||
| internalCopy.append (data, sourceDataSize); | |||||
| data = static_cast <const char*> (internalCopy.getData()); | |||||
| } | |||||
| createInternalCopy(); | |||||
| } | } | ||||
| MemoryInputStream::MemoryInputStream (const MemoryBlock& sourceData, | MemoryInputStream::MemoryInputStream (const MemoryBlock& sourceData, | ||||
| @@ -10286,10 +10283,14 @@ MemoryInputStream::MemoryInputStream (const MemoryBlock& sourceData, | |||||
| position (0) | position (0) | ||||
| { | { | ||||
| if (keepInternalCopy) | if (keepInternalCopy) | ||||
| { | |||||
| internalCopy = sourceData; | |||||
| data = static_cast <const char*> (internalCopy.getData()); | |||||
| } | |||||
| createInternalCopy(); | |||||
| } | |||||
| void MemoryInputStream::createInternalCopy() | |||||
| { | |||||
| internalCopy.malloc (dataSize); | |||||
| memcpy (internalCopy, data, dataSize); | |||||
| data = internalCopy; | |||||
| } | } | ||||
| MemoryInputStream::~MemoryInputStream() | MemoryInputStream::~MemoryInputStream() | ||||
| @@ -10305,6 +10306,9 @@ int MemoryInputStream::read (void* const buffer, const int howMany) | |||||
| { | { | ||||
| jassert (howMany >= 0); | jassert (howMany >= 0); | ||||
| const int num = jmin (howMany, (int) (dataSize - position)); | const int num = jmin (howMany, (int) (dataSize - position)); | ||||
| if (num <= 0) | |||||
| return 0; | |||||
| memcpy (buffer, data + position, num); | memcpy (buffer, data + position, num); | ||||
| position += num; | position += num; | ||||
| return (int) num; | return (int) num; | ||||
| @@ -10312,7 +10316,7 @@ int MemoryInputStream::read (void* const buffer, const int howMany) | |||||
| bool MemoryInputStream::isExhausted() | bool MemoryInputStream::isExhausted() | ||||
| { | { | ||||
| return (position >= dataSize); | |||||
| return position >= dataSize; | |||||
| } | } | ||||
| bool MemoryInputStream::setPosition (const int64 pos) | bool MemoryInputStream::setPosition (const int64 pos) | ||||
| @@ -24323,29 +24327,18 @@ BEGIN_JUCE_NAMESPACE | |||||
| AudioFormatReaderSource::AudioFormatReaderSource (AudioFormatReader* const reader_, | AudioFormatReaderSource::AudioFormatReaderSource (AudioFormatReader* const reader_, | ||||
| const bool deleteReaderWhenThisIsDeleted) | const bool deleteReaderWhenThisIsDeleted) | ||||
| : reader (reader_), | |||||
| deleteReader (deleteReaderWhenThisIsDeleted), | |||||
| : reader (reader_, deleteReaderWhenThisIsDeleted), | |||||
| nextPlayPos (0), | nextPlayPos (0), | ||||
| looping (false) | looping (false) | ||||
| { | { | ||||
| jassert (reader != nullptr); | jassert (reader != nullptr); | ||||
| } | } | ||||
| AudioFormatReaderSource::~AudioFormatReaderSource() | |||||
| { | |||||
| if (deleteReader) | |||||
| delete reader; | |||||
| } | |||||
| void AudioFormatReaderSource::setNextReadPosition (int64 newPosition) | |||||
| { | |||||
| nextPlayPos = newPosition; | |||||
| } | |||||
| AudioFormatReaderSource::~AudioFormatReaderSource() {} | |||||
| void AudioFormatReaderSource::setLooping (bool shouldLoop) | |||||
| { | |||||
| looping = shouldLoop; | |||||
| } | |||||
| int64 AudioFormatReaderSource::getTotalLength() const { return reader->lengthInSamples; } | |||||
| void AudioFormatReaderSource::setNextReadPosition (int64 newPosition) { nextPlayPos = newPosition; } | |||||
| void AudioFormatReaderSource::setLooping (bool shouldLoop) { looping = shouldLoop; } | |||||
| int64 AudioFormatReaderSource::getNextReadPosition() const | int64 AudioFormatReaderSource::getNextReadPosition() const | ||||
| { | { | ||||
| @@ -24353,19 +24346,8 @@ int64 AudioFormatReaderSource::getNextReadPosition() const | |||||
| : nextPlayPos; | : nextPlayPos; | ||||
| } | } | ||||
| int64 AudioFormatReaderSource::getTotalLength() const | |||||
| { | |||||
| return reader->lengthInSamples; | |||||
| } | |||||
| void AudioFormatReaderSource::prepareToPlay (int /*samplesPerBlockExpected*/, | |||||
| double /*sampleRate*/) | |||||
| { | |||||
| } | |||||
| void AudioFormatReaderSource::releaseResources() | |||||
| { | |||||
| } | |||||
| void AudioFormatReaderSource::prepareToPlay (int /*samplesPerBlockExpected*/, double /*sampleRate*/) {} | |||||
| void AudioFormatReaderSource::releaseResources() {} | |||||
| void AudioFormatReaderSource::getNextAudioBlock (const AudioSourceChannelInfo& info) | void AudioFormatReaderSource::getNextAudioBlock (const AudioSourceChannelInfo& info) | ||||
| { | { | ||||
| @@ -24380,39 +24362,26 @@ void AudioFormatReaderSource::getNextAudioBlock (const AudioSourceChannelInfo& i | |||||
| if (newEnd > newStart) | if (newEnd > newStart) | ||||
| { | { | ||||
| info.buffer->readFromAudioReader (reader, | |||||
| info.startSample, | |||||
| newEnd - newStart, | |||||
| newStart, | |||||
| true, true); | |||||
| info.buffer->readFromAudioReader (reader, info.startSample, | |||||
| newEnd - newStart, newStart, true, true); | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| const int endSamps = (int) reader->lengthInSamples - newStart; | const int endSamps = (int) reader->lengthInSamples - newStart; | ||||
| info.buffer->readFromAudioReader (reader, | |||||
| info.startSample, | |||||
| endSamps, | |||||
| newStart, | |||||
| true, true); | |||||
| info.buffer->readFromAudioReader (reader, info.startSample, | |||||
| endSamps, newStart, true, true); | |||||
| info.buffer->readFromAudioReader (reader, | |||||
| info.startSample + endSamps, | |||||
| newEnd, | |||||
| 0, | |||||
| true, true); | |||||
| info.buffer->readFromAudioReader (reader, info.startSample + endSamps, | |||||
| newEnd, 0, true, true); | |||||
| } | } | ||||
| nextPlayPos = newEnd; | nextPlayPos = newEnd; | ||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| info.buffer->readFromAudioReader (reader, | |||||
| info.startSample, | |||||
| info.numSamples, | |||||
| start, | |||||
| true, true); | |||||
| info.buffer->readFromAudioReader (reader, info.startSample, | |||||
| info.numSamples, start, true, true); | |||||
| nextPlayPos += info.numSamples; | nextPlayPos += info.numSamples; | ||||
| } | } | ||||
| } | } | ||||
| @@ -24954,11 +24923,10 @@ private: | |||||
| juce_ImplementSingleton (SharedBufferingAudioSourceThread) | juce_ImplementSingleton (SharedBufferingAudioSourceThread) | ||||
| BufferingAudioSource::BufferingAudioSource (PositionableAudioSource* source_, | BufferingAudioSource::BufferingAudioSource (PositionableAudioSource* source_, | ||||
| const bool deleteSourceWhenDeleted_, | |||||
| const bool deleteSourceWhenDeleted, | |||||
| const int numberOfSamplesToBuffer_, | const int numberOfSamplesToBuffer_, | ||||
| const int numberOfChannels_) | const int numberOfChannels_) | ||||
| : source (source_), | |||||
| deleteSourceWhenDeleted (deleteSourceWhenDeleted_), | |||||
| : source (source_, deleteSourceWhenDeleted), | |||||
| numberOfSamplesToBuffer (jmax (1024, numberOfSamplesToBuffer_)), | numberOfSamplesToBuffer (jmax (1024, numberOfSamplesToBuffer_)), | ||||
| numberOfChannels (numberOfChannels_), | numberOfChannels (numberOfChannels_), | ||||
| buffer (numberOfChannels_, 0), | buffer (numberOfChannels_, 0), | ||||
| @@ -24979,9 +24947,6 @@ BufferingAudioSource::~BufferingAudioSource() | |||||
| if (thread != nullptr) | if (thread != nullptr) | ||||
| thread->removeSource (this); | thread->removeSource (this); | ||||
| if (deleteSourceWhenDeleted) | |||||
| delete source; | |||||
| } | } | ||||
| void BufferingAudioSource::prepareToPlay (int samplesPerBlockExpected, double sampleRate_) | void BufferingAudioSource::prepareToPlay (int samplesPerBlockExpected, double sampleRate_) | ||||
| @@ -25203,21 +25168,16 @@ END_JUCE_NAMESPACE | |||||
| BEGIN_JUCE_NAMESPACE | BEGIN_JUCE_NAMESPACE | ||||
| ChannelRemappingAudioSource::ChannelRemappingAudioSource (AudioSource* const source_, | ChannelRemappingAudioSource::ChannelRemappingAudioSource (AudioSource* const source_, | ||||
| const bool deleteSourceWhenDeleted_) | |||||
| : requiredNumberOfChannels (2), | |||||
| source (source_), | |||||
| deleteSourceWhenDeleted (deleteSourceWhenDeleted_), | |||||
| const bool deleteSourceWhenDeleted) | |||||
| : source (source_, deleteSourceWhenDeleted), | |||||
| requiredNumberOfChannels (2), | |||||
| buffer (2, 16) | buffer (2, 16) | ||||
| { | { | ||||
| remappedInfo.buffer = &buffer; | remappedInfo.buffer = &buffer; | ||||
| remappedInfo.startSample = 0; | remappedInfo.startSample = 0; | ||||
| } | } | ||||
| ChannelRemappingAudioSource::~ChannelRemappingAudioSource() | |||||
| { | |||||
| if (deleteSourceWhenDeleted) | |||||
| delete source; | |||||
| } | |||||
| ChannelRemappingAudioSource::~ChannelRemappingAudioSource() {} | |||||
| void ChannelRemappingAudioSource::setNumberOfChannelsToProduce (const int requiredNumberOfChannels_) | void ChannelRemappingAudioSource::setNumberOfChannelsToProduce (const int requiredNumberOfChannels_) | ||||
| { | { | ||||
| @@ -25379,9 +25339,8 @@ END_JUCE_NAMESPACE | |||||
| BEGIN_JUCE_NAMESPACE | BEGIN_JUCE_NAMESPACE | ||||
| IIRFilterAudioSource::IIRFilterAudioSource (AudioSource* const inputSource, | IIRFilterAudioSource::IIRFilterAudioSource (AudioSource* const inputSource, | ||||
| const bool deleteInputWhenDeleted_) | |||||
| : input (inputSource), | |||||
| deleteInputWhenDeleted (deleteInputWhenDeleted_) | |||||
| const bool deleteInputWhenDeleted) | |||||
| : input (inputSource, deleteInputWhenDeleted) | |||||
| { | { | ||||
| jassert (inputSource != nullptr); | jassert (inputSource != nullptr); | ||||
| @@ -25389,11 +25348,7 @@ IIRFilterAudioSource::IIRFilterAudioSource (AudioSource* const inputSource, | |||||
| iirFilters.add (new IIRFilter()); | iirFilters.add (new IIRFilter()); | ||||
| } | } | ||||
| IIRFilterAudioSource::~IIRFilterAudioSource() | |||||
| { | |||||
| if (deleteInputWhenDeleted) | |||||
| delete input; | |||||
| } | |||||
| IIRFilterAudioSource::~IIRFilterAudioSource() {} | |||||
| void IIRFilterAudioSource::setFilterParameters (const IIRFilter& newSettings) | void IIRFilterAudioSource::setFilterParameters (const IIRFilter& newSettings) | ||||
| { | { | ||||
| @@ -25434,6 +25389,71 @@ END_JUCE_NAMESPACE | |||||
| /*** End of inlined file: juce_IIRFilterAudioSource.cpp ***/ | /*** End of inlined file: juce_IIRFilterAudioSource.cpp ***/ | ||||
| /*** Start of inlined file: juce_ReverbAudioSource.cpp ***/ | |||||
| BEGIN_JUCE_NAMESPACE | |||||
| ReverbAudioSource::ReverbAudioSource (AudioSource* const inputSource, const bool deleteInputWhenDeleted) | |||||
| : input (inputSource, deleteInputWhenDeleted), | |||||
| bypass (false) | |||||
| { | |||||
| jassert (inputSource != nullptr); | |||||
| } | |||||
| ReverbAudioSource::~ReverbAudioSource() {} | |||||
| void ReverbAudioSource::prepareToPlay (int samplesPerBlockExpected, double sampleRate) | |||||
| { | |||||
| const ScopedLock sl (lock); | |||||
| input->prepareToPlay (samplesPerBlockExpected, sampleRate); | |||||
| reverb.setSampleRate (sampleRate); | |||||
| } | |||||
| void ReverbAudioSource::releaseResources() {} | |||||
| void ReverbAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill) | |||||
| { | |||||
| const ScopedLock sl (lock); | |||||
| input->getNextAudioBlock (bufferToFill); | |||||
| if (! bypass) | |||||
| { | |||||
| float* const firstChannel = bufferToFill.buffer->getSampleData (0, bufferToFill.startSample); | |||||
| if (bufferToFill.buffer->getNumChannels() > 1) | |||||
| { | |||||
| reverb.processStereo (firstChannel, | |||||
| bufferToFill.buffer->getSampleData (1, bufferToFill.startSample), | |||||
| bufferToFill.numSamples); | |||||
| } | |||||
| else | |||||
| { | |||||
| reverb.processMono (firstChannel, bufferToFill.numSamples); | |||||
| } | |||||
| } | |||||
| } | |||||
| void ReverbAudioSource::setParameters (const Reverb::Parameters& newParams) | |||||
| { | |||||
| const ScopedLock sl (lock); | |||||
| reverb.setParameters (newParams); | |||||
| } | |||||
| void ReverbAudioSource::setBypassed (bool isBypassed) noexcept | |||||
| { | |||||
| if (bypass != isBypassed) | |||||
| { | |||||
| const ScopedLock sl (lock); | |||||
| bypass = isBypassed; | |||||
| reverb.reset(); | |||||
| } | |||||
| } | |||||
| END_JUCE_NAMESPACE | |||||
| /*** End of inlined file: juce_ReverbAudioSource.cpp ***/ | |||||
| /*** Start of inlined file: juce_MixerAudioSource.cpp ***/ | /*** Start of inlined file: juce_MixerAudioSource.cpp ***/ | ||||
| BEGIN_JUCE_NAMESPACE | BEGIN_JUCE_NAMESPACE | ||||
| @@ -25581,10 +25601,9 @@ END_JUCE_NAMESPACE | |||||
| BEGIN_JUCE_NAMESPACE | BEGIN_JUCE_NAMESPACE | ||||
| ResamplingAudioSource::ResamplingAudioSource (AudioSource* const inputSource, | ResamplingAudioSource::ResamplingAudioSource (AudioSource* const inputSource, | ||||
| const bool deleteInputWhenDeleted_, | |||||
| const bool deleteInputWhenDeleted, | |||||
| const int numChannels_) | const int numChannels_) | ||||
| : input (inputSource), | |||||
| deleteInputWhenDeleted (deleteInputWhenDeleted_), | |||||
| : input (inputSource, deleteInputWhenDeleted), | |||||
| ratio (1.0), | ratio (1.0), | ||||
| lastRatio (1.0), | lastRatio (1.0), | ||||
| buffer (numChannels_, 0), | buffer (numChannels_, 0), | ||||
| @@ -25594,11 +25613,7 @@ ResamplingAudioSource::ResamplingAudioSource (AudioSource* const inputSource, | |||||
| jassert (input != nullptr); | jassert (input != nullptr); | ||||
| } | } | ||||
| ResamplingAudioSource::~ResamplingAudioSource() | |||||
| { | |||||
| if (deleteInputWhenDeleted) | |||||
| delete input; | |||||
| } | |||||
| ResamplingAudioSource::~ResamplingAudioSource() {} | |||||
| void ResamplingAudioSource::setResamplingRatio (const double samplesInPerOutputSample) | void ResamplingAudioSource::setResamplingRatio (const double samplesInPerOutputSample) | ||||
| { | { | ||||
| @@ -42111,7 +42126,7 @@ void Component::paintComponent (Graphics& g) | |||||
| paint (imG); | paint (imG); | ||||
| } | } | ||||
| g.setColour (Colours::black.withAlpha (getAlpha())); | |||||
| g.setColour (Colours::black); | |||||
| g.drawImageAt (bufferedImage, 0, 0); | g.drawImageAt (bufferedImage, 0, 0); | ||||
| } | } | ||||
| else | else | ||||
| @@ -42202,9 +42217,9 @@ void Component::paintEntireComponent (Graphics& g, const bool ignoreAlphaLevel) | |||||
| { | { | ||||
| jassert (! g.isClipEmpty()); | jassert (! g.isClipEmpty()); | ||||
| #if JUCE_DEBUG | |||||
| #if JUCE_DEBUG | |||||
| flags.isInsidePaintCall = true; | flags.isInsidePaintCall = true; | ||||
| #endif | |||||
| #endif | |||||
| if (effect != nullptr) | if (effect != nullptr) | ||||
| { | { | ||||
| @@ -42231,9 +42246,9 @@ void Component::paintEntireComponent (Graphics& g, const bool ignoreAlphaLevel) | |||||
| paintComponentAndChildren (g); | paintComponentAndChildren (g); | ||||
| } | } | ||||
| #if JUCE_DEBUG | |||||
| #if JUCE_DEBUG | |||||
| flags.isInsidePaintCall = false; | flags.isInsidePaintCall = false; | ||||
| #endif | |||||
| #endif | |||||
| } | } | ||||
| void Component::setPaintingIsUnclipped (const bool shouldPaintWithoutClipping) noexcept | void Component::setPaintingIsUnclipped (const bool shouldPaintWithoutClipping) noexcept | ||||
| @@ -97618,22 +97633,24 @@ END_JUCE_NAMESPACE | |||||
| /*** Start of inlined file: juce_ImageFileFormat.cpp ***/ | /*** Start of inlined file: juce_ImageFileFormat.cpp ***/ | ||||
| BEGIN_JUCE_NAMESPACE | BEGIN_JUCE_NAMESPACE | ||||
| ImageFileFormat* ImageFileFormat::findImageFormatForStream (InputStream& input) | |||||
| struct DefaultImageFormats | |||||
| { | { | ||||
| static PNGImageFormat png; | |||||
| static JPEGImageFormat jpg; | |||||
| static GIFImageFormat gif; | |||||
| PNGImageFormat png; | |||||
| JPEGImageFormat jpg; | |||||
| GIFImageFormat gif; | |||||
| }; | |||||
| ImageFileFormat* formats[4]; | |||||
| int numFormats = 0; | |||||
| static DefaultImageFormats defaultImageFormats; | |||||
| formats [numFormats++] = &png; | |||||
| formats [numFormats++] = &jpg; | |||||
| formats [numFormats++] = &gif; | |||||
| ImageFileFormat* ImageFileFormat::findImageFormatForStream (InputStream& input) | |||||
| { | |||||
| ImageFileFormat* formats[] = { &defaultImageFormats.png, | |||||
| &defaultImageFormats.jpg, | |||||
| &defaultImageFormats.gif }; | |||||
| const int64 streamPos = input.getPosition(); | const int64 streamPos = input.getPosition(); | ||||
| for (int i = 0; i < numFormats; ++i) | |||||
| for (int i = 0; i < numElementsInArray (formats); ++i) | |||||
| { | { | ||||
| const bool found = formats[i]->canUnderstand (input); | const bool found = formats[i]->canUnderstand (input); | ||||
| input.setPosition (streamPos); | input.setPosition (streamPos); | ||||
| @@ -272259,6 +272276,9 @@ public: | |||||
| jassert (path.isEmpty()); // we might need to apply a transform to the path, so this must be empty | jassert (path.isEmpty()); // we might need to apply a transform to the path, so this must be empty | ||||
| CGPathRef pathRef = CTFontCreatePathForGlyph (ctFontRef, (CGGlyph) glyphNumber, &renderingTransform); | CGPathRef pathRef = CTFontCreatePathForGlyph (ctFontRef, (CGGlyph) glyphNumber, &renderingTransform); | ||||
| if (pathRef == 0) | |||||
| return false; | |||||
| CGPathApply (pathRef, &path, pathApplier); | CGPathApply (pathRef, &path, pathApplier); | ||||
| CFRelease (pathRef); | CFRelease (pathRef); | ||||
| @@ -274948,7 +274968,7 @@ using namespace JUCE_NAMESPACE; | |||||
| if (f.getFileName().matchesWildcard ((*filters)[i], true)) | if (f.getFileName().matchesWildcard ((*filters)[i], true)) | ||||
| return true; | return true; | ||||
| return f.isDirectory(); | |||||
| return f.isDirectory() && ! [[NSWorkspace sharedWorkspace] isFilePackageAtPath: filename]; | |||||
| } | } | ||||
| @end | @end | ||||
| @@ -277296,6 +277316,9 @@ public: | |||||
| jassert (path.isEmpty()); // we might need to apply a transform to the path, so this must be empty | jassert (path.isEmpty()); // we might need to apply a transform to the path, so this must be empty | ||||
| CGPathRef pathRef = CTFontCreatePathForGlyph (ctFontRef, (CGGlyph) glyphNumber, &renderingTransform); | CGPathRef pathRef = CTFontCreatePathForGlyph (ctFontRef, (CGGlyph) glyphNumber, &renderingTransform); | ||||
| if (pathRef == 0) | |||||
| return false; | |||||
| CGPathApply (pathRef, &path, pathApplier); | CGPathApply (pathRef, &path, pathApplier); | ||||
| CFRelease (pathRef); | CFRelease (pathRef); | ||||
| @@ -282056,7 +282079,7 @@ using namespace JUCE_NAMESPACE; | |||||
| if (f.getFileName().matchesWildcard ((*filters)[i], true)) | if (f.getFileName().matchesWildcard ((*filters)[i], true)) | ||||
| return true; | return true; | ||||
| return f.isDirectory(); | |||||
| return f.isDirectory() && ! [[NSWorkspace sharedWorkspace] isFilePackageAtPath: filename]; | |||||
| } | } | ||||
| @end | @end | ||||
| @@ -73,7 +73,7 @@ namespace JuceDummyNamespace {} | |||||
| */ | */ | ||||
| #define JUCE_MAJOR_VERSION 1 | #define JUCE_MAJOR_VERSION 1 | ||||
| #define JUCE_MINOR_VERSION 53 | #define JUCE_MINOR_VERSION 53 | ||||
| #define JUCE_BUILDNUMBER 91 | |||||
| #define JUCE_BUILDNUMBER 92 | |||||
| /** Current Juce version number. | /** Current Juce version number. | ||||
| @@ -1350,6 +1350,16 @@ inline int roundFloatToInt (const float value) noexcept | |||||
| return roundToInt (value); | return roundToInt (value); | ||||
| } | } | ||||
| #if (JUCE_INTEL && JUCE_32BIT) || 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; | |||||
| #else | |||||
| #define JUCE_UNDENORMALISE(x) | |||||
| #endif | |||||
| /** This namespace contains a few template classes for helping work out class type variations. | /** This namespace contains a few template classes for helping work out class type variations. | ||||
| */ | */ | ||||
| namespace TypeHelpers | namespace TypeHelpers | ||||
| @@ -20988,7 +20998,9 @@ private: | |||||
| const char* data; | const char* data; | ||||
| size_t dataSize, position; | size_t dataSize, position; | ||||
| MemoryBlock internalCopy; | |||||
| HeapBlock<char> internalCopy; | |||||
| void createInternalCopy(); | |||||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MemoryInputStream); | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MemoryInputStream); | ||||
| }; | }; | ||||
| @@ -29257,6 +29269,8 @@ public: | |||||
| The x position is an integer, but the top and bottom of the line can be sub-pixel | The x position is an integer, but the top and bottom of the line can be sub-pixel | ||||
| positions, and these will be anti-aliased if necessary. | positions, and these will be anti-aliased if necessary. | ||||
| The bottom parameter must be greater than or equal to the top parameter. | |||||
| */ | */ | ||||
| void drawVerticalLine (int x, float top, float bottom) const; | void drawVerticalLine (int x, float top, float bottom) const; | ||||
| @@ -29264,6 +29278,8 @@ public: | |||||
| The y position is an integer, but the left and right ends of the line can be sub-pixel | The y position is an integer, but the left and right ends of the line can be sub-pixel | ||||
| positions, and these will be anti-aliased if necessary. | positions, and these will be anti-aliased if necessary. | ||||
| The right parameter must be greater than or equal to the left parameter. | |||||
| */ | */ | ||||
| void drawHorizontalLine (int y, float left, float right) const; | void drawHorizontalLine (int y, float left, float right) const; | ||||
| @@ -37982,7 +37998,8 @@ public: | |||||
| /** Creates an AudioFormatReaderSource for a given reader. | /** Creates an AudioFormatReaderSource for a given reader. | ||||
| @param sourceReader the reader to use as the data source | |||||
| @param sourceReader the reader to use as the data source - this must | |||||
| not be null | |||||
| @param deleteReaderWhenThisIsDeleted if true, the reader passed-in will be deleted | @param deleteReaderWhenThisIsDeleted if true, the reader passed-in will be deleted | ||||
| when this object is deleted; if false it will be | when this object is deleted; if false it will be | ||||
| left up to the caller to manage its lifetime | left up to the caller to manage its lifetime | ||||
| @@ -38028,8 +38045,7 @@ public: | |||||
| private: | private: | ||||
| AudioFormatReader* reader; | |||||
| bool deleteReader; | |||||
| OptionalScopedPointer<AudioFormatReader> reader; | |||||
| int64 volatile nextPlayPos; | int64 volatile nextPlayPos; | ||||
| bool volatile looping; | bool volatile looping; | ||||
| @@ -38506,14 +38522,13 @@ public: | |||||
| private: | private: | ||||
| PositionableAudioSource* source; | |||||
| bool deleteSourceWhenDeleted; | |||||
| OptionalScopedPointer<PositionableAudioSource> source; | |||||
| int numberOfSamplesToBuffer, numberOfChannels; | int numberOfSamplesToBuffer, numberOfChannels; | ||||
| AudioSampleBuffer buffer; | AudioSampleBuffer buffer; | ||||
| CriticalSection bufferStartPosLock; | CriticalSection bufferStartPosLock; | ||||
| int64 volatile bufferValidStart, bufferValidEnd, nextPlayPos; | int64 volatile bufferValidStart, bufferValidEnd, nextPlayPos; | ||||
| bool wasSourceLooping; | |||||
| double volatile sampleRate; | double volatile sampleRate; | ||||
| bool wasSourceLooping; | |||||
| friend class SharedBufferingAudioSourceThread; | friend class SharedBufferingAudioSourceThread; | ||||
| bool readNextBufferChunk(); | bool readNextBufferChunk(); | ||||
| @@ -38576,8 +38591,7 @@ public: | |||||
| private: | private: | ||||
| AudioSource* const input; | |||||
| const bool deleteInputWhenDeleted; | |||||
| OptionalScopedPointer<AudioSource> input; | |||||
| double ratio, lastRatio; | double ratio, lastRatio; | ||||
| AudioSampleBuffer buffer; | AudioSampleBuffer buffer; | ||||
| int bufferPos, sampsInBuffer; | int bufferPos, sampsInBuffer; | ||||
| @@ -38862,11 +38876,9 @@ public: | |||||
| private: | private: | ||||
| int requiredNumberOfChannels; | |||||
| OptionalScopedPointer<AudioSource> source; | |||||
| Array <int> remappedInputs, remappedOutputs; | Array <int> remappedInputs, remappedOutputs; | ||||
| AudioSource* const source; | |||||
| const bool deleteSourceWhenDeleted; | |||||
| int requiredNumberOfChannels; | |||||
| AudioSampleBuffer buffer; | AudioSampleBuffer buffer; | ||||
| AudioSourceChannelInfo remappedInfo; | AudioSourceChannelInfo remappedInfo; | ||||
| @@ -39018,7 +39030,7 @@ public: | |||||
| /** Creates a IIRFilterAudioSource for a given input source. | /** Creates a IIRFilterAudioSource for a given input source. | ||||
| @param inputSource the input source to read from | |||||
| @param inputSource the input source to read from - this must not be null | |||||
| @param deleteInputWhenDeleted if true, the input source will be deleted when | @param deleteInputWhenDeleted if true, the input source will be deleted when | ||||
| this object is deleted | this object is deleted | ||||
| */ | */ | ||||
| @@ -39028,8 +39040,7 @@ public: | |||||
| /** Destructor. */ | /** Destructor. */ | ||||
| ~IIRFilterAudioSource(); | ~IIRFilterAudioSource(); | ||||
| /** Changes the filter to use the same parameters as the one being passed in. | |||||
| */ | |||||
| /** Changes the filter to use the same parameters as the one being passed in. */ | |||||
| void setFilterParameters (const IIRFilter& newSettings); | void setFilterParameters (const IIRFilter& newSettings); | ||||
| void prepareToPlay (int samplesPerBlockExpected, double sampleRate); | void prepareToPlay (int samplesPerBlockExpected, double sampleRate); | ||||
| @@ -39038,8 +39049,7 @@ public: | |||||
| private: | private: | ||||
| AudioSource* const input; | |||||
| const bool deleteInputWhenDeleted; | |||||
| OptionalScopedPointer<AudioSource> input; | |||||
| OwnedArray <IIRFilter> iirFilters; | OwnedArray <IIRFilter> iirFilters; | ||||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (IIRFilterAudioSource); | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (IIRFilterAudioSource); | ||||
| @@ -39148,6 +39158,357 @@ private: | |||||
| #endif | #endif | ||||
| #ifndef __JUCE_RESAMPLINGAUDIOSOURCE_JUCEHEADER__ | #ifndef __JUCE_RESAMPLINGAUDIOSOURCE_JUCEHEADER__ | ||||
| #endif | |||||
| #ifndef __JUCE_REVERBAUDIOSOURCE_JUCEHEADER__ | |||||
| /*** Start of inlined file: juce_ReverbAudioSource.h ***/ | |||||
| #ifndef __JUCE_REVERBAUDIOSOURCE_JUCEHEADER__ | |||||
| #define __JUCE_REVERBAUDIOSOURCE_JUCEHEADER__ | |||||
| /*** Start of inlined file: juce_Reverb.h ***/ | |||||
| #ifndef __JUCE_REVERB_JUCEHEADER__ | |||||
| #define __JUCE_REVERB_JUCEHEADER__ | |||||
| /** | |||||
| Performs a simple reverb effect on a stream of audio data. | |||||
| This is a simple stereo reverb, based on the technique and tunings used in FreeVerb. | |||||
| Use setSampleRate() to prepare it, and then call processStereo() or processMono() to | |||||
| apply the reverb to your audio data. | |||||
| @see ReverbAudioSource | |||||
| */ | |||||
| class Reverb | |||||
| { | |||||
| public: | |||||
| Reverb() | |||||
| { | |||||
| setParameters (Parameters()); | |||||
| setSampleRate (44100.0); | |||||
| } | |||||
| /** Holds the parameters being used by a Reverb object. */ | |||||
| struct Parameters | |||||
| { | |||||
| Parameters() noexcept | |||||
| : roomSize (0.5f), | |||||
| damping (0.5f), | |||||
| wetLevel (0.33f), | |||||
| dryLevel (0.4f), | |||||
| width (1.0f), | |||||
| freezeMode (0) | |||||
| {} | |||||
| float roomSize; /**< Room size, 0 to 1.0, where 1.0 is big, 0 is small. */ | |||||
| float damping; /**< Damping, 0 to 1.0, where 0 is not damped, 1.0 is fully damped. */ | |||||
| float wetLevel; /**< Wet level, 0 to 1.0 */ | |||||
| float dryLevel; /**< Dry level, 0 to 1.0 */ | |||||
| float width; /**< Reverb width, 0 to 1.0, where 1.0 is very wide. */ | |||||
| float freezeMode; /**< Freeze mode - values < 0.5 are "normal" mode, values > 0.5 | |||||
| put the reverb into a continuous feedback loop. */ | |||||
| }; | |||||
| /** Returns the reverb's current parameters. */ | |||||
| const Parameters& getParameters() const noexcept { return parameters; } | |||||
| /** Applies a new set of parameters to the reverb. | |||||
| Note that this doesn't attempt to lock the reverb, so if you call this in parallel with | |||||
| the process method, you may get artifacts. | |||||
| */ | |||||
| void setParameters (const Parameters& newParams) | |||||
| { | |||||
| const float wetScaleFactor = 3.0f; | |||||
| const float dryScaleFactor = 2.0f; | |||||
| const float wet = newParams.wetLevel * wetScaleFactor; | |||||
| wet1 = wet * (newParams.width * 0.5f + 0.5f); | |||||
| wet2 = wet * (1.0f - newParams.width) * 0.5f; | |||||
| dry = newParams.dryLevel * dryScaleFactor; | |||||
| gain = isFrozen (newParams.freezeMode) ? 0.0f : 0.015f; | |||||
| parameters = newParams; | |||||
| shouldUpdateDamping = true; | |||||
| } | |||||
| /** Sets the sample rate that will be used for the reverb. | |||||
| You must call this before the process methods, in order to tell it the correct sample rate. | |||||
| */ | |||||
| void setSampleRate (const double sampleRate) | |||||
| { | |||||
| jassert (sampleRate > 0); | |||||
| static const short combTunings[] = { 1116, 1188, 1277, 1356, 1422, 1491, 1557, 1617 }; // (at 44100Hz) | |||||
| static const short allPassTunings[] = { 556, 441, 341, 225 }; | |||||
| const int stereoSpread = 23; | |||||
| const int intSampleRate = (int) sampleRate; | |||||
| int i; | |||||
| for (i = 0; i < numCombs; ++i) | |||||
| { | |||||
| comb[0][i].setSize ((intSampleRate * combTunings[i]) / 44100); | |||||
| comb[1][i].setSize ((intSampleRate * (combTunings[i] + stereoSpread)) / 44100); | |||||
| } | |||||
| for (i = 0; i < numAllPasses; ++i) | |||||
| { | |||||
| allPass[0][i].setSize ((intSampleRate * allPassTunings[i]) / 44100); | |||||
| allPass[1][i].setSize ((intSampleRate * (allPassTunings[i] + stereoSpread)) / 44100); | |||||
| } | |||||
| shouldUpdateDamping = true; | |||||
| } | |||||
| /** Clears the reverb's buffers. */ | |||||
| void reset() | |||||
| { | |||||
| for (int j = 0; j < numChannels; ++j) | |||||
| { | |||||
| int i; | |||||
| for (i = 0; i < numCombs; ++i) | |||||
| comb[j][i].clear(); | |||||
| for (i = 0; i < numAllPasses; ++i) | |||||
| allPass[j][i].clear(); | |||||
| } | |||||
| } | |||||
| /** Applies the reverb to two stereo channels of audio data. */ | |||||
| void processStereo (float* const left, float* const right, const int numSamples) noexcept | |||||
| { | |||||
| jassert (left != nullptr && right != nullptr); | |||||
| if (shouldUpdateDamping) | |||||
| updateDamping(); | |||||
| for (int i = 0; i < numSamples; ++i) | |||||
| { | |||||
| const float input = (left[i] + right[i]) * gain; | |||||
| float outL = 0, outR = 0; | |||||
| int j; | |||||
| for (j = 0; j < numCombs; ++j) // accumulate the comb filters in parallel | |||||
| { | |||||
| outL += comb[0][j].process (input); | |||||
| outR += comb[1][j].process (input); | |||||
| } | |||||
| for (j = 0; j < numAllPasses; ++j) // run the allpass filters in series | |||||
| { | |||||
| outL = allPass[0][j].process (outL); | |||||
| outR = allPass[1][j].process (outR); | |||||
| } | |||||
| left[i] = outL * wet1 + outR * wet2 + left[i] * dry; | |||||
| right[i] = outR * wet1 + outL * wet2 + right[i] * dry; | |||||
| } | |||||
| } | |||||
| /** Applies the reverb to a single mono channel of audio data. */ | |||||
| void processMono (float* const samples, const int numSamples) noexcept | |||||
| { | |||||
| jassert (samples != nullptr); | |||||
| if (shouldUpdateDamping) | |||||
| updateDamping(); | |||||
| for (int i = 0; i < numSamples; ++i) | |||||
| { | |||||
| const float input = samples[i] * gain; | |||||
| float output = 0; | |||||
| int j; | |||||
| for (j = 0; j < numCombs; ++j) // accumulate the comb filters in parallel | |||||
| output += comb[0][j].process (input); | |||||
| for (j = 0; j < numAllPasses; ++j) // run the allpass filters in series | |||||
| output = allPass[0][j].process (output); | |||||
| samples[i] = output * wet1 + input * dry; | |||||
| } | |||||
| } | |||||
| private: | |||||
| Parameters parameters; | |||||
| volatile bool shouldUpdateDamping; | |||||
| float gain, wet1, wet2, dry; | |||||
| inline static bool isFrozen (const float freezeMode) noexcept { return freezeMode >= 0.5f; } | |||||
| void updateDamping() noexcept | |||||
| { | |||||
| const float roomScaleFactor = 0.28f; | |||||
| const float roomOffset = 0.7f; | |||||
| const float dampScaleFactor = 0.4f; | |||||
| shouldUpdateDamping = false; | |||||
| if (isFrozen (parameters.freezeMode)) | |||||
| setDamping (1.0f, 0.0f); | |||||
| else | |||||
| setDamping (parameters.damping * dampScaleFactor, | |||||
| parameters.roomSize * roomScaleFactor + roomOffset); | |||||
| } | |||||
| void setDamping (const float dampingToUse, const float roomSizeToUse) noexcept | |||||
| { | |||||
| for (int j = 0; j < numChannels; ++j) | |||||
| for (int i = numCombs; --i >= 0;) | |||||
| comb[j][i].setFeedbackAndDamp (roomSizeToUse, dampingToUse); | |||||
| } | |||||
| class CombFilter | |||||
| { | |||||
| public: | |||||
| CombFilter() noexcept : bufferSize (0), bufferIndex (0) {} | |||||
| void setSize (const int size) | |||||
| { | |||||
| if (size != bufferSize) | |||||
| { | |||||
| bufferIndex = 0; | |||||
| buffer.malloc (size); | |||||
| bufferSize = size; | |||||
| } | |||||
| clear(); | |||||
| } | |||||
| void clear() noexcept | |||||
| { | |||||
| last = 0; | |||||
| zeromem (buffer, bufferSize * sizeof (float)); | |||||
| } | |||||
| void setFeedbackAndDamp (const float f, const float d) noexcept | |||||
| { | |||||
| damp1 = d; | |||||
| damp2 = 1.0f - d; | |||||
| feedback = f; | |||||
| } | |||||
| inline float process (const float input) noexcept | |||||
| { | |||||
| const float output = buffer [bufferIndex]; | |||||
| last = (output * damp2) + (last * damp1); | |||||
| JUCE_UNDENORMALISE (last); | |||||
| float temp = input + (last * feedback); | |||||
| JUCE_UNDENORMALISE (temp); | |||||
| buffer [bufferIndex] = temp; | |||||
| bufferIndex = (bufferIndex + 1) % bufferSize; | |||||
| return output; | |||||
| } | |||||
| private: | |||||
| HeapBlock<float> buffer; | |||||
| int bufferSize, bufferIndex; | |||||
| float feedback, last, damp1, damp2; | |||||
| JUCE_DECLARE_NON_COPYABLE (CombFilter); | |||||
| }; | |||||
| class AllPassFilter | |||||
| { | |||||
| public: | |||||
| AllPassFilter() noexcept : bufferSize (0), bufferIndex (0) {} | |||||
| void setSize (const int size) | |||||
| { | |||||
| if (size != bufferSize) | |||||
| { | |||||
| bufferIndex = 0; | |||||
| buffer.malloc (size); | |||||
| bufferSize = size; | |||||
| } | |||||
| clear(); | |||||
| } | |||||
| void clear() noexcept | |||||
| { | |||||
| zeromem (buffer, bufferSize * sizeof (float)); | |||||
| } | |||||
| inline float process (const float input) noexcept | |||||
| { | |||||
| const float bufferedValue = buffer [bufferIndex]; | |||||
| float temp = input + (bufferedValue * 0.5f); | |||||
| JUCE_UNDENORMALISE (temp); | |||||
| buffer [bufferIndex] = temp; | |||||
| bufferIndex = (bufferIndex + 1) % bufferSize; | |||||
| return bufferedValue - input; | |||||
| } | |||||
| private: | |||||
| HeapBlock<float> buffer; | |||||
| int bufferSize, bufferIndex; | |||||
| JUCE_DECLARE_NON_COPYABLE (AllPassFilter); | |||||
| }; | |||||
| enum { numCombs = 8, numAllPasses = 4, numChannels = 2 }; | |||||
| CombFilter comb [numChannels][numCombs]; | |||||
| AllPassFilter allPass [numChannels][numAllPasses]; | |||||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Reverb); | |||||
| }; | |||||
| #endif // __JUCE_REVERB_JUCEHEADER__ | |||||
| /*** End of inlined file: juce_Reverb.h ***/ | |||||
| /** | |||||
| An AudioSource that uses the Reverb class to apply a reverb to another AudioSource. | |||||
| @see Reverb | |||||
| */ | |||||
| class JUCE_API ReverbAudioSource : public AudioSource | |||||
| { | |||||
| public: | |||||
| /** Creates a ReverbAudioSource to process a given input source. | |||||
| @param inputSource the input source to read from - this must not be null | |||||
| @param deleteInputWhenDeleted if true, the input source will be deleted when | |||||
| this object is deleted | |||||
| */ | |||||
| ReverbAudioSource (AudioSource* inputSource, | |||||
| bool deleteInputWhenDeleted); | |||||
| /** Destructor. */ | |||||
| ~ReverbAudioSource(); | |||||
| /** Returns the parameters from the reverb. */ | |||||
| const Reverb::Parameters& getParameters() const noexcept { return reverb.getParameters(); } | |||||
| /** Changes the reverb's parameters. */ | |||||
| void setParameters (const Reverb::Parameters& newParams); | |||||
| void setBypassed (bool isBypassed) noexcept; | |||||
| bool isBypassed() const noexcept { return bypass; } | |||||
| void prepareToPlay (int samplesPerBlockExpected, double sampleRate); | |||||
| void releaseResources(); | |||||
| void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill); | |||||
| private: | |||||
| CriticalSection lock; | |||||
| OptionalScopedPointer<AudioSource> input; | |||||
| Reverb reverb; | |||||
| volatile bool bypass; | |||||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ReverbAudioSource); | |||||
| }; | |||||
| #endif // __JUCE_REVERBAUDIOSOURCE_JUCEHEADER__ | |||||
| /*** End of inlined file: juce_ReverbAudioSource.h ***/ | |||||
| #endif | #endif | ||||
| #ifndef __JUCE_TONEGENERATORAUDIOSOURCE_JUCEHEADER__ | #ifndef __JUCE_TONEGENERATORAUDIOSOURCE_JUCEHEADER__ | ||||
| @@ -44360,6 +44721,9 @@ private: | |||||
| #endif | #endif | ||||
| #ifndef __JUCE_IIRFILTER_JUCEHEADER__ | #ifndef __JUCE_IIRFILTER_JUCEHEADER__ | ||||
| #endif | |||||
| #ifndef __JUCE_REVERB_JUCEHEADER__ | |||||
| #endif | #endif | ||||
| #ifndef __JUCE_MIDIBUFFER_JUCEHEADER__ | #ifndef __JUCE_MIDIBUFFER_JUCEHEADER__ | ||||
| @@ -33,29 +33,18 @@ BEGIN_JUCE_NAMESPACE | |||||
| //============================================================================== | //============================================================================== | ||||
| AudioFormatReaderSource::AudioFormatReaderSource (AudioFormatReader* const reader_, | AudioFormatReaderSource::AudioFormatReaderSource (AudioFormatReader* const reader_, | ||||
| const bool deleteReaderWhenThisIsDeleted) | const bool deleteReaderWhenThisIsDeleted) | ||||
| : reader (reader_), | |||||
| deleteReader (deleteReaderWhenThisIsDeleted), | |||||
| : reader (reader_, deleteReaderWhenThisIsDeleted), | |||||
| nextPlayPos (0), | nextPlayPos (0), | ||||
| looping (false) | looping (false) | ||||
| { | { | ||||
| jassert (reader != nullptr); | jassert (reader != nullptr); | ||||
| } | } | ||||
| AudioFormatReaderSource::~AudioFormatReaderSource() | |||||
| { | |||||
| if (deleteReader) | |||||
| delete reader; | |||||
| } | |||||
| AudioFormatReaderSource::~AudioFormatReaderSource() {} | |||||
| void AudioFormatReaderSource::setNextReadPosition (int64 newPosition) | |||||
| { | |||||
| nextPlayPos = newPosition; | |||||
| } | |||||
| void AudioFormatReaderSource::setLooping (bool shouldLoop) | |||||
| { | |||||
| looping = shouldLoop; | |||||
| } | |||||
| int64 AudioFormatReaderSource::getTotalLength() const { return reader->lengthInSamples; } | |||||
| void AudioFormatReaderSource::setNextReadPosition (int64 newPosition) { nextPlayPos = newPosition; } | |||||
| void AudioFormatReaderSource::setLooping (bool shouldLoop) { looping = shouldLoop; } | |||||
| int64 AudioFormatReaderSource::getNextReadPosition() const | int64 AudioFormatReaderSource::getNextReadPosition() const | ||||
| { | { | ||||
| @@ -63,19 +52,8 @@ int64 AudioFormatReaderSource::getNextReadPosition() const | |||||
| : nextPlayPos; | : nextPlayPos; | ||||
| } | } | ||||
| int64 AudioFormatReaderSource::getTotalLength() const | |||||
| { | |||||
| return reader->lengthInSamples; | |||||
| } | |||||
| void AudioFormatReaderSource::prepareToPlay (int /*samplesPerBlockExpected*/, | |||||
| double /*sampleRate*/) | |||||
| { | |||||
| } | |||||
| void AudioFormatReaderSource::releaseResources() | |||||
| { | |||||
| } | |||||
| void AudioFormatReaderSource::prepareToPlay (int /*samplesPerBlockExpected*/, double /*sampleRate*/) {} | |||||
| void AudioFormatReaderSource::releaseResources() {} | |||||
| void AudioFormatReaderSource::getNextAudioBlock (const AudioSourceChannelInfo& info) | void AudioFormatReaderSource::getNextAudioBlock (const AudioSourceChannelInfo& info) | ||||
| { | { | ||||
| @@ -90,39 +68,26 @@ void AudioFormatReaderSource::getNextAudioBlock (const AudioSourceChannelInfo& i | |||||
| if (newEnd > newStart) | if (newEnd > newStart) | ||||
| { | { | ||||
| info.buffer->readFromAudioReader (reader, | |||||
| info.startSample, | |||||
| newEnd - newStart, | |||||
| newStart, | |||||
| true, true); | |||||
| info.buffer->readFromAudioReader (reader, info.startSample, | |||||
| newEnd - newStart, newStart, true, true); | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| const int endSamps = (int) reader->lengthInSamples - newStart; | const int endSamps = (int) reader->lengthInSamples - newStart; | ||||
| info.buffer->readFromAudioReader (reader, | |||||
| info.startSample, | |||||
| endSamps, | |||||
| newStart, | |||||
| true, true); | |||||
| info.buffer->readFromAudioReader (reader, | |||||
| info.startSample + endSamps, | |||||
| newEnd, | |||||
| 0, | |||||
| true, true); | |||||
| info.buffer->readFromAudioReader (reader, info.startSample, | |||||
| endSamps, newStart, true, true); | |||||
| info.buffer->readFromAudioReader (reader, info.startSample + endSamps, | |||||
| newEnd, 0, true, true); | |||||
| } | } | ||||
| nextPlayPos = newEnd; | nextPlayPos = newEnd; | ||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| info.buffer->readFromAudioReader (reader, | |||||
| info.startSample, | |||||
| info.numSamples, | |||||
| start, | |||||
| true, true); | |||||
| info.buffer->readFromAudioReader (reader, info.startSample, | |||||
| info.numSamples, start, true, true); | |||||
| nextPlayPos += info.numSamples; | nextPlayPos += info.numSamples; | ||||
| } | } | ||||
| } | } | ||||
| @@ -30,6 +30,7 @@ | |||||
| #include "../../threads/juce_Thread.h" | #include "../../threads/juce_Thread.h" | ||||
| #include "../audio_file_formats/juce_AudioFormatReader.h" | #include "../audio_file_formats/juce_AudioFormatReader.h" | ||||
| #include "../dsp/juce_AudioSampleBuffer.h" | #include "../dsp/juce_AudioSampleBuffer.h" | ||||
| #include "../../memory/juce_OptionalScopedPointer.h" | |||||
| //============================================================================== | //============================================================================== | ||||
| @@ -44,7 +45,8 @@ public: | |||||
| //============================================================================== | //============================================================================== | ||||
| /** Creates an AudioFormatReaderSource for a given reader. | /** Creates an AudioFormatReaderSource for a given reader. | ||||
| @param sourceReader the reader to use as the data source | |||||
| @param sourceReader the reader to use as the data source - this must | |||||
| not be null | |||||
| @param deleteReaderWhenThisIsDeleted if true, the reader passed-in will be deleted | @param deleteReaderWhenThisIsDeleted if true, the reader passed-in will be deleted | ||||
| when this object is deleted; if false it will be | when this object is deleted; if false it will be | ||||
| left up to the caller to manage its lifetime | left up to the caller to manage its lifetime | ||||
| @@ -93,8 +95,7 @@ public: | |||||
| private: | private: | ||||
| //============================================================================== | //============================================================================== | ||||
| AudioFormatReader* reader; | |||||
| bool deleteReader; | |||||
| OptionalScopedPointer<AudioFormatReader> reader; | |||||
| int64 volatile nextPlayPos; | int64 volatile nextPlayPos; | ||||
| bool volatile looping; | bool volatile looping; | ||||
| @@ -120,11 +120,10 @@ juce_ImplementSingleton (SharedBufferingAudioSourceThread) | |||||
| //============================================================================== | //============================================================================== | ||||
| BufferingAudioSource::BufferingAudioSource (PositionableAudioSource* source_, | BufferingAudioSource::BufferingAudioSource (PositionableAudioSource* source_, | ||||
| const bool deleteSourceWhenDeleted_, | |||||
| const bool deleteSourceWhenDeleted, | |||||
| const int numberOfSamplesToBuffer_, | const int numberOfSamplesToBuffer_, | ||||
| const int numberOfChannels_) | const int numberOfChannels_) | ||||
| : source (source_), | |||||
| deleteSourceWhenDeleted (deleteSourceWhenDeleted_), | |||||
| : source (source_, deleteSourceWhenDeleted), | |||||
| numberOfSamplesToBuffer (jmax (1024, numberOfSamplesToBuffer_)), | numberOfSamplesToBuffer (jmax (1024, numberOfSamplesToBuffer_)), | ||||
| numberOfChannels (numberOfChannels_), | numberOfChannels (numberOfChannels_), | ||||
| buffer (numberOfChannels_, 0), | buffer (numberOfChannels_, 0), | ||||
| @@ -145,9 +144,6 @@ BufferingAudioSource::~BufferingAudioSource() | |||||
| if (thread != nullptr) | if (thread != nullptr) | ||||
| thread->removeSource (this); | thread->removeSource (this); | ||||
| if (deleteSourceWhenDeleted) | |||||
| delete source; | |||||
| } | } | ||||
| //============================================================================== | //============================================================================== | ||||
| @@ -29,6 +29,7 @@ | |||||
| #include "juce_PositionableAudioSource.h" | #include "juce_PositionableAudioSource.h" | ||||
| #include "../../threads/juce_Thread.h" | #include "../../threads/juce_Thread.h" | ||||
| #include "../dsp/juce_AudioSampleBuffer.h" | #include "../dsp/juce_AudioSampleBuffer.h" | ||||
| #include "../../memory/juce_OptionalScopedPointer.h" | |||||
| //============================================================================== | //============================================================================== | ||||
| @@ -90,14 +91,13 @@ public: | |||||
| private: | private: | ||||
| //============================================================================== | //============================================================================== | ||||
| PositionableAudioSource* source; | |||||
| bool deleteSourceWhenDeleted; | |||||
| OptionalScopedPointer<PositionableAudioSource> source; | |||||
| int numberOfSamplesToBuffer, numberOfChannels; | int numberOfSamplesToBuffer, numberOfChannels; | ||||
| AudioSampleBuffer buffer; | AudioSampleBuffer buffer; | ||||
| CriticalSection bufferStartPosLock; | CriticalSection bufferStartPosLock; | ||||
| int64 volatile bufferValidStart, bufferValidEnd, nextPlayPos; | int64 volatile bufferValidStart, bufferValidEnd, nextPlayPos; | ||||
| bool wasSourceLooping; | |||||
| double volatile sampleRate; | double volatile sampleRate; | ||||
| bool wasSourceLooping; | |||||
| friend class SharedBufferingAudioSourceThread; | friend class SharedBufferingAudioSourceThread; | ||||
| bool readNextBufferChunk(); | bool readNextBufferChunk(); | ||||
| @@ -32,21 +32,16 @@ BEGIN_JUCE_NAMESPACE | |||||
| //============================================================================== | //============================================================================== | ||||
| ChannelRemappingAudioSource::ChannelRemappingAudioSource (AudioSource* const source_, | ChannelRemappingAudioSource::ChannelRemappingAudioSource (AudioSource* const source_, | ||||
| const bool deleteSourceWhenDeleted_) | |||||
| : requiredNumberOfChannels (2), | |||||
| source (source_), | |||||
| deleteSourceWhenDeleted (deleteSourceWhenDeleted_), | |||||
| const bool deleteSourceWhenDeleted) | |||||
| : source (source_, deleteSourceWhenDeleted), | |||||
| requiredNumberOfChannels (2), | |||||
| buffer (2, 16) | buffer (2, 16) | ||||
| { | { | ||||
| remappedInfo.buffer = &buffer; | remappedInfo.buffer = &buffer; | ||||
| remappedInfo.startSample = 0; | remappedInfo.startSample = 0; | ||||
| } | } | ||||
| ChannelRemappingAudioSource::~ChannelRemappingAudioSource() | |||||
| { | |||||
| if (deleteSourceWhenDeleted) | |||||
| delete source; | |||||
| } | |||||
| ChannelRemappingAudioSource::~ChannelRemappingAudioSource() {} | |||||
| //============================================================================== | //============================================================================== | ||||
| void ChannelRemappingAudioSource::setNumberOfChannelsToProduce (const int requiredNumberOfChannels_) | void ChannelRemappingAudioSource::setNumberOfChannelsToProduce (const int requiredNumberOfChannels_) | ||||
| @@ -29,6 +29,7 @@ | |||||
| #include "juce_AudioSource.h" | #include "juce_AudioSource.h" | ||||
| #include "../../text/juce_XmlElement.h" | #include "../../text/juce_XmlElement.h" | ||||
| #include "../../containers/juce_Array.h" | #include "../../containers/juce_Array.h" | ||||
| #include "../../memory/juce_OptionalScopedPointer.h" | |||||
| //============================================================================== | //============================================================================== | ||||
| @@ -135,11 +136,9 @@ public: | |||||
| private: | private: | ||||
| //============================================================================== | //============================================================================== | ||||
| int requiredNumberOfChannels; | |||||
| OptionalScopedPointer<AudioSource> source; | |||||
| Array <int> remappedInputs, remappedOutputs; | Array <int> remappedInputs, remappedOutputs; | ||||
| AudioSource* const source; | |||||
| const bool deleteSourceWhenDeleted; | |||||
| int requiredNumberOfChannels; | |||||
| AudioSampleBuffer buffer; | AudioSampleBuffer buffer; | ||||
| AudioSourceChannelInfo remappedInfo; | AudioSourceChannelInfo remappedInfo; | ||||
| @@ -29,11 +29,11 @@ BEGIN_JUCE_NAMESPACE | |||||
| #include "juce_IIRFilterAudioSource.h" | #include "juce_IIRFilterAudioSource.h" | ||||
| //============================================================================== | //============================================================================== | ||||
| IIRFilterAudioSource::IIRFilterAudioSource (AudioSource* const inputSource, | IIRFilterAudioSource::IIRFilterAudioSource (AudioSource* const inputSource, | ||||
| const bool deleteInputWhenDeleted_) | |||||
| : input (inputSource), | |||||
| deleteInputWhenDeleted (deleteInputWhenDeleted_) | |||||
| const bool deleteInputWhenDeleted) | |||||
| : input (inputSource, deleteInputWhenDeleted) | |||||
| { | { | ||||
| jassert (inputSource != nullptr); | jassert (inputSource != nullptr); | ||||
| @@ -41,11 +41,7 @@ IIRFilterAudioSource::IIRFilterAudioSource (AudioSource* const inputSource, | |||||
| iirFilters.add (new IIRFilter()); | iirFilters.add (new IIRFilter()); | ||||
| } | } | ||||
| IIRFilterAudioSource::~IIRFilterAudioSource() | |||||
| { | |||||
| if (deleteInputWhenDeleted) | |||||
| delete input; | |||||
| } | |||||
| IIRFilterAudioSource::~IIRFilterAudioSource() {} | |||||
| //============================================================================== | //============================================================================== | ||||
| void IIRFilterAudioSource::setFilterParameters (const IIRFilter& newSettings) | void IIRFilterAudioSource::setFilterParameters (const IIRFilter& newSettings) | ||||
| @@ -29,6 +29,7 @@ | |||||
| #include "juce_AudioSource.h" | #include "juce_AudioSource.h" | ||||
| #include "../dsp/juce_IIRFilter.h" | #include "../dsp/juce_IIRFilter.h" | ||||
| #include "../../containers/juce_OwnedArray.h" | #include "../../containers/juce_OwnedArray.h" | ||||
| #include "../../memory/juce_OptionalScopedPointer.h" | |||||
| //============================================================================== | //============================================================================== | ||||
| @@ -41,7 +42,7 @@ public: | |||||
| //============================================================================== | //============================================================================== | ||||
| /** Creates a IIRFilterAudioSource for a given input source. | /** Creates a IIRFilterAudioSource for a given input source. | ||||
| @param inputSource the input source to read from | |||||
| @param inputSource the input source to read from - this must not be null | |||||
| @param deleteInputWhenDeleted if true, the input source will be deleted when | @param deleteInputWhenDeleted if true, the input source will be deleted when | ||||
| this object is deleted | this object is deleted | ||||
| */ | */ | ||||
| @@ -52,8 +53,7 @@ public: | |||||
| ~IIRFilterAudioSource(); | ~IIRFilterAudioSource(); | ||||
| //============================================================================== | //============================================================================== | ||||
| /** Changes the filter to use the same parameters as the one being passed in. | |||||
| */ | |||||
| /** Changes the filter to use the same parameters as the one being passed in. */ | |||||
| void setFilterParameters (const IIRFilter& newSettings); | void setFilterParameters (const IIRFilter& newSettings); | ||||
| //============================================================================== | //============================================================================== | ||||
| @@ -61,11 +61,9 @@ public: | |||||
| void releaseResources(); | void releaseResources(); | ||||
| void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill); | void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill); | ||||
| private: | private: | ||||
| //============================================================================== | //============================================================================== | ||||
| AudioSource* const input; | |||||
| const bool deleteInputWhenDeleted; | |||||
| OptionalScopedPointer<AudioSource> input; | |||||
| OwnedArray <IIRFilter> iirFilters; | OwnedArray <IIRFilter> iirFilters; | ||||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (IIRFilterAudioSource); | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (IIRFilterAudioSource); | ||||
| @@ -32,10 +32,9 @@ BEGIN_JUCE_NAMESPACE | |||||
| //============================================================================== | //============================================================================== | ||||
| ResamplingAudioSource::ResamplingAudioSource (AudioSource* const inputSource, | ResamplingAudioSource::ResamplingAudioSource (AudioSource* const inputSource, | ||||
| const bool deleteInputWhenDeleted_, | |||||
| const bool deleteInputWhenDeleted, | |||||
| const int numChannels_) | const int numChannels_) | ||||
| : input (inputSource), | |||||
| deleteInputWhenDeleted (deleteInputWhenDeleted_), | |||||
| : input (inputSource, deleteInputWhenDeleted), | |||||
| ratio (1.0), | ratio (1.0), | ||||
| lastRatio (1.0), | lastRatio (1.0), | ||||
| buffer (numChannels_, 0), | buffer (numChannels_, 0), | ||||
| @@ -45,11 +44,7 @@ ResamplingAudioSource::ResamplingAudioSource (AudioSource* const inputSource, | |||||
| jassert (input != nullptr); | jassert (input != nullptr); | ||||
| } | } | ||||
| ResamplingAudioSource::~ResamplingAudioSource() | |||||
| { | |||||
| if (deleteInputWhenDeleted) | |||||
| delete input; | |||||
| } | |||||
| ResamplingAudioSource::~ResamplingAudioSource() {} | |||||
| void ResamplingAudioSource::setResamplingRatio (const double samplesInPerOutputSample) | void ResamplingAudioSource::setResamplingRatio (const double samplesInPerOutputSample) | ||||
| { | { | ||||
| @@ -28,6 +28,7 @@ | |||||
| #include "juce_AudioSource.h" | #include "juce_AudioSource.h" | ||||
| #include "../../threads/juce_SpinLock.h" | #include "../../threads/juce_SpinLock.h" | ||||
| #include "../../memory/juce_OptionalScopedPointer.h" | |||||
| //============================================================================== | //============================================================================== | ||||
| @@ -77,8 +78,7 @@ public: | |||||
| private: | private: | ||||
| //============================================================================== | //============================================================================== | ||||
| AudioSource* const input; | |||||
| const bool deleteInputWhenDeleted; | |||||
| OptionalScopedPointer<AudioSource> input; | |||||
| double ratio, lastRatio; | double ratio, lastRatio; | ||||
| AudioSampleBuffer buffer; | AudioSampleBuffer buffer; | ||||
| int bufferPos, sampsInBuffer; | int bufferPos, sampsInBuffer; | ||||
| @@ -0,0 +1,92 @@ | |||||
| /* | |||||
| ============================================================================== | |||||
| This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||||
| Copyright 2004-11 by Raw Material Software Ltd. | |||||
| ------------------------------------------------------------------------------ | |||||
| JUCE can be redistributed and/or modified under the terms of the GNU General | |||||
| Public License (Version 2), as published by the Free Software Foundation. | |||||
| A copy of the license is included in the JUCE distribution, or can be found | |||||
| online 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.rawmaterialsoftware.com/juce for more information. | |||||
| ============================================================================== | |||||
| */ | |||||
| #include "../../core/juce_StandardHeader.h" | |||||
| BEGIN_JUCE_NAMESPACE | |||||
| #include "juce_ReverbAudioSource.h" | |||||
| //============================================================================== | |||||
| ReverbAudioSource::ReverbAudioSource (AudioSource* const inputSource, const bool deleteInputWhenDeleted) | |||||
| : input (inputSource, deleteInputWhenDeleted), | |||||
| bypass (false) | |||||
| { | |||||
| jassert (inputSource != nullptr); | |||||
| } | |||||
| ReverbAudioSource::~ReverbAudioSource() {} | |||||
| void ReverbAudioSource::prepareToPlay (int samplesPerBlockExpected, double sampleRate) | |||||
| { | |||||
| const ScopedLock sl (lock); | |||||
| input->prepareToPlay (samplesPerBlockExpected, sampleRate); | |||||
| reverb.setSampleRate (sampleRate); | |||||
| } | |||||
| void ReverbAudioSource::releaseResources() {} | |||||
| void ReverbAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill) | |||||
| { | |||||
| const ScopedLock sl (lock); | |||||
| input->getNextAudioBlock (bufferToFill); | |||||
| if (! bypass) | |||||
| { | |||||
| float* const firstChannel = bufferToFill.buffer->getSampleData (0, bufferToFill.startSample); | |||||
| if (bufferToFill.buffer->getNumChannels() > 1) | |||||
| { | |||||
| reverb.processStereo (firstChannel, | |||||
| bufferToFill.buffer->getSampleData (1, bufferToFill.startSample), | |||||
| bufferToFill.numSamples); | |||||
| } | |||||
| else | |||||
| { | |||||
| reverb.processMono (firstChannel, bufferToFill.numSamples); | |||||
| } | |||||
| } | |||||
| } | |||||
| void ReverbAudioSource::setParameters (const Reverb::Parameters& newParams) | |||||
| { | |||||
| const ScopedLock sl (lock); | |||||
| reverb.setParameters (newParams); | |||||
| } | |||||
| void ReverbAudioSource::setBypassed (bool isBypassed) noexcept | |||||
| { | |||||
| if (bypass != isBypassed) | |||||
| { | |||||
| const ScopedLock sl (lock); | |||||
| bypass = isBypassed; | |||||
| reverb.reset(); | |||||
| } | |||||
| } | |||||
| END_JUCE_NAMESPACE | |||||
| @@ -0,0 +1,82 @@ | |||||
| /* | |||||
| ============================================================================== | |||||
| This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||||
| Copyright 2004-11 by Raw Material Software Ltd. | |||||
| ------------------------------------------------------------------------------ | |||||
| JUCE can be redistributed and/or modified under the terms of the GNU General | |||||
| Public License (Version 2), as published by the Free Software Foundation. | |||||
| A copy of the license is included in the JUCE distribution, or can be found | |||||
| online 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.rawmaterialsoftware.com/juce for more information. | |||||
| ============================================================================== | |||||
| */ | |||||
| #ifndef __JUCE_REVERBAUDIOSOURCE_JUCEHEADER__ | |||||
| #define __JUCE_REVERBAUDIOSOURCE_JUCEHEADER__ | |||||
| #include "juce_AudioSource.h" | |||||
| #include "../dsp/juce_Reverb.h" | |||||
| #include "../../threads/juce_CriticalSection.h" | |||||
| #include "../../memory/juce_OptionalScopedPointer.h" | |||||
| //============================================================================== | |||||
| /** | |||||
| An AudioSource that uses the Reverb class to apply a reverb to another AudioSource. | |||||
| @see Reverb | |||||
| */ | |||||
| class JUCE_API ReverbAudioSource : public AudioSource | |||||
| { | |||||
| public: | |||||
| /** Creates a ReverbAudioSource to process a given input source. | |||||
| @param inputSource the input source to read from - this must not be null | |||||
| @param deleteInputWhenDeleted if true, the input source will be deleted when | |||||
| this object is deleted | |||||
| */ | |||||
| ReverbAudioSource (AudioSource* inputSource, | |||||
| bool deleteInputWhenDeleted); | |||||
| /** Destructor. */ | |||||
| ~ReverbAudioSource(); | |||||
| //============================================================================== | |||||
| /** Returns the parameters from the reverb. */ | |||||
| const Reverb::Parameters& getParameters() const noexcept { return reverb.getParameters(); } | |||||
| /** Changes the reverb's parameters. */ | |||||
| void setParameters (const Reverb::Parameters& newParams); | |||||
| void setBypassed (bool isBypassed) noexcept; | |||||
| bool isBypassed() const noexcept { return bypass; } | |||||
| //============================================================================== | |||||
| void prepareToPlay (int samplesPerBlockExpected, double sampleRate); | |||||
| void releaseResources(); | |||||
| void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill); | |||||
| private: | |||||
| //============================================================================== | |||||
| CriticalSection lock; | |||||
| OptionalScopedPointer<AudioSource> input; | |||||
| Reverb reverb; | |||||
| volatile bool bypass; | |||||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ReverbAudioSource); | |||||
| }; | |||||
| #endif // __JUCE_REVERBAUDIOSOURCE_JUCEHEADER__ | |||||
| @@ -0,0 +1,325 @@ | |||||
| /* | |||||
| ============================================================================== | |||||
| This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||||
| Copyright 2004-11 by Raw Material Software Ltd. | |||||
| ------------------------------------------------------------------------------ | |||||
| JUCE can be redistributed and/or modified under the terms of the GNU General | |||||
| Public License (Version 2), as published by the Free Software Foundation. | |||||
| A copy of the license is included in the JUCE distribution, or can be found | |||||
| online 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.rawmaterialsoftware.com/juce for more information. | |||||
| ============================================================================== | |||||
| */ | |||||
| #ifndef __JUCE_REVERB_JUCEHEADER__ | |||||
| #define __JUCE_REVERB_JUCEHEADER__ | |||||
| //============================================================================== | |||||
| /** | |||||
| Performs a simple reverb effect on a stream of audio data. | |||||
| This is a simple stereo reverb, based on the technique and tunings used in FreeVerb. | |||||
| Use setSampleRate() to prepare it, and then call processStereo() or processMono() to | |||||
| apply the reverb to your audio data. | |||||
| @see ReverbAudioSource | |||||
| */ | |||||
| class Reverb | |||||
| { | |||||
| public: | |||||
| //============================================================================== | |||||
| Reverb() | |||||
| { | |||||
| setParameters (Parameters()); | |||||
| setSampleRate (44100.0); | |||||
| } | |||||
| //============================================================================== | |||||
| /** Holds the parameters being used by a Reverb object. */ | |||||
| struct Parameters | |||||
| { | |||||
| Parameters() noexcept | |||||
| : roomSize (0.5f), | |||||
| damping (0.5f), | |||||
| wetLevel (0.33f), | |||||
| dryLevel (0.4f), | |||||
| width (1.0f), | |||||
| freezeMode (0) | |||||
| {} | |||||
| float roomSize; /**< Room size, 0 to 1.0, where 1.0 is big, 0 is small. */ | |||||
| float damping; /**< Damping, 0 to 1.0, where 0 is not damped, 1.0 is fully damped. */ | |||||
| float wetLevel; /**< Wet level, 0 to 1.0 */ | |||||
| float dryLevel; /**< Dry level, 0 to 1.0 */ | |||||
| float width; /**< Reverb width, 0 to 1.0, where 1.0 is very wide. */ | |||||
| float freezeMode; /**< Freeze mode - values < 0.5 are "normal" mode, values > 0.5 | |||||
| put the reverb into a continuous feedback loop. */ | |||||
| }; | |||||
| //============================================================================== | |||||
| /** Returns the reverb's current parameters. */ | |||||
| const Parameters& getParameters() const noexcept { return parameters; } | |||||
| /** Applies a new set of parameters to the reverb. | |||||
| Note that this doesn't attempt to lock the reverb, so if you call this in parallel with | |||||
| the process method, you may get artifacts. | |||||
| */ | |||||
| void setParameters (const Parameters& newParams) | |||||
| { | |||||
| const float wetScaleFactor = 3.0f; | |||||
| const float dryScaleFactor = 2.0f; | |||||
| const float wet = newParams.wetLevel * wetScaleFactor; | |||||
| wet1 = wet * (newParams.width * 0.5f + 0.5f); | |||||
| wet2 = wet * (1.0f - newParams.width) * 0.5f; | |||||
| dry = newParams.dryLevel * dryScaleFactor; | |||||
| gain = isFrozen (newParams.freezeMode) ? 0.0f : 0.015f; | |||||
| parameters = newParams; | |||||
| shouldUpdateDamping = true; | |||||
| } | |||||
| //============================================================================== | |||||
| /** Sets the sample rate that will be used for the reverb. | |||||
| You must call this before the process methods, in order to tell it the correct sample rate. | |||||
| */ | |||||
| void setSampleRate (const double sampleRate) | |||||
| { | |||||
| jassert (sampleRate > 0); | |||||
| static const short combTunings[] = { 1116, 1188, 1277, 1356, 1422, 1491, 1557, 1617 }; // (at 44100Hz) | |||||
| static const short allPassTunings[] = { 556, 441, 341, 225 }; | |||||
| const int stereoSpread = 23; | |||||
| const int intSampleRate = (int) sampleRate; | |||||
| int i; | |||||
| for (i = 0; i < numCombs; ++i) | |||||
| { | |||||
| comb[0][i].setSize ((intSampleRate * combTunings[i]) / 44100); | |||||
| comb[1][i].setSize ((intSampleRate * (combTunings[i] + stereoSpread)) / 44100); | |||||
| } | |||||
| for (i = 0; i < numAllPasses; ++i) | |||||
| { | |||||
| allPass[0][i].setSize ((intSampleRate * allPassTunings[i]) / 44100); | |||||
| allPass[1][i].setSize ((intSampleRate * (allPassTunings[i] + stereoSpread)) / 44100); | |||||
| } | |||||
| shouldUpdateDamping = true; | |||||
| } | |||||
| /** Clears the reverb's buffers. */ | |||||
| void reset() | |||||
| { | |||||
| for (int j = 0; j < numChannels; ++j) | |||||
| { | |||||
| int i; | |||||
| for (i = 0; i < numCombs; ++i) | |||||
| comb[j][i].clear(); | |||||
| for (i = 0; i < numAllPasses; ++i) | |||||
| allPass[j][i].clear(); | |||||
| } | |||||
| } | |||||
| //============================================================================== | |||||
| /** Applies the reverb to two stereo channels of audio data. */ | |||||
| void processStereo (float* const left, float* const right, const int numSamples) noexcept | |||||
| { | |||||
| jassert (left != nullptr && right != nullptr); | |||||
| if (shouldUpdateDamping) | |||||
| updateDamping(); | |||||
| for (int i = 0; i < numSamples; ++i) | |||||
| { | |||||
| const float input = (left[i] + right[i]) * gain; | |||||
| float outL = 0, outR = 0; | |||||
| int j; | |||||
| for (j = 0; j < numCombs; ++j) // accumulate the comb filters in parallel | |||||
| { | |||||
| outL += comb[0][j].process (input); | |||||
| outR += comb[1][j].process (input); | |||||
| } | |||||
| for (j = 0; j < numAllPasses; ++j) // run the allpass filters in series | |||||
| { | |||||
| outL = allPass[0][j].process (outL); | |||||
| outR = allPass[1][j].process (outR); | |||||
| } | |||||
| left[i] = outL * wet1 + outR * wet2 + left[i] * dry; | |||||
| right[i] = outR * wet1 + outL * wet2 + right[i] * dry; | |||||
| } | |||||
| } | |||||
| /** Applies the reverb to a single mono channel of audio data. */ | |||||
| void processMono (float* const samples, const int numSamples) noexcept | |||||
| { | |||||
| jassert (samples != nullptr); | |||||
| if (shouldUpdateDamping) | |||||
| updateDamping(); | |||||
| for (int i = 0; i < numSamples; ++i) | |||||
| { | |||||
| const float input = samples[i] * gain; | |||||
| float output = 0; | |||||
| int j; | |||||
| for (j = 0; j < numCombs; ++j) // accumulate the comb filters in parallel | |||||
| output += comb[0][j].process (input); | |||||
| for (j = 0; j < numAllPasses; ++j) // run the allpass filters in series | |||||
| output = allPass[0][j].process (output); | |||||
| samples[i] = output * wet1 + input * dry; | |||||
| } | |||||
| } | |||||
| private: | |||||
| //============================================================================== | |||||
| Parameters parameters; | |||||
| volatile bool shouldUpdateDamping; | |||||
| float gain, wet1, wet2, dry; | |||||
| inline static bool isFrozen (const float freezeMode) noexcept { return freezeMode >= 0.5f; } | |||||
| void updateDamping() noexcept | |||||
| { | |||||
| const float roomScaleFactor = 0.28f; | |||||
| const float roomOffset = 0.7f; | |||||
| const float dampScaleFactor = 0.4f; | |||||
| shouldUpdateDamping = false; | |||||
| if (isFrozen (parameters.freezeMode)) | |||||
| setDamping (1.0f, 0.0f); | |||||
| else | |||||
| setDamping (parameters.damping * dampScaleFactor, | |||||
| parameters.roomSize * roomScaleFactor + roomOffset); | |||||
| } | |||||
| void setDamping (const float dampingToUse, const float roomSizeToUse) noexcept | |||||
| { | |||||
| for (int j = 0; j < numChannels; ++j) | |||||
| for (int i = numCombs; --i >= 0;) | |||||
| comb[j][i].setFeedbackAndDamp (roomSizeToUse, dampingToUse); | |||||
| } | |||||
| //============================================================================== | |||||
| class CombFilter | |||||
| { | |||||
| public: | |||||
| CombFilter() noexcept : bufferSize (0), bufferIndex (0) {} | |||||
| void setSize (const int size) | |||||
| { | |||||
| if (size != bufferSize) | |||||
| { | |||||
| bufferIndex = 0; | |||||
| buffer.malloc (size); | |||||
| bufferSize = size; | |||||
| } | |||||
| clear(); | |||||
| } | |||||
| void clear() noexcept | |||||
| { | |||||
| last = 0; | |||||
| zeromem (buffer, bufferSize * sizeof (float)); | |||||
| } | |||||
| void setFeedbackAndDamp (const float f, const float d) noexcept | |||||
| { | |||||
| damp1 = d; | |||||
| damp2 = 1.0f - d; | |||||
| feedback = f; | |||||
| } | |||||
| inline float process (const float input) noexcept | |||||
| { | |||||
| const float output = buffer [bufferIndex]; | |||||
| last = (output * damp2) + (last * damp1); | |||||
| JUCE_UNDENORMALISE (last); | |||||
| float temp = input + (last * feedback); | |||||
| JUCE_UNDENORMALISE (temp); | |||||
| buffer [bufferIndex] = temp; | |||||
| bufferIndex = (bufferIndex + 1) % bufferSize; | |||||
| return output; | |||||
| } | |||||
| private: | |||||
| HeapBlock<float> buffer; | |||||
| int bufferSize, bufferIndex; | |||||
| float feedback, last, damp1, damp2; | |||||
| JUCE_DECLARE_NON_COPYABLE (CombFilter); | |||||
| }; | |||||
| //============================================================================== | |||||
| class AllPassFilter | |||||
| { | |||||
| public: | |||||
| AllPassFilter() noexcept : bufferSize (0), bufferIndex (0) {} | |||||
| void setSize (const int size) | |||||
| { | |||||
| if (size != bufferSize) | |||||
| { | |||||
| bufferIndex = 0; | |||||
| buffer.malloc (size); | |||||
| bufferSize = size; | |||||
| } | |||||
| clear(); | |||||
| } | |||||
| void clear() noexcept | |||||
| { | |||||
| zeromem (buffer, bufferSize * sizeof (float)); | |||||
| } | |||||
| inline float process (const float input) noexcept | |||||
| { | |||||
| const float bufferedValue = buffer [bufferIndex]; | |||||
| float temp = input + (bufferedValue * 0.5f); | |||||
| JUCE_UNDENORMALISE (temp); | |||||
| buffer [bufferIndex] = temp; | |||||
| bufferIndex = (bufferIndex + 1) % bufferSize; | |||||
| return bufferedValue - input; | |||||
| } | |||||
| private: | |||||
| HeapBlock<float> buffer; | |||||
| int bufferSize, bufferIndex; | |||||
| JUCE_DECLARE_NON_COPYABLE (AllPassFilter); | |||||
| }; | |||||
| enum { numCombs = 8, numAllPasses = 4, numChannels = 2 }; | |||||
| CombFilter comb [numChannels][numCombs]; | |||||
| AllPassFilter allPass [numChannels][numAllPasses]; | |||||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Reverb); | |||||
| }; | |||||
| #endif // __JUCE_REVERB_JUCEHEADER__ | |||||
| @@ -33,7 +33,7 @@ | |||||
| */ | */ | ||||
| #define JUCE_MAJOR_VERSION 1 | #define JUCE_MAJOR_VERSION 1 | ||||
| #define JUCE_MINOR_VERSION 53 | #define JUCE_MINOR_VERSION 53 | ||||
| #define JUCE_BUILDNUMBER 91 | |||||
| #define JUCE_BUILDNUMBER 92 | |||||
| /** Current Juce version number. | /** Current Juce version number. | ||||
| @@ -1823,7 +1823,7 @@ void Component::paintComponent (Graphics& g) | |||||
| paint (imG); | paint (imG); | ||||
| } | } | ||||
| g.setColour (Colours::black.withAlpha (getAlpha())); | |||||
| g.setColour (Colours::black); | |||||
| g.drawImageAt (bufferedImage, 0, 0); | g.drawImageAt (bufferedImage, 0, 0); | ||||
| } | } | ||||
| else | else | ||||
| @@ -1914,9 +1914,9 @@ void Component::paintEntireComponent (Graphics& g, const bool ignoreAlphaLevel) | |||||
| { | { | ||||
| jassert (! g.isClipEmpty()); | jassert (! g.isClipEmpty()); | ||||
| #if JUCE_DEBUG | |||||
| #if JUCE_DEBUG | |||||
| flags.isInsidePaintCall = true; | flags.isInsidePaintCall = true; | ||||
| #endif | |||||
| #endif | |||||
| if (effect != nullptr) | if (effect != nullptr) | ||||
| { | { | ||||
| @@ -1943,9 +1943,9 @@ void Component::paintEntireComponent (Graphics& g, const bool ignoreAlphaLevel) | |||||
| paintComponentAndChildren (g); | paintComponentAndChildren (g); | ||||
| } | } | ||||
| #if JUCE_DEBUG | |||||
| #if JUCE_DEBUG | |||||
| flags.isInsidePaintCall = false; | flags.isInsidePaintCall = false; | ||||
| #endif | |||||
| #endif | |||||
| } | } | ||||
| void Component::setPaintingIsUnclipped (const bool shouldPaintWithoutClipping) noexcept | void Component::setPaintingIsUnclipped (const bool shouldPaintWithoutClipping) noexcept | ||||
| @@ -392,6 +392,8 @@ public: | |||||
| The x position is an integer, but the top and bottom of the line can be sub-pixel | The x position is an integer, but the top and bottom of the line can be sub-pixel | ||||
| positions, and these will be anti-aliased if necessary. | positions, and these will be anti-aliased if necessary. | ||||
| The bottom parameter must be greater than or equal to the top parameter. | |||||
| */ | */ | ||||
| void drawVerticalLine (int x, float top, float bottom) const; | void drawVerticalLine (int x, float top, float bottom) const; | ||||
| @@ -399,6 +401,8 @@ public: | |||||
| The y position is an integer, but the left and right ends of the line can be sub-pixel | The y position is an integer, but the left and right ends of the line can be sub-pixel | ||||
| positions, and these will be anti-aliased if necessary. | positions, and these will be anti-aliased if necessary. | ||||
| The right parameter must be greater than or equal to the left parameter. | |||||
| */ | */ | ||||
| void drawHorizontalLine (int y, float left, float right) const; | void drawHorizontalLine (int y, float left, float right) const; | ||||
| @@ -32,24 +32,25 @@ BEGIN_JUCE_NAMESPACE | |||||
| #include "../../../io/files/juce_FileInputStream.h" | #include "../../../io/files/juce_FileInputStream.h" | ||||
| #include "../../../io/streams/juce_BufferedInputStream.h" | #include "../../../io/streams/juce_BufferedInputStream.h" | ||||
| //============================================================================== | //============================================================================== | ||||
| ImageFileFormat* ImageFileFormat::findImageFormatForStream (InputStream& input) | |||||
| struct DefaultImageFormats | |||||
| { | { | ||||
| static PNGImageFormat png; | |||||
| static JPEGImageFormat jpg; | |||||
| static GIFImageFormat gif; | |||||
| PNGImageFormat png; | |||||
| JPEGImageFormat jpg; | |||||
| GIFImageFormat gif; | |||||
| }; | |||||
| ImageFileFormat* formats[4]; | |||||
| int numFormats = 0; | |||||
| static DefaultImageFormats defaultImageFormats; | |||||
| formats [numFormats++] = &png; | |||||
| formats [numFormats++] = &jpg; | |||||
| formats [numFormats++] = &gif; | |||||
| ImageFileFormat* ImageFileFormat::findImageFormatForStream (InputStream& input) | |||||
| { | |||||
| ImageFileFormat* formats[] = { &defaultImageFormats.png, | |||||
| &defaultImageFormats.jpg, | |||||
| &defaultImageFormats.gif }; | |||||
| const int64 streamPos = input.getPosition(); | const int64 streamPos = input.getPosition(); | ||||
| for (int i = 0; i < numFormats; ++i) | |||||
| for (int i = 0; i < numElementsInArray (formats); ++i) | |||||
| { | { | ||||
| const bool found = formats[i]->canUnderstand (input); | const bool found = formats[i]->canUnderstand (input); | ||||
| input.setPosition (streamPos); | input.setPosition (streamPos); | ||||
| @@ -39,10 +39,7 @@ MemoryInputStream::MemoryInputStream (const void* const sourceData, | |||||
| position (0) | position (0) | ||||
| { | { | ||||
| if (keepInternalCopy) | if (keepInternalCopy) | ||||
| { | |||||
| internalCopy.append (data, sourceDataSize); | |||||
| data = static_cast <const char*> (internalCopy.getData()); | |||||
| } | |||||
| createInternalCopy(); | |||||
| } | } | ||||
| MemoryInputStream::MemoryInputStream (const MemoryBlock& sourceData, | MemoryInputStream::MemoryInputStream (const MemoryBlock& sourceData, | ||||
| @@ -52,10 +49,14 @@ MemoryInputStream::MemoryInputStream (const MemoryBlock& sourceData, | |||||
| position (0) | position (0) | ||||
| { | { | ||||
| if (keepInternalCopy) | if (keepInternalCopy) | ||||
| { | |||||
| internalCopy = sourceData; | |||||
| data = static_cast <const char*> (internalCopy.getData()); | |||||
| } | |||||
| createInternalCopy(); | |||||
| } | |||||
| void MemoryInputStream::createInternalCopy() | |||||
| { | |||||
| internalCopy.malloc (dataSize); | |||||
| memcpy (internalCopy, data, dataSize); | |||||
| data = internalCopy; | |||||
| } | } | ||||
| MemoryInputStream::~MemoryInputStream() | MemoryInputStream::~MemoryInputStream() | ||||
| @@ -71,6 +72,9 @@ int MemoryInputStream::read (void* const buffer, const int howMany) | |||||
| { | { | ||||
| jassert (howMany >= 0); | jassert (howMany >= 0); | ||||
| const int num = jmin (howMany, (int) (dataSize - position)); | const int num = jmin (howMany, (int) (dataSize - position)); | ||||
| if (num <= 0) | |||||
| return 0; | |||||
| memcpy (buffer, data + position, num); | memcpy (buffer, data + position, num); | ||||
| position += num; | position += num; | ||||
| return (int) num; | return (int) num; | ||||
| @@ -78,7 +82,7 @@ int MemoryInputStream::read (void* const buffer, const int howMany) | |||||
| bool MemoryInputStream::isExhausted() | bool MemoryInputStream::isExhausted() | ||||
| { | { | ||||
| return (position >= dataSize); | |||||
| return position >= dataSize; | |||||
| } | } | ||||
| bool MemoryInputStream::setPosition (const int64 pos) | bool MemoryInputStream::setPosition (const int64 pos) | ||||
| @@ -93,6 +97,7 @@ int64 MemoryInputStream::getPosition() | |||||
| } | } | ||||
| //============================================================================== | |||||
| #if JUCE_UNIT_TESTS | #if JUCE_UNIT_TESTS | ||||
| #include "../../utilities/juce_UnitTest.h" | #include "../../utilities/juce_UnitTest.h" | ||||
| @@ -80,7 +80,9 @@ private: | |||||
| //============================================================================== | //============================================================================== | ||||
| const char* data; | const char* data; | ||||
| size_t dataSize, position; | size_t dataSize, position; | ||||
| MemoryBlock internalCopy; | |||||
| HeapBlock<char> internalCopy; | |||||
| void createInternalCopy(); | |||||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MemoryInputStream); | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MemoryInputStream); | ||||
| }; | }; | ||||
| @@ -116,6 +116,9 @@ | |||||
| #ifndef __JUCE_RESAMPLINGAUDIOSOURCE_JUCEHEADER__ | #ifndef __JUCE_RESAMPLINGAUDIOSOURCE_JUCEHEADER__ | ||||
| #include "audio/audio_sources/juce_ResamplingAudioSource.h" | #include "audio/audio_sources/juce_ResamplingAudioSource.h" | ||||
| #endif | #endif | ||||
| #ifndef __JUCE_REVERBAUDIOSOURCE_JUCEHEADER__ | |||||
| #include "audio/audio_sources/juce_ReverbAudioSource.h" | |||||
| #endif | |||||
| #ifndef __JUCE_TONEGENERATORAUDIOSOURCE_JUCEHEADER__ | #ifndef __JUCE_TONEGENERATORAUDIOSOURCE_JUCEHEADER__ | ||||
| #include "audio/audio_sources/juce_ToneGeneratorAudioSource.h" | #include "audio/audio_sources/juce_ToneGeneratorAudioSource.h" | ||||
| #endif | #endif | ||||
| @@ -140,6 +143,9 @@ | |||||
| #ifndef __JUCE_IIRFILTER_JUCEHEADER__ | #ifndef __JUCE_IIRFILTER_JUCEHEADER__ | ||||
| #include "audio/dsp/juce_IIRFilter.h" | #include "audio/dsp/juce_IIRFilter.h" | ||||
| #endif | #endif | ||||
| #ifndef __JUCE_REVERB_JUCEHEADER__ | |||||
| #include "audio/dsp/juce_Reverb.h" | |||||
| #endif | |||||
| #ifndef __JUCE_MIDIBUFFER_JUCEHEADER__ | #ifndef __JUCE_MIDIBUFFER_JUCEHEADER__ | ||||
| #include "audio/midi/juce_MidiBuffer.h" | #include "audio/midi/juce_MidiBuffer.h" | ||||
| #endif | #endif | ||||
| @@ -416,6 +416,17 @@ inline int roundFloatToInt (const float value) noexcept | |||||
| return roundToInt (value); | return roundToInt (value); | ||||
| } | } | ||||
| //============================================================================== | |||||
| #if (JUCE_INTEL && JUCE_32BIT) || 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; | |||||
| #else | |||||
| #define JUCE_UNDENORMALISE(x) | |||||
| #endif | |||||
| //============================================================================== | //============================================================================== | ||||
| /** This namespace contains a few template classes for helping work out class type variations. | /** This namespace contains a few template classes for helping work out class type variations. | ||||
| */ | */ | ||||
| @@ -73,7 +73,7 @@ using namespace JUCE_NAMESPACE; | |||||
| if (f.getFileName().matchesWildcard ((*filters)[i], true)) | if (f.getFileName().matchesWildcard ((*filters)[i], true)) | ||||
| return true; | return true; | ||||
| return f.isDirectory(); | |||||
| return f.isDirectory() && ! [[NSWorkspace sharedWorkspace] isFilePackageAtPath: filename]; | |||||
| } | } | ||||
| @end | @end | ||||
| @@ -217,6 +217,9 @@ public: | |||||
| jassert (path.isEmpty()); // we might need to apply a transform to the path, so this must be empty | jassert (path.isEmpty()); // we might need to apply a transform to the path, so this must be empty | ||||
| CGPathRef pathRef = CTFontCreatePathForGlyph (ctFontRef, (CGGlyph) glyphNumber, &renderingTransform); | CGPathRef pathRef = CTFontCreatePathForGlyph (ctFontRef, (CGGlyph) glyphNumber, &renderingTransform); | ||||
| if (pathRef == 0) | |||||
| return false; | |||||
| CGPathApply (pathRef, &path, pathApplier); | CGPathApply (pathRef, &path, pathApplier); | ||||
| CFRelease (pathRef); | CFRelease (pathRef); | ||||