| @@ -1866,7 +1866,6 @@ add_library( ${BINARY_NAME} | |||
| "../../../../../modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp" | |||
| "../../../../../modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp" | |||
| "../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" | |||
| "../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" | |||
| "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" | |||
| "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" | |||
| "../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" | |||
| @@ -3804,7 +3803,6 @@ set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_l | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| @@ -36,7 +36,6 @@ | |||
| 7B4163348896EB1B86B15160 /* AVFoundation.framework */ = {isa = PBXBuildFile; fileRef = DC192EFA899E6CBE6B5CD394; }; | |||
| 8584640341100008744861A5 /* IOKit.framework */ = {isa = PBXBuildFile; fileRef = 71A91516AFD980FEE694C0E1; }; | |||
| 89AD16514B1F4133FFEA1DF9 /* WebKit.framework */ = {isa = PBXBuildFile; fileRef = 96D99A08027CA35D6A4E5CFD; }; | |||
| 89BC6E2354102D975E08E918 /* Carbon.framework */ = {isa = PBXBuildFile; fileRef = 440D507FD8F31DB62B1F95C7; }; | |||
| 8C0AEA08A71075A6C765AEC9 /* AVKit.framework */ = {isa = PBXBuildFile; fileRef = 3B99CF94C44E2EE04635A439; }; | |||
| 91CD2BCE4CA07E18229EB436 /* RecentFilesMenuTemplate.nib */ = {isa = PBXBuildFile; fileRef = 9672FCE6167ADB567A9EB2F8; }; | |||
| 9BEA1428416CE06BF72FBAB8 /* DiscRecording.framework */ = {isa = PBXBuildFile; fileRef = 3DC90DA86565B0356B6E5E0B; }; | |||
| @@ -81,7 +80,6 @@ | |||
| 3DC90DA86565B0356B6E5E0B /* DiscRecording.framework */ /* DiscRecording.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiscRecording.framework; path = System/Library/Frameworks/DiscRecording.framework; sourceTree = SDKROOT; }; | |||
| 3E4ED41C374261CFFD309743 /* include_juce_graphics.mm */ /* include_juce_graphics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_graphics.mm; path = ../../JuceLibraryCode/include_juce_graphics.mm; sourceTree = SOURCE_ROOT; }; | |||
| 40BD06D4AB0D2C73E936A2F1 /* OpenGL.framework */ /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; | |||
| 440D507FD8F31DB62B1F95C7 /* Carbon.framework */ /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; | |||
| 470C3E4553B513FFEF752779 /* AudioToolbox.framework */ /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; | |||
| 491641F7632BCC81BBA0ED85 /* juce_audio_formats */ /* juce_audio_formats */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_formats; path = ../../../../modules/juce_audio_formats; sourceTree = SOURCE_ROOT; }; | |||
| 49ECA8B998B339A083674A22 /* Foundation.framework */ /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; | |||
| @@ -148,7 +146,6 @@ | |||
| 163B0CF2DD0990A63DF1D5A6, | |||
| 7B4163348896EB1B86B15160, | |||
| 8C0AEA08A71075A6C765AEC9, | |||
| 89BC6E2354102D975E08E918, | |||
| 9F15FD7A7CE83CFD98F07D59, | |||
| 1351A13E78F38741C6075600, | |||
| 527DA2E6827BAFDDD3E8E80F, | |||
| @@ -173,7 +170,6 @@ | |||
| 470C3E4553B513FFEF752779, | |||
| DC192EFA899E6CBE6B5CD394, | |||
| 3B99CF94C44E2EE04635A439, | |||
| 440D507FD8F31DB62B1F95C7, | |||
| 02A2ED58B066B4D119F67913, | |||
| 4F0A137A4115946A346180E6, | |||
| B4389672DA4CC8E0A531062D, | |||
| @@ -3606,7 +3606,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SplashScreen.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/> | |||
| @@ -6288,9 +6288,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\misc</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| @@ -3606,7 +3606,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SplashScreen.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/> | |||
| @@ -6288,9 +6288,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\misc</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| @@ -3606,7 +3606,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SplashScreen.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/> | |||
| @@ -6288,9 +6288,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\misc</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| @@ -3606,7 +3606,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SplashScreen.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/> | |||
| @@ -6288,9 +6288,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\misc</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| @@ -1643,7 +1643,6 @@ add_library( ${BINARY_NAME} | |||
| "../../../../../modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp" | |||
| "../../../../../modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp" | |||
| "../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" | |||
| "../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" | |||
| "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" | |||
| "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" | |||
| "../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" | |||
| @@ -3279,7 +3278,6 @@ set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_l | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| @@ -24,7 +24,6 @@ | |||
| 7E870C094BAE67D7EB149F1C /* include_juce_events.mm */ = {isa = PBXBuildFile; fileRef = 248FAA119A4FC24C522165EF; }; | |||
| 8A0F71A4EEC7FE694352DD94 /* Accelerate.framework */ = {isa = PBXBuildFile; fileRef = 9EADBF913B7A454B6BE93A4A; }; | |||
| 9031C69145EE085B60904363 /* IOKit.framework */ = {isa = PBXBuildFile; fileRef = 43775DC3D9F7917846EA5327; }; | |||
| 9B19A6655FCC8086134C8656 /* Carbon.framework */ = {isa = PBXBuildFile; fileRef = 1DA5C6A474916745AFEC6DA5; }; | |||
| 9D47995A33BBA693ED435B31 /* include_juce_gui_extra.mm */ = {isa = PBXBuildFile; fileRef = B06AE97C86D27E7FEBCB4631; }; | |||
| C7B090C29D8DE4D2503204B1 /* include_juce_audio_utils.mm */ = {isa = PBXBuildFile; fileRef = BAFDA8DE51E7A69E477439EB; }; | |||
| CC782AABFA20787BABBCED90 /* Foundation.framework */ = {isa = PBXBuildFile; fileRef = E1BB9D521BF6C055F5B88628; }; | |||
| @@ -43,7 +42,6 @@ | |||
| 12C680C68A15B9A590264B18 /* CoreMIDI.framework */ /* CoreMIDI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; }; | |||
| 18C1CCE5684F9FA0478F27AD /* AudioToolbox.framework */ /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; | |||
| 18E39207A0F5F9B8BC7EE94F /* include_juce_audio_processors.mm */ /* include_juce_audio_processors.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_processors.mm; path = ../../JuceLibraryCode/include_juce_audio_processors.mm; sourceTree = SOURCE_ROOT; }; | |||
| 1DA5C6A474916745AFEC6DA5 /* Carbon.framework */ /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; | |||
| 24425FFB0BCC7E54CADAA013 /* include_juce_core.mm */ /* include_juce_core.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_core.mm; path = ../../JuceLibraryCode/include_juce_core.mm; sourceTree = SOURCE_ROOT; }; | |||
| 248FAA119A4FC24C522165EF /* include_juce_events.mm */ /* include_juce_events.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_events.mm; path = ../../JuceLibraryCode/include_juce_events.mm; sourceTree = SOURCE_ROOT; }; | |||
| 24D90B40648CC05A9B1AA55B /* CoreAudioKit.framework */ /* CoreAudioKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; }; | |||
| @@ -87,7 +85,6 @@ | |||
| files = ( | |||
| 8A0F71A4EEC7FE694352DD94, | |||
| 30BE30F31D1AAED9FC893AA5, | |||
| 9B19A6655FCC8086134C8656, | |||
| 0319B40AD2FD96007FFA928B, | |||
| 5AFD011031C266431687C922, | |||
| 71863EE98034AB7C3CBCAA81, | |||
| @@ -108,7 +105,6 @@ | |||
| children = ( | |||
| 9EADBF913B7A454B6BE93A4A, | |||
| 18C1CCE5684F9FA0478F27AD, | |||
| 1DA5C6A474916745AFEC6DA5, | |||
| 453777CEB7099A5D61901D13, | |||
| 9F28F179EF6B90EB9F4DBEE9, | |||
| 24D90B40648CC05A9B1AA55B, | |||
| @@ -3105,7 +3105,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SplashScreen.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/> | |||
| <ClInclude Include="..\..\JuceLibraryCode\JuceHeader.h"/> | |||
| @@ -5403,9 +5403,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\misc</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| @@ -1773,7 +1773,6 @@ add_library( ${BINARY_NAME} | |||
| "../../../../../modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp" | |||
| "../../../../../modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp" | |||
| "../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" | |||
| "../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" | |||
| "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" | |||
| "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" | |||
| "../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" | |||
| @@ -3563,7 +3562,6 @@ set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_l | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| @@ -14,7 +14,6 @@ | |||
| 15CCE43D7DCFC649638919D4 /* include_juce_audio_basics.mm */ = {isa = PBXBuildFile; fileRef = 4C7D82F9274A4F9DBF11235C; }; | |||
| 21D330A5B13178B12BEAFC3C /* AudioToolbox.framework */ = {isa = PBXBuildFile; fileRef = D4EBC17BDB7F88CCBC76730B; }; | |||
| 2727A191DB1BAAC9C04B9081 /* include_juce_opengl.mm */ = {isa = PBXBuildFile; fileRef = 37E4D5C341406B7072120006; }; | |||
| 2B4B9CF71F94BDD1E3AC89AE /* Carbon.framework */ = {isa = PBXBuildFile; fileRef = B0935EBBA4F6E2B05F3D1C0A; }; | |||
| 2C3D221D2AA87F07B3F1044D /* include_juce_gui_basics.mm */ = {isa = PBXBuildFile; fileRef = 8FE7B37CDE0818DB27BDDEBD; }; | |||
| 3E1689E23B9C85F03209DCEF /* GraphEditorPanel.cpp */ = {isa = PBXBuildFile; fileRef = 3D78A731234A833CA112AE45; }; | |||
| 443244451A0F2064D4767337 /* Icon.icns */ = {isa = PBXBuildFile; fileRef = 2A6983F82B13F9E8B10299AE; }; | |||
| @@ -103,7 +102,6 @@ | |||
| A66EFAC64B1B67B536C73415 /* HostStartup.cpp */ /* HostStartup.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = HostStartup.cpp; path = ../../Source/HostStartup.cpp; sourceTree = SOURCE_ROOT; }; | |||
| A692426308435C2002F988FE /* proaudio.path */ /* proaudio.path */ = {isa = PBXFileReference; lastKnownFileType = file.path; name = proaudio.path; path = ../../../../examples/Assets/proaudio.path; sourceTree = SOURCE_ROOT; }; | |||
| A872AF2CAFFC72109B9C6348 /* cassette_recorder.wav */ /* cassette_recorder.wav */ = {isa = PBXFileReference; lastKnownFileType = file.wav; name = cassette_recorder.wav; path = ../../../../examples/Assets/cassette_recorder.wav; sourceTree = SOURCE_ROOT; }; | |||
| B0935EBBA4F6E2B05F3D1C0A /* Carbon.framework */ /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; | |||
| B285CAB91AE928C476CA4F9C /* include_juce_audio_utils.mm */ /* include_juce_audio_utils.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_audio_utils.mm; path = ../../JuceLibraryCode/include_juce_audio_utils.mm; sourceTree = SOURCE_ROOT; }; | |||
| B2A1E626CC120982805754F6 /* JUCEAppIcon.png */ /* JUCEAppIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = JUCEAppIcon.png; path = ../../Source/JUCEAppIcon.png; sourceTree = SOURCE_ROOT; }; | |||
| B457EE687507BF1DEEA7581F /* WebKit.framework */ /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; | |||
| @@ -130,7 +128,6 @@ | |||
| B288A89F96704F142ED8E939, | |||
| 73E371F1B912FCCAE0CD7E5D, | |||
| 21D330A5B13178B12BEAFC3C, | |||
| 2B4B9CF71F94BDD1E3AC89AE, | |||
| AC3BED74AC7C6D9F5739F38B, | |||
| E3CB85BA817BC9E3942A8AB0, | |||
| 70580743C3D5695F065FF698, | |||
| @@ -269,7 +266,6 @@ | |||
| 5ACC21AA45BBF48C3C64D56D, | |||
| 86CA337014D3F67E906FFD28, | |||
| D4EBC17BDB7F88CCBC76730B, | |||
| B0935EBBA4F6E2B05F3D1C0A, | |||
| 9794142D24966F93FFDE51A1, | |||
| 9F9B445E6755CAA19E4344ED, | |||
| E68018DE199135B7F738FB17, | |||
| @@ -3340,7 +3340,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SplashScreen.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/> | |||
| @@ -5838,9 +5838,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\misc</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| @@ -3340,7 +3340,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SplashScreen.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/> | |||
| @@ -5838,9 +5838,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\misc</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| @@ -3340,7 +3340,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SplashScreen.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/> | |||
| @@ -5838,9 +5838,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\misc</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| @@ -3340,7 +3340,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SplashScreen.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/> | |||
| @@ -5838,9 +5838,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\misc</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| @@ -1662,7 +1662,6 @@ add_library( ${BINARY_NAME} | |||
| "../../../../../modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp" | |||
| "../../../../../modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp" | |||
| "../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" | |||
| "../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" | |||
| "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" | |||
| "../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" | |||
| "../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" | |||
| @@ -3378,7 +3377,6 @@ set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_l | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_AppleRemote.mm" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_NSViewFrameWatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| set_source_files_properties("../../../../../modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) | |||
| @@ -29,7 +29,6 @@ | |||
| A1F34D09F4E4338775917ED1 /* include_juce_audio_formats.mm */ = {isa = PBXBuildFile; fileRef = C6E2284D86D93F1D9D5C7666; }; | |||
| B323E5E5FBD5663B21A8E623 /* OpenGL.framework */ = {isa = PBXBuildFile; fileRef = 996E743A20FC78671766BF59; }; | |||
| BB9A9692D99DD0DDB1047B60 /* include_juce_audio_basics.mm */ = {isa = PBXBuildFile; fileRef = 6D1F9E505D20C09647124F0A; }; | |||
| BED88ADEA4DC91AA8C810FA8 /* Carbon.framework */ = {isa = PBXBuildFile; fileRef = 398A945EFD9ED923162982B1; }; | |||
| C4D6C466C41173D6970553D2 /* AudioToolbox.framework */ = {isa = PBXBuildFile; fileRef = 9E8129263CD42C6029FC2CAD; }; | |||
| C5E7BAD864E02CF37F7BD707 /* include_juce_events.mm */ = {isa = PBXBuildFile; fileRef = 33AA348465F512DBA8778DAF; }; | |||
| C6348C6B1D0312580E97EA19 /* include_juce_osc.cpp */ = {isa = PBXBuildFile; fileRef = 3BF06B70407FFDBE9534F942; }; | |||
| @@ -50,7 +49,6 @@ | |||
| 25DEDA8C9F94A6C8DFC8E53E /* SharedCanvas.h */ /* SharedCanvas.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SharedCanvas.h; path = ../../Source/SharedCanvas.h; sourceTree = SOURCE_ROOT; }; | |||
| 2E13A899F4E3C99054A3656F /* Accelerate.framework */ /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; | |||
| 33AA348465F512DBA8778DAF /* include_juce_events.mm */ /* include_juce_events.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_events.mm; path = ../../JuceLibraryCode/include_juce_events.mm; sourceTree = SOURCE_ROOT; }; | |||
| 398A945EFD9ED923162982B1 /* Carbon.framework */ /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; | |||
| 3BF06B70407FFDBE9534F942 /* include_juce_osc.cpp */ /* include_juce_osc.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_osc.cpp; path = ../../JuceLibraryCode/include_juce_osc.cpp; sourceTree = SOURCE_ROOT; }; | |||
| 448838BE6E937D450A3C84CE /* CoreMIDI.framework */ /* CoreMIDI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; }; | |||
| 4D1DB6D77B6F3DE7A569780B /* CoreAudioKit.framework */ /* CoreAudioKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; }; | |||
| @@ -107,7 +105,6 @@ | |||
| files = ( | |||
| 80EE2C27B466BAFD83881D3F, | |||
| C4D6C466C41173D6970553D2, | |||
| BED88ADEA4DC91AA8C810FA8, | |||
| 3C30D7C28C86F4054257DCD5, | |||
| 67DF295E93E54432043126DF, | |||
| 770AB74B1D3A0108F764DD47, | |||
| @@ -151,7 +148,6 @@ | |||
| children = ( | |||
| 2E13A899F4E3C99054A3656F, | |||
| 9E8129263CD42C6029FC2CAD, | |||
| 398A945EFD9ED923162982B1, | |||
| C78806A6727F44EACFDED4A5, | |||
| 6799B056504F9F017998B9E2, | |||
| 4D1DB6D77B6F3DE7A569780B, | |||
| @@ -3203,7 +3203,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SplashScreen.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/> | |||
| @@ -5565,9 +5565,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\misc</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| @@ -17,7 +17,6 @@ | |||
| 11D42F7EC6E6539D79A7F4B1 /* QuartzCore.framework */ = {isa = PBXBuildFile; fileRef = E5D6C36496F5BC84D7213BE8; }; | |||
| 1321E6C1C6170B6C898AD09D /* Icon.icns */ = {isa = PBXBuildFile; fileRef = 951128CA33CCDEF570436B1C; }; | |||
| 1B988E139004D8E2850EB656 /* jucer_PaintRoutine.cpp */ = {isa = PBXBuildFile; fileRef = C187718F7B9EBA88584B43F3; }; | |||
| 1E76E36772355E2A43CF4961 /* Carbon.framework */ = {isa = PBXBuildFile; fileRef = D00F311BFC3C2625C457CB9B; }; | |||
| 209FCCC2155A1FCB7E11E20D /* jucer_JucerDocument.cpp */ = {isa = PBXBuildFile; fileRef = 269A454F1FF081DA67FFD578; }; | |||
| 234B6BA2952CBC7C61EF70EF /* include_juce_events.mm */ = {isa = PBXBuildFile; fileRef = 5867DC4E39DF8539B54C0D59; }; | |||
| 241F29FCBB7A17BB44A0B10C /* Cocoa.framework */ = {isa = PBXBuildFile; fileRef = D1F9B0E9F5D54FE48BEB46EA; }; | |||
| @@ -314,7 +313,6 @@ | |||
| CCD62DB0A19A985A4B9D7F32 /* jucer_ProjectExport_Android.h */ /* jucer_ProjectExport_Android.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ProjectExport_Android.h; path = ../../Source/ProjectSaving/jucer_ProjectExport_Android.h; sourceTree = SOURCE_ROOT; }; | |||
| CD267A28C16C4E79EB749005 /* gpl_logo.svg */ /* gpl_logo.svg */ = {isa = PBXFileReference; lastKnownFileType = file.svg; name = gpl_logo.svg; path = ../../Source/BinaryData/Icons/gpl_logo.svg; sourceTree = SOURCE_ROOT; }; | |||
| CF6C8BD0DA3D8CD4E99EBADA /* WebKit.framework */ /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; | |||
| D00F311BFC3C2625C457CB9B /* Carbon.framework */ /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; | |||
| D045BD5943BD38F2720FF5F0 /* jucer_FontPropertyComponent.h */ /* jucer_FontPropertyComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_FontPropertyComponent.h; path = ../../Source/ComponentEditor/Properties/jucer_FontPropertyComponent.h; sourceTree = SOURCE_ROOT; }; | |||
| D05BD91B6105827B010E1C20 /* juce_gui_extra */ /* juce_gui_extra */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_gui_extra; path = ../../../../modules/juce_gui_extra; sourceTree = SOURCE_ROOT; }; | |||
| D1739728A79A2062418B8EF0 /* wizard_StaticLibrary.svg */ /* wizard_StaticLibrary.svg */ = {isa = PBXFileReference; lastKnownFileType = file.svg; name = wizard_StaticLibrary.svg; path = ../../Source/BinaryData/Icons/wizard_StaticLibrary.svg; sourceTree = SOURCE_ROOT; }; | |||
| @@ -390,7 +388,6 @@ | |||
| A578EAD4BB55680E8097BE0F, | |||
| C1B9334AE849F93FB3C56B34, | |||
| A14C2C2725DA3CA7995D2815, | |||
| 1E76E36772355E2A43CF4961, | |||
| 241F29FCBB7A17BB44A0B10C, | |||
| 9359F9401D59B4517F75C39C, | |||
| 091A57B4B9CE623E75E9A756, | |||
| @@ -442,7 +439,6 @@ | |||
| 80D62B907248523E6943298B, | |||
| 5A75806B34E4EA6598A6024A, | |||
| 210CD22F25F2C22F9CEEB025, | |||
| D00F311BFC3C2625C457CB9B, | |||
| D1F9B0E9F5D54FE48BEB46EA, | |||
| 728FE25157E9874D50BBECB2, | |||
| E983E6DDE3318B872EBE347F, | |||
| @@ -2136,7 +2136,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SplashScreen.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/> | |||
| <ClInclude Include="..\..\JuceLibraryCode\BinaryData.h"/> | |||
| @@ -3759,9 +3759,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\misc</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| @@ -2136,7 +2136,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SplashScreen.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/> | |||
| <ClInclude Include="..\..\JuceLibraryCode\BinaryData.h"/> | |||
| @@ -3759,9 +3759,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\misc</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| @@ -2136,7 +2136,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SplashScreen.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/> | |||
| <ClInclude Include="..\..\JuceLibraryCode\BinaryData.h"/> | |||
| @@ -3759,9 +3759,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\misc</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| @@ -2136,7 +2136,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SplashScreen.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/> | |||
| <ClInclude Include="..\..\JuceLibraryCode\BinaryData.h"/> | |||
| @@ -3759,9 +3759,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\misc</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| @@ -389,7 +389,7 @@ void ProjectExporter::addCommonAudioPluginSettings() | |||
| { | |||
| if (shouldBuildTargetType (build_tools::ProjectType::Target::AAXPlugIn)) | |||
| addAAXFoldersToPath(); | |||
| } | |||
| } | |||
| void ProjectExporter::addLegacyVSTFolderToPathIfSpecified() | |||
| { | |||
| @@ -19,7 +19,6 @@ | |||
| 3822F598DA7044E5DB7633A9 /* include_juce_audio_utils.mm */ = {isa = PBXBuildFile; fileRef = 846E187EC2E797B982861CA4; }; | |||
| 3866839F4051D104244870B1 /* CoreAudioKit.framework */ = {isa = PBXBuildFile; fileRef = 336A244E3C6460495F0A424C; }; | |||
| 4BC57B0D2215621D90C8881C /* WebKit.framework */ = {isa = PBXBuildFile; fileRef = D2EBC6292AE5AFC46EB10DAC; }; | |||
| 59004CE43AE081B4A6CE9E17 /* Carbon.framework */ = {isa = PBXBuildFile; fileRef = 1932D54A7FAE13BADBA3E9B5; }; | |||
| 5CB3596030B0DD3763CAF85C /* include_juce_data_structures.mm */ = {isa = PBXBuildFile; fileRef = 302A999B2803C0D5C15D237C; }; | |||
| 5FE50792EDC7638DE9A824B5 /* RecentFilesMenuTemplate.nib */ = {isa = PBXBuildFile; fileRef = 5C7BDD8DF72F2FC2D44D757A; }; | |||
| 66FC7F44EEC9044E5C4A21C3 /* CoreAudio.framework */ = {isa = PBXBuildFile; fileRef = C0531453A002C480280C5F05; }; | |||
| @@ -54,7 +53,6 @@ | |||
| 080EAB9CF5AB2BD6B2BBB173 /* ConsoleApp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = UnitTestRunner; sourceTree = BUILT_PRODUCTS_DIR; }; | |||
| 08ED235CBE02E0FB4BE4653E /* include_juce_cryptography.mm */ /* include_juce_cryptography.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_cryptography.mm; path = ../../JuceLibraryCode/include_juce_cryptography.mm; sourceTree = SOURCE_ROOT; }; | |||
| 1088318C19CEB1861C58B3BA /* include_juce_video.mm */ /* include_juce_video.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_video.mm; path = ../../JuceLibraryCode/include_juce_video.mm; sourceTree = SOURCE_ROOT; }; | |||
| 1932D54A7FAE13BADBA3E9B5 /* Carbon.framework */ /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; | |||
| 1CA82C74AEC08421812BDCAC /* include_juce_opengl.mm */ /* include_juce_opengl.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_opengl.mm; path = ../../JuceLibraryCode/include_juce_opengl.mm; sourceTree = SOURCE_ROOT; }; | |||
| 1DC921E6494548F5E73E1056 /* juce_graphics */ /* juce_graphics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_graphics; path = ../../../../modules/juce_graphics; sourceTree = SOURCE_ROOT; }; | |||
| 2030A589A9355FE6A0F72428 /* Cocoa.framework */ /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; | |||
| @@ -116,7 +114,6 @@ | |||
| 96EFF7BA261F57DD829324D8, | |||
| 6EB1A3B818863EF1787A9CCE, | |||
| D82BA4D40F5686DAFF5E11FB, | |||
| 59004CE43AE081B4A6CE9E17, | |||
| AA207299991F85938465BF65, | |||
| 66FC7F44EEC9044E5C4A21C3, | |||
| 3866839F4051D104244870B1, | |||
| @@ -141,7 +138,6 @@ | |||
| 7898C73DCA6FA9D9CF669D32, | |||
| 4B427AF10E722F9A362CEB73, | |||
| 99527F36B4484133087435CD, | |||
| 1932D54A7FAE13BADBA3E9B5, | |||
| 2030A589A9355FE6A0F72428, | |||
| C0531453A002C480280C5F05, | |||
| 336A244E3C6460495F0A424C, | |||
| @@ -3408,7 +3408,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SplashScreen.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/> | |||
| @@ -5934,9 +5934,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\misc</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| @@ -3408,7 +3408,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SplashScreen.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/> | |||
| @@ -5934,9 +5934,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\misc</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| @@ -3408,7 +3408,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SplashScreen.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/> | |||
| @@ -5934,9 +5934,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\misc</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| @@ -3179,7 +3179,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SplashScreen.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\juce_gui_extra.h"/> | |||
| <ClInclude Include="..\..\..\..\modules\juce_opengl\geometry\juce_Draggable3DOrientation.h"/> | |||
| @@ -5532,9 +5532,6 @@ | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\misc</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_CarbonViewWrapperComponent.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\..\..\modules\juce_gui_extra\native\juce_mac_NSViewFrameWatcher.h"> | |||
| <Filter>JUCE Modules\juce_gui_extra\native</Filter> | |||
| </ClInclude> | |||
| @@ -1,403 +0,0 @@ | |||
| /* | |||
| File: AUCarbonViewBase.cpp | |||
| Abstract: AUCarbonViewBase.h | |||
| Version: 1.1 | |||
| Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple | |||
| Inc. ("Apple") in consideration of your agreement to the following | |||
| terms, and your use, installation, modification or redistribution of | |||
| this Apple software constitutes acceptance of these terms. If you do | |||
| not agree with these terms, please do not use, install, modify or | |||
| redistribute this Apple software. | |||
| In consideration of your agreement to abide by the following terms, and | |||
| subject to these terms, Apple grants you a personal, non-exclusive | |||
| license, under Apple's copyrights in this original Apple software (the | |||
| "Apple Software"), to use, reproduce, modify and redistribute the Apple | |||
| Software, with or without modifications, in source and/or binary forms; | |||
| provided that if you redistribute the Apple Software in its entirety and | |||
| without modifications, you must retain this notice and the following | |||
| text and disclaimers in all such redistributions of the Apple Software. | |||
| Neither the name, trademarks, service marks or logos of Apple Inc. may | |||
| be used to endorse or promote products derived from the Apple Software | |||
| without specific prior written permission from Apple. Except as | |||
| expressly stated in this notice, no other rights or licenses, express or | |||
| implied, are granted by Apple herein, including but not limited to any | |||
| patent rights that may be infringed by your derivative works or by other | |||
| works in which the Apple Software may be incorporated. | |||
| The Apple Software is provided by Apple on an "AS IS" basis. APPLE | |||
| MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION | |||
| THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS | |||
| FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND | |||
| OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. | |||
| IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL | |||
| OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |||
| SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |||
| INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, | |||
| MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED | |||
| AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), | |||
| STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE | |||
| POSSIBILITY OF SUCH DAMAGE. | |||
| Copyright (C) 2014 Apple Inc. All Rights Reserved. | |||
| */ | |||
| #include "AUCarbonViewBase.h" | |||
| #include "AUCarbonViewControl.h" | |||
| #include <algorithm> | |||
| AUCarbonViewBase::AUCarbonViewBase(AudioUnitCarbonView inInstance, Float32 inNotificationInterval /* in seconds */) : | |||
| ComponentBase(inInstance), | |||
| mEditAudioUnit(0), | |||
| mParameterListener(NULL), | |||
| #if !__LP64__ | |||
| mEventListener(NULL), | |||
| #endif | |||
| mTimerRef (NULL), | |||
| mTimerUPP (NULL), | |||
| mCarbonWindow(NULL), | |||
| mCarbonPane(NULL), | |||
| mXOffset(0), | |||
| mYOffset(0) | |||
| { | |||
| AUEventListenerCreate (ParameterListener, this, | |||
| CFRunLoopGetCurrent(), kCFRunLoopCommonModes, | |||
| inNotificationInterval, inNotificationInterval, | |||
| &mParameterListener); | |||
| } | |||
| AUCarbonViewBase::~AUCarbonViewBase() | |||
| { | |||
| #if !__LP64__ | |||
| if (mCarbonPane) | |||
| DisposeControl(mCarbonPane); | |||
| for (ControlList::iterator it = mControlList.begin(); it != mControlList.end(); ++it) { | |||
| AUCarbonViewControl *ctl = *it; | |||
| delete ctl; | |||
| } | |||
| AUListenerDispose(mParameterListener); | |||
| if (mTimerRef) | |||
| ::RemoveEventLoopTimer (mTimerRef); | |||
| if (mTimerUPP) | |||
| DisposeEventLoopTimerUPP (mTimerUPP); | |||
| #endif | |||
| } | |||
| void AUCarbonViewBase::AddControl(AUCarbonViewControl *control) | |||
| { | |||
| ControlList::iterator it = find(mControlList.begin(), mControlList.end(), control); | |||
| if (it == mControlList.end()) | |||
| mControlList.push_back(control); | |||
| } | |||
| void AUCarbonViewBase::RemoveControl(AUCarbonViewControl *control) | |||
| { | |||
| ControlList::iterator it = find(mControlList.begin(), mControlList.end(), control); | |||
| if (it != mControlList.end()) { | |||
| AUCarbonViewControl *ctl = *it; | |||
| mControlList.erase(it); | |||
| delete ctl; | |||
| } | |||
| } | |||
| void AUCarbonViewBase::ClearControls () | |||
| { | |||
| for (ControlList::iterator it = mControlList.begin(); it != mControlList.end(); ++it) { | |||
| AUCarbonViewControl *ctl = *it; | |||
| delete ctl; | |||
| } | |||
| mControlList.clear(); | |||
| } | |||
| void AUCarbonViewBase::ParameterListener(void * inCallbackRefCon, | |||
| void * inObject, | |||
| const AudioUnitEvent * inEvent, | |||
| UInt64 inEventHostTime, | |||
| Float32 inParameterValue) | |||
| { | |||
| if (inEvent->mEventType == kAudioUnitEvent_ParameterValueChange) { | |||
| AUCarbonViewControl *ctl = (AUCarbonViewControl *)inObject; | |||
| ctl->ParameterToControl(inParameterValue); | |||
| } | |||
| } | |||
| OSStatus AUCarbonViewBase::CreateCarbonView(AudioUnit inAudioUnit, WindowRef inWindow, ControlRef inParentControl, const Float32Point &inLocation, const Float32Point &inSize, ControlRef &outParentControl) | |||
| { | |||
| #if !__LP64__ | |||
| mEditAudioUnit = inAudioUnit; | |||
| mCarbonWindow = inWindow; | |||
| WindowAttributes attributes; | |||
| verify_noerr(GetWindowAttributes(mCarbonWindow, &attributes)); | |||
| mCompositWindow = (attributes & kWindowCompositingAttribute) != 0; | |||
| Rect area; | |||
| area.left = short(inLocation.x); area.top = short(inLocation.y); | |||
| area.right = short(area.left + inSize.x); area.bottom = short(area.top + inSize.y); | |||
| OSStatus err = ::CreateUserPaneControl(inWindow, &area, | |||
| kControlSupportsEmbedding, | |||
| &mCarbonPane); // subclass can resize mCarbonPane to taste | |||
| verify_noerr(err); | |||
| if (err) return err; | |||
| outParentControl = mCarbonPane; | |||
| // register for mouse-down in our pane -- we want to clear focus | |||
| EventTypeSpec paneEvents[] = { | |||
| { kEventClassControl, kEventControlClick } | |||
| }; | |||
| WantEventTypes(GetControlEventTarget(mCarbonPane), GetEventTypeCount(paneEvents), paneEvents); | |||
| if (IsCompositWindow()) { | |||
| verify_noerr(::HIViewAddSubview(inParentControl, mCarbonPane)); | |||
| mXOffset = 0; | |||
| mYOffset = 0; | |||
| } | |||
| else { | |||
| verify_noerr(::EmbedControl(mCarbonPane, inParentControl)); | |||
| mXOffset = inLocation.x; | |||
| mYOffset = inLocation.y; | |||
| } | |||
| mBottomRight.h = mBottomRight.v = 0; | |||
| SizeControl(mCarbonPane, 0, 0); | |||
| if (err = CreateUI(mXOffset, mYOffset)) | |||
| return err; | |||
| // we should only resize the control if a subclass has embedded | |||
| // controls in this AND this is done with the EmbedControl call below | |||
| // if mBottomRight is STILL equal to zero, then that wasn't done | |||
| // so don't size the control | |||
| Rect paneBounds; | |||
| GetControlBounds(mCarbonPane, &paneBounds); | |||
| // only resize mCarbonPane if it has not already been resized during CreateUI | |||
| if ((paneBounds.top == paneBounds.bottom) && (paneBounds.left == paneBounds.right)) { | |||
| if (mBottomRight.h != 0 && mBottomRight.v != 0) | |||
| SizeControl(mCarbonPane, (short) (mBottomRight.h - mXOffset), (short) (mBottomRight.v - mYOffset)); | |||
| } | |||
| if (IsCompositWindow()) { | |||
| // prepare for handling scroll-events | |||
| EventTypeSpec scrollEvents[] = { | |||
| { kEventClassScrollable, kEventScrollableGetInfo }, | |||
| { kEventClassScrollable, kEventScrollableScrollTo } | |||
| }; | |||
| WantEventTypes(GetControlEventTarget(mCarbonPane), GetEventTypeCount(scrollEvents), scrollEvents); | |||
| mCurrentScrollPoint.x = mCurrentScrollPoint.y = 0.0f; | |||
| } | |||
| return err; | |||
| #else | |||
| return noErr; | |||
| #endif | |||
| } | |||
| OSStatus AUCarbonViewBase::CreateUI(Float32 inXOffset, Float32 inYOffset) | |||
| { | |||
| return noErr; | |||
| } | |||
| OSStatus AUCarbonViewBase::EmbedControl(ControlRef ctl) | |||
| { | |||
| #if !__LP64__ | |||
| Rect r; | |||
| ::GetControlBounds(ctl, &r); | |||
| if (r.right > mBottomRight.h) mBottomRight.h = r.right; | |||
| if (r.bottom > mBottomRight.v) mBottomRight.v = r.bottom; | |||
| if (IsCompositWindow()) | |||
| return ::HIViewAddSubview(mCarbonPane, ctl); | |||
| else | |||
| return ::EmbedControl(ctl, mCarbonPane); | |||
| #else | |||
| return noErr; | |||
| #endif | |||
| } | |||
| void AUCarbonViewBase::AddCarbonControl(AUCarbonViewControl::ControlType type, const CAAUParameter ¶m, ControlRef control) | |||
| { | |||
| verify_noerr(EmbedControl(control)); | |||
| AUCarbonViewControl *auvc = new AUCarbonViewControl(this, mParameterListener, type, param, control); | |||
| auvc->Bind(); | |||
| AddControl(auvc); | |||
| } | |||
| bool AUCarbonViewBase::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef event) | |||
| { | |||
| #if !__LP64__ | |||
| UInt32 eclass = GetEventClass(event); | |||
| UInt32 ekind = GetEventKind(event); | |||
| ControlRef control; | |||
| switch (eclass) { | |||
| case kEventClassControl: | |||
| { | |||
| switch (ekind) { | |||
| case kEventControlClick: | |||
| GetEventParameter(event, kEventParamDirectObject, typeControlRef, NULL, sizeof(ControlRef), NULL, &control); | |||
| if (control == mCarbonPane) { | |||
| ClearKeyboardFocus(mCarbonWindow); | |||
| return true; | |||
| } | |||
| } | |||
| } | |||
| break; | |||
| case kEventClassScrollable: | |||
| { | |||
| switch (ekind) { | |||
| case kEventScrollableGetInfo: | |||
| { | |||
| // [1/4] | |||
| /* <-- kEventParamImageSize (out, typeHISize) | |||
| * On exit, contains the size of the entire scrollable view. | |||
| */ | |||
| HISize originalSize = { static_cast<CGFloat>(mBottomRight.h), static_cast<CGFloat>(mBottomRight.v) }; | |||
| verify_noerr(SetEventParameter(event, kEventParamImageSize, typeHISize, sizeof(HISize), &originalSize)); | |||
| // [2/4] | |||
| /* <-- kEventParamViewSize (out, typeHISize) | |||
| * On exit, contains the amount of the scrollable view that is | |||
| * visible. | |||
| */ | |||
| HIViewRef parentView = HIViewGetSuperview(mCarbonPane); | |||
| HIRect parentBounds; | |||
| verify_noerr(HIViewGetBounds(parentView, &parentBounds)); | |||
| //HISize windowSize = { float(windowBounds.right - windowBounds.left), | |||
| // float(windowBounds.bottom - windowBounds.top) }; | |||
| verify_noerr(SetEventParameter(event, kEventParamViewSize, typeHISize, sizeof(HISize), &(parentBounds.size))); | |||
| // [3/4] | |||
| /* <-- kEventParamLineSize (out, typeHISize) | |||
| * On exit, contains the amount that should be scrolled in | |||
| * response to a single click on a scrollbar arrow. | |||
| */ | |||
| HISize scrollIncrementSize = { 16.0f, float(20) }; | |||
| verify_noerr(SetEventParameter(event, kEventParamLineSize, typeHISize, sizeof(HISize), &scrollIncrementSize)); | |||
| // [4/4] | |||
| /* <-- kEventParamOrigin (out, typeHIPoint) | |||
| * On exit, contains the scrollable viewÕs current origin (the | |||
| * view-relative coordinate that is drawn at the top left | |||
| * corner of its frame). These coordinates should always be | |||
| * greater than or equal to zero. They should be less than or | |||
| * equal to the viewÕs image size minus its view size. | |||
| */ | |||
| verify_noerr(SetEventParameter(event, kEventParamOrigin, typeHIPoint, sizeof(HIPoint), &mCurrentScrollPoint)); | |||
| } | |||
| return true; | |||
| case kEventScrollableScrollTo: | |||
| { | |||
| /* | |||
| * kEventClassScrollable / kEventScrollableScrollTo | |||
| * | |||
| * Summary: | |||
| * Requests that an HIScrollViewÕs scrollable view should scroll to | |||
| * a particular origin. | |||
| */ | |||
| /* --> kEventParamOrigin (in, typeHIPoint) | |||
| * The new origin for the scrollable view. The origin | |||
| * coordinates will vary from (0,0) to scrollable viewÕs image | |||
| * size minus its view size. | |||
| */ | |||
| HIPoint pointToScrollTo; | |||
| verify_noerr(GetEventParameter(event, kEventParamOrigin, typeHIPoint, NULL, sizeof(HIPoint), NULL, &pointToScrollTo)); | |||
| float xDelta = mCurrentScrollPoint.x - pointToScrollTo.x; | |||
| float yDelta = mCurrentScrollPoint.y - pointToScrollTo.y; | |||
| // move visible portion the appropriate amount | |||
| verify_noerr(HIViewScrollRect(mCarbonPane, NULL, xDelta, yDelta)); | |||
| // set new content to be drawn | |||
| verify_noerr(HIViewSetBoundsOrigin(mCarbonPane, pointToScrollTo.x, pointToScrollTo.y)); | |||
| mCurrentScrollPoint = pointToScrollTo; | |||
| } | |||
| return true; | |||
| default: | |||
| break; | |||
| } | |||
| } | |||
| break; | |||
| default: | |||
| break; | |||
| } | |||
| #endif | |||
| return false; | |||
| } | |||
| /*! @method TellListener */ | |||
| void AUCarbonViewBase::TellListener (const CAAUParameter &auvp, AudioUnitCarbonViewEventID event, void *evpar) | |||
| { | |||
| #if !__LP64__ | |||
| if (mEventListener) | |||
| (*mEventListener)(mEventListenerUserData, mComponentInstance, &auvp, event, evpar); | |||
| #endif | |||
| AudioUnitEvent auEvent; | |||
| auEvent.mArgument.mParameter = auvp; | |||
| if (event == kAudioUnitCarbonViewEvent_MouseDownInControl) { | |||
| auEvent.mEventType = kAudioUnitEvent_BeginParameterChangeGesture; | |||
| } else { | |||
| auEvent.mEventType = kAudioUnitEvent_EndParameterChangeGesture; | |||
| } | |||
| AUEventListenerNotify(mParameterListener, this, &auEvent); | |||
| } | |||
| void AUCarbonViewBase::Update (bool inUIThread) | |||
| { | |||
| for (ControlList::iterator iter = mControlList.begin(); iter != mControlList.end(); ++iter) | |||
| { | |||
| (*iter)->Update(inUIThread); | |||
| } | |||
| } | |||
| pascal void AUCarbonViewBase::TheTimerProc (EventLoopTimerRef inTimer, void *inUserData) | |||
| { | |||
| AUCarbonViewBase* This = reinterpret_cast<AUCarbonViewBase*>(inUserData); | |||
| This->RespondToEventTimer (inTimer); | |||
| } | |||
| void AUCarbonViewBase::RespondToEventTimer (EventLoopTimerRef inTimer) | |||
| {} | |||
| /* | |||
| THESE are reasonable values for these two times | |||
| 0.005 // delay | |||
| 0.050 // interval | |||
| */ | |||
| OSStatus AUCarbonViewBase::CreateEventLoopTimer (Float32 inDelay, Float32 inInterval) | |||
| { | |||
| if (mTimerUPP) | |||
| return noErr; | |||
| mTimerUPP = NewEventLoopTimerUPP(TheTimerProc); | |||
| EventLoopRef mainEventLoop = GetMainEventLoop(); | |||
| //doesn't seem to like too small a value | |||
| if (inDelay < 0.005) | |||
| inDelay = 0.005; | |||
| OSStatus timerResult = ::InstallEventLoopTimer( | |||
| mainEventLoop, | |||
| inDelay, | |||
| inInterval, | |||
| mTimerUPP, | |||
| this, | |||
| &mTimerRef); | |||
| return timerResult; | |||
| } | |||
| @@ -1,190 +0,0 @@ | |||
| /* | |||
| File: AUCarbonViewBase.h | |||
| Abstract: Part of CoreAudio Utility Classes | |||
| Version: 1.1 | |||
| Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple | |||
| Inc. ("Apple") in consideration of your agreement to the following | |||
| terms, and your use, installation, modification or redistribution of | |||
| this Apple software constitutes acceptance of these terms. If you do | |||
| not agree with these terms, please do not use, install, modify or | |||
| redistribute this Apple software. | |||
| In consideration of your agreement to abide by the following terms, and | |||
| subject to these terms, Apple grants you a personal, non-exclusive | |||
| license, under Apple's copyrights in this original Apple software (the | |||
| "Apple Software"), to use, reproduce, modify and redistribute the Apple | |||
| Software, with or without modifications, in source and/or binary forms; | |||
| provided that if you redistribute the Apple Software in its entirety and | |||
| without modifications, you must retain this notice and the following | |||
| text and disclaimers in all such redistributions of the Apple Software. | |||
| Neither the name, trademarks, service marks or logos of Apple Inc. may | |||
| be used to endorse or promote products derived from the Apple Software | |||
| without specific prior written permission from Apple. Except as | |||
| expressly stated in this notice, no other rights or licenses, express or | |||
| implied, are granted by Apple herein, including but not limited to any | |||
| patent rights that may be infringed by your derivative works or by other | |||
| works in which the Apple Software may be incorporated. | |||
| The Apple Software is provided by Apple on an "AS IS" basis. APPLE | |||
| MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION | |||
| THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS | |||
| FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND | |||
| OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. | |||
| IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL | |||
| OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |||
| SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |||
| INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, | |||
| MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED | |||
| AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), | |||
| STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE | |||
| POSSIBILITY OF SUCH DAMAGE. | |||
| Copyright (C) 2014 Apple Inc. All Rights Reserved. | |||
| */ | |||
| #ifndef __AUCarbonViewBase_h__ | |||
| #define __AUCarbonViewBase_h__ | |||
| #pragma clang diagnostic ignored "-Wdeprecated-declarations" | |||
| #include <vector> | |||
| #include "AUCarbonViewControl.h" | |||
| #include "ComponentBase.h" | |||
| static const Float32 kDefaultNotificationInterval = 0.100; | |||
| /*! @class AUCarbonViewBase */ | |||
| class AUCarbonViewBase : public ComponentBase, public CarbonEventHandler | |||
| { | |||
| public: | |||
| /*! @ctor AUCarbonViewBase */ | |||
| AUCarbonViewBase ( AudioUnitCarbonView inInstance, | |||
| Float32 inNotificationInterval = kDefaultNotificationInterval /* in seconds */); | |||
| /*! @dtor ~AUCarbonViewBase */ | |||
| virtual ~AUCarbonViewBase(); | |||
| // AUViewBase overrides | |||
| /*! @method CreateCarbonView */ | |||
| virtual OSStatus CreateCarbonView (AudioUnit inAudioUnit, WindowRef inWindow, ControlRef inParentControl, const Float32Point &inLocation, const Float32Point &inSize, ControlRef &outParentControl); | |||
| // our own virtual methods | |||
| /*! @method CreateUI */ | |||
| virtual OSStatus CreateUI (Float32 inXOffset, Float32 inYOffset); | |||
| /*! @method HandleEvent */ | |||
| virtual bool HandleEvent (EventHandlerCallRef inHandlerRef, EventRef event); | |||
| /*! @method GetEditAudioUnit */ | |||
| const AudioUnit GetEditAudioUnit () const { return mEditAudioUnit; } | |||
| // | |||
| /*! @method ComponentEntryDispatch */ | |||
| static OSStatus ComponentEntryDispatch ( | |||
| ComponentParameters * params, | |||
| AUCarbonViewBase * This); | |||
| /*! @method AddCarbonControl */ | |||
| void AddCarbonControl ( | |||
| AUCarbonViewControl::ControlType type, | |||
| const CAAUParameter & param, | |||
| ControlRef control); | |||
| /*! @method GetCarbonWindow */ | |||
| WindowRef GetCarbonWindow () { return mCarbonWindow; } | |||
| /*! @method GetCarbonPane */ | |||
| ControlRef GetCarbonPane () { return mCarbonPane; } | |||
| /*! @method EmbedControl */ | |||
| OSStatus EmbedControl (ControlRef ctl); | |||
| /*! @method TellListener */ | |||
| void TellListener (const CAAUParameter &auvp, AudioUnitCarbonViewEventID event, void *evpar); | |||
| // pass in true if wanting an update to the view and you're calling this from a thread | |||
| // that is safe to do UI in. | |||
| // If you don't know, pass in false! | |||
| /*! @method Update */ | |||
| void Update (bool inUIThread); | |||
| /*! @method GetXOffset */ | |||
| Float32 GetXOffset () { return mXOffset; } | |||
| /*! @method GetYOffset */ | |||
| Float32 GetYOffset () { return mYOffset; } | |||
| /*! @method ClearControls */ | |||
| void ClearControls (); | |||
| /*! @method IsCompositWindow */ | |||
| bool IsCompositWindow () const { return mCompositWindow; } | |||
| protected: | |||
| #if !__LP64__ | |||
| /*! @method SetEventListener */ | |||
| void SetEventListener (AudioUnitCarbonViewEventListener listener, void *userData) | |||
| { | |||
| mEventListener = listener; | |||
| mEventListenerUserData = userData; | |||
| } | |||
| #endif | |||
| /*! @method AddControl */ | |||
| void AddControl (AUCarbonViewControl *control); | |||
| /*! @method RemoveControl */ | |||
| void RemoveControl (AUCarbonViewControl *control); | |||
| OSStatus CreateEventLoopTimer (Float32 inDelay, Float32 inInterval); | |||
| /*! @method ParameterListener */ | |||
| static void ParameterListener (void * inCallbackRefCon, | |||
| void * inObject, | |||
| const AudioUnitEvent * inEvent, | |||
| UInt64 inEventHostTime, | |||
| Float32 inParameterValue); | |||
| static pascal void TheTimerProc ( EventLoopTimerRef inTimer, | |||
| void * inUserData); | |||
| virtual void RespondToEventTimer (EventLoopTimerRef inTimer); | |||
| /*! @var mEditAudioUnit */ | |||
| AudioUnit mEditAudioUnit; // the AU we're controlling | |||
| /*! @var mParameterListener */ | |||
| AUEventListenerRef mParameterListener; | |||
| #if !__LP64__ | |||
| /*! @var mEventListener */ | |||
| AudioUnitCarbonViewEventListener | |||
| mEventListener; | |||
| #endif | |||
| /*! @var mEventListenerUserData */ | |||
| void * mEventListenerUserData; | |||
| private: | |||
| typedef std::vector<AUCarbonViewControl *> ControlList; | |||
| /*! @var mControlList */ | |||
| ControlList mControlList; | |||
| EventLoopTimerRef mTimerRef; | |||
| EventLoopTimerUPP mTimerUPP; | |||
| protected: | |||
| /*! @var mCarbonWindow */ | |||
| WindowRef mCarbonWindow; | |||
| /*! @var mCarbonPane */ | |||
| ControlRef mCarbonPane; // user pane, contains all other controls | |||
| /*! @var mBottomRight */ | |||
| Point mBottomRight; // largest width and height of child controls | |||
| /*! @var mXOffset */ | |||
| Float32 mXOffset; | |||
| /*! @var mYOffset */ | |||
| Float32 mYOffset; | |||
| /*! @var mCompositWindow */ | |||
| bool mCompositWindow; | |||
| /*! @var mCurrentScrollPoint */ | |||
| HIPoint mCurrentScrollPoint; // needed for scrolling | |||
| }; | |||
| #endif // __AUCarbonViewBase_h__ | |||
| @@ -1,710 +0,0 @@ | |||
| /* | |||
| File: AUCarbonViewControl.cpp | |||
| Abstract: AUCarbonViewControl.h | |||
| Version: 1.1 | |||
| Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple | |||
| Inc. ("Apple") in consideration of your agreement to the following | |||
| terms, and your use, installation, modification or redistribution of | |||
| this Apple software constitutes acceptance of these terms. If you do | |||
| not agree with these terms, please do not use, install, modify or | |||
| redistribute this Apple software. | |||
| In consideration of your agreement to abide by the following terms, and | |||
| subject to these terms, Apple grants you a personal, non-exclusive | |||
| license, under Apple's copyrights in this original Apple software (the | |||
| "Apple Software"), to use, reproduce, modify and redistribute the Apple | |||
| Software, with or without modifications, in source and/or binary forms; | |||
| provided that if you redistribute the Apple Software in its entirety and | |||
| without modifications, you must retain this notice and the following | |||
| text and disclaimers in all such redistributions of the Apple Software. | |||
| Neither the name, trademarks, service marks or logos of Apple Inc. may | |||
| be used to endorse or promote products derived from the Apple Software | |||
| without specific prior written permission from Apple. Except as | |||
| expressly stated in this notice, no other rights or licenses, express or | |||
| implied, are granted by Apple herein, including but not limited to any | |||
| patent rights that may be infringed by your derivative works or by other | |||
| works in which the Apple Software may be incorporated. | |||
| The Apple Software is provided by Apple on an "AS IS" basis. APPLE | |||
| MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION | |||
| THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS | |||
| FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND | |||
| OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. | |||
| IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL | |||
| OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |||
| SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |||
| INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, | |||
| MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED | |||
| AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), | |||
| STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE | |||
| POSSIBILITY OF SUCH DAMAGE. | |||
| Copyright (C) 2014 Apple Inc. All Rights Reserved. | |||
| */ | |||
| #include "AUCarbonViewControl.h" | |||
| #include "AUCarbonViewBase.h" | |||
| #include "AUViewLocalizedStringKeys.h" | |||
| AUCarbonViewControl::AUCarbonViewControl(AUCarbonViewBase *ownerView, AUParameterListenerRef listener, ControlType type, const CAAUParameter ¶m, ControlRef control) : | |||
| mOwnerView(ownerView), | |||
| mListener(listener), | |||
| mType(type), | |||
| mParam(param), | |||
| mControl(control), | |||
| mInControlInitialization(0) | |||
| { | |||
| #if !__LP64__ | |||
| SetControlReference(control, SRefCon(this)); | |||
| #endif | |||
| } | |||
| AUCarbonViewControl::~AUCarbonViewControl() | |||
| { | |||
| AUListenerRemoveParameter(mListener, this, &mParam); | |||
| } | |||
| AUCarbonViewControl* AUCarbonViewControl::mLastControl = NULL; | |||
| void AUCarbonViewControl::Bind() | |||
| { | |||
| #if !__LP64__ | |||
| mInControlInitialization = 1; // true | |||
| AUListenerAddParameter(mListener, this, &mParam); | |||
| // will cause an almost-immediate callback | |||
| EventTypeSpec events[] = { | |||
| { kEventClassControl, kEventControlValueFieldChanged } // N.B. OS X only | |||
| }; | |||
| WantEventTypes(GetControlEventTarget(mControl), GetEventTypeCount(events), events); | |||
| if (mType == kTypeContinuous || mType == kTypeText || mType == kTypeDiscrete) { | |||
| EventTypeSpec controlEvents[] = { | |||
| { kEventClassControl, kEventControlHit }, | |||
| { kEventClassControl, kEventControlClick }, | |||
| { kEventClassControl, kEventControlTrack } | |||
| }; | |||
| WantEventTypes(GetControlEventTarget(mControl), GetEventTypeCount(controlEvents), controlEvents); | |||
| } | |||
| if (mType == kTypeText) { | |||
| EventTypeSpec controlFocusEvents[] = { | |||
| { kEventClassControl, kEventControlSetFocusPart } | |||
| }; | |||
| WantEventTypes(GetControlEventTarget(mControl), GetEventTypeCount(controlFocusEvents), controlFocusEvents); | |||
| ControlKeyFilterUPP proc = mParam.ValuesHaveStrings() ? StdKeyFilterCallback : NumericKeyFilterCallback; | |||
| // this will fail for a static text field | |||
| SetControlData(mControl, 0, kControlEditTextKeyFilterTag, sizeof(proc), &proc); | |||
| } | |||
| Update(true); | |||
| mInControlInitialization = 0; // false | |||
| #endif | |||
| } | |||
| void AUCarbonViewControl::ParameterToControl(Float32 paramValue) | |||
| { | |||
| #if !__LP64__ | |||
| ++mInControlInitialization; | |||
| switch (mType) { | |||
| case kTypeContinuous: | |||
| SetValueFract(AUParameterValueToLinear(paramValue, &mParam)); | |||
| break; | |||
| case kTypeDiscrete: | |||
| { | |||
| long value = long(paramValue); | |||
| // special case [1] -- menu parameters | |||
| if (mParam.HasNamedParams()) { | |||
| // if we're dealing with menus they behave differently! | |||
| // becaue setting min and max doesn't work correctly for the control value | |||
| // first menu item always reports a control value of 1 | |||
| ControlKind ctrlKind; | |||
| if (GetControlKind(mControl, &ctrlKind) == noErr) { | |||
| if ((ctrlKind.kind == kControlKindPopupArrow) | |||
| || (ctrlKind.kind == kControlKindPopupButton)) | |||
| { | |||
| value = value - long(mParam.ParamInfo().minValue) + 1; | |||
| } | |||
| } | |||
| } | |||
| // special case [2] -- Write-only boolean parameters | |||
| AudioUnitParameterInfo AUPI = mParam.ParamInfo(); | |||
| bool isWriteOnlyBoolParameter = ( (AUPI.unit == kAudioUnitParameterUnit_Boolean) && | |||
| (AUPI.flags & kAudioUnitParameterFlag_IsWritable) && | |||
| !(AUPI.flags & kAudioUnitParameterFlag_IsReadable) ); | |||
| if (!isWriteOnlyBoolParameter) { | |||
| SetValue (value); | |||
| } | |||
| } | |||
| break; | |||
| case kTypeText: | |||
| { | |||
| CFStringRef cfstr = mParam.GetStringFromValueCopy(¶mValue); | |||
| if ( !(mParam.ParamInfo().flags & kAudioUnitParameterFlag_IsWritable) //READ ONLY PARAMS | |||
| && (mParam.ParamInfo().flags & kAudioUnitParameterFlag_IsReadable)) | |||
| { | |||
| if (mParam.GetParamTag()) { | |||
| CFMutableStringRef str = CFStringCreateMutableCopy(NULL, 256, cfstr); | |||
| CFRelease (cfstr); | |||
| CFStringAppend (str, CFSTR(" ")); | |||
| CFStringAppend (str, mParam.GetParamTag()); | |||
| cfstr = str; | |||
| } | |||
| } | |||
| SetTextValue(cfstr); | |||
| CFRelease (cfstr); | |||
| } | |||
| break; | |||
| } | |||
| --mInControlInitialization; | |||
| #endif | |||
| } | |||
| void AUCarbonViewControl::ControlToParameter() | |||
| { | |||
| #if !__LP64__ | |||
| if (mInControlInitialization) | |||
| return; | |||
| switch (mType) { | |||
| case kTypeContinuous: | |||
| { | |||
| double controlValue = GetValueFract(); | |||
| Float32 paramValue = AUParameterValueFromLinear(controlValue, &mParam); | |||
| mParam.SetValue(mListener, this, paramValue); | |||
| } | |||
| break; | |||
| case kTypeDiscrete: | |||
| { | |||
| long value = GetValue(); | |||
| // special case [1] -- Menus | |||
| if (mParam.HasNamedParams()) { | |||
| // if we're dealing with menus they behave differently! | |||
| // becaue setting min and max doesn't work correctly for the control value | |||
| // first menu item always reports a control value of 1 | |||
| ControlKind ctrlKind; | |||
| if (GetControlKind(mControl, &ctrlKind) == noErr) { | |||
| if ((ctrlKind.kind == kControlKindPopupArrow) | |||
| || (ctrlKind.kind == kControlKindPopupButton)) | |||
| { | |||
| value = value + long(mParam.ParamInfo().minValue) - 1; | |||
| } | |||
| } | |||
| } | |||
| // special case [2] -- Write-only boolean parameters | |||
| AudioUnitParameterInfo AUPI = mParam.ParamInfo(); | |||
| bool isWriteOnlyBoolParameter = ( (AUPI.unit == kAudioUnitParameterUnit_Boolean) && | |||
| (AUPI.flags & kAudioUnitParameterFlag_IsWritable) && | |||
| !(AUPI.flags & kAudioUnitParameterFlag_IsReadable) ); | |||
| if (isWriteOnlyBoolParameter) { | |||
| value = 1; | |||
| } | |||
| mParam.SetValue (mListener, this, value); | |||
| } | |||
| break; | |||
| case kTypeText: | |||
| { | |||
| Float32 val = mParam.GetValueFromString (GetTextValue()); | |||
| mParam.SetValue(mListener, this, (mParam.IsIndexedParam() ? (int)val : val)); | |||
| if (mParam.ValuesHaveStrings()) | |||
| ParameterToControl(val); //make sure we display the correct text (from the AU) | |||
| } | |||
| break; | |||
| } | |||
| #endif | |||
| } | |||
| void AUCarbonViewControl::SetValueFract(double value) | |||
| { | |||
| #if !__LP64__ | |||
| SInt32 minimum = GetControl32BitMinimum(mControl); | |||
| SInt32 maximum = GetControl32BitMaximum(mControl); | |||
| SInt32 cval = SInt32(value * (maximum - minimum) + minimum + 0.5); | |||
| SetControl32BitValue(mControl, cval); | |||
| // printf("set: value=%lf, min=%ld, max=%ld, ctl value=%ld\n", value, minimum, maximum, cval); | |||
| #endif | |||
| } | |||
| double AUCarbonViewControl::GetValueFract() | |||
| { | |||
| #if !__LP64__ | |||
| SInt32 minimum = GetControl32BitMinimum(mControl); | |||
| SInt32 maximum = GetControl32BitMaximum(mControl); | |||
| SInt32 cval = GetControl32BitValue(mControl); | |||
| double result = double(cval - minimum) / double(maximum - minimum); | |||
| // printf("get: min=%ld, max=%ld, value=%ld, result=%f\n", minimum, maximum, cval, result); | |||
| return result; | |||
| #else | |||
| return 0; | |||
| #endif | |||
| } | |||
| void AUCarbonViewControl::SetTextValue(CFStringRef cfstr) | |||
| { | |||
| #if !__LP64__ | |||
| verify_noerr(SetControlData(mControl, 0, kControlEditTextCFStringTag, sizeof(CFStringRef), &cfstr)); | |||
| #endif | |||
| } | |||
| CFStringRef AUCarbonViewControl::GetTextValue() | |||
| { | |||
| #if !__LP64__ | |||
| CFStringRef cfstr; | |||
| verify_noerr(GetControlData(mControl, 0, kControlEditTextCFStringTag, sizeof(CFStringRef), &cfstr, NULL)); | |||
| return cfstr; | |||
| #else | |||
| return CFSTR(""); | |||
| #endif | |||
| } | |||
| void AUCarbonViewControl::SetValue(long value) | |||
| { | |||
| #if !__LP64__ | |||
| SetControl32BitValue(mControl, value); | |||
| #endif | |||
| } | |||
| long AUCarbonViewControl::GetValue() | |||
| { | |||
| #if !__LP64__ | |||
| return GetControl32BitValue(mControl); | |||
| #else | |||
| return 0; | |||
| #endif | |||
| } | |||
| /* Notes on event handling | |||
| Button (Click and release on button) | |||
| kEventControlClick received | |||
| kEventControlTrack received | |||
| kEventControlValueFieldChanged received | |||
| kEventControlHit received | |||
| Button (Click and release outside of button bounds) | |||
| kEventControlClick received | |||
| kEventControlTrack received | |||
| Slider (Click, drag, and release) | |||
| kEventControlClick received | |||
| kEventControlTrack received | |||
| kEventControlValueFieldChanged received | |||
| kEventControlValueFieldChanged received | |||
| kEventControlHit received | |||
| Slider (Click, release without changing value) | |||
| kEventControlClick received | |||
| kEventControlTrack received | |||
| */ | |||
| bool AUCarbonViewControl::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef event) | |||
| { | |||
| UInt32 eclass = GetEventClass(event); | |||
| UInt32 ekind = GetEventKind(event); | |||
| ControlRef control; | |||
| bool handled = true; | |||
| switch (eclass) { | |||
| case kEventClassControl: | |||
| { | |||
| AudioUnitParameterInfo AUPI = mParam.ParamInfo(); | |||
| bool isWriteOnlyBoolParameter = ( (AUPI.unit == kAudioUnitParameterUnit_Boolean) && | |||
| (AUPI.flags & kAudioUnitParameterFlag_IsWritable) && | |||
| !(AUPI.flags & kAudioUnitParameterFlag_IsReadable) ); | |||
| switch (ekind) { | |||
| case kEventControlSetFocusPart: // tab | |||
| handled = !handled; // fall through to next case | |||
| mLastControl = this; | |||
| case kEventControlValueFieldChanged: | |||
| GetEventParameter(event, kEventParamDirectObject, typeControlRef, NULL, sizeof(ControlRef), NULL, &control); | |||
| verify(control == mControl); | |||
| ControlToParameter(); | |||
| return handled; | |||
| case kEventControlClick: | |||
| if (isWriteOnlyBoolParameter) { | |||
| GetEventParameter(event, kEventParamDirectObject, typeControlRef, NULL, sizeof(ControlRef), NULL, &control); | |||
| verify(control == mControl); | |||
| ControlToParameter(); | |||
| } else if (mLastControl != this) { | |||
| if (mLastControl != NULL) { | |||
| mLastControl->Update(false); | |||
| } | |||
| mLastControl = this; | |||
| } | |||
| mOwnerView->TellListener(mParam, kAudioUnitCarbonViewEvent_MouseDownInControl, NULL); | |||
| break; // don't return true, continue normal processing | |||
| case kEventControlHit: | |||
| if (mLastControl != this) { | |||
| if (mLastControl != NULL) | |||
| mLastControl->Update(false); | |||
| mLastControl = this; | |||
| } | |||
| mOwnerView->TellListener(mParam, kAudioUnitCarbonViewEvent_MouseUpInControl, NULL); | |||
| break; // don't return true, continue normal processing | |||
| case kEventControlTrack: | |||
| if (mLastControl != this) { | |||
| if (mLastControl != NULL) | |||
| mLastControl->Update(false); | |||
| mLastControl = this; | |||
| } | |||
| CallNextEventHandler(inHandlerRef, event); | |||
| ControlToParameter(); // new code | |||
| mOwnerView->TellListener(mParam, kAudioUnitCarbonViewEvent_MouseUpInControl, NULL); | |||
| // old code: | |||
| // break; // don't return true, continue normal processing | |||
| return handled; // don't return true, continue normal processing | |||
| } | |||
| } | |||
| } | |||
| return !handled; | |||
| } | |||
| pascal void AUCarbonViewControl::SliderTrackProc(ControlRef theControl, ControlPartCode partCode) | |||
| { | |||
| // this doesn't need to actually do anything | |||
| // AUCarbonViewControl *This = (AUCarbonViewControl *)GetControlReference(theControl); | |||
| } | |||
| pascal ControlKeyFilterResult AUCarbonViewControl::StdKeyFilterCallback(ControlRef theControl, | |||
| SInt16 *keyCode, SInt16 *charCode, | |||
| EventModifiers *modifiers) | |||
| { | |||
| #if !__LP64__ | |||
| SInt16 c = *charCode; | |||
| if (c >= ' ' || c == '\b' || c == 0x7F || (c >= 0x1c && c <= 0x1f) || c == '\t') | |||
| return kControlKeyFilterPassKey; | |||
| if (c == '\r' || c == 3) { // return or Enter | |||
| AUCarbonViewControl *This = (AUCarbonViewControl *)GetControlReference(theControl); | |||
| ControlEditTextSelectionRec sel = { 0, 32767 }; | |||
| SetControlData(This->mControl, 0, kControlEditTextSelectionTag, sizeof(sel), &sel); | |||
| This->ControlToParameter(); | |||
| } | |||
| #endif | |||
| return kControlKeyFilterBlockKey; | |||
| } | |||
| pascal ControlKeyFilterResult AUCarbonViewControl::NumericKeyFilterCallback(ControlRef theControl, | |||
| SInt16 *keyCode, SInt16 *charCode, | |||
| EventModifiers *modifiers) | |||
| { | |||
| #if !__LP64__ | |||
| SInt16 c = *charCode; | |||
| if (isdigit(c) || c == '+' || c == '-' || c == '.' || c == '\b' || c == 0x7F || (c >= 0x1c && c <= 0x1f) | |||
| || c == '\t') | |||
| return kControlKeyFilterPassKey; | |||
| if (c == '\r' || c == 3) { // return or Enter | |||
| AUCarbonViewControl *This = (AUCarbonViewControl *)GetControlReference(theControl); | |||
| ControlEditTextSelectionRec sel = { 0, 32767 }; | |||
| SetControlData(This->mControl, 0, kControlEditTextSelectionTag, sizeof(sel), &sel); | |||
| This->ControlToParameter(); | |||
| } | |||
| #endif | |||
| return kControlKeyFilterBlockKey; | |||
| } | |||
| Boolean AUCarbonViewControl::SizeControlToFit(ControlRef inControl, SInt16 *outWidth, SInt16 *outHeight) | |||
| { | |||
| #if !__LP64__ | |||
| if (inControl == 0) return false; | |||
| Boolean bValue = false; | |||
| // this only works on text controls -- returns an error for other controls, but doesn't do anything, | |||
| // so the error is irrelevant | |||
| SetControlData(inControl, kControlEntireControl, 'stim' /* kControlStaticTextIsMultilineTag */, sizeof(Boolean), &bValue); | |||
| SInt16 baseLineOffset; | |||
| Rect bestRect; | |||
| OSErr err = GetBestControlRect(inControl, &bestRect, &baseLineOffset); | |||
| if (err != noErr) return false; | |||
| int width = (bestRect.right - bestRect.left) + 1; | |||
| int height = (bestRect.bottom - bestRect.top) + 1; | |||
| Rect boundsRect; | |||
| GetControlBounds (inControl, &boundsRect); | |||
| Rect newRect; | |||
| newRect.top = boundsRect.top; | |||
| newRect.bottom = newRect.top + height; | |||
| newRect.left = boundsRect.left; | |||
| newRect.right = newRect.left + width; | |||
| SetControlBounds (inControl, &newRect); | |||
| if (outWidth) | |||
| *outWidth = width; | |||
| if (outHeight) | |||
| *outHeight = height; | |||
| #endif | |||
| return true; | |||
| } | |||
| #pragma mark ___AUPropertyControl | |||
| bool AUPropertyControl::HandleEvent(EventHandlerCallRef inHandlerRef, EventRef event) | |||
| { | |||
| UInt32 eclass = GetEventClass(event); | |||
| UInt32 ekind = GetEventKind(event); | |||
| switch (eclass) { | |||
| case kEventClassControl: | |||
| switch (ekind) { | |||
| case kEventControlValueFieldChanged: | |||
| HandleControlChange(); | |||
| return true; // handled | |||
| } | |||
| } | |||
| return false; | |||
| } | |||
| void AUPropertyControl::RegisterEvents () | |||
| { | |||
| #if !__LP64__ | |||
| EventTypeSpec events[] = { | |||
| { kEventClassControl, kEventControlValueFieldChanged } // N.B. OS X only | |||
| }; | |||
| WantEventTypes(GetControlEventTarget(mControl), GetEventTypeCount(events), events); | |||
| #endif | |||
| } | |||
| void AUPropertyControl::EmbedControl (ControlRef theControl) | |||
| { | |||
| mView->EmbedControl (theControl); | |||
| } | |||
| WindowRef AUPropertyControl::GetCarbonWindow() | |||
| { | |||
| return mView->GetCarbonWindow(); | |||
| } | |||
| #pragma mark ___AUVPreset | |||
| #if !__LP64__ | |||
| static CFStringRef kStringFactoryPreset = kAUViewLocalizedStringKey_FactoryPreset; | |||
| static bool sAUVPresetLocalized = false; | |||
| #endif | |||
| AUVPresets::AUVPresets (AUCarbonViewBase* inParentView, | |||
| CFArrayRef& inPresets, | |||
| Point inLocation, | |||
| int nameWidth, | |||
| int controlWidth, | |||
| ControlFontStyleRec & inFontStyle) | |||
| : AUPropertyControl (inParentView), | |||
| mPresets (inPresets), | |||
| mView (inParentView) | |||
| { | |||
| #if !__LP64__ | |||
| Rect r; | |||
| // ok we now have an array of factory presets | |||
| // get their strings and display them | |||
| r.top = inLocation.v; r.bottom = r.top; | |||
| r.left = inLocation.h; r.right = r.left; | |||
| // localize as necessary | |||
| if (!sAUVPresetLocalized) { | |||
| CFBundleRef mainBundle = CFBundleGetBundleWithIdentifier(kLocalizedStringBundle_AUView); | |||
| if (mainBundle) { | |||
| kStringFactoryPreset = CFCopyLocalizedStringFromTableInBundle( | |||
| kAUViewLocalizedStringKey_FactoryPreset, kLocalizedStringTable_AUView, | |||
| mainBundle, CFSTR("FactoryPreset title string")); | |||
| sAUVPresetLocalized = true; | |||
| } | |||
| } | |||
| // create localized title string | |||
| CFMutableStringRef factoryPresetsTitle = CFStringCreateMutable(NULL, 0); | |||
| CFStringAppend(factoryPresetsTitle, kStringFactoryPreset); | |||
| CFStringAppend(factoryPresetsTitle, kAUViewUnlocalizedString_TitleSeparator); | |||
| ControlRef theControl; | |||
| verify_noerr(CreateStaticTextControl(mView->GetCarbonWindow(), &r, factoryPresetsTitle, &inFontStyle, &theControl)); | |||
| SInt16 width = 0; | |||
| AUCarbonViewControl::SizeControlToFit(theControl, &width, &mHeight); | |||
| CFRelease(factoryPresetsTitle); | |||
| EmbedControl(theControl); | |||
| r.top -= 2; | |||
| r.left += width + 10; | |||
| r.right = r.left; | |||
| r.bottom = r.top; | |||
| verify_noerr(CreatePopupButtonControl ( mView->GetCarbonWindow(), &r, NULL, | |||
| -12345, // DON'T GET MENU FROM RESOURCE mMenuID,!!! | |||
| FALSE, // variableWidth, | |||
| 0, // titleWidth, | |||
| 0, // titleJustification, | |||
| 0, // titleStyle, | |||
| &mControl)); | |||
| MenuRef menuRef; | |||
| verify_noerr(CreateNewMenu(1, 0, &menuRef)); | |||
| int numPresets = CFArrayGetCount(mPresets); | |||
| for (int i = 0; i < numPresets; ++i) | |||
| { | |||
| AUPreset* preset = (AUPreset*) CFArrayGetValueAtIndex (mPresets, i); | |||
| verify_noerr(AppendMenuItemTextWithCFString (menuRef, preset->presetName, 0, 0, 0)); | |||
| } | |||
| verify_noerr(SetControlData(mControl, 0, kControlPopupButtonMenuRefTag, sizeof(menuRef), &menuRef)); | |||
| verify_noerr (SetControlFontStyle (mControl, &inFontStyle)); | |||
| SetControl32BitMaximum (mControl, numPresets); | |||
| // size popup | |||
| SInt16 height = 0; | |||
| AUCarbonViewControl::SizeControlToFit(mControl, &width, &height); | |||
| if (height > mHeight) mHeight = height; | |||
| if (mHeight < 0) mHeight = 0; | |||
| // find which menu item is the Default preset | |||
| UInt32 propertySize = sizeof(AUPreset); | |||
| AUPreset defaultPreset; | |||
| OSStatus result = AudioUnitGetProperty (mView->GetEditAudioUnit(), | |||
| kAudioUnitProperty_PresentPreset, | |||
| kAudioUnitScope_Global, | |||
| 0, | |||
| &defaultPreset, | |||
| &propertySize); | |||
| mPropertyID = kAudioUnitProperty_PresentPreset; | |||
| #endif | |||
| #ifndef __LP64__ | |||
| if (result != noErr) { // if the PresentPreset property is not implemented, fall back to the CurrentPreset property | |||
| result = AudioUnitGetProperty (mView->GetEditAudioUnit(), | |||
| kAudioUnitProperty_CurrentPreset, | |||
| kAudioUnitScope_Global, | |||
| 0, | |||
| &defaultPreset, | |||
| &propertySize); | |||
| mPropertyID = kAudioUnitProperty_CurrentPreset; | |||
| if (result == noErr) | |||
| CFRetain (defaultPreset.presetName); | |||
| } | |||
| #endif | |||
| #if !__LP64__ | |||
| EmbedControl (mControl); | |||
| HandlePropertyChange(defaultPreset); | |||
| RegisterEvents(); | |||
| #endif | |||
| } | |||
| void AUVPresets::AddInterest (AUEventListenerRef inListener, | |||
| void * inObject) | |||
| { | |||
| AudioUnitEvent e; | |||
| e.mEventType = kAudioUnitEvent_PropertyChange; | |||
| e.mArgument.mProperty.mAudioUnit = mView->GetEditAudioUnit(); | |||
| e.mArgument.mProperty.mPropertyID = mPropertyID; | |||
| e.mArgument.mProperty.mScope = kAudioUnitScope_Global; | |||
| e.mArgument.mProperty.mElement = 0; | |||
| AUEventListenerAddEventType(inListener, inObject, &e); | |||
| } | |||
| void AUVPresets::RemoveInterest (AUEventListenerRef inListener, | |||
| void * inObject) | |||
| { | |||
| AudioUnitEvent e; | |||
| e.mEventType = kAudioUnitEvent_PropertyChange; | |||
| e.mArgument.mProperty.mAudioUnit = mView->GetEditAudioUnit(); | |||
| e.mArgument.mProperty.mPropertyID = mPropertyID; | |||
| e.mArgument.mProperty.mScope = kAudioUnitScope_Global; | |||
| e.mArgument.mProperty.mElement = 0; | |||
| AUEventListenerRemoveEventType(inListener, inObject, &e); | |||
| } | |||
| void AUVPresets::HandleControlChange () | |||
| { | |||
| #if !__LP64__ | |||
| SInt32 i = GetControl32BitValue(mControl); | |||
| if (i > 0) | |||
| { | |||
| AUPreset* preset = (AUPreset*) CFArrayGetValueAtIndex (mPresets, i-1); | |||
| verify_noerr(AudioUnitSetProperty (mView->GetEditAudioUnit(), | |||
| mPropertyID, // either currentPreset or PresentPreset depending on which is supported | |||
| kAudioUnitScope_Global, | |||
| 0, | |||
| preset, | |||
| sizeof(AUPreset))); | |||
| // when we change a preset we can't expect the AU to update its state | |||
| // as it isn't meant to know that its being viewed! | |||
| // so we broadcast a notification to all listeners that all parameters on this AU have changed | |||
| AudioUnitParameter changedUnit; | |||
| changedUnit.mAudioUnit = mView->GetEditAudioUnit(); | |||
| changedUnit.mParameterID = kAUParameterListener_AnyParameter; | |||
| verify_noerr (AUParameterListenerNotify (NULL, NULL, &changedUnit) ); | |||
| } | |||
| #endif | |||
| } | |||
| void AUVPresets::HandlePropertyChange(AUPreset &preset) | |||
| { | |||
| #if !__LP64__ | |||
| // check to see if the preset is in our menu | |||
| int numPresets = CFArrayGetCount(mPresets); | |||
| if (preset.presetNumber < 0) { | |||
| SetControl32BitValue (mControl, 0); //controls are one-based | |||
| } else { | |||
| for (SInt32 i = 0; i < numPresets; ++i) { | |||
| AUPreset* currPreset = (AUPreset*) CFArrayGetValueAtIndex (mPresets, i); | |||
| if (preset.presetNumber == currPreset->presetNumber) { | |||
| SetControl32BitValue (mControl, ++i); //controls are one-based | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| if (preset.presetName) | |||
| CFRelease (preset.presetName); | |||
| #endif | |||
| } | |||
| bool AUVPresets::HandlePropertyChange (const AudioUnitProperty &inProp) | |||
| { | |||
| if (inProp.mPropertyID == mPropertyID) | |||
| { | |||
| UInt32 theSize = sizeof(AUPreset); | |||
| AUPreset currentPreset; | |||
| OSStatus result = AudioUnitGetProperty(inProp.mAudioUnit, | |||
| inProp.mPropertyID, | |||
| inProp.mScope, | |||
| inProp.mElement, ¤tPreset, &theSize); | |||
| if (result == noErr) { | |||
| #ifndef __LP64__ | |||
| if (inProp.mPropertyID == kAudioUnitProperty_CurrentPreset && currentPreset.presetName) | |||
| CFRetain (currentPreset.presetName); | |||
| #endif | |||
| HandlePropertyChange(currentPreset); | |||
| return true; | |||
| } | |||
| } | |||
| return false; | |||
| } | |||
| @@ -1,230 +0,0 @@ | |||
| /* | |||
| File: AUCarbonViewControl.h | |||
| Abstract: Part of CoreAudio Utility Classes | |||
| Version: 1.1 | |||
| Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple | |||
| Inc. ("Apple") in consideration of your agreement to the following | |||
| terms, and your use, installation, modification or redistribution of | |||
| this Apple software constitutes acceptance of these terms. If you do | |||
| not agree with these terms, please do not use, install, modify or | |||
| redistribute this Apple software. | |||
| In consideration of your agreement to abide by the following terms, and | |||
| subject to these terms, Apple grants you a personal, non-exclusive | |||
| license, under Apple's copyrights in this original Apple software (the | |||
| "Apple Software"), to use, reproduce, modify and redistribute the Apple | |||
| Software, with or without modifications, in source and/or binary forms; | |||
| provided that if you redistribute the Apple Software in its entirety and | |||
| without modifications, you must retain this notice and the following | |||
| text and disclaimers in all such redistributions of the Apple Software. | |||
| Neither the name, trademarks, service marks or logos of Apple Inc. may | |||
| be used to endorse or promote products derived from the Apple Software | |||
| without specific prior written permission from Apple. Except as | |||
| expressly stated in this notice, no other rights or licenses, express or | |||
| implied, are granted by Apple herein, including but not limited to any | |||
| patent rights that may be infringed by your derivative works or by other | |||
| works in which the Apple Software may be incorporated. | |||
| The Apple Software is provided by Apple on an "AS IS" basis. APPLE | |||
| MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION | |||
| THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS | |||
| FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND | |||
| OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. | |||
| IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL | |||
| OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |||
| SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |||
| INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, | |||
| MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED | |||
| AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), | |||
| STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE | |||
| POSSIBILITY OF SUCH DAMAGE. | |||
| Copyright (C) 2014 Apple Inc. All Rights Reserved. | |||
| */ | |||
| #ifndef __AUCarbonViewControl_h__ | |||
| #define __AUCarbonViewControl_h__ | |||
| #include <Carbon/Carbon.h> | |||
| #include <AudioUnit/AudioUnitCarbonView.h> | |||
| #include <AudioToolbox/AudioUnitUtilities.h> | |||
| #include "CarbonEventHandler.h" | |||
| #include "CAAUParameter.h" | |||
| class AUCarbonViewBase; | |||
| // ____________________________________________________________________________ | |||
| // AUCarbonViewControl | |||
| // Wrapper for a control that is wired to an AudioUnit parameter. | |||
| /*! @class AUCarbonViewControl */ | |||
| class AUCarbonViewControl : public CarbonEventHandler { | |||
| // note that the controls are never disposed; that's managed by the AUCarbonViewBase's | |||
| // parent pane which contains all of them ... if we later need to be able to delete | |||
| // individual controls on the fly, extra work needed | |||
| public: | |||
| enum ControlType { | |||
| kTypeContinuous, // e.g. slider | |||
| kTypeDiscrete, // e.g. pop-up menu | |||
| kTypeText | |||
| }; | |||
| AUCarbonViewControl(AUCarbonViewBase *ownerView, AUParameterListenerRef listener, ControlType type, const CAAUParameter ¶m, ControlRef control); | |||
| ~AUCarbonViewControl(); | |||
| /*! @method Bind */ | |||
| virtual void Bind(); // second-stage construction | |||
| /*! @method ControlToParameter */ | |||
| virtual void ControlToParameter(); | |||
| /*! @method ParameterToControl */ | |||
| virtual void ParameterToControl(Float32 newValue); | |||
| /*! @method SetValueFract */ | |||
| virtual void SetValueFract(double value); | |||
| /*! @method GetValueFract */ | |||
| virtual double GetValueFract(); | |||
| /*! @method SetTextValue */ | |||
| virtual void SetTextValue(CFStringRef str); | |||
| /*! @method GetTextValue */ | |||
| virtual CFStringRef GetTextValue(); | |||
| /*! @method SetValue */ | |||
| virtual void SetValue(long value); | |||
| /*! @method GetValue */ | |||
| virtual long GetValue(); | |||
| /*! @method GetOwnerView */ | |||
| AUCarbonViewBase * GetOwnerView() {return mOwnerView;} | |||
| /*! @method Update */ | |||
| void Update (bool inUIThread) | |||
| { | |||
| if (inUIThread) | |||
| ParameterToControl (mParam.GetValue()); | |||
| else | |||
| AUParameterListenerNotify (mListener, this, &mParam); | |||
| } | |||
| // CarbonEventHandler overrides | |||
| /*! @method HandleEvent */ | |||
| virtual bool HandleEvent(EventHandlerCallRef inHandlerRef, EventRef event); | |||
| /*! @method ControlRef */ | |||
| operator ControlRef() { return mControl; } | |||
| /*! @method SizeControlToFit */ | |||
| static Boolean SizeControlToFit(ControlRef inControl, SInt16 *outWidth = NULL, SInt16 *outHeight = NULL); | |||
| /*! @method SliderTrackProc */ | |||
| static pascal void SliderTrackProc(ControlRef theControl, ControlPartCode partCode); | |||
| /*! @method NumericKeyFilterCallback */ | |||
| static pascal ControlKeyFilterResult NumericKeyFilterCallback(ControlRef theControl, SInt16 *keyCode, SInt16 *charCode, | |||
| EventModifiers *modifiers); | |||
| protected: | |||
| /*! @method ParamInfo */ | |||
| const AudioUnitParameterInfo &ParamInfo() { return mParam.ParamInfo(); } | |||
| /*! @var mOwnerView */ | |||
| AUCarbonViewBase * mOwnerView; | |||
| /*! @var mListener */ | |||
| AUParameterListenerRef mListener; | |||
| /*! @var mType */ | |||
| ControlType mType; | |||
| /*! @var mParam */ | |||
| CAAUParameter mParam; | |||
| /*! @var mControl */ | |||
| ControlRef mControl; | |||
| /*! @method StdKeyFilterCallback */ | |||
| static pascal ControlKeyFilterResult StdKeyFilterCallback(ControlRef theControl, SInt16 *keyCode, SInt16 *charCode, | |||
| EventModifiers *modifiers); | |||
| SInt16 mInControlInitialization; | |||
| static AUCarbonViewControl* mLastControl; | |||
| }; | |||
| /*! @class AUPropertyControl */ | |||
| class AUPropertyControl : public CarbonEventHandler { | |||
| public: | |||
| /*! @ctor AUPropertyControl */ | |||
| AUPropertyControl (AUCarbonViewBase * inBase) : mControl(0), mView (inBase), mHeight(0) {} | |||
| /*! @method HandleEvent */ | |||
| virtual bool HandleEvent(EventHandlerCallRef inHandlerRef, EventRef event); | |||
| /*! @method HandlePropertyChange */ | |||
| virtual bool HandlePropertyChange (const AudioUnitProperty &inProp) = 0; | |||
| /*! @method AddInterest */ | |||
| virtual void AddInterest (AUEventListenerRef inListener, | |||
| void * inObject) = 0; | |||
| /*! @method RemoveInterest */ | |||
| virtual void RemoveInterest (AUEventListenerRef inListener, | |||
| void * inObject) = 0; | |||
| /*! @method GetHeight */ | |||
| int GetHeight() { return mHeight;} | |||
| protected: | |||
| /*! @method HandleControlChange */ | |||
| virtual void HandleControlChange () = 0; | |||
| /*! @method RegisterEvents */ | |||
| void RegisterEvents (); | |||
| /*! @method EmbedControl */ | |||
| void EmbedControl (ControlRef theControl); | |||
| /*! @method GetCarbonWindow */ | |||
| WindowRef GetCarbonWindow(); | |||
| /*! @var mControl */ | |||
| ControlRef mControl; | |||
| /*! @var mView */ | |||
| AUCarbonViewBase* mView; | |||
| /*! @var mHeight */ | |||
| SInt16 mHeight; | |||
| }; | |||
| /*! @class AUVPresets */ | |||
| class AUVPresets : public AUPropertyControl { | |||
| public: | |||
| /*! @ctor HandleControlChange */ | |||
| AUVPresets (AUCarbonViewBase * inBase, | |||
| CFArrayRef& inPresets, | |||
| Point inLocation, | |||
| int nameWidth, | |||
| int controlWidth, | |||
| ControlFontStyleRec & inFontStyle); | |||
| virtual ~AUVPresets () { CFRelease (mPresets); } | |||
| /*! @method HandlePropertyChange */ | |||
| virtual bool HandlePropertyChange (const AudioUnitProperty &inProp); | |||
| /*! @method AddInterest */ | |||
| virtual void AddInterest (AUEventListenerRef inListener, | |||
| void * inObject); | |||
| /*! @method RemoveInterest */ | |||
| virtual void RemoveInterest (AUEventListenerRef inListener, | |||
| void * inObject); | |||
| protected: | |||
| /*! @method HandleControlChange */ | |||
| virtual void HandleControlChange (); | |||
| /*! @var mPresets */ | |||
| CFArrayRef mPresets; | |||
| /*! @var mView */ | |||
| AUCarbonViewBase* mView; | |||
| AudioUnitPropertyID mPropertyID; | |||
| void HandlePropertyChange(AUPreset &preset); | |||
| }; | |||
| #endif // __AUCarbonViewControl_h__ | |||
| @@ -1,125 +0,0 @@ | |||
| /* | |||
| File: AUCarbonViewDispatch.cpp | |||
| Abstract: AUCarbonViewDispatch.h | |||
| Version: 1.1 | |||
| Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple | |||
| Inc. ("Apple") in consideration of your agreement to the following | |||
| terms, and your use, installation, modification or redistribution of | |||
| this Apple software constitutes acceptance of these terms. If you do | |||
| not agree with these terms, please do not use, install, modify or | |||
| redistribute this Apple software. | |||
| In consideration of your agreement to abide by the following terms, and | |||
| subject to these terms, Apple grants you a personal, non-exclusive | |||
| license, under Apple's copyrights in this original Apple software (the | |||
| "Apple Software"), to use, reproduce, modify and redistribute the Apple | |||
| Software, with or without modifications, in source and/or binary forms; | |||
| provided that if you redistribute the Apple Software in its entirety and | |||
| without modifications, you must retain this notice and the following | |||
| text and disclaimers in all such redistributions of the Apple Software. | |||
| Neither the name, trademarks, service marks or logos of Apple Inc. may | |||
| be used to endorse or promote products derived from the Apple Software | |||
| without specific prior written permission from Apple. Except as | |||
| expressly stated in this notice, no other rights or licenses, express or | |||
| implied, are granted by Apple herein, including but not limited to any | |||
| patent rights that may be infringed by your derivative works or by other | |||
| works in which the Apple Software may be incorporated. | |||
| The Apple Software is provided by Apple on an "AS IS" basis. APPLE | |||
| MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION | |||
| THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS | |||
| FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND | |||
| OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. | |||
| IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL | |||
| OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |||
| SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |||
| INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, | |||
| MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED | |||
| AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), | |||
| STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE | |||
| POSSIBILITY OF SUCH DAMAGE. | |||
| Copyright (C) 2014 Apple Inc. All Rights Reserved. | |||
| */ | |||
| #include "AUCarbonViewBase.h" | |||
| // ____________________________________________________________________________ | |||
| // component dispatch | |||
| #if PRAGMA_STRUCT_ALIGN | |||
| #pragma options align=mac68k | |||
| #elif PRAGMA_STRUCT_PACKPUSH | |||
| #pragma pack(push, 2) | |||
| #elif PRAGMA_STRUCT_PACK | |||
| #pragma pack(2) | |||
| #endif | |||
| struct AudioUnitCarbonViewCreateGluePB { | |||
| unsigned char componentFlags; | |||
| unsigned char componentParamSize; | |||
| short componentWhat; | |||
| ControlRef* outControl; | |||
| const Float32Point* inSize; | |||
| const Float32Point* inLocation; | |||
| ControlRef inParentControl; | |||
| WindowRef inWindow; | |||
| AudioUnit inAudioUnit; | |||
| AudioUnitCarbonView inView; | |||
| }; | |||
| #if !__LP64__ | |||
| struct AudioUnitCarbonViewSetEventListenerGluePB { | |||
| unsigned char componentFlags; | |||
| unsigned char componentParamSize; | |||
| short componentWhat; | |||
| void* inUserData; | |||
| AudioUnitCarbonViewEventListener inCallback; | |||
| AudioUnitCarbonView inView; | |||
| }; | |||
| #endif | |||
| #if PRAGMA_STRUCT_ALIGN | |||
| #pragma options align=reset | |||
| #elif PRAGMA_STRUCT_PACKPUSH | |||
| #pragma pack(pop) | |||
| #elif PRAGMA_STRUCT_PACK | |||
| #pragma pack() | |||
| #endif | |||
| #define CheckNull(x) if ((x) == NULL) return paramErr; | |||
| OSStatus AUCarbonViewBase::ComponentEntryDispatch(ComponentParameters *p, AUCarbonViewBase *This) | |||
| { | |||
| if (This == NULL) return paramErr; | |||
| OSStatus result = noErr; | |||
| switch (p->what) { | |||
| case kAudioUnitCarbonViewCreateSelect: | |||
| { | |||
| AudioUnitCarbonViewCreateGluePB *pb = (AudioUnitCarbonViewCreateGluePB *)p; | |||
| CheckNull(pb->inAudioUnit); | |||
| CheckNull(pb->inWindow); | |||
| CheckNull(pb->inParentControl); | |||
| CheckNull(pb->inSize); | |||
| CheckNull(pb->inLocation); | |||
| CheckNull(pb->outControl); | |||
| result = This->CreateCarbonView(pb->inAudioUnit, pb->inWindow, pb->inParentControl, | |||
| *pb->inLocation, *pb->inSize, *pb->outControl); | |||
| } | |||
| break; | |||
| #if !__LP64__ | |||
| case kAudioUnitCarbonViewSetEventListenerSelect: | |||
| { | |||
| AudioUnitCarbonViewSetEventListenerGluePB *pb = (AudioUnitCarbonViewSetEventListenerGluePB *)p; | |||
| This->SetEventListener(pb->inCallback, pb->inUserData); | |||
| } | |||
| break; | |||
| #endif | |||
| default: | |||
| result = ComponentBase::ComponentEntryDispatch(p, This); | |||
| break; | |||
| } | |||
| return result; | |||
| } | |||
| @@ -1,91 +0,0 @@ | |||
| /* | |||
| File: CarbonEventHandler.cpp | |||
| Abstract: CarbonEventHandler.h | |||
| Version: 1.1 | |||
| Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple | |||
| Inc. ("Apple") in consideration of your agreement to the following | |||
| terms, and your use, installation, modification or redistribution of | |||
| this Apple software constitutes acceptance of these terms. If you do | |||
| not agree with these terms, please do not use, install, modify or | |||
| redistribute this Apple software. | |||
| In consideration of your agreement to abide by the following terms, and | |||
| subject to these terms, Apple grants you a personal, non-exclusive | |||
| license, under Apple's copyrights in this original Apple software (the | |||
| "Apple Software"), to use, reproduce, modify and redistribute the Apple | |||
| Software, with or without modifications, in source and/or binary forms; | |||
| provided that if you redistribute the Apple Software in its entirety and | |||
| without modifications, you must retain this notice and the following | |||
| text and disclaimers in all such redistributions of the Apple Software. | |||
| Neither the name, trademarks, service marks or logos of Apple Inc. may | |||
| be used to endorse or promote products derived from the Apple Software | |||
| without specific prior written permission from Apple. Except as | |||
| expressly stated in this notice, no other rights or licenses, express or | |||
| implied, are granted by Apple herein, including but not limited to any | |||
| patent rights that may be infringed by your derivative works or by other | |||
| works in which the Apple Software may be incorporated. | |||
| The Apple Software is provided by Apple on an "AS IS" basis. APPLE | |||
| MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION | |||
| THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS | |||
| FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND | |||
| OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. | |||
| IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL | |||
| OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |||
| SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |||
| INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, | |||
| MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED | |||
| AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), | |||
| STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE | |||
| POSSIBILITY OF SUCH DAMAGE. | |||
| Copyright (C) 2014 Apple Inc. All Rights Reserved. | |||
| */ | |||
| #include "CarbonEventHandler.h" | |||
| static pascal OSStatus TheEventHandler(EventHandlerCallRef inHandlerRef, EventRef inEvent, void *inUserData) | |||
| { | |||
| CarbonEventHandler *handler = (CarbonEventHandler *)inUserData; | |||
| if (handler->HandleEvent(inHandlerRef, inEvent)) | |||
| return noErr; | |||
| else return eventNotHandledErr; | |||
| } | |||
| CarbonEventHandler::CarbonEventHandler() : | |||
| mHandlers(NULL) | |||
| { | |||
| } | |||
| CarbonEventHandler::~CarbonEventHandler() | |||
| { | |||
| if (mHandlers != NULL) { | |||
| int count = static_cast<int>(CFDictionaryGetCount(mHandlers)); | |||
| EventHandlerRef *theHandlers = (EventHandlerRef*) malloc(count * sizeof(EventHandlerRef)); | |||
| CFDictionaryGetKeysAndValues(mHandlers, NULL, (const void **)theHandlers); | |||
| for (int i = 0; i < count; i++) | |||
| RemoveEventHandler(theHandlers[i]); | |||
| CFDictionaryRemoveAllValues(mHandlers); | |||
| CFRelease (mHandlers); | |||
| free(theHandlers); | |||
| } | |||
| } | |||
| void CarbonEventHandler::WantEventTypes(EventTargetRef target, UInt32 inNumTypes, const EventTypeSpec *inList) | |||
| { | |||
| if (mHandlers == NULL) | |||
| mHandlers = CFDictionaryCreateMutable(NULL, 0, NULL, NULL); | |||
| EventHandlerRef handler; | |||
| if (CFDictionaryGetValueIfPresent (mHandlers, target, (const void **)&handler)) // if there is already a handler for the target, add the type | |||
| verify_noerr(AddEventTypesToHandler(handler, inNumTypes, inList)); | |||
| else { | |||
| verify_noerr(InstallEventHandler(target, TheEventHandler, inNumTypes, inList, this, &handler)); | |||
| CFDictionaryAddValue(mHandlers, target, handler); | |||
| } | |||
| } | |||
| @@ -1,71 +0,0 @@ | |||
| /* | |||
| File: CarbonEventHandler.h | |||
| Abstract: Part of CoreAudio Utility Classes | |||
| Version: 1.1 | |||
| Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple | |||
| Inc. ("Apple") in consideration of your agreement to the following | |||
| terms, and your use, installation, modification or redistribution of | |||
| this Apple software constitutes acceptance of these terms. If you do | |||
| not agree with these terms, please do not use, install, modify or | |||
| redistribute this Apple software. | |||
| In consideration of your agreement to abide by the following terms, and | |||
| subject to these terms, Apple grants you a personal, non-exclusive | |||
| license, under Apple's copyrights in this original Apple software (the | |||
| "Apple Software"), to use, reproduce, modify and redistribute the Apple | |||
| Software, with or without modifications, in source and/or binary forms; | |||
| provided that if you redistribute the Apple Software in its entirety and | |||
| without modifications, you must retain this notice and the following | |||
| text and disclaimers in all such redistributions of the Apple Software. | |||
| Neither the name, trademarks, service marks or logos of Apple Inc. may | |||
| be used to endorse or promote products derived from the Apple Software | |||
| without specific prior written permission from Apple. Except as | |||
| expressly stated in this notice, no other rights or licenses, express or | |||
| implied, are granted by Apple herein, including but not limited to any | |||
| patent rights that may be infringed by your derivative works or by other | |||
| works in which the Apple Software may be incorporated. | |||
| The Apple Software is provided by Apple on an "AS IS" basis. APPLE | |||
| MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION | |||
| THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS | |||
| FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND | |||
| OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. | |||
| IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL | |||
| OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |||
| SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |||
| INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, | |||
| MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED | |||
| AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), | |||
| STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE | |||
| POSSIBILITY OF SUCH DAMAGE. | |||
| Copyright (C) 2014 Apple Inc. All Rights Reserved. | |||
| */ | |||
| #ifndef __CarbonEventHandler_h__ | |||
| #define __CarbonEventHandler_h__ | |||
| #include <Carbon/Carbon.h> | |||
| /*! @class CarbonEventHandler */ | |||
| class CarbonEventHandler { | |||
| public: | |||
| /*! @ctor CarbonEventHandler */ | |||
| CarbonEventHandler(); | |||
| /*! @dtor ~CarbonEventHandler */ | |||
| virtual ~CarbonEventHandler(); | |||
| /*! @method WantEventTypes */ | |||
| virtual void WantEventTypes(EventTargetRef target, UInt32 inNumTypes, const EventTypeSpec *inList); | |||
| /*! @method HandleEvent */ | |||
| virtual bool HandleEvent(EventHandlerCallRef inHandlerRef, EventRef event) = 0; | |||
| protected: | |||
| /*! @var mHandlers */ | |||
| CFMutableDictionaryRef mHandlers; | |||
| }; | |||
| #endif // __CarbonEventHandler_h__ | |||
| @@ -22,11 +22,6 @@ | |||
| #if JucePlugin_Build_AU | |||
| #if __LP64__ | |||
| #undef JUCE_SUPPORT_CARBON | |||
| #define JUCE_SUPPORT_CARBON 0 | |||
| #endif | |||
| JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wshorten-64-to-32", | |||
| "-Wunused-parameter", | |||
| "-Wdeprecated-declarations", | |||
| @@ -52,29 +47,11 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wshorten-64-to-32", | |||
| #include <QuartzCore/QuartzCore.h> | |||
| #include "CoreAudioUtilityClasses/MusicDeviceBase.h" | |||
| /** The BUILD_AU_CARBON_UI flag lets you specify whether old-school carbon hosts are supported as | |||
| well as ones that can open a cocoa view. If this is enabled, you'll need to also add the AUCarbonBase | |||
| files to your project. | |||
| */ | |||
| #if ! (defined (BUILD_AU_CARBON_UI) || JUCE_64BIT) | |||
| #define BUILD_AU_CARBON_UI 1 | |||
| #endif | |||
| #ifdef __LP64__ | |||
| #undef BUILD_AU_CARBON_UI // (not possible in a 64-bit build) | |||
| #endif | |||
| #if BUILD_AU_CARBON_UI | |||
| #include "CoreAudioUtilityClasses/AUCarbonViewBase.h" | |||
| #endif | |||
| JUCE_END_IGNORE_WARNINGS_GCC_LIKE | |||
| #define JUCE_MAC_WINDOW_VISIBITY_BODGE 1 | |||
| #define JUCE_CORE_INCLUDE_OBJC_HELPERS 1 | |||
| #include "../utility/juce_IncludeModuleHeaders.h" | |||
| #include "../utility/juce_CarbonVisibility.h" | |||
| #include <juce_audio_basics/native/juce_mac_CoreAudioLayouts.h> | |||
| #include <juce_audio_basics/native/juce_mac_CoreAudioTimeConversions.h> | |||
| @@ -96,13 +73,7 @@ struct AudioProcessorHolder | |||
| AudioProcessorHolder (bool initialiseGUI) | |||
| { | |||
| if (initialiseGUI) | |||
| { | |||
| #if BUILD_AU_CARBON_UI | |||
| NSApplicationLoad(); | |||
| #endif | |||
| initialiseJuce_GUI(); | |||
| } | |||
| juceFilter.reset (createPluginFilterOfType (AudioProcessor::wrapperType_AudioUnit)); | |||
| @@ -1060,23 +1031,6 @@ public: | |||
| return rate > 0 ? juceFilter->getLatencySamples() / rate : 0; | |||
| } | |||
| //============================================================================== | |||
| #if BUILD_AU_CARBON_UI | |||
| int GetNumCustomUIComponents() override | |||
| { | |||
| return getHostType().isDigitalPerformer() ? 0 : 1; | |||
| } | |||
| void GetUIComponentDescs (ComponentDescription* inDescArray) override | |||
| { | |||
| inDescArray[0].componentType = kAudioUnitCarbonViewComponentType; | |||
| inDescArray[0].componentSubType = JucePlugin_AUSubType; | |||
| inDescArray[0].componentManufacturer = JucePlugin_AUManufacturerCode; | |||
| inDescArray[0].componentFlags = 0; | |||
| inDescArray[0].componentFlagsMask = 0; | |||
| } | |||
| #endif | |||
| //============================================================================== | |||
| bool getCurrentPosition (AudioPlayHead::CurrentPositionInfo& info) override | |||
| { | |||
| @@ -2420,243 +2374,6 @@ private: | |||
| JUCE_DECLARE_NON_COPYABLE (JuceAU) | |||
| }; | |||
| //============================================================================== | |||
| #if BUILD_AU_CARBON_UI | |||
| class JuceAUView : public AUCarbonViewBase | |||
| { | |||
| public: | |||
| JuceAUView (AudioUnitCarbonView auview) | |||
| : AUCarbonViewBase (auview), | |||
| juceFilter (nullptr) | |||
| { | |||
| } | |||
| ~JuceAUView() | |||
| { | |||
| deleteUI(); | |||
| } | |||
| ComponentResult CreateUI (Float32 /*inXOffset*/, Float32 /*inYOffset*/) override | |||
| { | |||
| JUCE_AUTORELEASEPOOL | |||
| { | |||
| if (juceFilter == nullptr) | |||
| { | |||
| void* pointers[2]; | |||
| UInt32 propertySize = sizeof (pointers); | |||
| AudioUnitGetProperty (GetEditAudioUnit(), | |||
| juceFilterObjectPropertyID, | |||
| kAudioUnitScope_Global, | |||
| 0, | |||
| pointers, | |||
| &propertySize); | |||
| juceFilter = (AudioProcessor*) pointers[0]; | |||
| } | |||
| if (juceFilter != nullptr) | |||
| { | |||
| deleteUI(); | |||
| if (AudioProcessorEditor* editorComp = juceFilter->createEditorIfNeeded()) | |||
| { | |||
| editorComp->setOpaque (true); | |||
| windowComp.reset (new ComponentInHIView (editorComp, mCarbonPane)); | |||
| } | |||
| } | |||
| else | |||
| { | |||
| jassertfalse; // can't get a pointer to our effect | |||
| } | |||
| } | |||
| return noErr; | |||
| } | |||
| AudioUnitCarbonViewEventListener getEventListener() const { return mEventListener; } | |||
| void* getEventListenerUserData() const { return mEventListenerUserData; } | |||
| private: | |||
| //============================================================================== | |||
| AudioProcessor* juceFilter; | |||
| std::unique_ptr<Component> windowComp; | |||
| void deleteUI() | |||
| { | |||
| if (windowComp != nullptr) | |||
| { | |||
| PopupMenu::dismissAllActiveMenus(); | |||
| /* This assertion is triggered when there's some kind of modal component active, and the | |||
| host is trying to delete our plugin. | |||
| If you must use modal components, always use them in a non-blocking way, by never | |||
| calling runModalLoop(), but instead using enterModalState() with a callback that | |||
| will be performed on completion. (Note that this assertion could actually trigger | |||
| a false alarm even if you're doing it correctly, but is here to catch people who | |||
| aren't so careful) */ | |||
| jassert (Component::getCurrentlyModalComponent() == nullptr); | |||
| if (JuceAU::EditorCompHolder* editorCompHolder = dynamic_cast<JuceAU::EditorCompHolder*> (windowComp->getChildComponent(0))) | |||
| if (AudioProcessorEditor* audioProcessEditor = dynamic_cast<AudioProcessorEditor*> (editorCompHolder->getChildComponent(0))) | |||
| juceFilter->editorBeingDeleted (audioProcessEditor); | |||
| windowComp = nullptr; | |||
| } | |||
| } | |||
| //============================================================================== | |||
| // Uses a child NSWindow to sit in front of a HIView and display our component | |||
| class ComponentInHIView : public Component | |||
| { | |||
| public: | |||
| ComponentInHIView (AudioProcessorEditor* ed, HIViewRef parentHIView) | |||
| : parentView (parentHIView), | |||
| editor (ed), | |||
| recursive (false) | |||
| { | |||
| JUCE_AUTORELEASEPOOL | |||
| { | |||
| jassert (ed != nullptr); | |||
| addAndMakeVisible (editor); | |||
| setOpaque (true); | |||
| setVisible (true); | |||
| setBroughtToFrontOnMouseClick (true); | |||
| setSize (editor.getWidth(), editor.getHeight()); | |||
| SizeControl (parentHIView, (SInt16) editor.getWidth(), (SInt16) editor.getHeight()); | |||
| WindowRef windowRef = HIViewGetWindow (parentHIView); | |||
| hostWindow = [[NSWindow alloc] initWithWindowRef: windowRef]; | |||
| // not really sure why this is needed in older OS X versions | |||
| // but JUCE plug-ins crash without it | |||
| if ((SystemStats::getOperatingSystemType() & 0xff) < 12) | |||
| [hostWindow retain]; | |||
| [hostWindow setCanHide: YES]; | |||
| [hostWindow setReleasedWhenClosed: YES]; | |||
| updateWindowPos(); | |||
| #if ! JucePlugin_EditorRequiresKeyboardFocus | |||
| addToDesktop (ComponentPeer::windowIsTemporary | ComponentPeer::windowIgnoresKeyPresses); | |||
| setWantsKeyboardFocus (false); | |||
| #else | |||
| addToDesktop (ComponentPeer::windowIsTemporary); | |||
| setWantsKeyboardFocus (true); | |||
| #endif | |||
| setVisible (true); | |||
| toFront (false); | |||
| addSubWindow(); | |||
| NSWindow* pluginWindow = [((NSView*) getWindowHandle()) window]; | |||
| [pluginWindow setNextResponder: hostWindow]; | |||
| attachWindowHidingHooks (this, (WindowRef) windowRef, hostWindow); | |||
| } | |||
| } | |||
| ~ComponentInHIView() | |||
| { | |||
| JUCE_AUTORELEASEPOOL | |||
| { | |||
| removeWindowHidingHooks (this); | |||
| NSWindow* pluginWindow = [((NSView*) getWindowHandle()) window]; | |||
| [hostWindow removeChildWindow: pluginWindow]; | |||
| removeFromDesktop(); | |||
| [hostWindow release]; | |||
| hostWindow = nil; | |||
| } | |||
| } | |||
| void updateWindowPos() | |||
| { | |||
| HIPoint f; | |||
| f.x = f.y = 0; | |||
| HIPointConvert (&f, kHICoordSpaceView, parentView, kHICoordSpaceScreenPixel, 0); | |||
| setTopLeftPosition ((int) f.x, (int) f.y); | |||
| } | |||
| void addSubWindow() | |||
| { | |||
| NSWindow* pluginWindow = [((NSView*) getWindowHandle()) window]; | |||
| [pluginWindow setExcludedFromWindowsMenu: YES]; | |||
| [pluginWindow setCanHide: YES]; | |||
| [hostWindow addChildWindow: pluginWindow | |||
| ordered: NSWindowAbove]; | |||
| [hostWindow orderFront: nil]; | |||
| [pluginWindow orderFront: nil]; | |||
| } | |||
| void resized() override | |||
| { | |||
| if (Component* const child = getChildComponent (0)) | |||
| child->setBounds (getLocalBounds()); | |||
| } | |||
| void paint (Graphics&) override {} | |||
| void childBoundsChanged (Component*) override | |||
| { | |||
| if (! recursive) | |||
| { | |||
| recursive = true; | |||
| const int w = jmax (32, editor.getWidth()); | |||
| const int h = jmax (32, editor.getHeight()); | |||
| SizeControl (parentView, (SInt16) w, (SInt16) h); | |||
| if (getWidth() != w || getHeight() != h) | |||
| setSize (w, h); | |||
| editor.repaint(); | |||
| updateWindowPos(); | |||
| addSubWindow(); // (need this for AULab) | |||
| recursive = false; | |||
| } | |||
| } | |||
| bool keyPressed (const KeyPress& kp) override | |||
| { | |||
| if (! kp.getModifiers().isCommandDown()) | |||
| { | |||
| // If we have an unused keypress, move the key-focus to a host window | |||
| // and re-inject the event.. | |||
| static NSTimeInterval lastEventTime = 0; // check we're not recursively sending the same event | |||
| NSTimeInterval eventTime = [[NSApp currentEvent] timestamp]; | |||
| if (lastEventTime != eventTime) | |||
| { | |||
| lastEventTime = eventTime; | |||
| [[hostWindow parentWindow] makeKeyWindow]; | |||
| repostCurrentNSEvent(); | |||
| } | |||
| } | |||
| return false; | |||
| } | |||
| private: | |||
| HIViewRef parentView; | |||
| NSWindow* hostWindow; | |||
| JuceAU::EditorCompHolder editor; | |||
| bool recursive; | |||
| }; | |||
| }; | |||
| #endif | |||
| //============================================================================== | |||
| #define JUCE_COMPONENT_ENTRYX(Class, Name, Suffix) \ | |||
| extern "C" __attribute__((visibility("default"))) ComponentResult Name ## Suffix (ComponentParameters* params, Class* obj); \ | |||
| @@ -2694,10 +2411,6 @@ JUCE_COMPONENT_ENTRY (JuceAU, JucePlugin_AUExportPrefix, Entry) | |||
| JUCE_FACTORY_ENTRY (JuceAU, JucePlugin_AUExportPrefix) | |||
| #endif | |||
| #if BUILD_AU_CARBON_UI | |||
| JUCE_COMPONENT_ENTRY (JuceAUView, JucePlugin_AUExportPrefix, ViewEntry) | |||
| #endif | |||
| #if ! JUCE_DISABLE_AU_FACTORY_ENTRY | |||
| JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wcast-align", "-Wzero-as-null-pointer-constant") | |||
| @@ -24,11 +24,8 @@ | |||
| #if JucePlugin_Build_VST || JucePlugin_Build_VST3 | |||
| #define JUCE_MAC_WINDOW_VISIBITY_BODGE 1 | |||
| #include "../utility/juce_IncludeSystemHeaders.h" | |||
| #include "../utility/juce_IncludeModuleHeaders.h" | |||
| #include "../utility/juce_CarbonVisibility.h" | |||
| //============================================================================== | |||
| namespace juce | |||
| @@ -153,8 +150,6 @@ void* attachComponentToWindowRefVST (Component* comp, void* parentWindowOrView, | |||
| [hostWindow orderFront: nil]; | |||
| [pluginWindow orderFront: nil]; | |||
| attachWindowHidingHooks (comp, (WindowRef) parentWindowOrView, hostWindow); | |||
| return hostWindow; | |||
| } | |||
| #endif | |||
| @@ -192,8 +187,6 @@ void detachComponentFromWindowRefVST (Component* comp, void* window, bool isNSVi | |||
| comp->getProperties() ["boundsEventRef"].toString().getHexValue64(); | |||
| RemoveEventHandler (ref); | |||
| removeWindowHidingHooks (comp); | |||
| CFUniquePtr<HIViewRef> dummyView ((HIViewRef) (void*) (pointer_sized_int) | |||
| comp->getProperties() ["dummyViewRef"].toString().getHexValue64()); | |||
| @@ -41,23 +41,3 @@ | |||
| #define ENTRY_POINT JucePlugin_AUExportPrefixQuoted "Entry" | |||
| #include "AUResources.r" | |||
| //============================================================================== | |||
| // component resources for Audio Unit Carbon View | |||
| #ifndef BUILD_AU_CARBON_UI | |||
| #define BUILD_AU_CARBON_UI 1 | |||
| #endif | |||
| #if BUILD_AU_CARBON_UI | |||
| #define RES_ID 2000 | |||
| #define COMP_TYPE kAudioUnitCarbonViewComponentType | |||
| #define COMP_SUBTYPE JucePlugin_AUSubType | |||
| #define COMP_MANUF JucePlugin_AUManufacturerCode | |||
| #define VERSION JucePlugin_VersionCode | |||
| #define NAME JucePlugin_Manufacturer ": " JucePlugin_Name " View" | |||
| #define DESCRIPTION NAME | |||
| #define ENTRY_POINT JucePlugin_AUExportPrefixQuoted "ViewEntry" | |||
| #include "AUResources.r" | |||
| #endif | |||
| @@ -55,9 +55,6 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wparentheses", | |||
| #include "AU/CoreAudioUtilityClasses/AUBase.cpp" | |||
| #include "AU/CoreAudioUtilityClasses/AUBuffer.cpp" | |||
| #include "AU/CoreAudioUtilityClasses/AUCarbonViewBase.cpp" | |||
| #include "AU/CoreAudioUtilityClasses/AUCarbonViewControl.cpp" | |||
| #include "AU/CoreAudioUtilityClasses/AUCarbonViewDispatch.cpp" | |||
| #include "AU/CoreAudioUtilityClasses/AUDispatch.cpp" | |||
| #include "AU/CoreAudioUtilityClasses/AUInputElement.cpp" | |||
| #include "AU/CoreAudioUtilityClasses/AUMIDIBase.cpp" | |||
| @@ -69,7 +66,6 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wparentheses", | |||
| #include "AU/CoreAudioUtilityClasses/CAMutex.cpp" | |||
| #include "AU/CoreAudioUtilityClasses/CAStreamBasicDescription.cpp" | |||
| #include "AU/CoreAudioUtilityClasses/CAVectorUnit.cpp" | |||
| #include "AU/CoreAudioUtilityClasses/CarbonEventHandler.cpp" | |||
| #include "AU/CoreAudioUtilityClasses/ComponentBase.cpp" | |||
| #include "AU/CoreAudioUtilityClasses/MusicDeviceBase.cpp" | |||
| @@ -1,73 +0,0 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE 7 technical preview. | |||
| Copyright (c) 2022 - Raw Material Software Limited | |||
| You may use this code under the terms of the GPL v3 | |||
| (see www.gnu.org/licenses). | |||
| For the technical preview this file cannot be licensed commercially. | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| namespace juce | |||
| { | |||
| //============================================================================== | |||
| #if JUCE_SUPPORT_CARBON && JUCE_MAC_WINDOW_VISIBITY_BODGE | |||
| /* When you wrap a WindowRef as an NSWindow, it seems to bugger up the HideWindow | |||
| function, so when the host tries (and fails) to hide the window, this stuff catches | |||
| the event and forces it to update. | |||
| */ | |||
| static pascal OSStatus windowVisibilityBodge (EventHandlerCallRef, EventRef e, void* user) | |||
| { | |||
| NSWindow* hostWindow = (NSWindow*) user; | |||
| switch (GetEventKind (e)) | |||
| { | |||
| case kEventWindowInit: [hostWindow display]; break; | |||
| case kEventWindowShown: [hostWindow orderFront: nil]; break; | |||
| case kEventWindowHidden: [hostWindow orderOut: nil]; break; | |||
| } | |||
| return eventNotHandledErr; | |||
| } | |||
| inline void attachWindowHidingHooks (Component* comp, void* hostWindowRef, NSWindow* nsWindow) | |||
| { | |||
| const EventTypeSpec eventsToCatch[] = | |||
| { | |||
| { kEventClassWindow, kEventWindowInit }, | |||
| { kEventClassWindow, kEventWindowShown }, | |||
| { kEventClassWindow, kEventWindowHidden } | |||
| }; | |||
| EventHandlerRef ref; | |||
| InstallWindowEventHandler ((WindowRef) hostWindowRef, | |||
| NewEventHandlerUPP (windowVisibilityBodge), | |||
| GetEventTypeCount (eventsToCatch), eventsToCatch, | |||
| (void*) nsWindow, &ref); | |||
| comp->getProperties().set ("carbonEventRef", String::toHexString ((pointer_sized_int) (void*) ref)); | |||
| } | |||
| inline void removeWindowHidingHooks (Component* comp) | |||
| { | |||
| if (comp != nullptr) | |||
| RemoveEventHandler ((EventHandlerRef) (void*) (pointer_sized_int) | |||
| comp->getProperties() ["carbonEventRef"].toString().getHexValue64()); | |||
| } | |||
| #elif JUCE_MAC | |||
| inline void attachWindowHidingHooks (void*, void*, void*) {} | |||
| inline void removeWindowHidingHooks (void*) {} | |||
| #endif | |||
| } // namespace juce | |||
| @@ -34,10 +34,6 @@ | |||
| #include <sys/time.h> | |||
| #include <arpa/inet.h> | |||
| #elif JUCE_MAC || JUCE_IOS | |||
| #if ! (defined (JUCE_SUPPORT_CARBON) || defined (__LP64__)) | |||
| #define JUCE_SUPPORT_CARBON 1 | |||
| #endif | |||
| #ifdef __OBJC__ | |||
| #if JUCE_MAC | |||
| #include <Cocoa/Cocoa.h> | |||
| @@ -48,10 +44,6 @@ | |||
| #endif | |||
| #endif | |||
| #if JUCE_SUPPORT_CARBON && (! JUCE_IOS) | |||
| #include <Carbon/Carbon.h> | |||
| #endif | |||
| #include <objc/runtime.h> | |||
| #include <objc/objc.h> | |||
| #include <objc/message.h> | |||
| @@ -28,10 +28,6 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") | |||
| #include <CoreMIDI/MIDIServices.h> | |||
| #if JUCE_SUPPORT_CARBON | |||
| #include <AudioUnit/AudioUnitCarbonView.h> | |||
| #endif | |||
| #include <CoreAudioKit/AUViewController.h> | |||
| #include <juce_audio_basics/native/juce_mac_CoreAudioTimeConversions.h> | |||
| @@ -427,7 +423,6 @@ namespace AudioUnitFormatHelpers | |||
| } | |||
| //============================================================================== | |||
| class AudioUnitPluginWindowCarbon; | |||
| class AudioUnitPluginWindowCocoa; | |||
| //============================================================================== | |||
| @@ -1615,7 +1610,6 @@ public: | |||
| private: | |||
| //============================================================================== | |||
| friend class AudioUnitPluginWindowCarbon; | |||
| friend class AudioUnitPluginWindowCocoa; | |||
| friend class AudioUnitPluginFormat; | |||
| @@ -2594,162 +2588,12 @@ private: | |||
| } | |||
| }; | |||
| #if JUCE_SUPPORT_CARBON | |||
| //============================================================================== | |||
| class AudioUnitPluginWindowCarbon : public AudioProcessorEditor | |||
| { | |||
| public: | |||
| AudioUnitPluginWindowCarbon (AudioUnitPluginInstance& p) | |||
| : AudioProcessorEditor (&p), | |||
| plugin (p), | |||
| audioComponent (nullptr), | |||
| viewComponent (nullptr) | |||
| { | |||
| innerWrapper.reset (new InnerWrapperComponent (*this)); | |||
| addAndMakeVisible (innerWrapper.get()); | |||
| setOpaque (true); | |||
| setVisible (true); | |||
| setSize (400, 300); | |||
| UInt32 propertySize; | |||
| if (AudioUnitGetPropertyInfo (plugin.audioUnit, kAudioUnitProperty_GetUIComponentList, | |||
| kAudioUnitScope_Global, 0, &propertySize, NULL) == noErr | |||
| && propertySize > 0) | |||
| { | |||
| HeapBlock<AudioComponentDescription> views (propertySize / sizeof (AudioComponentDescription)); | |||
| if (AudioUnitGetProperty (plugin.audioUnit, kAudioUnitProperty_GetUIComponentList, | |||
| kAudioUnitScope_Global, 0, &views[0], &propertySize) == noErr) | |||
| { | |||
| audioComponent = AudioComponentFindNext (nullptr, &views[0]); | |||
| } | |||
| } | |||
| } | |||
| ~AudioUnitPluginWindowCarbon() | |||
| { | |||
| innerWrapper = nullptr; | |||
| if (isValid()) | |||
| plugin.editorBeingDeleted (this); | |||
| } | |||
| bool isValid() const noexcept { return audioComponent != nullptr; } | |||
| //============================================================================== | |||
| void paint (Graphics& g) override | |||
| { | |||
| g.fillAll (Colours::black); | |||
| } | |||
| void resized() override | |||
| { | |||
| if (innerWrapper != nullptr) | |||
| innerWrapper->setSize (getWidth(), getHeight()); | |||
| } | |||
| //============================================================================== | |||
| bool keyStateChanged (bool) override { return false; } | |||
| bool keyPressed (const KeyPress&) override { return false; } | |||
| //============================================================================== | |||
| AudioUnit getAudioUnit() const { return plugin.audioUnit; } | |||
| AudioUnitCarbonView getViewComponent() | |||
| { | |||
| if (viewComponent == nullptr && audioComponent != nullptr) | |||
| AudioComponentInstanceNew (audioComponent, &viewComponent); | |||
| return viewComponent; | |||
| } | |||
| void closeViewComponent() | |||
| { | |||
| if (viewComponent != nullptr) | |||
| { | |||
| JUCE_AU_LOG ("Closing AU GUI: " + plugin.getName()); | |||
| AudioComponentInstanceDispose (viewComponent); | |||
| viewComponent = nullptr; | |||
| } | |||
| } | |||
| private: | |||
| //============================================================================== | |||
| AudioUnitPluginInstance& plugin; | |||
| AudioComponent audioComponent; | |||
| AudioUnitCarbonView viewComponent; | |||
| //============================================================================== | |||
| class InnerWrapperComponent : public CarbonViewWrapperComponent | |||
| { | |||
| public: | |||
| InnerWrapperComponent (AudioUnitPluginWindowCarbon& w) : owner (w) {} | |||
| ~InnerWrapperComponent() | |||
| { | |||
| deleteWindow(); | |||
| } | |||
| HIViewRef attachView (WindowRef windowRef, HIViewRef rootView) override | |||
| { | |||
| JUCE_AU_LOG ("Opening AU GUI: " + owner.plugin.getName()); | |||
| AudioUnitCarbonView carbonView = owner.getViewComponent(); | |||
| if (carbonView == 0) | |||
| return 0; | |||
| Float32Point pos = { 0, 0 }; | |||
| Float32Point size = { 250, 200 }; | |||
| HIViewRef pluginView = 0; | |||
| AudioUnitCarbonViewCreate (carbonView, owner.getAudioUnit(), windowRef, rootView, | |||
| &pos, &size, (ControlRef*) &pluginView); | |||
| return pluginView; | |||
| } | |||
| void removeView (HIViewRef) override | |||
| { | |||
| owner.closeViewComponent(); | |||
| } | |||
| private: | |||
| AudioUnitPluginWindowCarbon& owner; | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InnerWrapperComponent) | |||
| }; | |||
| friend class InnerWrapperComponent; | |||
| std::unique_ptr<InnerWrapperComponent> innerWrapper; | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioUnitPluginWindowCarbon) | |||
| }; | |||
| #endif | |||
| //============================================================================== | |||
| AudioProcessorEditor* AudioUnitPluginInstance::createEditor() | |||
| { | |||
| std::unique_ptr<AudioProcessorEditor> w (new AudioUnitPluginWindowCocoa (*this, false)); | |||
| if (! static_cast<AudioUnitPluginWindowCocoa*> (w.get())->isValid()) | |||
| w.reset(); | |||
| #if JUCE_SUPPORT_CARBON | |||
| if (w == nullptr) | |||
| { | |||
| w.reset (new AudioUnitPluginWindowCarbon (*this)); | |||
| if (! static_cast<AudioUnitPluginWindowCarbon*> (w.get())->isValid()) | |||
| w.reset(); | |||
| } | |||
| #endif | |||
| if (w == nullptr) | |||
| w.reset (new AudioUnitPluginWindowCocoa (*this, true)); // use AUGenericView as a fallback | |||
| return w.release(); | |||
| @@ -1220,10 +1220,6 @@ struct VSTPluginInstance final : public AudioPluginInstance, | |||
| wantsMidiMessages = pluginCanDo ("receiveVstMidiEvent") > 0 || isSynthPlugin(); | |||
| #if JUCE_MAC && JUCE_SUPPORT_CARBON | |||
| usesCocoaNSView = ((unsigned int) pluginCanDo ("hasCockosViewAsConfig") & 0xffff0000ul) == 0xbeef0000ul; | |||
| #endif | |||
| setLatencySamples (vstEffect->initialDelay); | |||
| } | |||
| @@ -1961,7 +1957,6 @@ struct VSTPluginInstance final : public AudioPluginInstance, | |||
| ModuleHandle::Ptr vstModule; | |||
| std::unique_ptr<VSTPluginFormat::ExtraFunctions> extraFunctions; | |||
| bool usesCocoaNSView = false; | |||
| private: | |||
| //============================================================================== | |||
| @@ -2732,18 +2727,8 @@ public: | |||
| #elif JUCE_MAC | |||
| ignoreUnused (recursiveResize, pluginRefusesToResize, alreadyInside); | |||
| #if JUCE_SUPPORT_CARBON | |||
| if (! plug.usesCocoaNSView) | |||
| { | |||
| carbonWrapper.reset (new CarbonWrapperComponent (*this)); | |||
| addAndMakeVisible (carbonWrapper.get()); | |||
| } | |||
| else | |||
| #endif | |||
| { | |||
| cocoaWrapper.reset (new NSViewComponentWithParent (plugin)); | |||
| addAndMakeVisible (cocoaWrapper.get()); | |||
| } | |||
| cocoaWrapper.reset (new NSViewComponentWithParent (plugin)); | |||
| addAndMakeVisible (cocoaWrapper.get()); | |||
| #endif | |||
| activeVSTWindows.add (this); | |||
| @@ -2769,9 +2754,6 @@ public: | |||
| closePluginWindow(); | |||
| #if JUCE_MAC | |||
| #if JUCE_SUPPORT_CARBON | |||
| carbonWrapper.reset(); | |||
| #endif | |||
| cocoaWrapper.reset(); | |||
| #endif | |||
| @@ -2800,11 +2782,6 @@ public: | |||
| setSize (correctedBounds.getWidth(), correctedBounds.getHeight()); | |||
| #if JUCE_MAC | |||
| #if JUCE_SUPPORT_CARBON | |||
| if (carbonWrapper != nullptr) | |||
| carbonWrapper->setSize (correctedBounds.getWidth(), correctedBounds.getHeight()); | |||
| #endif | |||
| if (cocoaWrapper != nullptr) | |||
| cocoaWrapper->setSize (correctedBounds.getWidth(), correctedBounds.getHeight()); | |||
| #endif | |||
| @@ -2820,25 +2797,19 @@ public: | |||
| void visibilityChanged() override | |||
| { | |||
| if (cocoaWrapper != nullptr) | |||
| { | |||
| if (isShowing()) | |||
| openPluginWindow ((NSView*) cocoaWrapper->getView()); | |||
| else | |||
| closePluginWindow(); | |||
| } | |||
| if (isShowing()) | |||
| openPluginWindow ((NSView*) cocoaWrapper->getView()); | |||
| else | |||
| closePluginWindow(); | |||
| } | |||
| void childBoundsChanged (Component*) override | |||
| { | |||
| if (cocoaWrapper != nullptr) | |||
| { | |||
| auto w = cocoaWrapper->getWidth(); | |||
| auto h = cocoaWrapper->getHeight(); | |||
| auto w = cocoaWrapper->getWidth(); | |||
| auto h = cocoaWrapper->getHeight(); | |||
| if (w != getWidth() || h != getHeight()) | |||
| setSize (w, h); | |||
| } | |||
| if (w != getWidth() || h != getHeight()) | |||
| setSize (w, h); | |||
| } | |||
| void parentHierarchyChanged() override { visibilityChanged(); } | |||
| @@ -3317,86 +3288,6 @@ private: | |||
| //============================================================================== | |||
| #if JUCE_MAC | |||
| #if JUCE_SUPPORT_CARBON | |||
| struct CarbonWrapperComponent : public CarbonViewWrapperComponent | |||
| { | |||
| CarbonWrapperComponent (VSTPluginWindow& w) : owner (w) | |||
| { | |||
| keepPluginWindowWhenHidden = w.shouldAvoidDeletingWindow(); | |||
| setRepaintsChildHIViewWhenCreated (w.shouldRepaintCarbonWindowWhenCreated()); | |||
| } | |||
| ~CarbonWrapperComponent() | |||
| { | |||
| deleteWindow(); | |||
| } | |||
| HIViewRef attachView (WindowRef windowRef, HIViewRef /*rootView*/) override | |||
| { | |||
| owner.openPluginWindow (windowRef); | |||
| return {}; | |||
| } | |||
| void removeView (HIViewRef) override | |||
| { | |||
| if (owner.isOpen) | |||
| { | |||
| owner.isOpen = false; | |||
| owner.dispatch (Vst2::effEditClose, 0, 0, 0, 0); | |||
| owner.dispatch (Vst2::effEditSleep, 0, 0, 0, 0); | |||
| } | |||
| } | |||
| bool getEmbeddedViewSize (int& w, int& h) override | |||
| { | |||
| Vst2::ERect* rect = nullptr; | |||
| owner.dispatch (Vst2::effEditGetRect, 0, 0, &rect, 0); | |||
| w = rect->right - rect->left; | |||
| h = rect->bottom - rect->top; | |||
| return true; | |||
| } | |||
| void handleMouseDown (int x, int y) override | |||
| { | |||
| if (! alreadyInside) | |||
| { | |||
| alreadyInside = true; | |||
| getTopLevelComponent()->toFront (true); | |||
| owner.dispatch (Vst2::effEditMouse, x, y, 0, 0); | |||
| alreadyInside = false; | |||
| } | |||
| else | |||
| { | |||
| PostEvent (::mouseDown, 0); | |||
| } | |||
| } | |||
| void handlePaint() override | |||
| { | |||
| if (auto* peer = getPeer()) | |||
| { | |||
| auto pos = peer->globalToLocal (getScreenPosition()); | |||
| Vst2::ERect r; | |||
| r.left = (int16) pos.getX(); | |||
| r.top = (int16) pos.getY(); | |||
| r.right = (int16) (r.left + getWidth()); | |||
| r.bottom = (int16) (r.top + getHeight()); | |||
| owner.dispatch (Vst2::effEditDraw, 0, 0, &r, 0); | |||
| } | |||
| } | |||
| private: | |||
| VSTPluginWindow& owner; | |||
| bool alreadyInside = false; | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CarbonWrapperComponent) | |||
| }; | |||
| friend struct CarbonWrapperComponent; | |||
| std::unique_ptr<CarbonWrapperComponent> carbonWrapper; | |||
| #endif | |||
| std::unique_ptr<NSViewComponentWithParent> cocoaWrapper; | |||
| void resized() override | |||
| @@ -36,13 +36,6 @@ | |||
| #include <juce_core/containers/juce_Optional.h> | |||
| //============================================================================== | |||
| #if JUCE_MAC | |||
| #if JUCE_SUPPORT_CARBON && (JUCE_PLUGINHOST_VST || JUCE_PLUGINHOST_AU) | |||
| #include <Carbon/Carbon.h> | |||
| #include <juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h> | |||
| #endif | |||
| #endif | |||
| #if (JUCE_PLUGINHOST_VST || JUCE_PLUGINHOST_VST3) && (JUCE_LINUX || JUCE_BSD) | |||
| #include <X11/Xlib.h> | |||
| #include <X11/Xutil.h> | |||
| @@ -107,10 +107,6 @@ | |||
| // #error "You need to set either the JUCE_PLUGINHOST_AU and/or JUCE_PLUGINHOST_VST and/or JUCE_PLUGINHOST_VST3 and/or JUCE_PLUGINHOST_LADSPA flags if you're using this module!" | |||
| #endif | |||
| #if ! (defined (JUCE_SUPPORT_CARBON) || JUCE_64BIT || JUCE_IOS) | |||
| #define JUCE_SUPPORT_CARBON 1 | |||
| #endif | |||
| #ifndef JUCE_SUPPORT_LEGACY_AUDIOPROCESSOR | |||
| #define JUCE_SUPPORT_LEGACY_AUDIOPROCESSOR 1 | |||
| #endif | |||
| @@ -30,7 +30,7 @@ namespace Steinberg | |||
| #endif | |||
| //============================================================================== | |||
| #if (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) || (defined(AUDIOCOMPONENT_NOCARBONINSTANCES) && AUDIOCOMPONENT_NOCARBONINSTANCES) | |||
| #if TARGET_OS_IPHONE | |||
| struct OpaqueAudioComponentInstance; | |||
| typedef struct OpaqueAudioComponentInstance* AudioComponentInstance; | |||
| #else | |||
| @@ -20,17 +20,13 @@ | |||
| ============================================================================== | |||
| */ | |||
| #if ! defined (DOXYGEN) && (JUCE_MAC || JUCE_IOS) | |||
| #if __LP64__ | |||
| using OSType = unsigned int; | |||
| #else | |||
| using OSType = unsigned long; | |||
| #endif | |||
| #endif | |||
| namespace juce | |||
| { | |||
| #if ! DOXYGEN && (JUCE_MAC || JUCE_IOS) | |||
| using OSType = unsigned int; | |||
| #endif | |||
| //============================================================================== | |||
| /** | |||
| Represents a local file or directory. | |||
| @@ -44,10 +44,6 @@ | |||
| #import <IOKit/pwr_mgt/IOPMLib.h> | |||
| #import <MetalKit/MetalKit.h> | |||
| #if JUCE_SUPPORT_CARBON | |||
| #import <Carbon/Carbon.h> // still needed for SetSystemUIMode() | |||
| #endif | |||
| #elif JUCE_IOS | |||
| #if JUCE_PUSH_NOTIFICATIONS && defined (__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 | |||
| #import <UserNotifications/UserNotifications.h> | |||
| @@ -36,7 +36,7 @@ | |||
| minimumCppStandard: 14 | |||
| dependencies: juce_graphics juce_data_structures | |||
| OSXFrameworks: Carbon Cocoa QuartzCore | |||
| OSXFrameworks: Cocoa QuartzCore | |||
| WeakOSXFrameworks: Metal MetalKit | |||
| iOSFrameworks: CoreServices UIKit | |||
| WeakiOSFrameworks: Metal MetalKit | |||
| @@ -1385,35 +1385,7 @@ public: | |||
| // has a Z label). Therefore, we need to query the current keyboard | |||
| // layout to figure out what character the key would have produced | |||
| // if the shift key was not pressed | |||
| String unmodified; | |||
| #if JUCE_SUPPORT_CARBON | |||
| if (auto currentKeyboard = CFUniquePtr<TISInputSourceRef> (TISCopyCurrentKeyboardInputSource())) | |||
| { | |||
| if (auto layoutData = (CFDataRef) TISGetInputSourceProperty (currentKeyboard, | |||
| kTISPropertyUnicodeKeyLayoutData)) | |||
| { | |||
| if (auto* layoutPtr = (const UCKeyboardLayout*) CFDataGetBytePtr (layoutData)) | |||
| { | |||
| UInt32 keysDown = 0; | |||
| UniChar buffer[4]; | |||
| UniCharCount actual; | |||
| if (UCKeyTranslate (layoutPtr, [ev keyCode], kUCKeyActionDown, 0, LMGetKbdType(), | |||
| kUCKeyTranslateNoDeadKeysBit, &keysDown, sizeof (buffer) / sizeof (UniChar), | |||
| &actual, buffer) == 0) | |||
| unmodified = String (CharPointer_UTF16 (reinterpret_cast<CharPointer_UTF16::CharType*> (buffer)), 4); | |||
| } | |||
| } | |||
| } | |||
| // did the above layout conversion fail | |||
| if (unmodified.isEmpty()) | |||
| #endif | |||
| { | |||
| unmodified = nsStringToJuce ([ev charactersIgnoringModifiers]); | |||
| } | |||
| String unmodified = nsStringToJuce ([ev charactersIgnoringModifiers]); | |||
| auto keyCode = (int) unmodified[0]; | |||
| if (keyCode == 0x19) // (backwards-tab) | |||
| @@ -1,339 +0,0 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE 7 technical preview. | |||
| Copyright (c) 2022 - Raw Material Software Limited | |||
| You may use this code under the terms of the GPL v3 | |||
| (see www.gnu.org/licenses). | |||
| For the technical preview this file cannot be licensed commercially. | |||
| JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||
| EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||
| DISCLAIMED. | |||
| ============================================================================== | |||
| */ | |||
| namespace juce | |||
| { | |||
| //============================================================================== | |||
| /** | |||
| Creates a floating carbon window that can be used to hold a carbon UI. | |||
| This is a handy class that's designed to be inlined where needed, e.g. | |||
| in the audio plugin hosting code. | |||
| @tags{GUI} | |||
| */ | |||
| class CarbonViewWrapperComponent : public Component, | |||
| public ComponentMovementWatcher, | |||
| public Timer | |||
| { | |||
| public: | |||
| CarbonViewWrapperComponent() | |||
| : ComponentMovementWatcher (this), | |||
| carbonWindow (nil), | |||
| keepPluginWindowWhenHidden (false), | |||
| wrapperWindow (nil), | |||
| embeddedView (0), | |||
| recursiveResize (false), | |||
| repaintChildOnCreation (true) | |||
| { | |||
| } | |||
| ~CarbonViewWrapperComponent() | |||
| { | |||
| jassert (embeddedView == 0); // must call deleteWindow() in the subclass's destructor! | |||
| } | |||
| virtual HIViewRef attachView (WindowRef windowRef, HIViewRef rootView) = 0; | |||
| virtual void removeView (HIViewRef embeddedView) = 0; | |||
| virtual void handleMouseDown (int, int) {} | |||
| virtual void handlePaint() {} | |||
| virtual bool getEmbeddedViewSize (int& w, int& h) | |||
| { | |||
| if (embeddedView == 0) | |||
| return false; | |||
| HIRect bounds; | |||
| HIViewGetBounds (embeddedView, &bounds); | |||
| w = jmax (1, roundToInt (bounds.size.width)); | |||
| h = jmax (1, roundToInt (bounds.size.height)); | |||
| return true; | |||
| } | |||
| void createWindow() | |||
| { | |||
| if (wrapperWindow == nil) | |||
| { | |||
| Rect r; | |||
| r.left = (short) getScreenX(); | |||
| r.top = (short) getScreenY(); | |||
| r.right = (short) (r.left + getWidth()); | |||
| r.bottom = (short) (r.top + getHeight()); | |||
| CreateNewWindow (kDocumentWindowClass, | |||
| (WindowAttributes) (kWindowStandardHandlerAttribute | kWindowCompositingAttribute | |||
| | kWindowNoShadowAttribute | kWindowNoTitleBarAttribute), | |||
| &r, &wrapperWindow); | |||
| jassert (wrapperWindow != 0); | |||
| if (wrapperWindow == 0) | |||
| return; | |||
| carbonWindow = [[NSWindow alloc] initWithWindowRef: wrapperWindow]; | |||
| [getOwnerWindow() addChildWindow: carbonWindow | |||
| ordered: NSWindowAbove]; | |||
| embeddedView = attachView (wrapperWindow, HIViewGetRoot (wrapperWindow)); | |||
| // Check for the plugin creating its own floating window, and if there is one, | |||
| // we need to reparent it to make it visible.. | |||
| if (carbonWindow.childWindows.count > 0) | |||
| if (NSWindow* floatingChildWindow = [[carbonWindow childWindows] objectAtIndex: 0]) | |||
| [getOwnerWindow() addChildWindow: floatingChildWindow | |||
| ordered: NSWindowAbove]; | |||
| EventTypeSpec windowEventTypes[] = | |||
| { | |||
| { kEventClassWindow, kEventWindowGetClickActivation }, | |||
| { kEventClassWindow, kEventWindowHandleDeactivate }, | |||
| { kEventClassWindow, kEventWindowBoundsChanging }, | |||
| { kEventClassMouse, kEventMouseDown }, | |||
| { kEventClassMouse, kEventMouseMoved }, | |||
| { kEventClassMouse, kEventMouseDragged }, | |||
| { kEventClassMouse, kEventMouseUp }, | |||
| { kEventClassWindow, kEventWindowDrawContent }, | |||
| { kEventClassWindow, kEventWindowShown }, | |||
| { kEventClassWindow, kEventWindowHidden } | |||
| }; | |||
| EventHandlerUPP upp = NewEventHandlerUPP (carbonEventCallback); | |||
| InstallWindowEventHandler (wrapperWindow, upp, | |||
| sizeof (windowEventTypes) / sizeof (EventTypeSpec), | |||
| windowEventTypes, this, &eventHandlerRef); | |||
| setOurSizeToEmbeddedViewSize(); | |||
| setEmbeddedWindowToOurSize(); | |||
| creationTime = Time::getCurrentTime(); | |||
| } | |||
| } | |||
| void deleteWindow() | |||
| { | |||
| removeView (embeddedView); | |||
| embeddedView = 0; | |||
| if (wrapperWindow != nil) | |||
| { | |||
| NSWindow* ownerWindow = getOwnerWindow(); | |||
| if ([[ownerWindow childWindows] count] > 0) | |||
| { | |||
| [ownerWindow removeChildWindow: carbonWindow]; | |||
| [carbonWindow close]; | |||
| } | |||
| RemoveEventHandler (eventHandlerRef); | |||
| DisposeWindow (wrapperWindow); | |||
| wrapperWindow = nil; | |||
| } | |||
| } | |||
| //============================================================================== | |||
| void setOurSizeToEmbeddedViewSize() | |||
| { | |||
| int w, h; | |||
| if (getEmbeddedViewSize (w, h)) | |||
| { | |||
| if (w != getWidth() || h != getHeight()) | |||
| { | |||
| startTimer (50); | |||
| setSize (w, h); | |||
| if (Component* p = getParentComponent()) | |||
| p->setSize (w, h); | |||
| } | |||
| else | |||
| { | |||
| startTimer (jlimit (50, 500, getTimerInterval() + 20)); | |||
| } | |||
| } | |||
| else | |||
| { | |||
| stopTimer(); | |||
| } | |||
| } | |||
| void setEmbeddedWindowToOurSize() | |||
| { | |||
| if (! recursiveResize) | |||
| { | |||
| recursiveResize = true; | |||
| if (embeddedView != 0) | |||
| { | |||
| HIRect r; | |||
| r.origin.x = 0; | |||
| r.origin.y = 0; | |||
| r.size.width = (float) getWidth(); | |||
| r.size.height = (float) getHeight(); | |||
| HIViewSetFrame (embeddedView, &r); | |||
| } | |||
| if (wrapperWindow != nil) | |||
| { | |||
| jassert (getTopLevelComponent()->getDesktopScaleFactor() == 1.0f); | |||
| Rectangle<int> screenBounds (getScreenBounds() * Desktop::getInstance().getGlobalScaleFactor()); | |||
| Rect wr; | |||
| wr.left = (short) screenBounds.getX(); | |||
| wr.top = (short) screenBounds.getY(); | |||
| wr.right = (short) screenBounds.getRight(); | |||
| wr.bottom = (short) screenBounds.getBottom(); | |||
| SetWindowBounds (wrapperWindow, kWindowContentRgn, &wr); | |||
| // This group stuff is mainly a workaround for Mackie plugins like FinalMix.. | |||
| WindowGroupRef group = GetWindowGroup (wrapperWindow); | |||
| WindowRef attachedWindow; | |||
| if (GetIndexedWindow (group, 2, kWindowGroupContentsReturnWindows, &attachedWindow) == noErr) | |||
| { | |||
| SelectWindow (attachedWindow); | |||
| ActivateWindow (attachedWindow, TRUE); | |||
| HideWindow (wrapperWindow); | |||
| } | |||
| ShowWindow (wrapperWindow); | |||
| } | |||
| recursiveResize = false; | |||
| } | |||
| } | |||
| void componentMovedOrResized (bool /*wasMoved*/, bool /*wasResized*/) override | |||
| { | |||
| setEmbeddedWindowToOurSize(); | |||
| } | |||
| // (overridden to intercept movements of the top-level window) | |||
| void componentMovedOrResized (Component& component, bool wasMoved, bool wasResized) override | |||
| { | |||
| ComponentMovementWatcher::componentMovedOrResized (component, wasMoved, wasResized); | |||
| if (&component == getTopLevelComponent()) | |||
| setEmbeddedWindowToOurSize(); | |||
| } | |||
| void componentPeerChanged() override | |||
| { | |||
| deleteWindow(); | |||
| createWindow(); | |||
| } | |||
| void componentVisibilityChanged() override | |||
| { | |||
| if (isShowing()) | |||
| createWindow(); | |||
| else if (! keepPluginWindowWhenHidden) | |||
| deleteWindow(); | |||
| setEmbeddedWindowToOurSize(); | |||
| } | |||
| static void recursiveHIViewRepaint (HIViewRef view) | |||
| { | |||
| HIViewSetNeedsDisplay (view, true); | |||
| HIViewRef child = HIViewGetFirstSubview (view); | |||
| while (child != 0) | |||
| { | |||
| recursiveHIViewRepaint (child); | |||
| child = HIViewGetNextView (child); | |||
| } | |||
| } | |||
| void timerCallback() override | |||
| { | |||
| if (isShowing()) | |||
| { | |||
| setOurSizeToEmbeddedViewSize(); | |||
| // To avoid strange overpainting problems when the UI is first opened, we'll | |||
| // repaint it a few times during the first second that it's on-screen.. | |||
| if (repaintChildOnCreation && (Time::getCurrentTime() - creationTime).inMilliseconds() < 1000) | |||
| recursiveHIViewRepaint (HIViewGetRoot (wrapperWindow)); | |||
| } | |||
| } | |||
| void setRepaintsChildHIViewWhenCreated (bool b) noexcept | |||
| { | |||
| repaintChildOnCreation = b; | |||
| } | |||
| OSStatus carbonEventHandler (EventHandlerCallRef /*nextHandlerRef*/, EventRef event) | |||
| { | |||
| switch (GetEventKind (event)) | |||
| { | |||
| case kEventWindowHandleDeactivate: | |||
| ActivateWindow (wrapperWindow, TRUE); | |||
| return noErr; | |||
| case kEventWindowGetClickActivation: | |||
| { | |||
| getTopLevelComponent()->toFront (false); | |||
| [carbonWindow makeKeyAndOrderFront: nil]; | |||
| ClickActivationResult howToHandleClick = kActivateAndHandleClick; | |||
| SetEventParameter (event, kEventParamClickActivation, typeClickActivationResult, | |||
| sizeof (ClickActivationResult), &howToHandleClick); | |||
| if (embeddedView != 0) | |||
| HIViewSetNeedsDisplay (embeddedView, true); | |||
| return noErr; | |||
| } | |||
| } | |||
| return eventNotHandledErr; | |||
| } | |||
| static pascal OSStatus carbonEventCallback (EventHandlerCallRef nextHandlerRef, EventRef event, void* userData) | |||
| { | |||
| return ((CarbonViewWrapperComponent*) userData)->carbonEventHandler (nextHandlerRef, event); | |||
| } | |||
| NSWindow* carbonWindow; | |||
| bool keepPluginWindowWhenHidden; | |||
| protected: | |||
| WindowRef wrapperWindow; | |||
| HIViewRef embeddedView; | |||
| bool recursiveResize, repaintChildOnCreation; | |||
| Time creationTime; | |||
| EventHandlerRef eventHandlerRef; | |||
| NSWindow* getOwnerWindow() const { return [((NSView*) getWindowHandle()) window]; } | |||
| }; | |||
| //============================================================================== | |||
| // Non-public utility function that hosts can use if they need to get hold of the | |||
| // internals of a carbon wrapper window.. | |||
| void* getCarbonWindow (Component* possibleCarbonComponent) | |||
| { | |||
| if (CarbonViewWrapperComponent* cv = dynamic_cast<CarbonViewWrapperComponent*> (possibleCarbonComponent)) | |||
| return cv->carbonWindow; | |||
| return nullptr; | |||
| } | |||
| } // namespace juce | |||
| @@ -577,18 +577,11 @@ private: | |||
| PlayerController (Pimpl& ownerToUse, bool useNativeControlsIfAvailable) | |||
| : PlayerControllerBase (ownerToUse, useNativeControlsIfAvailable) | |||
| { | |||
| #if JUCE_32BIT | |||
| // 32-bit builds don't have AVPlayerView, so need to use a layer | |||
| useNativeControls = false; | |||
| #endif | |||
| wrappedPlayer = [&]() -> std::unique_ptr<WrappedPlayer> | |||
| { | |||
| #if ! JUCE_32BIT | |||
| if (@available (macOS 10.9, *)) | |||
| if (useNativeControls) | |||
| return std::make_unique<WrappedPlayerView>(); | |||
| #endif | |||
| return std::make_unique<WrappedPlayerLayer> (); | |||
| }(); | |||
| @@ -658,7 +651,6 @@ private: | |||
| NSUniquePtr<AVPlayerLayer> playerLayer { [[AVPlayerLayer alloc] init] }; | |||
| }; | |||
| #if ! JUCE_32BIT | |||
| class API_AVAILABLE (macos (10.9)) WrappedPlayerView : public WrappedPlayer | |||
| { | |||
| public: | |||
| @@ -670,7 +662,6 @@ private: | |||
| private: | |||
| NSUniquePtr<AVPlayerView> playerView { [[AVPlayerView alloc] init] }; | |||
| }; | |||
| #endif | |||
| std::unique_ptr<WrappedPlayer> wrappedPlayer; | |||
| }; | |||