diff --git a/build/macosx/Juce.xcodeproj/project.pbxproj b/build/macosx/Juce.xcodeproj/project.pbxproj index ec6d47c5ef..b7be4dee6e 100644 --- a/build/macosx/Juce.xcodeproj/project.pbxproj +++ b/build/macosx/Juce.xcodeproj/project.pbxproj @@ -97,6 +97,8 @@ 8440CD3E0ACD0FFC0086FFD7 /* juce_ComponentMovementWatcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8440CD3C0ACD0FFC0086FFD7 /* juce_ComponentMovementWatcher.cpp */; }; 8440CD3F0ACD0FFC0086FFD7 /* juce_ComponentMovementWatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 8440CD3D0ACD0FFC0086FFD7 /* juce_ComponentMovementWatcher.h */; }; 8440CD620ACD112E0086FFD7 /* juce_SliderListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 8440CD610ACD112E0086FFD7 /* juce_SliderListener.h */; }; + 84581EEA0D9148C500AE1A4C /* juce_QuickTimeAudioFormat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84581EE80D9148C500AE1A4C /* juce_QuickTimeAudioFormat.cpp */; }; + 84581EEB0D9148C500AE1A4C /* juce_QuickTimeAudioFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 84581EE90D9148C500AE1A4C /* juce_QuickTimeAudioFormat.h */; }; 846034DE09CB374E00E255CF /* juce_InterprocessConnection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 846034DA09CB374E00E255CF /* juce_InterprocessConnection.cpp */; }; 846034DF09CB374E00E255CF /* juce_InterprocessConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 846034DB09CB374E00E255CF /* juce_InterprocessConnection.h */; }; 846034E009CB374E00E255CF /* juce_InterprocessConnectionServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 846034DC09CB374E00E255CF /* juce_InterprocessConnectionServer.cpp */; }; @@ -782,6 +784,8 @@ 8440CD610ACD112E0086FFD7 /* juce_SliderListener.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_SliderListener.h; sourceTree = ""; }; 8456EC6508A2A6C80087C412 /* juce_Config.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = juce_Config.h; path = ../../juce_Config.h; sourceTree = SOURCE_ROOT; }; 8456EC6908A2A6F00087C412 /* JUCE changelist.txt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = "JUCE changelist.txt"; path = "../../docs/JUCE changelist.txt"; sourceTree = SOURCE_ROOT; }; + 84581EE80D9148C500AE1A4C /* juce_QuickTimeAudioFormat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = juce_QuickTimeAudioFormat.cpp; sourceTree = ""; }; + 84581EE90D9148C500AE1A4C /* juce_QuickTimeAudioFormat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = juce_QuickTimeAudioFormat.h; sourceTree = ""; }; 846034DA09CB374E00E255CF /* juce_InterprocessConnection.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_InterprocessConnection.cpp; sourceTree = ""; }; 846034DB09CB374E00E255CF /* juce_InterprocessConnection.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = juce_InterprocessConnection.h; sourceTree = ""; }; 846034DC09CB374E00E255CF /* juce_InterprocessConnectionServer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = juce_InterprocessConnectionServer.cpp; sourceTree = ""; }; @@ -1630,6 +1634,8 @@ 8495BB890D8067B2001D9C0B /* juce_AudioThumbnail.h */, 8495BB8A0D8067B2001D9C0B /* juce_AudioThumbnailCache.cpp */, 8495BB8B0D8067B2001D9C0B /* juce_AudioThumbnailCache.h */, + 84581EE80D9148C500AE1A4C /* juce_QuickTimeAudioFormat.cpp */, + 84581EE90D9148C500AE1A4C /* juce_QuickTimeAudioFormat.h */, 84A4884708A22E4900752A2B /* juce_WavAudioFormat.cpp */, 84A4884808A22E4900752A2B /* juce_WavAudioFormat.h */, ); @@ -2890,6 +2896,7 @@ 8495BB8F0D8067B2001D9C0B /* juce_AudioThumbnailCache.h in Headers */, 8495BB950D806BDA001D9C0B /* juce_FileInputSource.h in Headers */, 8495BB960D806BDA001D9C0B /* juce_InputSource.h in Headers */, + 84581EEB0D9148C500AE1A4C /* juce_QuickTimeAudioFormat.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3304,6 +3311,7 @@ 8495BB8C0D8067B2001D9C0B /* juce_AudioThumbnail.cpp in Sources */, 8495BB8E0D8067B2001D9C0B /* juce_AudioThumbnailCache.cpp in Sources */, 8495BB940D806BDA001D9C0B /* juce_FileInputSource.cpp in Sources */, + 84581EEA0D9148C500AE1A4C /* juce_QuickTimeAudioFormat.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/build/win32/vc8/JUCE.vcproj b/build/win32/vc8/JUCE.vcproj index ab4804031c..252b43364f 100644 --- a/build/win32/vc8/JUCE.vcproj +++ b/build/win32/vc8/JUCE.vcproj @@ -677,6 +677,14 @@ RelativePath="..\..\..\src\juce_appframework\audio\audio_file_formats\juce_OggVorbisAudioFormat.h" > + + + + diff --git a/extras/audio plugins/demo/build/AudioUnit/JuceDemoAU.xcodeproj/project.pbxproj b/extras/audio plugins/demo/build/AudioUnit/JuceDemoAU.xcodeproj/project.pbxproj index 4e8417291e..f6cbd51085 100644 --- a/extras/audio plugins/demo/build/AudioUnit/JuceDemoAU.xcodeproj/project.pbxproj +++ b/extras/audio plugins/demo/build/AudioUnit/JuceDemoAU.xcodeproj/project.pbxproj @@ -7,22 +7,10 @@ objects = { /* Begin PBXBuildFile section */ - 3E8BF105079CA60300021B09 /* AUBase.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D199ED03175E1E01CA2136 /* AUBase.h */; }; - 3E8BF106079CA60300021B09 /* AUDispatch.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D199EF03175E1E01CA2136 /* AUDispatch.h */; }; - 3E8BF107079CA60300021B09 /* AUInputElement.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D199F103175E1E01CA2136 /* AUInputElement.h */; }; - 3E8BF108079CA60300021B09 /* AUOutputElement.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D199F303175E1E01CA2136 /* AUOutputElement.h */; }; - 3E8BF109079CA60300021B09 /* AUScopeElement.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D199F603175E1E01CA2136 /* AUScopeElement.h */; }; - 3E8BF10A079CA60300021B09 /* ComponentBase.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D199FA03175E1E01CA2136 /* ComponentBase.h */; }; 3E8BF10B079CA60300021B09 /* AUEffectBase.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D199FF03175E1E01CA2136 /* AUEffectBase.h */; }; 3E8BF10C079CA60300021B09 /* AUBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D19A0F03175E1E01CA2136 /* AUBuffer.h */; }; 3E8BF10D079CA60300021B09 /* CAStreamBasicDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = F5D19A6903175E8C01CA2136 /* CAStreamBasicDescription.h */; }; 3E8BF10E079CA60300021B09 /* CAAudioChannelLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 7967EF8C04D70E7C00C625F7 /* CAAudioChannelLayout.h */; }; - 3E8BF113079CA60300021B09 /* AUBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5D199EC03175E1E01CA2136 /* AUBase.cpp */; }; - 3E8BF114079CA60300021B09 /* AUDispatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5D199EE03175E1E01CA2136 /* AUDispatch.cpp */; }; - 3E8BF115079CA60300021B09 /* AUInputElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5D199F003175E1E01CA2136 /* AUInputElement.cpp */; }; - 3E8BF116079CA60300021B09 /* AUOutputElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5D199F203175E1E01CA2136 /* AUOutputElement.cpp */; }; - 3E8BF117079CA60300021B09 /* AUScopeElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5D199F503175E1E01CA2136 /* AUScopeElement.cpp */; }; - 3E8BF118079CA60300021B09 /* ComponentBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5D199F903175E1E01CA2136 /* ComponentBase.cpp */; }; 3E8BF119079CA60300021B09 /* AUEffectBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5D199FE03175E1E01CA2136 /* AUEffectBase.cpp */; }; 3E8BF11A079CA60300021B09 /* AUBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5D19A0E03175E1E01CA2136 /* AUBuffer.cpp */; }; 3E8BF11B079CA60300021B09 /* CAAudioChannelLayout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7967EF8B04D70E7C00C625F7 /* CAAudioChannelLayout.cpp */; }; @@ -32,6 +20,18 @@ 3E8BF121079CA60300021B09 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F5DA37E702821D04014500A0 /* Carbon.framework */; }; 3E8BF122079CA60300021B09 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F5D19ABE0317606901CA2136 /* AudioUnit.framework */; }; 844C50290C71B6E300D0082E /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 844C50280C71B6E300D0082E /* IOKit.framework */; }; + 84581F8F0D917FC700AE1A4C /* AUBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84581F820D917FC700AE1A4C /* AUBase.cpp */; }; + 84581F900D917FC700AE1A4C /* AUBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 84581F830D917FC700AE1A4C /* AUBase.h */; }; + 84581F910D917FC700AE1A4C /* AUDispatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84581F840D917FC700AE1A4C /* AUDispatch.cpp */; }; + 84581F920D917FC700AE1A4C /* AUDispatch.h in Headers */ = {isa = PBXBuildFile; fileRef = 84581F850D917FC700AE1A4C /* AUDispatch.h */; }; + 84581F930D917FC700AE1A4C /* AUInputElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84581F860D917FC700AE1A4C /* AUInputElement.cpp */; }; + 84581F940D917FC700AE1A4C /* AUInputElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 84581F870D917FC700AE1A4C /* AUInputElement.h */; }; + 84581F950D917FC700AE1A4C /* AUOutputElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84581F880D917FC700AE1A4C /* AUOutputElement.cpp */; }; + 84581F960D917FC700AE1A4C /* AUOutputElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 84581F890D917FC700AE1A4C /* AUOutputElement.h */; }; + 84581F980D917FC700AE1A4C /* AUScopeElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84581F8B0D917FC700AE1A4C /* AUScopeElement.cpp */; }; + 84581F990D917FC700AE1A4C /* AUScopeElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 84581F8C0D917FC700AE1A4C /* AUScopeElement.h */; }; + 84581F9A0D917FC700AE1A4C /* ComponentBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84581F8D0D917FC700AE1A4C /* ComponentBase.cpp */; }; + 84581F9B0D917FC700AE1A4C /* ComponentBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 84581F8E0D917FC700AE1A4C /* ComponentBase.h */; }; 845FAE5F0A5C0A6A008C94D8 /* juce.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 845FAE5E0A5C0A6A008C94D8 /* juce.xcconfig */; }; 845FAEE10A5C2696008C94D8 /* QuickTime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 845FAEE00A5C2696008C94D8 /* QuickTime.framework */; }; 84B4CDD10C7DD23B0083122F /* MusicDeviceBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84B4CDCF0C7DD23B0083122F /* MusicDeviceBase.cpp */; }; @@ -90,13 +90,24 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 3E3AAA740670E29D00C484A8 /* AUResources.r */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.rez; path = AUResources.r; sourceTree = ""; }; 3E8BF126079CA60300021B09 /* DemoJuceAudioUnit.component */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DemoJuceAudioUnit.component; sourceTree = BUILT_PRODUCTS_DIR; }; 3E8BF154079CA7A800021B09 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = /System/Library/Frameworks/AudioToolbox.framework; sourceTree = ""; }; 7967EF8B04D70E7C00C625F7 /* CAAudioChannelLayout.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CAAudioChannelLayout.cpp; sourceTree = ""; }; 7967EF8C04D70E7C00C625F7 /* CAAudioChannelLayout.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CAAudioChannelLayout.h; sourceTree = ""; }; 7967EF8D04D70E7C00C625F7 /* CAStreamBasicDescription.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CAStreamBasicDescription.cpp; sourceTree = ""; }; 844C50280C71B6E300D0082E /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = IOKit.framework; sourceTree = ""; }; + 84581F820D917FC700AE1A4C /* AUBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AUBase.cpp; path = /Developer/Examples/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.cpp; sourceTree = ""; }; + 84581F830D917FC700AE1A4C /* AUBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AUBase.h; path = /Developer/Examples/CoreAudio/AudioUnits/AUPublic/AUBase/AUBase.h; sourceTree = ""; }; + 84581F840D917FC700AE1A4C /* AUDispatch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AUDispatch.cpp; path = /Developer/Examples/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.cpp; sourceTree = ""; }; + 84581F850D917FC700AE1A4C /* AUDispatch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AUDispatch.h; path = /Developer/Examples/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.h; sourceTree = ""; }; + 84581F860D917FC700AE1A4C /* AUInputElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AUInputElement.cpp; path = /Developer/Examples/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.cpp; sourceTree = ""; }; + 84581F870D917FC700AE1A4C /* AUInputElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AUInputElement.h; path = /Developer/Examples/CoreAudio/AudioUnits/AUPublic/AUBase/AUInputElement.h; sourceTree = ""; }; + 84581F880D917FC700AE1A4C /* AUOutputElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AUOutputElement.cpp; path = /Developer/Examples/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.cpp; sourceTree = ""; }; + 84581F890D917FC700AE1A4C /* AUOutputElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AUOutputElement.h; path = /Developer/Examples/CoreAudio/AudioUnits/AUPublic/AUBase/AUOutputElement.h; sourceTree = ""; }; + 84581F8B0D917FC700AE1A4C /* AUScopeElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AUScopeElement.cpp; path = /Developer/Examples/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.cpp; sourceTree = ""; }; + 84581F8C0D917FC700AE1A4C /* AUScopeElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AUScopeElement.h; path = /Developer/Examples/CoreAudio/AudioUnits/AUPublic/AUBase/AUScopeElement.h; sourceTree = ""; }; + 84581F8D0D917FC700AE1A4C /* ComponentBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ComponentBase.cpp; path = /Developer/Examples/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.cpp; sourceTree = ""; }; + 84581F8E0D917FC700AE1A4C /* ComponentBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ComponentBase.h; path = /Developer/Examples/CoreAudio/AudioUnits/AUPublic/AUBase/ComponentBase.h; sourceTree = ""; }; 845FAE5E0A5C0A6A008C94D8 /* juce.xcconfig */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xcconfig; name = juce.xcconfig; path = ../../../../../build/macosx/juce.xcconfig; sourceTree = SOURCE_ROOT; }; 845FAEE00A5C2696008C94D8 /* QuickTime.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = QuickTime.framework; sourceTree = ""; }; 84B4CDCF0C7DD23B0083122F /* MusicDeviceBase.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = MusicDeviceBase.cpp; path = /Developer/Examples/CoreAudio/AudioUnits/AUPublic/OtherBases/MusicDeviceBase.cpp; sourceTree = ""; }; @@ -128,18 +139,6 @@ F4E5DC2A0898301D00589A5A /* CAVectorUnitTypes.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CAVectorUnitTypes.h; sourceTree = ""; }; F5AA9A2F0281AAB901C34293 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CoreFoundation.framework; sourceTree = ""; }; F5AA9A300281AAB901C34293 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = CoreServices.framework; sourceTree = ""; }; - F5D199EC03175E1E01CA2136 /* AUBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AUBase.cpp; sourceTree = ""; }; - F5D199ED03175E1E01CA2136 /* AUBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AUBase.h; sourceTree = ""; }; - F5D199EE03175E1E01CA2136 /* AUDispatch.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AUDispatch.cpp; sourceTree = ""; }; - F5D199EF03175E1E01CA2136 /* AUDispatch.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AUDispatch.h; sourceTree = ""; }; - F5D199F003175E1E01CA2136 /* AUInputElement.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AUInputElement.cpp; sourceTree = ""; }; - F5D199F103175E1E01CA2136 /* AUInputElement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AUInputElement.h; sourceTree = ""; }; - F5D199F203175E1E01CA2136 /* AUOutputElement.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AUOutputElement.cpp; sourceTree = ""; }; - F5D199F303175E1E01CA2136 /* AUOutputElement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AUOutputElement.h; sourceTree = ""; }; - F5D199F503175E1E01CA2136 /* AUScopeElement.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AUScopeElement.cpp; sourceTree = ""; }; - F5D199F603175E1E01CA2136 /* AUScopeElement.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AUScopeElement.h; sourceTree = ""; }; - F5D199F903175E1E01CA2136 /* ComponentBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ComponentBase.cpp; sourceTree = ""; }; - F5D199FA03175E1E01CA2136 /* ComponentBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ComponentBase.h; sourceTree = ""; }; F5D199FE03175E1E01CA2136 /* AUEffectBase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AUEffectBase.cpp; sourceTree = ""; }; F5D199FF03175E1E01CA2136 /* AUEffectBase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AUEffectBase.h; sourceTree = ""; }; F5D19A0E03175E1E01CA2136 /* AUBuffer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AUBuffer.cpp; sourceTree = ""; }; @@ -289,19 +288,18 @@ F5D199EB03175E1E01CA2136 /* AUBase */ = { isa = PBXGroup; children = ( - 3E3AAA740670E29D00C484A8 /* AUResources.r */, - F5D199EC03175E1E01CA2136 /* AUBase.cpp */, - F5D199ED03175E1E01CA2136 /* AUBase.h */, - F5D199EE03175E1E01CA2136 /* AUDispatch.cpp */, - F5D199EF03175E1E01CA2136 /* AUDispatch.h */, - F5D199F003175E1E01CA2136 /* AUInputElement.cpp */, - F5D199F103175E1E01CA2136 /* AUInputElement.h */, - F5D199F203175E1E01CA2136 /* AUOutputElement.cpp */, - F5D199F303175E1E01CA2136 /* AUOutputElement.h */, - F5D199F503175E1E01CA2136 /* AUScopeElement.cpp */, - F5D199F603175E1E01CA2136 /* AUScopeElement.h */, - F5D199F903175E1E01CA2136 /* ComponentBase.cpp */, - F5D199FA03175E1E01CA2136 /* ComponentBase.h */, + 84581F820D917FC700AE1A4C /* AUBase.cpp */, + 84581F830D917FC700AE1A4C /* AUBase.h */, + 84581F840D917FC700AE1A4C /* AUDispatch.cpp */, + 84581F850D917FC700AE1A4C /* AUDispatch.h */, + 84581F860D917FC700AE1A4C /* AUInputElement.cpp */, + 84581F870D917FC700AE1A4C /* AUInputElement.h */, + 84581F880D917FC700AE1A4C /* AUOutputElement.cpp */, + 84581F890D917FC700AE1A4C /* AUOutputElement.h */, + 84581F8B0D917FC700AE1A4C /* AUScopeElement.cpp */, + 84581F8C0D917FC700AE1A4C /* AUScopeElement.h */, + 84581F8D0D917FC700AE1A4C /* ComponentBase.cpp */, + 84581F8E0D917FC700AE1A4C /* ComponentBase.h */, ); path = AUBase; sourceTree = ""; @@ -370,12 +368,6 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 3E8BF105079CA60300021B09 /* AUBase.h in Headers */, - 3E8BF106079CA60300021B09 /* AUDispatch.h in Headers */, - 3E8BF107079CA60300021B09 /* AUInputElement.h in Headers */, - 3E8BF108079CA60300021B09 /* AUOutputElement.h in Headers */, - 3E8BF109079CA60300021B09 /* AUScopeElement.h in Headers */, - 3E8BF10A079CA60300021B09 /* ComponentBase.h in Headers */, 3E8BF10B079CA60300021B09 /* AUEffectBase.h in Headers */, 3E8BF10C079CA60300021B09 /* AUBuffer.h in Headers */, 3E8BF10D079CA60300021B09 /* CAStreamBasicDescription.h in Headers */, @@ -390,6 +382,12 @@ 84F055260906FBCF00AEC8DB /* AUSilentTimeout.h in Headers */, 84EB404E090A5116008FAC1B /* JucePluginCharacteristics.h in Headers */, 84B4CDD20C7DD23B0083122F /* MusicDeviceBase.h in Headers */, + 84581F900D917FC700AE1A4C /* AUBase.h in Headers */, + 84581F920D917FC700AE1A4C /* AUDispatch.h in Headers */, + 84581F940D917FC700AE1A4C /* AUInputElement.h in Headers */, + 84581F960D917FC700AE1A4C /* AUOutputElement.h in Headers */, + 84581F990D917FC700AE1A4C /* AUScopeElement.h in Headers */, + 84581F9B0D917FC700AE1A4C /* ComponentBase.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -423,6 +421,7 @@ F5AA99BA0281A61201C34293 /* Project object */ = { isa = PBXProject; buildConfigurationList = A9E884B90874ABE600B2DFE8 /* Build configuration list for PBXProject "JuceDemoAU" */; + compatibilityVersion = "Xcode 2.4"; hasScannedForEncodings = 1; mainGroup = F5AA99B60281A61201C34293; productRefGroup = F5AA99C40281A62C01C34293 /* Products */; @@ -433,6 +432,7 @@ ProjectRef = 84F0545A0906865D00AEC8DB /* Juce.xcodeproj */; }, ); + projectRoot = ""; targets = ( 3E8BF102079CA60300021B09 /* JuceAU */, ); @@ -477,19 +477,13 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 3E8BF115079CA60300021B09 /* AUInputElement.cpp in Sources */, - 3E8BF116079CA60300021B09 /* AUOutputElement.cpp in Sources */, - 3E8BF117079CA60300021B09 /* AUScopeElement.cpp in Sources */, - 3E8BF113079CA60300021B09 /* AUBase.cpp in Sources */, 3E8BF119079CA60300021B09 /* AUEffectBase.cpp in Sources */, - 3E8BF114079CA60300021B09 /* AUDispatch.cpp in Sources */, 3E8BF11C079CA60300021B09 /* CAStreamBasicDescription.cpp in Sources */, 3E8BF11B079CA60300021B09 /* CAAudioChannelLayout.cpp in Sources */, 84CFAF0E090965080053C22C /* CarbonEventHandler.cpp in Sources */, 84CFAEFB090964560053C22C /* AUCarbonViewDispatch.cpp in Sources */, 84CFAEFC090964560053C22C /* AUCarbonViewControl.cpp in Sources */, 84CFAEFD090964560053C22C /* AUCarbonViewBase.cpp in Sources */, - 3E8BF118079CA60300021B09 /* ComponentBase.cpp in Sources */, 84CFAF10090965080053C22C /* CAAUParameter.cpp in Sources */, 3E8BF11A079CA60300021B09 /* AUBuffer.cpp in Sources */, 84F054E80906C8DD00AEC8DB /* AUMIDIBase.cpp in Sources */, @@ -499,6 +493,12 @@ 84EB400B090A4A2C008FAC1B /* juce_AudioUnitWrapper.cpp in Sources */, 84EB4042090A4F5A008FAC1B /* CAVectorUnit.cpp in Sources */, 84B4CDD10C7DD23B0083122F /* MusicDeviceBase.cpp in Sources */, + 84581F8F0D917FC700AE1A4C /* AUBase.cpp in Sources */, + 84581F910D917FC700AE1A4C /* AUDispatch.cpp in Sources */, + 84581F930D917FC700AE1A4C /* AUInputElement.cpp in Sources */, + 84581F950D917FC700AE1A4C /* AUOutputElement.cpp in Sources */, + 84581F980D917FC700AE1A4C /* AUScopeElement.cpp in Sources */, + 84581F9A0D917FC700AE1A4C /* ComponentBase.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -517,6 +517,10 @@ GCC_OPTIMIZATION_LEVEL = 0; GCC_SYMBOLS_PRIVATE_EXTERN = YES; GCC_USE_GCC3_PFE_SUPPORT = YES; + HEADER_SEARCH_PATHS = ( + ../../../../../, + "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk/usr/include", + ); INFOPLIST_FILE = "Info-JuceAU.plist"; INSTALL_PATH = "/Library/Audio/Plug-Ins/Components/"; OTHER_REZFLAGS = "-d ppc_$ppc -d i386_$i386 -I / -I /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/Headers"; diff --git a/juce.h b/juce.h index 1f88957283..ab754a92a1 100644 --- a/juce.h +++ b/juce.h @@ -176,6 +176,11 @@ END_JUCE_NAMESPACE #pragma comment(lib, "OpenGL32.Lib") #pragma comment(lib, "GlU32.Lib") #endif + + #if JUCE_QUICKTIME_AUDIOFORMAT + #pragma comment (lib, "QTMLClient.lib") + #endif + #endif #endif diff --git a/juce_Config.h b/juce_Config.h index 693c5efb9e..5dc226957f 100644 --- a/juce_Config.h +++ b/juce_Config.h @@ -90,6 +90,13 @@ #define JUCE_QUICKTIME 1 #endif +/** This lets you enable the QuickTimeAudioFormat class. + If you're using this on win32, you'll need to have installed the QuickTime SDK. +*/ +#if ! (defined (JUCE_QUICKTIME_AUDIOFORMAT) || defined (LINUX) || (defined (_WIN32) && ! defined (_MSC_VER))) +// #define JUCE_QUICKTIME_AUDIOFORMAT 1 +#endif + //============================================================================= /** Comment out this macro if you don't want to enable OpenGL or if you don't have the appropriate headers and libraries available. If it's not enabled, the diff --git a/src/juce_app_includes.h b/src/juce_app_includes.h index a69e675630..8a79bfb515 100644 --- a/src/juce_app_includes.h +++ b/src/juce_app_includes.h @@ -230,6 +230,9 @@ #ifndef __JUCE_OGGVORBISAUDIOFORMAT_JUCEHEADER__ #include "juce_appframework/audio/audio_file_formats/juce_OggVorbisAudioFormat.h" #endif +#ifndef __JUCE_QUICKTIMEAUDIOFORMAT_JUCEHEADER__ + #include "juce_appframework/audio/audio_file_formats/juce_QuickTimeAudioFormat.h" +#endif #ifndef __JUCE_WAVAUDIOFORMAT_JUCEHEADER__ #include "juce_appframework/audio/audio_file_formats/juce_WavAudioFormat.h" #endif diff --git a/src/juce_appframework/audio/audio_file_formats/juce_QuickTimeAudioFormat.cpp b/src/juce_appframework/audio/audio_file_formats/juce_QuickTimeAudioFormat.cpp new file mode 100644 index 0000000000..d181e703bf --- /dev/null +++ b/src/juce_appframework/audio/audio_file_formats/juce_QuickTimeAudioFormat.cpp @@ -0,0 +1,553 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the + GNU General Public License, as published by the Free Software Foundation; + either version 2 of the License, or (at your option) any later version. + + 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. + + You should have received a copy of the GNU General Public License + along with JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../../../../juce_Config.h" + +#if JUCE_QUICKTIME_AUDIOFORMAT + +#if ! defined (_WIN32) + #include + #include + #include + #include + #include +#else + #ifdef _MSC_VER + #pragma warning (push) + #pragma warning (disable : 4100) + #endif + + #include + #include + #include + #include + #include + + #ifdef _MSC_VER + #pragma warning (pop) + #endif +#endif + +#include "../../../juce_core/basics/juce_StandardHeader.h" + +BEGIN_JUCE_NAMESPACE + +#include "juce_QuickTimeAudioFormat.h" +#include "../../../juce_core/text/juce_LocalisedStrings.h" +#include "../../../juce_core/threads/juce_Thread.h" +#include "../../../juce_core/io/files/juce_FileInputStream.h" + +#define qtFormatName TRANS("QuickTime file") +static const tchar* const extensions[] = { T(".mov"), T(".mp3"), 0 }; + +//============================================================================== +class QTAudioReader : public AudioFormatReader +{ +public: + QTAudioReader (InputStream* const input_, const int trackNum_) + : AudioFormatReader (input_, qtFormatName), + ok (false), + movie (0), + trackNum (trackNum_), + extractor (0), + lastSampleRead (0), + lastThreadId (0) + { + bufferList = (AudioBufferList*) juce_calloc (256); + +#ifdef WIN32 + if (InitializeQTML (0) != noErr) + return; +#endif + if (EnterMovies() != noErr) + return; + +#if JUCE_MAC + EnterMoviesOnThread (0); +#endif + + if (! openMovie (input_)) + return; + + { + const int numTracks = GetMovieTrackCount (movie); + int trackCount = 0; + + for (int i = 1; i <= numTracks; ++i) + { + track = GetMovieIndTrack (movie, i); + media = GetTrackMedia (track); + + OSType mediaType; + GetMediaHandlerDescription (media, &mediaType, 0, 0); + + if (mediaType == SoundMediaType + && trackCount++ == trackNum_) + { + ok = true; + break; + } + } + } + + if (! ok) + return; + + ok = false; + + lengthInSamples = GetMediaDecodeDuration (media); + usesFloatingPointData = false; + + samplesPerFrame = (int) (GetMediaDecodeDuration (media) / GetMediaSampleCount (media)); + + trackUnitsPerFrame = GetMovieTimeScale (movie) * samplesPerFrame + / GetMediaTimeScale (media); + + OSStatus err = MovieAudioExtractionBegin (movie, 0, &extractor); + + unsigned long output_layout_size; + err = MovieAudioExtractionGetPropertyInfo (extractor, + kQTPropertyClass_MovieAudioExtraction_Audio, + kQTMovieAudioExtractionAudioPropertyID_AudioChannelLayout, + 0, &output_layout_size, 0); + if (err != noErr) + return; + + AudioChannelLayout* const qt_audio_channel_layout + = (AudioChannelLayout*) juce_calloc (output_layout_size); + + err = MovieAudioExtractionGetProperty (extractor, + kQTPropertyClass_MovieAudioExtraction_Audio, + kQTMovieAudioExtractionAudioPropertyID_AudioChannelLayout, + output_layout_size, qt_audio_channel_layout, 0); + + qt_audio_channel_layout->mChannelLayoutTag = kAudioChannelLayoutTag_Stereo; + + err = MovieAudioExtractionSetProperty (extractor, + kQTPropertyClass_MovieAudioExtraction_Audio, + kQTMovieAudioExtractionAudioPropertyID_AudioChannelLayout, + sizeof (qt_audio_channel_layout), + qt_audio_channel_layout); + + juce_free (qt_audio_channel_layout); + + err = MovieAudioExtractionGetProperty (extractor, + kQTPropertyClass_MovieAudioExtraction_Audio, + kQTMovieAudioExtractionAudioPropertyID_AudioStreamBasicDescription, + sizeof (inputStreamDesc), + &inputStreamDesc, 0); + if (err != noErr) + return; + + inputStreamDesc.mFormatFlags = kAudioFormatFlagIsSignedInteger + | kAudioFormatFlagIsPacked + | kAudioFormatFlagsNativeEndian; + inputStreamDesc.mBitsPerChannel = sizeof (SInt16) * 8; + inputStreamDesc.mChannelsPerFrame = jmin (2, inputStreamDesc.mChannelsPerFrame); + inputStreamDesc.mBytesPerFrame = sizeof (SInt16) * inputStreamDesc.mChannelsPerFrame; + inputStreamDesc.mBytesPerPacket = inputStreamDesc.mBytesPerFrame; + + err = MovieAudioExtractionSetProperty (extractor, + kQTPropertyClass_MovieAudioExtraction_Audio, + kQTMovieAudioExtractionAudioPropertyID_AudioStreamBasicDescription, + sizeof (inputStreamDesc), + &inputStreamDesc); + if (err != noErr) + return; + + Boolean allChannelsDiscrete = false; + err = MovieAudioExtractionSetProperty (extractor, + kQTPropertyClass_MovieAudioExtraction_Movie, + kQTMovieAudioExtractionMoviePropertyID_AllChannelsDiscrete, + sizeof (allChannelsDiscrete), + &allChannelsDiscrete); + + if (err != noErr) + return; + + bufferList->mNumberBuffers = 1; + bufferList->mBuffers[0].mNumberChannels = inputStreamDesc.mChannelsPerFrame; + bufferList->mBuffers[0].mDataByteSize = (UInt32) (samplesPerFrame * inputStreamDesc.mBytesPerFrame) + 16; + bufferList->mBuffers[0].mData = malloc (bufferList->mBuffers[0].mDataByteSize); + + sampleRate = inputStreamDesc.mSampleRate; + bitsPerSample = 16; + numChannels = inputStreamDesc.mChannelsPerFrame; + + detachThread(); + ok = true; + } + + ~QTAudioReader() + { + if (extractor != 0) + { + MovieAudioExtractionEnd (extractor); + extractor = 0; + } + + checkThreadIsAttached(); + DisposeMovie (movie); + + juce_free (bufferList->mBuffers[0].mData); + juce_free (bufferList); + } + + bool read (int** destSamples, + int64 startSample, + int numSamples) + { + checkThreadIsAttached(); + int done = 0; + + while (numSamples > 0) + { + if (! loadFrame ((int) startSample)) + return false; + + const int numToDo = jmin (numSamples, samplesPerFrame); + + for (unsigned int j = 0; j < inputStreamDesc.mChannelsPerFrame; ++j) + { + if (destSamples[j] != 0) + { + const short* const src = ((const short*) bufferList->mBuffers[0].mData) + j; + + for (int i = 0; i < numToDo; ++i) + destSamples[j][done + i] = src [i << 1] << 16; + } + } + + done += numToDo; + startSample += numToDo; + numSamples -= numToDo; + } + + detachThread(); + return true; + } + + bool loadFrame (const int sampleNum) + { + if (lastSampleRead != sampleNum) + { + TimeRecord time; + time.scale = (TimeScale) inputStreamDesc.mSampleRate; + time.base = 0; + time.value.hi = 0; + time.value.lo = (UInt32) sampleNum; + + OSStatus err = MovieAudioExtractionSetProperty (extractor, + kQTPropertyClass_MovieAudioExtraction_Movie, + kQTMovieAudioExtractionMoviePropertyID_CurrentTime, + sizeof (time), &time); + + if (err != noErr) + return false; + } + + bufferList->mBuffers[0].mDataByteSize = inputStreamDesc.mBytesPerFrame * samplesPerFrame; + + UInt32 outFlags = 0; + UInt32 actualNumSamples = samplesPerFrame; + OSStatus err = MovieAudioExtractionFillBuffer (extractor, &actualNumSamples, + bufferList, &outFlags); + + lastSampleRead = sampleNum + samplesPerFrame; + + return err == noErr; + } + + juce_UseDebuggingNewOperator + + bool ok; + +private: + Movie movie; + Media media; + Track track; + const int trackNum; + double trackUnitsPerFrame; + int samplesPerFrame; + int lastSampleRead, lastThreadId; + MovieAudioExtractionRef extractor; + AudioStreamBasicDescription inputStreamDesc; + AudioBufferList* bufferList; + + /*OSErr readMovieStream (long offset, long size, void* dataPtr) + { + input->setPosition (offset); + input->read (dataPtr, size); + return noErr; + } + + static OSErr readMovieStreamProc (long offset, long size, void* dataPtr, void* userRef) + { + return ((QTAudioReader*) userRef)->readMovieStream (offset, size, dataPtr); + }*/ + + static Handle createHandleDataRef (Handle dataHandle, const char* fileName) + { + Handle dataRef = 0; + OSStatus err = PtrToHand (&dataHandle, &dataRef, sizeof (Handle)); + if (err == noErr) + { + Str255 suffix; +#if JUCE_WIN32 + strcpy_s ((char*) suffix, 128, fileName); +#else + strcpy ((char*) suffix, fileName); +#endif + StringPtr name = suffix; + err = PtrAndHand (name, dataRef, name[0]+1); + + if (err == noErr) + { + long atoms[3]; + atoms[0] = EndianU32_NtoB (3 * sizeof (long)); + atoms[1] = EndianU32_NtoB (kDataRefExtensionMacOSFileType); + atoms[2] = EndianU32_NtoB (MovieFileType); + + err = PtrAndHand (atoms, dataRef, 3 * sizeof (long)); + + if (err == noErr) + return dataRef; + } + + DisposeHandle (dataRef); + } + + return 0; + } + + static CFStringRef juceStringToCFString (const String& s) + { + const int len = s.length(); + const juce_wchar* const t = (const juce_wchar*) s; + + UniChar* temp = (UniChar*) juce_malloc (sizeof (UniChar) * len + 4); + + for (int i = 0; i <= len; ++i) + temp[i] = t[i]; + + CFStringRef result = CFStringCreateWithCharacters (kCFAllocatorDefault, temp, len); + juce_free (temp); + + return result; + } + + //============================================================================== + bool openMovie (InputStream* const input) + { + bool ok = false; + + QTNewMoviePropertyElement props[5]; + zeromem (props, sizeof (props)); + int prop = 0; + + FileInputStream* fin = dynamic_cast (input); + + if (fin != 0) + { + CFStringRef pathString = juceStringToCFString (T("file://") + fin->getFile().getFullPathName().replaceCharacter (T('\\'), T('/'))); + CFURLRef urlRef = CFURLCreateWithString (kCFAllocatorDefault, pathString, 0); + CFRelease (pathString); + + props[prop].propClass = kQTPropertyClass_DataLocation; + props[prop].propID = kQTDataLocationPropertyID_CFURL; + props[prop].propValueSize = sizeof (urlRef); + props[prop].propValueAddress = &urlRef; + ++prop; + + ok = openMovie (props, prop); + } + else + { + // sanity-check because this currently needs to load the whole stream into memory.. + jassert (input->getTotalLength() < 50 * 1024 * 1024); + + Handle dataHandle = NewHandle ((Size) input->getTotalLength()); + HLock (dataHandle); + // read the entire stream into memory - this is a pain, but can't get it to work + // properly using a custom callback to supply the data. + input->read (*dataHandle, (int) input->getTotalLength()); + HUnlock (dataHandle); + + // different types to get QT to try. (We should really be a bit smarter here by + // working out in advance which one the stream contains, rather than just trying + // each one) + const char* const suffixesToTry[] = { "\04.mov", "\04.mp3", + "\04.avi", "\04.m4a" }; + + for (int i = 0; i < numElementsInArray (suffixesToTry) && ! ok; ++i) + { + Handle dataRef = createHandleDataRef (dataHandle, suffixesToTry [i]); + + /* // this fails for some bizarre reason - it can be bodged to work with + // movies, but can't seem to do it for other file types.. + QTNewMovieUserProcRecord procInfo; + procInfo.getMovieUserProc = NewGetMovieUPP (readMovieStreamProc); + procInfo.getMovieUserProcRefcon = this; + procInfo.defaultDataRef.dataRef = dataRef; + procInfo.defaultDataRef.dataRefType = HandleDataHandlerSubType; + + props[prop].propClass = kQTPropertyClass_DataLocation; + props[prop].propID = kQTDataLocationPropertyID_MovieUserProc; + props[prop].propValueSize = sizeof (procInfo); + props[prop].propValueAddress = (void*) &procInfo; + ++prop; */ + + DataReferenceRecord dr; + dr.dataRef = dataRef; + dr.dataRefType = HandleDataHandlerSubType; + props[prop].propClass = kQTPropertyClass_DataLocation; + props[prop].propID = kQTDataLocationPropertyID_DataReference; + props[prop].propValueSize = sizeof (dr); + props[prop].propValueAddress = (void*) &dr; + ++prop; + + ok = openMovie (props, prop); + + DisposeHandle (dataRef); + } + + DisposeHandle (dataHandle); + } + + return ok; + } + + bool openMovie (QTNewMoviePropertyElement* props, int prop) + { + Boolean trueBool = true; + props[prop].propClass = kQTPropertyClass_MovieInstantiation; + props[prop].propID = kQTMovieInstantiationPropertyID_DontResolveDataRefs; + props[prop].propValueSize = sizeof (trueBool); + props[prop].propValueAddress = &trueBool; + ++prop; + + Boolean isActive = true; + props[prop].propClass = kQTPropertyClass_NewMovieProperty; + props[prop].propID = kQTNewMoviePropertyID_Active; + props[prop].propValueSize = sizeof (isActive); + props[prop].propValueAddress = &isActive; + ++prop; + +#if JUCE_MAC + SetPort (0); +#else + MacSetPort (0); +#endif + + return NewMovieFromProperties (prop, props, 0, 0, &movie) == noErr; + } + + //============================================================================== + void checkThreadIsAttached() + { +#if JUCE_MAC + if (Thread::getCurrentThreadId() != lastThreadId) + EnterMoviesOnThread (0); + AttachMovieToCurrentThread (movie); +#endif + } + + void detachThread() + { +#if JUCE_MAC + DetachMovieFromCurrentThread (movie); +#endif + } +}; + + +//============================================================================== +QuickTimeAudioFormat::QuickTimeAudioFormat() + : AudioFormat (qtFormatName, (const tchar**) extensions) +{ +} + +QuickTimeAudioFormat::~QuickTimeAudioFormat() +{ +} + +const Array QuickTimeAudioFormat::getPossibleSampleRates() +{ + return Array(); +} + +const Array QuickTimeAudioFormat::getPossibleBitDepths() +{ + return Array(); +} + +bool QuickTimeAudioFormat::canDoStereo() +{ + return true; +} + +bool QuickTimeAudioFormat::canDoMono() +{ + return true; +} + +//============================================================================== +AudioFormatReader* QuickTimeAudioFormat::createReaderFor (InputStream* sourceStream, + const bool deleteStreamIfOpeningFails) +{ + QTAudioReader* r = new QTAudioReader (sourceStream, 0); + + if (! r->ok) + { + if (! deleteStreamIfOpeningFails) + r->input = 0; + + deleteAndZero (r); + } + + return r; +} + +AudioFormatWriter* QuickTimeAudioFormat::createWriterFor (OutputStream* /*streamToWriteTo*/, + double /*sampleRateToUse*/, + unsigned int /*numberOfChannels*/, + int /*bitsPerSample*/, + const StringPairArray& /*metadataValues*/, + int /*qualityOptionIndex*/) +{ + jassertfalse // not yet implemented! + return 0; +} + + +END_JUCE_NAMESPACE + +#endif diff --git a/src/juce_appframework/audio/audio_file_formats/juce_QuickTimeAudioFormat.h b/src/juce_appframework/audio/audio_file_formats/juce_QuickTimeAudioFormat.h new file mode 100644 index 0000000000..e99dc428ad --- /dev/null +++ b/src/juce_appframework/audio/audio_file_formats/juce_QuickTimeAudioFormat.h @@ -0,0 +1,81 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the + GNU General Public License, as published by the Free Software Foundation; + either version 2 of the License, or (at your option) any later version. + + 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. + + You should have received a copy of the GNU General Public License + along with JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#ifndef __JUCE_QUICKTIMEAUDIOFORMAT_JUCEHEADER__ +#define __JUCE_QUICKTIMEAUDIOFORMAT_JUCEHEADER__ + +#include "juce_AudioFormat.h" + + +//============================================================================== +/** + Uses QuickTime to read the audio track a movie or media file. + + As well as QuickTime movies, this should also manage to open other audio + files that quicktime can understand, like mp3, m4a, etc. + + @see AudioFormat +*/ +class JUCE_API QuickTimeAudioFormat : public AudioFormat +{ +public: + //============================================================================== + /** Creates a format object. */ + QuickTimeAudioFormat(); + + /** Destructor. */ + ~QuickTimeAudioFormat(); + + //============================================================================== + const Array getPossibleSampleRates(); + const Array getPossibleBitDepths(); + bool canDoStereo(); + bool canDoMono(); + + //============================================================================== + AudioFormatReader* createReaderFor (InputStream* sourceStream, + const bool deleteStreamIfOpeningFails); + + AudioFormatWriter* createWriterFor (OutputStream* streamToWriteTo, + double sampleRateToUse, + unsigned int numberOfChannels, + int bitsPerSample, + const StringPairArray& metadataValues, + int qualityOptionIndex); + + + //============================================================================== + juce_UseDebuggingNewOperator +}; + + + +#endif // __JUCE_QUICKTIMEAUDIOFORMAT_JUCEHEADER__