From 3d8ce244b137ae14158e13389561e0d1d8fad8b2 Mon Sep 17 00:00:00 2001 From: Julian Storer Date: Thu, 7 Jul 2011 12:25:45 +0100 Subject: [PATCH] New class: CoreAudioFormat, for using system audio codecs in OSX and iOS. --- Builds/Linux/Makefile | 6 + Builds/MacOSX/Juce.xcodeproj/project.pbxproj | 6 + Builds/VisualStudio2005/Juce.vcproj | 2 + Builds/VisualStudio2008/Juce.vcproj | 2 + Builds/VisualStudio2008_DLL/Juce.vcproj | 2 + Builds/VisualStudio2010/Juce.vcxproj | 2 + Builds/VisualStudio2010/Juce.vcxproj.filters | 6 + Builds/iOS/Juce.xcodeproj/project.pbxproj | 6 + Juce.jucer | 4 + amalgamation/juce_amalgamated_template.cpp | 1 + .../The Introjucer.xcodeproj/project.pbxproj | 8 +- .../Project/jucer_ProjectExport_XCode.h | 2 +- .../Source/Project/jucer_ProjectSaver.h | 31 +-- .../Juce Demo.xcodeproj/project.pbxproj | 8 +- .../Amalgamator.xcodeproj/project.pbxproj | 8 +- .../Plugin Host.xcodeproj/project.pbxproj | 4 + .../JuceDemoPlugin.xcodeproj/project.pbxproj | 4 + .../BinaryBuilder.xcodeproj/project.pbxproj | 8 +- .../HelloWorld.xcodeproj/project.pbxproj | 8 +- juce_amalgamated.cpp | 223 +++++++++++++++++- juce_amalgamated.h | 64 ++++- .../audio_file_formats/juce_AiffAudioFormat.h | 2 +- .../juce_AudioFormatManager.cpp | 2 + .../audio_file_formats/juce_FlacAudioFormat.h | 2 +- .../juce_OggVorbisAudioFormat.cpp | 3 +- .../juce_OggVorbisAudioFormat.h | 2 +- .../juce_QuickTimeAudioFormat.h | 2 +- .../audio_file_formats/juce_WavAudioFormat.h | 2 +- src/core/juce_StandardHeader.h | 2 +- src/io/streams/juce_MemoryInputStream.cpp | 1 + src/juce_app_includes.h | 3 + 31 files changed, 375 insertions(+), 51 deletions(-) diff --git a/Builds/Linux/Makefile b/Builds/Linux/Makefile index ef231624b4..a25e638e26 100644 --- a/Builds/Linux/Makefile +++ b/Builds/Linux/Makefile @@ -53,6 +53,7 @@ OBJECTS := \ $(OBJDIR)/juce_AudioSubsectionReader_65f61a0a.o \ $(OBJDIR)/juce_AudioThumbnail_cb99b4b4.o \ $(OBJDIR)/juce_AudioThumbnailCache_89a7c678.o \ + $(OBJDIR)/juce_CoreAudioFormat_1ce243da.o \ $(OBJDIR)/juce_FlacAudioFormat_19c048f1.o \ $(OBJDIR)/juce_OggVorbisAudioFormat_3f214fc9.o \ $(OBJDIR)/juce_QuickTimeAudioFormat_8ad67271.o \ @@ -456,6 +457,11 @@ $(OBJDIR)/juce_AudioThumbnailCache_89a7c678.o: ../../src/audio/audio_file_format @echo "Compiling juce_AudioThumbnailCache.cpp" @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" +$(OBJDIR)/juce_CoreAudioFormat_1ce243da.o: ../../src/audio/audio_file_formats/juce_CoreAudioFormat.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling juce_CoreAudioFormat.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + $(OBJDIR)/juce_FlacAudioFormat_19c048f1.o: ../../src/audio/audio_file_formats/juce_FlacAudioFormat.cpp -@mkdir -p $(OBJDIR) @echo "Compiling juce_FlacAudioFormat.cpp" diff --git a/Builds/MacOSX/Juce.xcodeproj/project.pbxproj b/Builds/MacOSX/Juce.xcodeproj/project.pbxproj index f857355f43..8a9163874f 100644 --- a/Builds/MacOSX/Juce.xcodeproj/project.pbxproj +++ b/Builds/MacOSX/Juce.xcodeproj/project.pbxproj @@ -20,6 +20,7 @@ FB21B7E6A7CE55D3C0E3C37E = { isa = PBXBuildFile; fileRef = 59597FA0A88A08937801D198; }; C1147D03F1F4D697CC30DD22 = { isa = PBXBuildFile; fileRef = 27C3C51DF2519B519B76E2EE; }; C5CFF5508299C26380465290 = { isa = PBXBuildFile; fileRef = CB32D4EE59D5CA9DB12F944D; }; + 0ACCAC5ABDE686B0CA42BFED = { isa = PBXBuildFile; fileRef = 203AC66FFB20EAD2E7A594BD; }; 2171BD82DA3A6744260CDE58 = { isa = PBXBuildFile; fileRef = E00781B15E47C9CB9E94869D; }; 3C22C15ACEEF0454171D231B = { isa = PBXBuildFile; fileRef = DA868174D4D2059AC1BE7E71; }; 6D421F7B7EE3A149389653C2 = { isa = PBXBuildFile; fileRef = 7CF036906034FABB44D2108F; }; @@ -395,6 +396,8 @@ 7B34E897026857C84399A09C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioThumbnail.h"; path = "../../src/audio/audio_file_formats/juce_AudioThumbnail.h"; sourceTree = "SOURCE_ROOT"; }; CB32D4EE59D5CA9DB12F944D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioThumbnailCache.cpp"; path = "../../src/audio/audio_file_formats/juce_AudioThumbnailCache.cpp"; sourceTree = "SOURCE_ROOT"; }; 3442FA257104DC3F43E7F870 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioThumbnailCache.h"; path = "../../src/audio/audio_file_formats/juce_AudioThumbnailCache.h"; sourceTree = "SOURCE_ROOT"; }; + 203AC66FFB20EAD2E7A594BD = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CoreAudioFormat.cpp"; path = "../../src/audio/audio_file_formats/juce_CoreAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + C9F1015CA457A61082398E34 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CoreAudioFormat.h"; path = "../../src/audio/audio_file_formats/juce_CoreAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; E00781B15E47C9CB9E94869D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FlacAudioFormat.cpp"; path = "../../src/audio/audio_file_formats/juce_FlacAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; 7C06BD13BF7E0097EB0A8D08 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FlacAudioFormat.h"; path = "../../src/audio/audio_file_formats/juce_FlacAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; DA868174D4D2059AC1BE7E71 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OggVorbisAudioFormat.cpp"; path = "../../src/audio/audio_file_formats/juce_OggVorbisAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; @@ -1145,6 +1148,8 @@ 7B34E897026857C84399A09C, CB32D4EE59D5CA9DB12F944D, 3442FA257104DC3F43E7F870, + 203AC66FFB20EAD2E7A594BD, + C9F1015CA457A61082398E34, E00781B15E47C9CB9E94869D, 7C06BD13BF7E0097EB0A8D08, DA868174D4D2059AC1BE7E71, @@ -2078,6 +2083,7 @@ FB21B7E6A7CE55D3C0E3C37E, C1147D03F1F4D697CC30DD22, C5CFF5508299C26380465290, + 0ACCAC5ABDE686B0CA42BFED, 2171BD82DA3A6744260CDE58, 3C22C15ACEEF0454171D231B, 6D421F7B7EE3A149389653C2, diff --git a/Builds/VisualStudio2005/Juce.vcproj b/Builds/VisualStudio2005/Juce.vcproj index ef4d86b81f..1be6dadff2 100644 --- a/Builds/VisualStudio2005/Juce.vcproj +++ b/Builds/VisualStudio2005/Juce.vcproj @@ -134,6 +134,8 @@ + + diff --git a/Builds/VisualStudio2008/Juce.vcproj b/Builds/VisualStudio2008/Juce.vcproj index ab9c68ec36..1d0b930d3d 100644 --- a/Builds/VisualStudio2008/Juce.vcproj +++ b/Builds/VisualStudio2008/Juce.vcproj @@ -134,6 +134,8 @@ + + diff --git a/Builds/VisualStudio2008_DLL/Juce.vcproj b/Builds/VisualStudio2008_DLL/Juce.vcproj index 771b7f60a6..656e6ade54 100644 --- a/Builds/VisualStudio2008_DLL/Juce.vcproj +++ b/Builds/VisualStudio2008_DLL/Juce.vcproj @@ -136,6 +136,8 @@ + + diff --git a/Builds/VisualStudio2010/Juce.vcxproj b/Builds/VisualStudio2010/Juce.vcxproj index 199dabcbd6..55c454fb45 100644 --- a/Builds/VisualStudio2010/Juce.vcxproj +++ b/Builds/VisualStudio2010/Juce.vcxproj @@ -136,6 +136,7 @@ + @@ -471,6 +472,7 @@ + diff --git a/Builds/VisualStudio2010/Juce.vcxproj.filters b/Builds/VisualStudio2010/Juce.vcxproj.filters index 6650399d7e..5e46f51d30 100644 --- a/Builds/VisualStudio2010/Juce.vcxproj.filters +++ b/Builds/VisualStudio2010/Juce.vcxproj.filters @@ -229,6 +229,9 @@ Juce\Source\audio\audio_file_formats + + Juce\Source\audio\audio_file_formats + Juce\Source\audio\audio_file_formats @@ -1341,6 +1344,9 @@ Juce\Source\audio\audio_file_formats + + Juce\Source\audio\audio_file_formats + Juce\Source\audio\audio_file_formats diff --git a/Builds/iOS/Juce.xcodeproj/project.pbxproj b/Builds/iOS/Juce.xcodeproj/project.pbxproj index 69fce832dc..4579574a97 100644 --- a/Builds/iOS/Juce.xcodeproj/project.pbxproj +++ b/Builds/iOS/Juce.xcodeproj/project.pbxproj @@ -20,6 +20,7 @@ FB21B7E6A7CE55D3C0E3C37E = { isa = PBXBuildFile; fileRef = 59597FA0A88A08937801D198; }; C1147D03F1F4D697CC30DD22 = { isa = PBXBuildFile; fileRef = 27C3C51DF2519B519B76E2EE; }; C5CFF5508299C26380465290 = { isa = PBXBuildFile; fileRef = CB32D4EE59D5CA9DB12F944D; }; + 0ACCAC5ABDE686B0CA42BFED = { isa = PBXBuildFile; fileRef = 203AC66FFB20EAD2E7A594BD; }; 2171BD82DA3A6744260CDE58 = { isa = PBXBuildFile; fileRef = E00781B15E47C9CB9E94869D; }; 3C22C15ACEEF0454171D231B = { isa = PBXBuildFile; fileRef = DA868174D4D2059AC1BE7E71; }; 6D421F7B7EE3A149389653C2 = { isa = PBXBuildFile; fileRef = 7CF036906034FABB44D2108F; }; @@ -395,6 +396,8 @@ 7B34E897026857C84399A09C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioThumbnail.h"; path = "../../src/audio/audio_file_formats/juce_AudioThumbnail.h"; sourceTree = "SOURCE_ROOT"; }; CB32D4EE59D5CA9DB12F944D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioThumbnailCache.cpp"; path = "../../src/audio/audio_file_formats/juce_AudioThumbnailCache.cpp"; sourceTree = "SOURCE_ROOT"; }; 3442FA257104DC3F43E7F870 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioThumbnailCache.h"; path = "../../src/audio/audio_file_formats/juce_AudioThumbnailCache.h"; sourceTree = "SOURCE_ROOT"; }; + 203AC66FFB20EAD2E7A594BD = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CoreAudioFormat.cpp"; path = "../../src/audio/audio_file_formats/juce_CoreAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + C9F1015CA457A61082398E34 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CoreAudioFormat.h"; path = "../../src/audio/audio_file_formats/juce_CoreAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; E00781B15E47C9CB9E94869D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FlacAudioFormat.cpp"; path = "../../src/audio/audio_file_formats/juce_FlacAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; 7C06BD13BF7E0097EB0A8D08 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FlacAudioFormat.h"; path = "../../src/audio/audio_file_formats/juce_FlacAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; DA868174D4D2059AC1BE7E71 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OggVorbisAudioFormat.cpp"; path = "../../src/audio/audio_file_formats/juce_OggVorbisAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; @@ -1145,6 +1148,8 @@ 7B34E897026857C84399A09C, CB32D4EE59D5CA9DB12F944D, 3442FA257104DC3F43E7F870, + 203AC66FFB20EAD2E7A594BD, + C9F1015CA457A61082398E34, E00781B15E47C9CB9E94869D, 7C06BD13BF7E0097EB0A8D08, DA868174D4D2059AC1BE7E71, @@ -2082,6 +2087,7 @@ FB21B7E6A7CE55D3C0E3C37E, C1147D03F1F4D697CC30DD22, C5CFF5508299C26380465290, + 0ACCAC5ABDE686B0CA42BFED, 2171BD82DA3A6744260CDE58, 3C22C15ACEEF0454171D231B, 6D421F7B7EE3A149389653C2, diff --git a/Juce.jucer b/Juce.jucer index dea524483b..0528d22767 100644 --- a/Juce.jucer +++ b/Juce.jucer @@ -101,6 +101,10 @@ resource="0" file="src/audio/audio_file_formats/juce_AudioThumbnailCache.cpp"/> + + writeToStream (mo, String::empty); - - if (! FileHelpers::overwriteFileWithNewDataIfDifferent (projectFile, mo)) - errors.add ("Couldn't write to the target file!"); + replaceFileIfDifferent (projectFile, mo); } } @@ -278,17 +276,6 @@ private: } } - bool replaceFileIfDifferent (const File& f, const MemoryOutputStream& newData) - { - if (! FileHelpers::overwriteFileWithNewDataIfDifferent (f, newData)) - { - errors.add ("Can't write to file: " + f.getFullPathName()); - return false; - } - - return true; - } - void writeBinaryDataFiles() { binaryDataCpp = project.getGeneratedCodeFolder().getChildFile ("BinaryData.cpp"); @@ -323,9 +310,7 @@ private: ScopedPointer exporter (project.createExporter (i)); std::cout << "Writing files for: " << exporter->getName() << std::endl; - const File targetFolder (exporter->getTargetFolder()); - - if (targetFolder.createDirectory()) + if (exporter->getTargetFolder().createDirectory()) { // start with a copy of the basic files, as each exporter may modify it. const ValueTree generatedGroupCopy (generatedFilesGroup.getNode().createCopy()); @@ -357,11 +342,15 @@ private: } } - File getSourceWrapperCpp (int fileIndex) const + bool replaceFileIfDifferent (const File& f, const MemoryOutputStream& newData) { - return project.getGeneratedCodeFolder() - .getChildFile (project.getJuceSourceFilenameRoot() + (fileIndex != 0 ? String (fileIndex) : String::empty)) - .withFileExtension (".cpp"); + if (! FileHelpers::overwriteFileWithNewDataIfDifferent (f, newData)) + { + errors.add ("Can't write to file: " + f.getFullPathName()); + return false; + } + + return true; } JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProjectSaver); diff --git a/extras/JuceDemo/Builds/MacOSX/Juce Demo.xcodeproj/project.pbxproj b/extras/JuceDemo/Builds/MacOSX/Juce Demo.xcodeproj/project.pbxproj index cc2247cd3e..f5a53c20e1 100644 --- a/extras/JuceDemo/Builds/MacOSX/Juce Demo.xcodeproj/project.pbxproj +++ b/extras/JuceDemo/Builds/MacOSX/Juce Demo.xcodeproj/project.pbxproj @@ -17,6 +17,7 @@ F1BAE9DCD179C8784FF28F8D = { isa = PBXBuildFile; fileRef = 4A96850C150C1C6D87A0D21A; }; B9911F3AC6CADFB47D1EA8D7 = { isa = PBXBuildFile; fileRef = 4D3E0D18D24F78B6BDE0E5DA; }; 452052BBDBAF17DCC06EF521 = { isa = PBXBuildFile; fileRef = E0C3359BB4B5260CEB917D46; }; + 36AEC0EAE7AB9D061AD9EFEF = { isa = PBXBuildFile; fileRef = 7B6D428682221857EAEA1C7D; }; C0A3C433D146C7E1FFCADFB2 = { isa = PBXBuildFile; fileRef = 4ADECB09FD213B2E910EA229; }; 78A66C2F9A9E2E6D011D8E5E = { isa = PBXBuildFile; fileRef = 885A20D277AD743C21C822B5; }; CE5C46E66485B7D77B5ADB4E = { isa = PBXBuildFile; fileRef = 42291DB48BF81754D90FE200; }; @@ -56,6 +57,7 @@ 4A96850C150C1C6D87A0D21A = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 4D3E0D18D24F78B6BDE0E5DA = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = System/Library/Frameworks/QTKit.framework; sourceTree = SDKROOT; }; E0C3359BB4B5260CEB917D46 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = System/Library/Frameworks/QuickTime.framework; sourceTree = SDKROOT; }; + 7B6D428682221857EAEA1C7D = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; 39B98C60B57B831FE5215CDD = { isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = JuceDemo.app; sourceTree = "BUILT_PRODUCTS_DIR"; }; 1A9DEA62F6A3CD1FB5CF105B = { isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Info.plist; sourceTree = "SOURCE_ROOT"; }; 4ADECB09FD213B2E910EA229 = { isa = PBXFileReference; lastKnownFileType = file.icns; name = Icon.icns; path = Icon.icns; sourceTree = "SOURCE_ROOT"; }; @@ -169,7 +171,8 @@ 85E860BFDA9D53EF77C08873, 4A96850C150C1C6D87A0D21A, 4D3E0D18D24F78B6BDE0E5DA, - E0C3359BB4B5260CEB917D46 ); name = Frameworks; sourceTree = ""; }; + E0C3359BB4B5260CEB917D46, + 7B6D428682221857EAEA1C7D ); name = Frameworks; sourceTree = ""; }; 3F406773369804D0FBF2789A = { isa = PBXGroup; children = ( 39B98C60B57B831FE5215CDD ); name = Products; sourceTree = ""; }; D6A4B94A747BFCF299B17932 = { isa = PBXGroup; children = ( @@ -289,7 +292,8 @@ C1437C4A64EB72D2A86729D3, F1BAE9DCD179C8784FF28F8D, B9911F3AC6CADFB47D1EA8D7, - 452052BBDBAF17DCC06EF521 ); runOnlyForDeploymentPostprocessing = 0; }; + 452052BBDBAF17DCC06EF521, + 36AEC0EAE7AB9D061AD9EFEF ); runOnlyForDeploymentPostprocessing = 0; }; F26B86DEACDEE5DFB60E10B1 = { isa = PBXNativeTarget; buildConfigurationList = C264FE1BF62B589B345E0C81; buildPhases = ( AE930F136F638C3C939F7146, 7A3A0C722E5F96990CA1B5F2, diff --git a/extras/amalgamator/Builds/MacOSX/Amalgamator.xcodeproj/project.pbxproj b/extras/amalgamator/Builds/MacOSX/Amalgamator.xcodeproj/project.pbxproj index 6f68b391ac..aa86540b4a 100644 --- a/extras/amalgamator/Builds/MacOSX/Amalgamator.xcodeproj/project.pbxproj +++ b/extras/amalgamator/Builds/MacOSX/Amalgamator.xcodeproj/project.pbxproj @@ -17,6 +17,7 @@ B1AED479824B53CD42E2CF43 = { isa = PBXBuildFile; fileRef = 099980A9C6DE98B28A9113C0; }; 88941AD8669C6AF9710FE99D = { isa = PBXBuildFile; fileRef = 0D21F7B58311040CB1C01680; }; 14235D597C71A211C34E35D7 = { isa = PBXBuildFile; fileRef = BFB630386598A251EE72BEFC; }; + F5A1BB88887D285B1DBA1FA4 = { isa = PBXBuildFile; fileRef = 3B604C2333F4A4ACEDDA5D33; }; E88444FD7BDE1A966EC392A5 = { isa = PBXBuildFile; fileRef = 195A51222E92C3A93F2D6FFA; }; 4D2A24E908E9A226C5A3D259 = { isa = PBXBuildFile; fileRef = F4A7A8C689EAE11C52879AFF; }; EA2AB86C7C92284FED89D52F = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; @@ -30,6 +31,7 @@ 099980A9C6DE98B28A9113C0 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 0D21F7B58311040CB1C01680 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = System/Library/Frameworks/QTKit.framework; sourceTree = SDKROOT; }; BFB630386598A251EE72BEFC = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = System/Library/Frameworks/QuickTime.framework; sourceTree = SDKROOT; }; + 3B604C2333F4A4ACEDDA5D33 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; F8AC870D665D0F64E9129D83 = { isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = amalgamator; sourceTree = "BUILT_PRODUCTS_DIR"; }; 195A51222E92C3A93F2D6FFA = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; }; AE2AAA898543257DC9074051 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; }; @@ -53,7 +55,8 @@ 44DC6A5C8B7FDF348BB1B939, 099980A9C6DE98B28A9113C0, 0D21F7B58311040CB1C01680, - BFB630386598A251EE72BEFC ); name = Frameworks; sourceTree = ""; }; + BFB630386598A251EE72BEFC, + 3B604C2333F4A4ACEDDA5D33 ); name = Frameworks; sourceTree = ""; }; FE436211E76A80250EE3B950 = { isa = PBXGroup; children = ( F8AC870D665D0F64E9129D83 ); name = Products; sourceTree = ""; }; 5DCB99F3A59154C29483AE9B = { isa = PBXGroup; children = ( @@ -141,7 +144,8 @@ 804677E715BD0D17AB576A99, B1AED479824B53CD42E2CF43, 88941AD8669C6AF9710FE99D, - 14235D597C71A211C34E35D7 ); runOnlyForDeploymentPostprocessing = 0; }; + 14235D597C71A211C34E35D7, + F5A1BB88887D285B1DBA1FA4 ); runOnlyForDeploymentPostprocessing = 0; }; C15E717C5DA07024CAFE5177 = { isa = PBXNativeTarget; buildConfigurationList = 9257F9B896FDE4D0483F4D47; buildPhases = ( 6D960AB00F450781A680A10C, 492D061FDF3111EE0092E6B8, diff --git a/extras/audio plugin host/Builds/MacOSX/Plugin Host.xcodeproj/project.pbxproj b/extras/audio plugin host/Builds/MacOSX/Plugin Host.xcodeproj/project.pbxproj index dca6ef0ac7..7ee223b59a 100644 --- a/extras/audio plugin host/Builds/MacOSX/Plugin Host.xcodeproj/project.pbxproj +++ b/extras/audio plugin host/Builds/MacOSX/Plugin Host.xcodeproj/project.pbxproj @@ -17,6 +17,7 @@ 0344374EE00EBC906608CCB7 = { isa = PBXBuildFile; fileRef = 4C20D27E2491F086AEA71044; }; CB3A6CACC45FC3DD9525E611 = { isa = PBXBuildFile; fileRef = 4FC85A8AE0D46CDFD5E61304; }; 57CAAF2DDA340BF5E764325B = { isa = PBXBuildFile; fileRef = F25D830DC35A0A240297BA70; }; + 48371E4CE630812E31DF1C28 = { isa = PBXBuildFile; fileRef = 8D069FF891B70C7001E05AB7; }; F653CD6DB1550002BFB3EE47 = { isa = PBXBuildFile; fileRef = 77964D54171CB8F24F616C9F; }; 71D47E0ED5F6A90682A5707C = { isa = PBXBuildFile; fileRef = BFD865C4B317E01BDD319AB0; }; A778E9C39DD11828306AF2E8 = { isa = PBXBuildFile; fileRef = 178E79E571E8D29BCC89FDD8; }; @@ -39,6 +40,7 @@ 4C20D27E2491F086AEA71044 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 4FC85A8AE0D46CDFD5E61304 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = System/Library/Frameworks/QTKit.framework; sourceTree = SDKROOT; }; F25D830DC35A0A240297BA70 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = System/Library/Frameworks/QuickTime.framework; sourceTree = SDKROOT; }; + 8D069FF891B70C7001E05AB7 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; 77964D54171CB8F24F616C9F = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; }; BFD865C4B317E01BDD319AB0 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; }; 3B43D9C2C41077380D379A07 = { isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Plugin Host.app"; sourceTree = "BUILT_PRODUCTS_DIR"; }; @@ -89,6 +91,7 @@ 4C20D27E2491F086AEA71044, 4FC85A8AE0D46CDFD5E61304, F25D830DC35A0A240297BA70, + 8D069FF891B70C7001E05AB7, 77964D54171CB8F24F616C9F, BFD865C4B317E01BDD319AB0 ); name = Frameworks; sourceTree = ""; }; 31DAB5E5452DF8F91208B6C4 = { isa = PBXGroup; children = ( @@ -190,6 +193,7 @@ 0344374EE00EBC906608CCB7, CB3A6CACC45FC3DD9525E611, 57CAAF2DDA340BF5E764325B, + 48371E4CE630812E31DF1C28, F653CD6DB1550002BFB3EE47, 71D47E0ED5F6A90682A5707C ); runOnlyForDeploymentPostprocessing = 0; }; 04F5D340BA63D9F8DE145DFB = { isa = PBXNativeTarget; buildConfigurationList = D4FE5C8CF4B04CB35C5449CB; buildPhases = ( diff --git a/extras/audio plugins/demo/Builds/MacOSX/JuceDemoPlugin.xcodeproj/project.pbxproj b/extras/audio plugins/demo/Builds/MacOSX/JuceDemoPlugin.xcodeproj/project.pbxproj index 190250d5d0..7023e3f029 100644 --- a/extras/audio plugins/demo/Builds/MacOSX/JuceDemoPlugin.xcodeproj/project.pbxproj +++ b/extras/audio plugins/demo/Builds/MacOSX/JuceDemoPlugin.xcodeproj/project.pbxproj @@ -17,6 +17,7 @@ 68746D242F6A6102FDD5D03D = { isa = PBXBuildFile; fileRef = B050085463EEB5F8367314CB; }; 205AA28314AC784F2CF1FA98 = { isa = PBXBuildFile; fileRef = B4F88060202011416CB3278B; }; CBE9E6042991B0677E3136D2 = { isa = PBXBuildFile; fileRef = 678CC9E413A7CF979964CEF7; }; + AC674433358C3691C8AC20AF = { isa = PBXBuildFile; fileRef = E226D5DEE103B1E298BD6E3E; }; 5B83F34400A1B5844680E1CE = { isa = PBXBuildFile; fileRef = DBC6733A66786D64D63E7016; }; E504A4E425435E78197183F3 = { isa = PBXBuildFile; fileRef = 2307ABAB0264959E640E9E37; }; AC674433358C3691C8AC20AF = { isa = PBXBuildFile; fileRef = E226D5DEE103B1E298BD6E3E; }; @@ -63,6 +64,7 @@ B050085463EEB5F8367314CB = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; B4F88060202011416CB3278B = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = System/Library/Frameworks/QTKit.framework; sourceTree = SDKROOT; }; 678CC9E413A7CF979964CEF7 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = System/Library/Frameworks/QuickTime.framework; sourceTree = SDKROOT; }; + E226D5DEE103B1E298BD6E3E = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; DBC6733A66786D64D63E7016 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; }; 2307ABAB0264959E640E9E37 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; }; E226D5DEE103B1E298BD6E3E = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; @@ -218,6 +220,7 @@ B050085463EEB5F8367314CB, B4F88060202011416CB3278B, 678CC9E413A7CF979964CEF7, + E226D5DEE103B1E298BD6E3E, DBC6733A66786D64D63E7016, 2307ABAB0264959E640E9E37, E226D5DEE103B1E298BD6E3E ); name = Frameworks; sourceTree = ""; }; @@ -354,6 +357,7 @@ 68746D242F6A6102FDD5D03D, 205AA28314AC784F2CF1FA98, CBE9E6042991B0677E3136D2, + AC674433358C3691C8AC20AF, 5B83F34400A1B5844680E1CE, E504A4E425435E78197183F3, AC674433358C3691C8AC20AF ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/extras/binarybuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj b/extras/binarybuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj index f73c1423c9..c38db0fe66 100644 --- a/extras/binarybuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj +++ b/extras/binarybuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj @@ -17,6 +17,7 @@ 489C322518A3C4F4DC8E8FE4 = { isa = PBXBuildFile; fileRef = 9088DD545C3708EA053CC371; }; 008367830DF5DB21FBAAA93F = { isa = PBXBuildFile; fileRef = 94105561197974333B7BD632; }; 9B12BA0402DA13494DFAE588 = { isa = PBXBuildFile; fileRef = 36A58EE4FBF01289682D7DAD; }; + 8C9019232ED599839765DF56 = { isa = PBXBuildFile; fileRef = C25FAADEC95C14D468751DD4; }; 707392A801368BCEE86E5256 = { isa = PBXBuildFile; fileRef = 9049BFDEB4FA33D1BAC82FAC; }; D51982959E41125E4F4E92FA = { isa = PBXBuildFile; fileRef = 8B9506611F425243DD224A90; }; 7119161802FA9887683494D0 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; @@ -30,6 +31,7 @@ 9088DD545C3708EA053CC371 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 94105561197974333B7BD632 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = System/Library/Frameworks/QTKit.framework; sourceTree = SDKROOT; }; 36A58EE4FBF01289682D7DAD = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = System/Library/Frameworks/QuickTime.framework; sourceTree = SDKROOT; }; + C25FAADEC95C14D468751DD4 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; 7FABD4A9FCB57F9C63BD5D34 = { isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = BinaryBuilder; sourceTree = "BUILT_PRODUCTS_DIR"; }; 9049BFDEB4FA33D1BAC82FAC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; }; 351908352BAB95A544A300F2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; }; @@ -53,7 +55,8 @@ DBDAB8F811D84F6C055C78DA, 9088DD545C3708EA053CC371, 94105561197974333B7BD632, - 36A58EE4FBF01289682D7DAD ); name = Frameworks; sourceTree = ""; }; + 36A58EE4FBF01289682D7DAD, + C25FAADEC95C14D468751DD4 ); name = Frameworks; sourceTree = ""; }; 8532B0CC7DC2F05D888E79F2 = { isa = PBXGroup; children = ( 7FABD4A9FCB57F9C63BD5D34 ); name = Products; sourceTree = ""; }; 07E3546C6DFA9084D23A33E9 = { isa = PBXGroup; children = ( @@ -141,7 +144,8 @@ 0735D492AB157E5F26F2293A, 489C322518A3C4F4DC8E8FE4, 008367830DF5DB21FBAAA93F, - 9B12BA0402DA13494DFAE588 ); runOnlyForDeploymentPostprocessing = 0; }; + 9B12BA0402DA13494DFAE588, + 8C9019232ED599839765DF56 ); runOnlyForDeploymentPostprocessing = 0; }; 495DDE27E308E15C44991018 = { isa = PBXNativeTarget; buildConfigurationList = 195657633D555407C2EA0CE8; buildPhases = ( F485685C969D78B9212B61AD, C02C54CA659982168A3DA559, diff --git a/extras/example projects/Builds/MacOSX/HelloWorld.xcodeproj/project.pbxproj b/extras/example projects/Builds/MacOSX/HelloWorld.xcodeproj/project.pbxproj index 4d3064c520..8cde3f120c 100644 --- a/extras/example projects/Builds/MacOSX/HelloWorld.xcodeproj/project.pbxproj +++ b/extras/example projects/Builds/MacOSX/HelloWorld.xcodeproj/project.pbxproj @@ -17,6 +17,7 @@ 9EA4F1C0E2356AB5C07CE95E = { isa = PBXBuildFile; fileRef = E6809DE026C8BEAB082B3DEB; }; 569A272ED68671F2FE9903B8 = { isa = PBXBuildFile; fileRef = EA28150CE20A1AF43E5A30AB; }; E12A6AAFEC6BB91A41D85FF2 = { isa = PBXBuildFile; fileRef = 8DBD4D8FD571C84A6C0CD817; }; + D397D8CEF8663F449B4439C0 = { isa = PBXBuildFile; fileRef = 18665A7A93EDBA956B64774E; }; C67B5243DBC7218FEC5DBCC0 = { isa = PBXBuildFile; fileRef = E7507E799D8BDA92BDB78915; }; 9B11A7532637EC12F1DC4B2E = { isa = PBXBuildFile; fileRef = 0DB195C2B3538434D7D20B51; }; CFFBB821ECB7D85603624533 = { isa = PBXBuildFile; fileRef = 57FFE120531343D50B7D2D28; }; @@ -34,6 +35,7 @@ E6809DE026C8BEAB082B3DEB = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; EA28150CE20A1AF43E5A30AB = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = System/Library/Frameworks/QTKit.framework; sourceTree = SDKROOT; }; 8DBD4D8FD571C84A6C0CD817 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = System/Library/Frameworks/QuickTime.framework; sourceTree = SDKROOT; }; + 18665A7A93EDBA956B64774E = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; D5A29444C637255D66ACB7AE = { isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HelloWorld.app; sourceTree = "BUILT_PRODUCTS_DIR"; }; B786F246076E6F5D363A6A2C = { isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Info.plist; sourceTree = "SOURCE_ROOT"; }; E7507E799D8BDA92BDB78915 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; }; @@ -69,7 +71,8 @@ 22D27893FB59F52DF84AD344, E6809DE026C8BEAB082B3DEB, EA28150CE20A1AF43E5A30AB, - 8DBD4D8FD571C84A6C0CD817 ); name = Frameworks; sourceTree = ""; }; + 8DBD4D8FD571C84A6C0CD817, + 18665A7A93EDBA956B64774E ); name = Frameworks; sourceTree = ""; }; DC3A70675753A61E8C7CD36B = { isa = PBXGroup; children = ( D5A29444C637255D66ACB7AE ); name = Products; sourceTree = ""; }; 4297D3C9A6348BA224516847 = { isa = PBXGroup; children = ( @@ -163,7 +166,8 @@ 6D3C942E85A6141029E184A4, 9EA4F1C0E2356AB5C07CE95E, 569A272ED68671F2FE9903B8, - E12A6AAFEC6BB91A41D85FF2 ); runOnlyForDeploymentPostprocessing = 0; }; + E12A6AAFEC6BB91A41D85FF2, + D397D8CEF8663F449B4439C0 ); runOnlyForDeploymentPostprocessing = 0; }; 9F559EB2CC99871D47887B82 = { isa = PBXNativeTarget; buildConfigurationList = 6F5E160F06E7FAD8B5C96752; buildPhases = ( 4B8D17F77F2E2E7A2419CB17, 172414663F1A38D78D2B00C3, diff --git a/juce_amalgamated.cpp b/juce_amalgamated.cpp index 9e67b1ea67..a4557bcdc3 100644 --- a/juce_amalgamated.cpp +++ b/juce_amalgamated.cpp @@ -10433,6 +10433,7 @@ public: static String createRandomWideCharString() { juce_wchar buffer [50] = { 0 }; + Random r; for (int i = 0; i < numElementsInArray (buffer) - 1; ++i) { @@ -22587,6 +22588,7 @@ void AudioFormatManager::registerBasicFormats() #if JUCE_MAC registerFormat (new AiffAudioFormat(), true); registerFormat (new WavAudioFormat(), false); + registerFormat (new CoreAudioFormat(), false); #else registerFormat (new WavAudioFormat(), true); registerFormat (new AiffAudioFormat(), false); @@ -108434,6 +108436,219 @@ END_JUCE_NAMESPACE #if JUCE_BUILD_NATIVE && ! JUCE_ONLY_BUILD_CORE_LIBRARY +/*** Start of inlined file: juce_CoreAudioFormat.cpp ***/ +#if JUCE_MAC || JUCE_IOS + +#include + +BEGIN_JUCE_NAMESPACE + +namespace +{ + const char* const coreAudioFormatName = "CoreAudio supported file"; + + StringArray findFileExtensionsForCoreAudioCodecs() + { + StringArray extensionsArray; + CFMutableArrayRef extensions = CFArrayCreateMutable (0, 0, 0); + UInt32 sizeOfArray = sizeof (CFMutableArrayRef); + + if (AudioFileGetGlobalInfo (kAudioFileGlobalInfo_AllExtensions, 0, 0, &sizeOfArray, &extensions) == noErr) + { + const CFIndex numValues = CFArrayGetCount (extensions); + + for (CFIndex i = 0; i < numValues; ++i) + extensionsArray.add ("." + String::fromCFString ((CFStringRef) CFArrayGetValueAtIndex (extensions, i))); + } + + return extensionsArray; + } +} + +class CoreAudioReader : public AudioFormatReader +{ +public: + + CoreAudioReader (InputStream* const inp) + : AudioFormatReader (inp, TRANS (coreAudioFormatName)), + ok (false) + { + usesFloatingPointData = true; + + OSStatus status = AudioFileOpenWithCallbacks (this, + &readCallback, + 0, // write needs to be null to avoid permisisions errors + &getSizeCallback, + 0, // setSize needs to be null to avoid permisisions errors + 0, // AudioFileTypeID inFileTypeHint + &audioFileID); + if (status == noErr) + { + status = ExtAudioFileWrapAudioFileID (audioFileID, false, &audioFileRef); + + if (status == noErr) + { + AudioStreamBasicDescription sourceAudioFormat; + UInt32 audioStreamBasicDescriptionSize = sizeof (AudioStreamBasicDescription); + ExtAudioFileGetProperty (audioFileRef, + kExtAudioFileProperty_FileDataFormat, + &audioStreamBasicDescriptionSize, + &sourceAudioFormat); + + numChannels = sourceAudioFormat.mChannelsPerFrame; + sampleRate = sourceAudioFormat.mSampleRate; + bitsPerSample = sourceAudioFormat.mBitsPerChannel; + + UInt32 sizeOfLengthProperty = sizeof (int64); + ExtAudioFileGetProperty (audioFileRef, + kExtAudioFileProperty_FileLengthFrames, + &sizeOfLengthProperty, + &lengthInSamples); + + destinationAudioFormat.mSampleRate = sampleRate; + destinationAudioFormat.mFormatID = kAudioFormatLinearPCM; + destinationAudioFormat.mFormatFlags = kLinearPCMFormatFlagIsFloat | kLinearPCMFormatFlagIsNonInterleaved; + destinationAudioFormat.mBitsPerChannel = sizeof (float) * 8; + destinationAudioFormat.mChannelsPerFrame = numChannels; + destinationAudioFormat.mBytesPerFrame = sizeof (float); + destinationAudioFormat.mFramesPerPacket = 1; + destinationAudioFormat.mBytesPerPacket = destinationAudioFormat.mFramesPerPacket * destinationAudioFormat.mBytesPerFrame; + + status = ExtAudioFileSetProperty (audioFileRef, + kExtAudioFileProperty_ClientDataFormat, + sizeof (AudioStreamBasicDescription), + &destinationAudioFormat); + if (status == noErr) + { + bufferList.malloc (1, sizeof (AudioBufferList) + numChannels * sizeof (AudioBuffer)); + bufferList->mNumberBuffers = numChannels; + ok = true; + } + } + } + } + + ~CoreAudioReader() + { + ExtAudioFileDispose (audioFileRef); + AudioFileClose (audioFileID); + } + + bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, + int64 startSampleInFile, int numSamples) + { + OSStatus status = ExtAudioFileSeek (audioFileRef, startSampleInFile); + if (status != noErr) + return false; + + const int numBytes = numSamples * sizeof (float); + audioDataBlock.ensureSize (numBytes * numChannels, false); + float* data = static_cast (audioDataBlock.getData()); + + for (int j = numChannels; --j >= 0;) + { + bufferList->mBuffers[j].mNumberChannels = 1; + bufferList->mBuffers[j].mDataByteSize = numBytes; + bufferList->mBuffers[j].mData = data; + data += numSamples; + } + + UInt32 numFramesToRead = numSamples; + status = ExtAudioFileRead (audioFileRef, &numFramesToRead, bufferList); + if (status != noErr) + return false; + + for (int i = numDestChannels; --i >= 0;) + { + if (destSamples[i] != nullptr) + { + if (i < numChannels) + memcpy (destSamples[i] + startOffsetInDestBuffer, bufferList->mBuffers[i].mData, numBytes); + else + zeromem (destSamples[i] + startOffsetInDestBuffer, numBytes); + } + } + + return true; + } + + bool ok; + +private: + AudioFileID audioFileID; + ExtAudioFileRef audioFileRef; + AudioStreamBasicDescription destinationAudioFormat; + MemoryBlock audioDataBlock; + HeapBlock bufferList; + + static SInt64 getSizeCallback (void* inClientData) + { + return static_cast (inClientData)->input->getTotalLength(); + } + + static OSStatus readCallback (void* inClientData, + SInt64 inPosition, + UInt32 requestCount, + void* buffer, + UInt32* actualCount) + { + CoreAudioReader* const reader = static_cast (inClientData); + + reader->input->setPosition (inPosition); + *actualCount = reader->input->read (buffer, requestCount); + + return noErr; + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CoreAudioReader); +}; + +CoreAudioFormat::CoreAudioFormat() + : AudioFormat (TRANS (coreAudioFormatName), findFileExtensionsForCoreAudioCodecs()) +{ +} + +CoreAudioFormat::~CoreAudioFormat() {} + +const Array CoreAudioFormat::getPossibleSampleRates() { return Array(); } +const Array CoreAudioFormat::getPossibleBitDepths() { return Array(); } + +bool CoreAudioFormat::canDoStereo() { return true; } +bool CoreAudioFormat::canDoMono() { return true; } + +AudioFormatReader* CoreAudioFormat::createReaderFor (InputStream* sourceStream, + bool deleteStreamIfOpeningFails) +{ + ScopedPointer r (new CoreAudioReader (sourceStream)); + + if (r->ok) + return r.release(); + + if (! deleteStreamIfOpeningFails) + r->input = nullptr; + + return nullptr; +} + +AudioFormatWriter* CoreAudioFormat::createWriterFor (OutputStream* streamToWriteTo, + double sampleRateToUse, + unsigned int numberOfChannels, + int bitsPerSample, + const StringPairArray& metadataValues, + int qualityOptionIndex) +{ + jassertfalse; // not yet implemented! + return nullptr; +} + +END_JUCE_NAMESPACE + +#endif + +/*** End of inlined file: juce_CoreAudioFormat.cpp ***/ + + + /*** Start of inlined file: juce_FlacAudioFormat.cpp ***/ #if JUCE_USE_FLAC @@ -131684,7 +131899,6 @@ END_JUCE_NAMESPACE /*** End of inlined file: juce_FlacAudioFormat.cpp ***/ - /*** Start of inlined file: juce_OggVorbisAudioFormat.cpp ***/ #if JUCE_USE_OGGVORBIS @@ -194694,8 +194908,7 @@ public: { for (int i = numDestChannels; --i >= 0;) if (destSamples[i] != nullptr) - zeromem (destSamples[i] + startOffsetInDestBuffer, - sizeof (int) * numSamples); + zeromem (destSamples[i] + startOffsetInDestBuffer, sizeof (int) * numSamples); } return true; @@ -281982,8 +282195,8 @@ bool NSViewComponentPeer::handleKeyEvent (NSEvent* ev, bool isKeyDown) String unmodified (nsStringToJuce ([ev charactersIgnoringModifiers])); int keyCode = getKeyCodeFromEvent (ev); - DBG ("unicode: " + unicode + " " + String::toHexString ((int) unicode[0])); - DBG ("unmodified: " + unmodified + " " + String::toHexString ((int) unmodified[0])); + //DBG ("unicode: " + unicode + " " + String::toHexString ((int) unicode[0])); + //DBG ("unmodified: " + unmodified + " " + String::toHexString ((int) unmodified[0])); if (unicode.isNotEmpty() || keyCode != 0) { diff --git a/juce_amalgamated.h b/juce_amalgamated.h index 3a36176029..09f681f635 100644 --- a/juce_amalgamated.h +++ b/juce_amalgamated.h @@ -73,7 +73,7 @@ namespace JuceDummyNamespace {} */ #define JUCE_MAJOR_VERSION 1 #define JUCE_MINOR_VERSION 54 -#define JUCE_BUILDNUMBER 17 +#define JUCE_BUILDNUMBER 18 /** Current Juce version number. @@ -36941,7 +36941,7 @@ public: int qualityOptionIndex); private: - JUCE_LEAK_DETECTOR (AiffAudioFormat); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(AiffAudioFormat); }; #endif // __JUCE_AIFFAUDIOFORMAT_JUCEHEADER__ @@ -37725,6 +37725,58 @@ private: /*** End of inlined file: juce_AudioThumbnailCache.h ***/ +#endif +#ifndef __JUCE_COREAUDIOFORMAT_JUCEHEADER__ + +/*** Start of inlined file: juce_CoreAudioFormat.h ***/ +#ifndef __JUCE_COREAUDIOFORMAT_JUCEHEADER__ +#define __JUCE_COREAUDIOFORMAT_JUCEHEADER__ + +#if JUCE_MAC || JUCE_IOS + +/** + OSX and iOS only - This uses the AudioToolbox framework to read any audio + format that the system has a codec for. + + This should be able to understand formats such as mp3, m4a, etc. + + @see AudioFormat + */ +class JUCE_API CoreAudioFormat : public AudioFormat +{ +public: + + /** Creates a format object. */ + CoreAudioFormat(); + + /** Destructor. */ + ~CoreAudioFormat(); + + const Array getPossibleSampleRates(); + const Array getPossibleBitDepths(); + bool canDoStereo(); + bool canDoMono(); + + AudioFormatReader* createReaderFor (InputStream* sourceStream, + bool deleteStreamIfOpeningFails); + + AudioFormatWriter* createWriterFor (OutputStream* streamToWriteTo, + double sampleRateToUse, + unsigned int numberOfChannels, + int bitsPerSample, + const StringPairArray& metadataValues, + int qualityOptionIndex); + +private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CoreAudioFormat); +}; + +#endif +#endif // __JUCE_COREAUDIOFORMAT_JUCEHEADER__ + +/*** End of inlined file: juce_CoreAudioFormat.h ***/ + + #endif #ifndef __JUCE_FLACAUDIOFORMAT_JUCEHEADER__ @@ -37767,7 +37819,7 @@ public: const StringPairArray& metadataValues, int qualityOptionIndex); private: - JUCE_LEAK_DETECTOR (FlacAudioFormat); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FlacAudioFormat); }; #endif @@ -37829,7 +37881,7 @@ public: int qualityOptionIndex); private: - JUCE_LEAK_DETECTOR (OggVorbisAudioFormat); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OggVorbisAudioFormat); }; #endif @@ -37881,7 +37933,7 @@ public: int qualityOptionIndex); private: - JUCE_LEAK_DETECTOR (QuickTimeAudioFormat); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (QuickTimeAudioFormat); }; #endif @@ -38007,7 +38059,7 @@ public: bool replaceMetadataInFile (const File& wavFile, const StringPairArray& newMetadata); private: - JUCE_LEAK_DETECTOR (WavAudioFormat); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WavAudioFormat); }; #endif // __JUCE_WAVAUDIOFORMAT_JUCEHEADER__ diff --git a/src/audio/audio_file_formats/juce_AiffAudioFormat.h b/src/audio/audio_file_formats/juce_AiffAudioFormat.h index b5659e2761..eabe86dc13 100644 --- a/src/audio/audio_file_formats/juce_AiffAudioFormat.h +++ b/src/audio/audio_file_formats/juce_AiffAudioFormat.h @@ -68,7 +68,7 @@ public: private: - JUCE_LEAK_DETECTOR (AiffAudioFormat); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(AiffAudioFormat); }; diff --git a/src/audio/audio_file_formats/juce_AudioFormatManager.cpp b/src/audio/audio_file_formats/juce_AudioFormatManager.cpp index 566b2ae1ae..878d9484ba 100644 --- a/src/audio/audio_file_formats/juce_AudioFormatManager.cpp +++ b/src/audio/audio_file_formats/juce_AudioFormatManager.cpp @@ -32,6 +32,7 @@ BEGIN_JUCE_NAMESPACE #include "juce_WavAudioFormat.h" #include "juce_FlacAudioFormat.h" #include "juce_OggVorbisAudioFormat.h" +#include "juce_CoreAudioFormat.h" #include "../../io/files/juce_FileInputStream.h" #include "../../memory/juce_ScopedPointer.h" @@ -75,6 +76,7 @@ void AudioFormatManager::registerBasicFormats() #if JUCE_MAC registerFormat (new AiffAudioFormat(), true); registerFormat (new WavAudioFormat(), false); + registerFormat (new CoreAudioFormat(), false); #else registerFormat (new WavAudioFormat(), true); registerFormat (new AiffAudioFormat(), false); diff --git a/src/audio/audio_file_formats/juce_FlacAudioFormat.h b/src/audio/audio_file_formats/juce_FlacAudioFormat.h index 1bbe01c906..2084eed077 100644 --- a/src/audio/audio_file_formats/juce_FlacAudioFormat.h +++ b/src/audio/audio_file_formats/juce_FlacAudioFormat.h @@ -67,7 +67,7 @@ public: const StringPairArray& metadataValues, int qualityOptionIndex); private: - JUCE_LEAK_DETECTOR (FlacAudioFormat); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FlacAudioFormat); }; diff --git a/src/audio/audio_file_formats/juce_OggVorbisAudioFormat.cpp b/src/audio/audio_file_formats/juce_OggVorbisAudioFormat.cpp index eebbb45c7b..457f21f657 100644 --- a/src/audio/audio_file_formats/juce_OggVorbisAudioFormat.cpp +++ b/src/audio/audio_file_formats/juce_OggVorbisAudioFormat.cpp @@ -208,8 +208,7 @@ public: { for (int i = numDestChannels; --i >= 0;) if (destSamples[i] != nullptr) - zeromem (destSamples[i] + startOffsetInDestBuffer, - sizeof (int) * numSamples); + zeromem (destSamples[i] + startOffsetInDestBuffer, sizeof (int) * numSamples); } return true; diff --git a/src/audio/audio_file_formats/juce_OggVorbisAudioFormat.h b/src/audio/audio_file_formats/juce_OggVorbisAudioFormat.h index 9896e60d25..679fcf8562 100644 --- a/src/audio/audio_file_formats/juce_OggVorbisAudioFormat.h +++ b/src/audio/audio_file_formats/juce_OggVorbisAudioFormat.h @@ -80,7 +80,7 @@ public: int qualityOptionIndex); private: - JUCE_LEAK_DETECTOR (OggVorbisAudioFormat); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OggVorbisAudioFormat); }; diff --git a/src/audio/audio_file_formats/juce_QuickTimeAudioFormat.h b/src/audio/audio_file_formats/juce_QuickTimeAudioFormat.h index eaea70ac7e..30f5f864e0 100644 --- a/src/audio/audio_file_formats/juce_QuickTimeAudioFormat.h +++ b/src/audio/audio_file_formats/juce_QuickTimeAudioFormat.h @@ -68,7 +68,7 @@ public: private: - JUCE_LEAK_DETECTOR (QuickTimeAudioFormat); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (QuickTimeAudioFormat); }; diff --git a/src/audio/audio_file_formats/juce_WavAudioFormat.h b/src/audio/audio_file_formats/juce_WavAudioFormat.h index 0bc3e67aad..dca4a5aadf 100644 --- a/src/audio/audio_file_formats/juce_WavAudioFormat.h +++ b/src/audio/audio_file_formats/juce_WavAudioFormat.h @@ -145,7 +145,7 @@ public: private: - JUCE_LEAK_DETECTOR (WavAudioFormat); + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WavAudioFormat); }; diff --git a/src/core/juce_StandardHeader.h b/src/core/juce_StandardHeader.h index f1aaa11dfe..c26adad169 100644 --- a/src/core/juce_StandardHeader.h +++ b/src/core/juce_StandardHeader.h @@ -33,7 +33,7 @@ */ #define JUCE_MAJOR_VERSION 1 #define JUCE_MINOR_VERSION 54 -#define JUCE_BUILDNUMBER 17 +#define JUCE_BUILDNUMBER 18 /** Current Juce version number. diff --git a/src/io/streams/juce_MemoryInputStream.cpp b/src/io/streams/juce_MemoryInputStream.cpp index 4d9c72c95b..f46c17a0ac 100644 --- a/src/io/streams/juce_MemoryInputStream.cpp +++ b/src/io/streams/juce_MemoryInputStream.cpp @@ -144,6 +144,7 @@ public: static String createRandomWideCharString() { juce_wchar buffer [50] = { 0 }; + Random r; for (int i = 0; i < numElementsInArray (buffer) - 1; ++i) { diff --git a/src/juce_app_includes.h b/src/juce_app_includes.h index c3e06a1546..fe0b506899 100644 --- a/src/juce_app_includes.h +++ b/src/juce_app_includes.h @@ -74,6 +74,9 @@ #ifndef __JUCE_AUDIOTHUMBNAILCACHE_JUCEHEADER__ #include "audio/audio_file_formats/juce_AudioThumbnailCache.h" #endif +#ifndef __JUCE_COREAUDIOFORMAT_JUCEHEADER__ + #include "audio/audio_file_formats/juce_CoreAudioFormat.h" +#endif #ifndef __JUCE_FLACAUDIOFORMAT_JUCEHEADER__ #include "audio/audio_file_formats/juce_FlacAudioFormat.h" #endif