| @@ -318,6 +318,7 @@ OBJECTS := \ | |||
| $(OBJDIR)/juce_win32_AudioCDReader_66c7252.o \ | |||
| $(OBJDIR)/juce_win32_CameraDevice_ea35306d.o \ | |||
| $(OBJDIR)/juce_win32_Direct2DGraphicsContext_9f1b6be1.o \ | |||
| $(OBJDIR)/juce_win32_DirectShowComponent_e4030c4f.o \ | |||
| $(OBJDIR)/juce_win32_DirectSound_3462415e.o \ | |||
| $(OBJDIR)/juce_win32_FileChooser_18a257.o \ | |||
| $(OBJDIR)/juce_win32_Files_f3e9a2ef.o \ | |||
| @@ -1782,6 +1783,11 @@ $(OBJDIR)/juce_win32_Direct2DGraphicsContext_9f1b6be1.o: ../../src/native/window | |||
| @echo "Compiling juce_win32_Direct2DGraphicsContext.cpp" | |||
| @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
| $(OBJDIR)/juce_win32_DirectShowComponent_e4030c4f.o: ../../src/native/windows/juce_win32_DirectShowComponent.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling juce_win32_DirectShowComponent.cpp" | |||
| @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
| $(OBJDIR)/juce_win32_DirectSound_3462415e.o: ../../src/native/windows/juce_win32_DirectSound.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling juce_win32_DirectSound.cpp" | |||
| @@ -313,6 +313,7 @@ | |||
| 9686F29C29D1C26E353DE68A = { isa = PBXBuildFile; fileRef = F3B50EE3939E9F16D13C3C7C; }; | |||
| 79B4C2F1C0CF592ACE8093C0 = { isa = PBXBuildFile; fileRef = 3A37CD82212075940421CE4F; }; | |||
| 88A87D28B3809665F28DC16E = { isa = PBXBuildFile; fileRef = 7F3EF672D07ECE3E13AAF267; }; | |||
| 6BDBEFD97E643E5BB27637FF = { isa = PBXBuildFile; fileRef = 249959E338D7750E56A9F2F8; }; | |||
| BC3C22F5350ED7433D303A04 = { isa = PBXBuildFile; fileRef = 58B70C726D186B4E770300BC; }; | |||
| 0B41EC4D7839F8CBCB8F9A0D = { isa = PBXBuildFile; fileRef = DCD09B6EF4A4A109DE01F152; }; | |||
| B420CD4B589C08EAFA6E3DA4 = { isa = PBXBuildFile; fileRef = 7527A5E8F4F39581159D3E5B; }; | |||
| @@ -785,6 +786,7 @@ | |||
| C25DFA2F2B673EB0146412BB = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_BubbleMessageComponent.h; path = ../../src/gui/components/special/juce_BubbleMessageComponent.h; sourceTree = SOURCE_ROOT; }; | |||
| 0A20E7E561633610A76A34AB = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ColourSelector.cpp; path = ../../src/gui/components/special/juce_ColourSelector.cpp; sourceTree = SOURCE_ROOT; }; | |||
| CD9F817B7EF0DA080668A3A8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ColourSelector.h; path = ../../src/gui/components/special/juce_ColourSelector.h; sourceTree = SOURCE_ROOT; }; | |||
| 4BF7A01BCE61A5068CA13D8F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DirectShowComponent.h; path = ../../src/gui/components/special/juce_DirectShowComponent.h; sourceTree = SOURCE_ROOT; }; | |||
| 9C1D5CDA61FB51F657DA8B22 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DropShadower.cpp; path = ../../src/gui/components/special/juce_DropShadower.cpp; sourceTree = SOURCE_ROOT; }; | |||
| 7DB8CFB77EA690ACF54C63B4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DropShadower.h; path = ../../src/gui/components/special/juce_DropShadower.h; sourceTree = SOURCE_ROOT; }; | |||
| 3C8C1AAF32DFECB89EB83271 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiKeyboardComponent.cpp; path = ../../src/gui/components/special/juce_MidiKeyboardComponent.cpp; sourceTree = SOURCE_ROOT; }; | |||
| @@ -1015,6 +1017,7 @@ | |||
| 9C4D1018ECC0BA07346453EF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_win32_AutoLinkLibraries.h; path = ../../src/native/windows/juce_win32_AutoLinkLibraries.h; sourceTree = SOURCE_ROOT; }; | |||
| 3A37CD82212075940421CE4F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_CameraDevice.cpp; path = ../../src/native/windows/juce_win32_CameraDevice.cpp; sourceTree = SOURCE_ROOT; }; | |||
| 7F3EF672D07ECE3E13AAF267 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_Direct2DGraphicsContext.cpp; path = ../../src/native/windows/juce_win32_Direct2DGraphicsContext.cpp; sourceTree = SOURCE_ROOT; }; | |||
| 249959E338D7750E56A9F2F8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_DirectShowComponent.cpp; path = ../../src/native/windows/juce_win32_DirectShowComponent.cpp; sourceTree = SOURCE_ROOT; }; | |||
| 58B70C726D186B4E770300BC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_DirectSound.cpp; path = ../../src/native/windows/juce_win32_DirectSound.cpp; sourceTree = SOURCE_ROOT; }; | |||
| BA66E265749F75DBA86EC3F1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_win32_DynamicLibraryLoader.h; path = ../../src/native/windows/juce_win32_DynamicLibraryLoader.h; sourceTree = SOURCE_ROOT; }; | |||
| DCD09B6EF4A4A109DE01F152 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_FileChooser.cpp; path = ../../src/native/windows/juce_win32_FileChooser.cpp; sourceTree = SOURCE_ROOT; }; | |||
| @@ -1565,6 +1568,7 @@ | |||
| C25DFA2F2B673EB0146412BB, | |||
| 0A20E7E561633610A76A34AB, | |||
| CD9F817B7EF0DA080668A3A8, | |||
| 4BF7A01BCE61A5068CA13D8F, | |||
| 9C1D5CDA61FB51F657DA8B22, | |||
| 7DB8CFB77EA690ACF54C63B4, | |||
| 3C8C1AAF32DFECB89EB83271, | |||
| @@ -1851,6 +1855,7 @@ | |||
| 9C4D1018ECC0BA07346453EF, | |||
| 3A37CD82212075940421CE4F, | |||
| 7F3EF672D07ECE3E13AAF267, | |||
| 249959E338D7750E56A9F2F8, | |||
| 58B70C726D186B4E770300BC, | |||
| BA66E265749F75DBA86EC3F1, | |||
| DCD09B6EF4A4A109DE01F152, | |||
| @@ -2361,6 +2366,7 @@ | |||
| 9686F29C29D1C26E353DE68A, | |||
| 79B4C2F1C0CF592ACE8093C0, | |||
| 88A87D28B3809665F28DC16E, | |||
| 6BDBEFD97E643E5BB27637FF, | |||
| BC3C22F5350ED7433D303A04, | |||
| 0B41EC4D7839F8CBCB8F9A0D, | |||
| B420CD4B589C08EAFA6E3DA4, | |||
| @@ -646,6 +646,7 @@ | |||
| <File RelativePath="..\..\src\gui\components\special\juce_BubbleMessageComponent.h"/> | |||
| <File RelativePath="..\..\src\gui\components\special\juce_ColourSelector.cpp"/> | |||
| <File RelativePath="..\..\src\gui\components\special\juce_ColourSelector.h"/> | |||
| <File RelativePath="..\..\src\gui\components\special\juce_DirectShowComponent.h"/> | |||
| <File RelativePath="..\..\src\gui\components\special\juce_DropShadower.cpp"/> | |||
| <File RelativePath="..\..\src\gui\components\special\juce_DropShadower.h"/> | |||
| <File RelativePath="..\..\src\gui\components\special\juce_MidiKeyboardComponent.cpp"/> | |||
| @@ -919,6 +920,7 @@ | |||
| <File RelativePath="..\..\src\native\windows\juce_win32_AutoLinkLibraries.h"/> | |||
| <File RelativePath="..\..\src\native\windows\juce_win32_CameraDevice.cpp"/> | |||
| <File RelativePath="..\..\src\native\windows\juce_win32_Direct2DGraphicsContext.cpp"/> | |||
| <File RelativePath="..\..\src\native\windows\juce_win32_DirectShowComponent.cpp"/> | |||
| <File RelativePath="..\..\src\native\windows\juce_win32_DirectSound.cpp"/> | |||
| <File RelativePath="..\..\src\native\windows\juce_win32_DynamicLibraryLoader.h"/> | |||
| <File RelativePath="..\..\src\native\windows\juce_win32_FileChooser.cpp"/> | |||
| @@ -646,6 +646,7 @@ | |||
| <File RelativePath="..\..\src\gui\components\special\juce_BubbleMessageComponent.h"/> | |||
| <File RelativePath="..\..\src\gui\components\special\juce_ColourSelector.cpp"/> | |||
| <File RelativePath="..\..\src\gui\components\special\juce_ColourSelector.h"/> | |||
| <File RelativePath="..\..\src\gui\components\special\juce_DirectShowComponent.h"/> | |||
| <File RelativePath="..\..\src\gui\components\special\juce_DropShadower.cpp"/> | |||
| <File RelativePath="..\..\src\gui\components\special\juce_DropShadower.h"/> | |||
| <File RelativePath="..\..\src\gui\components\special\juce_MidiKeyboardComponent.cpp"/> | |||
| @@ -919,6 +920,7 @@ | |||
| <File RelativePath="..\..\src\native\windows\juce_win32_AutoLinkLibraries.h"/> | |||
| <File RelativePath="..\..\src\native\windows\juce_win32_CameraDevice.cpp"/> | |||
| <File RelativePath="..\..\src\native\windows\juce_win32_Direct2DGraphicsContext.cpp"/> | |||
| <File RelativePath="..\..\src\native\windows\juce_win32_DirectShowComponent.cpp"/> | |||
| <File RelativePath="..\..\src\native\windows\juce_win32_DirectSound.cpp"/> | |||
| <File RelativePath="..\..\src\native\windows\juce_win32_DynamicLibraryLoader.h"/> | |||
| <File RelativePath="..\..\src\native\windows\juce_win32_FileChooser.cpp"/> | |||
| @@ -648,6 +648,7 @@ | |||
| <File RelativePath="..\..\src\gui\components\special\juce_BubbleMessageComponent.h"/> | |||
| <File RelativePath="..\..\src\gui\components\special\juce_ColourSelector.cpp"/> | |||
| <File RelativePath="..\..\src\gui\components\special\juce_ColourSelector.h"/> | |||
| <File RelativePath="..\..\src\gui\components\special\juce_DirectShowComponent.h"/> | |||
| <File RelativePath="..\..\src\gui\components\special\juce_DropShadower.cpp"/> | |||
| <File RelativePath="..\..\src\gui\components\special\juce_DropShadower.h"/> | |||
| <File RelativePath="..\..\src\gui\components\special\juce_MidiKeyboardComponent.cpp"/> | |||
| @@ -921,6 +922,7 @@ | |||
| <File RelativePath="..\..\src\native\windows\juce_win32_AutoLinkLibraries.h"/> | |||
| <File RelativePath="..\..\src\native\windows\juce_win32_CameraDevice.cpp"/> | |||
| <File RelativePath="..\..\src\native\windows\juce_win32_Direct2DGraphicsContext.cpp"/> | |||
| <File RelativePath="..\..\src\native\windows\juce_win32_DirectShowComponent.cpp"/> | |||
| <File RelativePath="..\..\src\native\windows\juce_win32_DirectSound.cpp"/> | |||
| <File RelativePath="..\..\src\native\windows\juce_win32_DynamicLibraryLoader.h"/> | |||
| <File RelativePath="..\..\src\native\windows\juce_win32_FileChooser.cpp"/> | |||
| @@ -401,6 +401,7 @@ | |||
| <ClCompile Include="..\..\src\native\windows\juce_win32_AudioCDReader.cpp"/> | |||
| <ClCompile Include="..\..\src\native\windows\juce_win32_CameraDevice.cpp"/> | |||
| <ClCompile Include="..\..\src\native\windows\juce_win32_Direct2DGraphicsContext.cpp"/> | |||
| <ClCompile Include="..\..\src\native\windows\juce_win32_DirectShowComponent.cpp"/> | |||
| <ClCompile Include="..\..\src\native\windows\juce_win32_DirectSound.cpp"/> | |||
| <ClCompile Include="..\..\src\native\windows\juce_win32_FileChooser.cpp"/> | |||
| <ClCompile Include="..\..\src\native\windows\juce_win32_Files.cpp"/> | |||
| @@ -683,6 +684,7 @@ | |||
| <ClInclude Include="..\..\src\gui\components\special\juce_BubbleComponent.h"/> | |||
| <ClInclude Include="..\..\src\gui\components\special\juce_BubbleMessageComponent.h"/> | |||
| <ClInclude Include="..\..\src\gui\components\special\juce_ColourSelector.h"/> | |||
| <ClInclude Include="..\..\src\gui\components\special\juce_DirectShowComponent.h"/> | |||
| <ClInclude Include="..\..\src\gui\components\special\juce_DropShadower.h"/> | |||
| <ClInclude Include="..\..\src\gui\components\special\juce_MidiKeyboardComponent.h"/> | |||
| <ClInclude Include="..\..\src\gui\components\special\juce_NSViewComponent.h"/> | |||
| @@ -1138,6 +1138,9 @@ | |||
| <ClCompile Include="..\..\src\native\windows\juce_win32_Direct2DGraphicsContext.cpp"> | |||
| <Filter>Juce\Source\native\windows</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\src\native\windows\juce_win32_DirectShowComponent.cpp"> | |||
| <Filter>Juce\Source\native\windows</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\src\native\windows\juce_win32_DirectSound.cpp"> | |||
| <Filter>Juce\Source\native\windows</Filter> | |||
| </ClCompile> | |||
| @@ -1980,6 +1983,9 @@ | |||
| <ClInclude Include="..\..\src\gui\components\special\juce_ColourSelector.h"> | |||
| <Filter>Juce\Source\gui\components\special</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\src\gui\components\special\juce_DirectShowComponent.h"> | |||
| <Filter>Juce\Source\gui\components\special</Filter> | |||
| </ClInclude> | |||
| <ClInclude Include="..\..\src\gui\components\special\juce_DropShadower.h"> | |||
| <Filter>Juce\Source\gui\components\special</Filter> | |||
| </ClInclude> | |||
| @@ -313,6 +313,7 @@ | |||
| 9686F29C29D1C26E353DE68A = { isa = PBXBuildFile; fileRef = F3B50EE3939E9F16D13C3C7C; }; | |||
| 79B4C2F1C0CF592ACE8093C0 = { isa = PBXBuildFile; fileRef = 3A37CD82212075940421CE4F; }; | |||
| 88A87D28B3809665F28DC16E = { isa = PBXBuildFile; fileRef = 7F3EF672D07ECE3E13AAF267; }; | |||
| 6BDBEFD97E643E5BB27637FF = { isa = PBXBuildFile; fileRef = 249959E338D7750E56A9F2F8; }; | |||
| BC3C22F5350ED7433D303A04 = { isa = PBXBuildFile; fileRef = 58B70C726D186B4E770300BC; }; | |||
| 0B41EC4D7839F8CBCB8F9A0D = { isa = PBXBuildFile; fileRef = DCD09B6EF4A4A109DE01F152; }; | |||
| B420CD4B589C08EAFA6E3DA4 = { isa = PBXBuildFile; fileRef = 7527A5E8F4F39581159D3E5B; }; | |||
| @@ -785,6 +786,7 @@ | |||
| C25DFA2F2B673EB0146412BB = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_BubbleMessageComponent.h; path = ../../src/gui/components/special/juce_BubbleMessageComponent.h; sourceTree = SOURCE_ROOT; }; | |||
| 0A20E7E561633610A76A34AB = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ColourSelector.cpp; path = ../../src/gui/components/special/juce_ColourSelector.cpp; sourceTree = SOURCE_ROOT; }; | |||
| CD9F817B7EF0DA080668A3A8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_ColourSelector.h; path = ../../src/gui/components/special/juce_ColourSelector.h; sourceTree = SOURCE_ROOT; }; | |||
| 4BF7A01BCE61A5068CA13D8F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DirectShowComponent.h; path = ../../src/gui/components/special/juce_DirectShowComponent.h; sourceTree = SOURCE_ROOT; }; | |||
| 9C1D5CDA61FB51F657DA8B22 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DropShadower.cpp; path = ../../src/gui/components/special/juce_DropShadower.cpp; sourceTree = SOURCE_ROOT; }; | |||
| 7DB8CFB77EA690ACF54C63B4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DropShadower.h; path = ../../src/gui/components/special/juce_DropShadower.h; sourceTree = SOURCE_ROOT; }; | |||
| 3C8C1AAF32DFECB89EB83271 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_MidiKeyboardComponent.cpp; path = ../../src/gui/components/special/juce_MidiKeyboardComponent.cpp; sourceTree = SOURCE_ROOT; }; | |||
| @@ -1015,6 +1017,7 @@ | |||
| 9C4D1018ECC0BA07346453EF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_win32_AutoLinkLibraries.h; path = ../../src/native/windows/juce_win32_AutoLinkLibraries.h; sourceTree = SOURCE_ROOT; }; | |||
| 3A37CD82212075940421CE4F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_CameraDevice.cpp; path = ../../src/native/windows/juce_win32_CameraDevice.cpp; sourceTree = SOURCE_ROOT; }; | |||
| 7F3EF672D07ECE3E13AAF267 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_Direct2DGraphicsContext.cpp; path = ../../src/native/windows/juce_win32_Direct2DGraphicsContext.cpp; sourceTree = SOURCE_ROOT; }; | |||
| 249959E338D7750E56A9F2F8 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_DirectShowComponent.cpp; path = ../../src/native/windows/juce_win32_DirectShowComponent.cpp; sourceTree = SOURCE_ROOT; }; | |||
| 58B70C726D186B4E770300BC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_DirectSound.cpp; path = ../../src/native/windows/juce_win32_DirectSound.cpp; sourceTree = SOURCE_ROOT; }; | |||
| BA66E265749F75DBA86EC3F1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_win32_DynamicLibraryLoader.h; path = ../../src/native/windows/juce_win32_DynamicLibraryLoader.h; sourceTree = SOURCE_ROOT; }; | |||
| DCD09B6EF4A4A109DE01F152 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_FileChooser.cpp; path = ../../src/native/windows/juce_win32_FileChooser.cpp; sourceTree = SOURCE_ROOT; }; | |||
| @@ -1565,6 +1568,7 @@ | |||
| C25DFA2F2B673EB0146412BB, | |||
| 0A20E7E561633610A76A34AB, | |||
| CD9F817B7EF0DA080668A3A8, | |||
| 4BF7A01BCE61A5068CA13D8F, | |||
| 9C1D5CDA61FB51F657DA8B22, | |||
| 7DB8CFB77EA690ACF54C63B4, | |||
| 3C8C1AAF32DFECB89EB83271, | |||
| @@ -1851,6 +1855,7 @@ | |||
| 9C4D1018ECC0BA07346453EF, | |||
| 3A37CD82212075940421CE4F, | |||
| 7F3EF672D07ECE3E13AAF267, | |||
| 249959E338D7750E56A9F2F8, | |||
| 58B70C726D186B4E770300BC, | |||
| BA66E265749F75DBA86EC3F1, | |||
| DCD09B6EF4A4A109DE01F152, | |||
| @@ -2365,6 +2370,7 @@ | |||
| 9686F29C29D1C26E353DE68A, | |||
| 79B4C2F1C0CF592ACE8093C0, | |||
| 88A87D28B3809665F28DC16E, | |||
| 6BDBEFD97E643E5BB27637FF, | |||
| BC3C22F5350ED7433D303A04, | |||
| 0B41EC4D7839F8CBCB8F9A0D, | |||
| B420CD4B589C08EAFA6E3DA4, | |||
| @@ -926,6 +926,8 @@ | |||
| file="src/gui/components/special/juce_ColourSelector.cpp"/> | |||
| <FILE id="W0GkpoQPd" name="juce_ColourSelector.h" compile="0" resource="0" | |||
| file="src/gui/components/special/juce_ColourSelector.h"/> | |||
| <FILE id="FfvKX" name="juce_DirectShowComponent.h" compile="0" resource="0" | |||
| file="src/gui/components/special/juce_DirectShowComponent.h"/> | |||
| <FILE id="l18RV2qVq" name="juce_DropShadower.cpp" compile="1" resource="0" | |||
| file="src/gui/components/special/juce_DropShadower.cpp"/> | |||
| <FILE id="tNsR3nrMx" name="juce_DropShadower.h" compile="0" resource="0" | |||
| @@ -1416,6 +1418,8 @@ | |||
| resource="0" file="src/native/windows/juce_win32_CameraDevice.cpp"/> | |||
| <FILE id="c4BNPC" name="juce_win32_Direct2DGraphicsContext.cpp" compile="1" | |||
| resource="0" file="src/native/windows/juce_win32_Direct2DGraphicsContext.cpp"/> | |||
| <FILE id="lWJ3cT" name="juce_win32_DirectShowComponent.cpp" compile="1" | |||
| resource="0" file="src/native/windows/juce_win32_DirectShowComponent.cpp"/> | |||
| <FILE id="CVNbte6ov" name="juce_win32_DirectSound.cpp" compile="1" | |||
| resource="0" file="src/native/windows/juce_win32_DirectSound.cpp"/> | |||
| <FILE id="WuS4E8Pvz" name="juce_win32_DynamicLibraryLoader.h" compile="0" | |||
| @@ -1620,5 +1624,5 @@ | |||
| JUCE_PLUGINHOST_VST="default" JUCE_PLUGINHOST_AU="default" JUCE_ONLY_BUILD_CORE_LIBRARY="default" | |||
| JUCE_WEB_BROWSER="default" JUCE_SUPPORT_CARBON="default" JUCE_CHECK_MEMORY_LEAKS="default" | |||
| JUCE_CATCH_UNHANDLED_EXCEPTIONS="default" JUCE_USE_XCURSOR="default" | |||
| JUCE_DIRECT2D="default"/> | |||
| JUCE_DIRECT2D="default" JUCE_MEDIAFOUNDATION="default" JUCE_DIRECTSHOW="default"/> | |||
| </JUCERPROJECT> | |||
| @@ -186,5 +186,6 @@ | |||
| JUCE_USE_XINERAMA="default" JUCE_USE_XSHM="default" JUCE_ONLY_BUILD_CORE_LIBRARY="default" | |||
| JUCE_WEB_BROWSER="default" JUCE_SUPPORT_CARBON="default" JUCE_CHECK_MEMORY_LEAKS="default" | |||
| JUCE_CATCH_UNHANDLED_EXCEPTIONS="default" JUCE_STRINGS_ARE_UNICODE="default" | |||
| JUCE_USE_XRENDER="default" JUCE_USE_XCURSOR="default" JUCE_DIRECT2D="default"/> | |||
| JUCE_USE_XRENDER="default" JUCE_USE_XCURSOR="default" JUCE_DIRECT2D="default" | |||
| JUCE_DIRECTSHOW="default" JUCE_MEDIAFOUNDATION="default"/> | |||
| </JUCERPROJECT> | |||
| @@ -16,6 +16,8 @@ | |||
| #define JUCE_ASIO 0 | |||
| #define JUCE_WASAPI 0 | |||
| #define JUCE_DIRECTSOUND 0 | |||
| //#define JUCE_DIRECTSHOW | |||
| //#define JUCE_MEDIAFOUNDATION | |||
| #define JUCE_ALSA 0 | |||
| #define JUCE_QUICKTIME 0 | |||
| #define JUCE_OPENGL 0 | |||
| @@ -18,6 +18,7 @@ LOCAL_SRC_FILES := \ | |||
| ../../../Source/demos/AudioDemoTabComponent.cpp\ | |||
| ../../../Source/demos/CameraDemo.cpp\ | |||
| ../../../Source/demos/CodeEditorDemo.cpp\ | |||
| ../../../Source/demos/DirectShowDemo.cpp\ | |||
| ../../../Source/demos/DragAndDropDemo.cpp\ | |||
| ../../../Source/demos/FontsAndTextDemo.cpp\ | |||
| ../../../Source/demos/InterprocessCommsDemo.cpp\ | |||
| @@ -53,6 +53,7 @@ OBJECTS := \ | |||
| $(OBJDIR)/AudioDemoTabComponent_81185e3.o \ | |||
| $(OBJDIR)/CameraDemo_954a4a30.o \ | |||
| $(OBJDIR)/CodeEditorDemo_55f35645.o \ | |||
| $(OBJDIR)/DirectShowDemo_2e0bc311.o \ | |||
| $(OBJDIR)/DragAndDropDemo_f8c9e5d7.o \ | |||
| $(OBJDIR)/FontsAndTextDemo_2cefcecb.o \ | |||
| $(OBJDIR)/InterprocessCommsDemo_aa1c1119.o \ | |||
| @@ -135,6 +136,11 @@ $(OBJDIR)/CodeEditorDemo_55f35645.o: ../../Source/demos/CodeEditorDemo.cpp | |||
| @echo "Compiling CodeEditorDemo.cpp" | |||
| @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
| $(OBJDIR)/DirectShowDemo_2e0bc311.o: ../../Source/demos/DirectShowDemo.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling DirectShowDemo.cpp" | |||
| @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
| $(OBJDIR)/DragAndDropDemo_f8c9e5d7.o: ../../Source/demos/DragAndDropDemo.cpp | |||
| -@mkdir -p $(OBJDIR) | |||
| @echo "Compiling DragAndDropDemo.cpp" | |||
| @@ -28,6 +28,7 @@ | |||
| 7EFB4E7D738BFFF90F49E0C0 = { isa = PBXBuildFile; fileRef = 048CEE4CC06227D8A57E47F2; }; | |||
| B69F5957B1729915BFB18735 = { isa = PBXBuildFile; fileRef = 7D65727C8F72F2BCC9A17D34; }; | |||
| F920A5AB6D0FF01022575079 = { isa = PBXBuildFile; fileRef = 268D7AFE2F3822C2C8E9A612; }; | |||
| 940BE0338CC1FEB65B4B82E2 = { isa = PBXBuildFile; fileRef = E072353A8A1F26CFB7090905; }; | |||
| A3AF0F559DD97F1B908AC1CA = { isa = PBXBuildFile; fileRef = F23738E4EFD2323063F82F1C; }; | |||
| 2C0AB902CB01E38D87A2A6A5 = { isa = PBXBuildFile; fileRef = B7F4DAFA5F8F1FC976C8B55D; }; | |||
| ACD2210FDE1137548F995F85 = { isa = PBXBuildFile; fileRef = F7620D8D567CCE463ADDE0A6; }; | |||
| @@ -76,6 +77,7 @@ | |||
| 8BEA0B754661F3038DBAF558 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AudioDemoTabComponent.h; path = ../../Source/demos/AudioDemoTabComponent.h; sourceTree = SOURCE_ROOT; }; | |||
| 7D65727C8F72F2BCC9A17D34 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CameraDemo.cpp; path = ../../Source/demos/CameraDemo.cpp; sourceTree = SOURCE_ROOT; }; | |||
| 268D7AFE2F3822C2C8E9A612 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CodeEditorDemo.cpp; path = ../../Source/demos/CodeEditorDemo.cpp; sourceTree = SOURCE_ROOT; }; | |||
| E072353A8A1F26CFB7090905 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DirectShowDemo.cpp; path = ../../Source/demos/DirectShowDemo.cpp; sourceTree = SOURCE_ROOT; }; | |||
| F23738E4EFD2323063F82F1C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DragAndDropDemo.cpp; path = ../../Source/demos/DragAndDropDemo.cpp; sourceTree = SOURCE_ROOT; }; | |||
| B7F4DAFA5F8F1FC976C8B55D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FontsAndTextDemo.cpp; path = ../../Source/demos/FontsAndTextDemo.cpp; sourceTree = SOURCE_ROOT; }; | |||
| F7620D8D567CCE463ADDE0A6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = InterprocessCommsDemo.cpp; path = ../../Source/demos/InterprocessCommsDemo.cpp; sourceTree = SOURCE_ROOT; }; | |||
| @@ -117,6 +119,7 @@ | |||
| 8BEA0B754661F3038DBAF558, | |||
| 7D65727C8F72F2BCC9A17D34, | |||
| 268D7AFE2F3822C2C8E9A612, | |||
| E072353A8A1F26CFB7090905, | |||
| F23738E4EFD2323063F82F1C, | |||
| B7F4DAFA5F8F1FC976C8B55D, | |||
| F7620D8D567CCE463ADDE0A6, | |||
| @@ -258,6 +261,7 @@ | |||
| 7EFB4E7D738BFFF90F49E0C0, | |||
| B69F5957B1729915BFB18735, | |||
| F920A5AB6D0FF01022575079, | |||
| 940BE0338CC1FEB65B4B82E2, | |||
| A3AF0F559DD97F1B908AC1CA, | |||
| 2C0AB902CB01E38D87A2A6A5, | |||
| ACD2210FDE1137548F995F85, | |||
| @@ -148,6 +148,7 @@ | |||
| <File RelativePath="..\..\Source\demos\AudioDemoTabComponent.h"/> | |||
| <File RelativePath="..\..\Source\demos\CameraDemo.cpp"/> | |||
| <File RelativePath="..\..\Source\demos\CodeEditorDemo.cpp"/> | |||
| <File RelativePath="..\..\Source\demos\DirectShowDemo.cpp"/> | |||
| <File RelativePath="..\..\Source\demos\DragAndDropDemo.cpp"/> | |||
| <File RelativePath="..\..\Source\demos\FontsAndTextDemo.cpp"/> | |||
| <File RelativePath="..\..\Source\demos\InterprocessCommsDemo.cpp"/> | |||
| @@ -148,6 +148,7 @@ | |||
| <File RelativePath="..\..\Source\demos\AudioDemoTabComponent.h"/> | |||
| <File RelativePath="..\..\Source\demos\CameraDemo.cpp"/> | |||
| <File RelativePath="..\..\Source\demos\CodeEditorDemo.cpp"/> | |||
| <File RelativePath="..\..\Source\demos\DirectShowDemo.cpp"/> | |||
| <File RelativePath="..\..\Source\demos\DragAndDropDemo.cpp"/> | |||
| <File RelativePath="..\..\Source\demos\FontsAndTextDemo.cpp"/> | |||
| <File RelativePath="..\..\Source\demos\InterprocessCommsDemo.cpp"/> | |||
| @@ -132,6 +132,7 @@ | |||
| <ClCompile Include="..\..\Source\demos\AudioDemoTabComponent.cpp"/> | |||
| <ClCompile Include="..\..\Source\demos\CameraDemo.cpp"/> | |||
| <ClCompile Include="..\..\Source\demos\CodeEditorDemo.cpp"/> | |||
| <ClCompile Include="..\..\Source\demos\DirectShowDemo.cpp"/> | |||
| <ClCompile Include="..\..\Source\demos\DragAndDropDemo.cpp"/> | |||
| <ClCompile Include="..\..\Source\demos\FontsAndTextDemo.cpp"/> | |||
| <ClCompile Include="..\..\Source\demos\InterprocessCommsDemo.cpp"/> | |||
| @@ -49,6 +49,9 @@ | |||
| <ClCompile Include="..\..\Source\demos\CodeEditorDemo.cpp"> | |||
| <Filter>Juce Demo\Source\Demos</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\demos\DirectShowDemo.cpp"> | |||
| <Filter>Juce Demo\Source\Demos</Filter> | |||
| </ClCompile> | |||
| <ClCompile Include="..\..\Source\demos\DragAndDropDemo.cpp"> | |||
| <Filter>Juce Demo\Source\Demos</Filter> | |||
| </ClCompile> | |||
| @@ -24,6 +24,7 @@ | |||
| 7EFB4E7D738BFFF90F49E0C0 = { isa = PBXBuildFile; fileRef = 048CEE4CC06227D8A57E47F2; }; | |||
| B69F5957B1729915BFB18735 = { isa = PBXBuildFile; fileRef = 7D65727C8F72F2BCC9A17D34; }; | |||
| F920A5AB6D0FF01022575079 = { isa = PBXBuildFile; fileRef = 268D7AFE2F3822C2C8E9A612; }; | |||
| 940BE0338CC1FEB65B4B82E2 = { isa = PBXBuildFile; fileRef = E072353A8A1F26CFB7090905; }; | |||
| A3AF0F559DD97F1B908AC1CA = { isa = PBXBuildFile; fileRef = F23738E4EFD2323063F82F1C; }; | |||
| 2C0AB902CB01E38D87A2A6A5 = { isa = PBXBuildFile; fileRef = B7F4DAFA5F8F1FC976C8B55D; }; | |||
| ACD2210FDE1137548F995F85 = { isa = PBXBuildFile; fileRef = F7620D8D567CCE463ADDE0A6; }; | |||
| @@ -68,6 +69,7 @@ | |||
| 8BEA0B754661F3038DBAF558 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AudioDemoTabComponent.h; path = ../../Source/demos/AudioDemoTabComponent.h; sourceTree = SOURCE_ROOT; }; | |||
| 7D65727C8F72F2BCC9A17D34 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CameraDemo.cpp; path = ../../Source/demos/CameraDemo.cpp; sourceTree = SOURCE_ROOT; }; | |||
| 268D7AFE2F3822C2C8E9A612 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CodeEditorDemo.cpp; path = ../../Source/demos/CodeEditorDemo.cpp; sourceTree = SOURCE_ROOT; }; | |||
| E072353A8A1F26CFB7090905 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DirectShowDemo.cpp; path = ../../Source/demos/DirectShowDemo.cpp; sourceTree = SOURCE_ROOT; }; | |||
| F23738E4EFD2323063F82F1C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DragAndDropDemo.cpp; path = ../../Source/demos/DragAndDropDemo.cpp; sourceTree = SOURCE_ROOT; }; | |||
| B7F4DAFA5F8F1FC976C8B55D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FontsAndTextDemo.cpp; path = ../../Source/demos/FontsAndTextDemo.cpp; sourceTree = SOURCE_ROOT; }; | |||
| F7620D8D567CCE463ADDE0A6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = InterprocessCommsDemo.cpp; path = ../../Source/demos/InterprocessCommsDemo.cpp; sourceTree = SOURCE_ROOT; }; | |||
| @@ -109,6 +111,7 @@ | |||
| 8BEA0B754661F3038DBAF558, | |||
| 7D65727C8F72F2BCC9A17D34, | |||
| 268D7AFE2F3822C2C8E9A612, | |||
| E072353A8A1F26CFB7090905, | |||
| F23738E4EFD2323063F82F1C, | |||
| B7F4DAFA5F8F1FC976C8B55D, | |||
| F7620D8D567CCE463ADDE0A6, | |||
| @@ -249,6 +252,7 @@ | |||
| 7EFB4E7D738BFFF90F49E0C0, | |||
| B69F5957B1729915BFB18735, | |||
| F920A5AB6D0FF01022575079, | |||
| 940BE0338CC1FEB65B4B82E2, | |||
| A3AF0F559DD97F1B908AC1CA, | |||
| 2C0AB902CB01E38D87A2A6A5, | |||
| ACD2210FDE1137548F995F85, | |||
| @@ -72,6 +72,8 @@ | |||
| file="Source/demos/CameraDemo.cpp"/> | |||
| <FILE id="VrH9xEBt4" name="CodeEditorDemo.cpp" compile="1" resource="0" | |||
| file="Source/demos/CodeEditorDemo.cpp"/> | |||
| <FILE id="Biv7Wl" name="DirectShowDemo.cpp" compile="1" resource="0" | |||
| file="Source/demos/DirectShowDemo.cpp"/> | |||
| <FILE id="LQxkyT31Q" name="DragAndDropDemo.cpp" compile="1" resource="0" | |||
| file="Source/demos/DragAndDropDemo.cpp"/> | |||
| <FILE id="WlmBspVQo" name="FontsAndTextDemo.cpp" compile="1" resource="0" | |||
| @@ -117,5 +119,6 @@ | |||
| JUCE_PLUGINHOST_AU="disabled" JUCE_ONLY_BUILD_CORE_LIBRARY="default" | |||
| JUCE_WEB_BROWSER="default" JUCE_SUPPORT_CARBON="default" JUCE_CHECK_MEMORY_LEAKS="default" | |||
| JUCE_CATCH_UNHANDLED_EXCEPTIONS="default" JUCE_STRINGS_ARE_UNICODE="default" | |||
| JUCE_USE_XRENDER="default" JUCE_USE_XCURSOR="default" JUCE_DIRECT2D="default"/> | |||
| JUCE_USE_XRENDER="default" JUCE_USE_XCURSOR="default" JUCE_DIRECT2D="default" | |||
| JUCE_MEDIAFOUNDATION="default" JUCE_DIRECTSHOW="default"/> | |||
| </JUCERPROJECT> | |||
| @@ -16,6 +16,8 @@ | |||
| //#define JUCE_ASIO | |||
| //#define JUCE_WASAPI | |||
| //#define JUCE_DIRECTSOUND | |||
| //#define JUCE_DIRECTSHOW | |||
| //#define JUCE_MEDIAFOUNDATION | |||
| //#define JUCE_ALSA | |||
| //#define JUCE_QUICKTIME | |||
| //#define JUCE_OPENGL | |||
| @@ -86,6 +86,7 @@ public: | |||
| menu.addCommandItem (commandManager, showDragAndDrop); | |||
| menu.addCommandItem (commandManager, showOpenGL); | |||
| menu.addCommandItem (commandManager, showQuicktime); | |||
| menu.addCommandItem (commandManager, showDirectShow); | |||
| menu.addCommandItem (commandManager, showInterprocessComms); | |||
| menu.addCommandItem (commandManager, showCamera); | |||
| menu.addCommandItem (commandManager, showWebBrowser); | |||
| @@ -157,6 +158,7 @@ public: | |||
| showDragAndDrop, | |||
| showOpenGL, | |||
| showQuicktime, | |||
| showDirectShow, | |||
| showCamera, | |||
| showWebBrowser, | |||
| showCodeEditor, | |||
| @@ -251,6 +253,15 @@ public: | |||
| #endif | |||
| break; | |||
| case showDirectShow: | |||
| result.setInfo ("DirectShow", "Shows the DirectShow demo", demosCategory, 0); | |||
| result.addDefaultKeypress ('b', ModifierKeys::commandModifier); | |||
| result.setTicked (currentDemoId == showDirectShow); | |||
| #if ! JUCE_DIRECTSHOW | |||
| result.setActive (false); | |||
| #endif | |||
| break; | |||
| case showCamera: | |||
| result.setInfo ("Camera Capture", "Shows the camera demo", demosCategory, 0); | |||
| result.addDefaultKeypress ('c', ModifierKeys::commandModifier); | |||
| @@ -374,6 +385,13 @@ public: | |||
| #endif | |||
| break; | |||
| case showDirectShow: | |||
| #if JUCE_DIRECTSHOW | |||
| showDemo (createDirectShowDemo()); | |||
| currentDemoId = showDirectShow; | |||
| #endif | |||
| break; | |||
| case showCamera: | |||
| #if JUCE_USE_CAMERA | |||
| showDemo (createCameraDemo()); | |||
| @@ -474,6 +492,7 @@ private: | |||
| showCamera = 0x2011, | |||
| showWebBrowser = 0x2012, | |||
| showCodeEditor = 0x2013, | |||
| showDirectShow = 0x2014, | |||
| setDefaultLookAndFeel = 0x200b, | |||
| setOldSchoolLookAndFeel = 0x200c, | |||
| @@ -0,0 +1,155 @@ | |||
| #include "../jucedemo_headers.h" | |||
| #if JUCE_DIRECTSHOW | |||
| //============================================================================== | |||
| class DirectShowWindowWithFileBrowser : public Component, | |||
| public FilenameComponentListener | |||
| { | |||
| public: | |||
| DirectShowWindowWithFileBrowser (DirectShowComponent::VideoRendererType type) | |||
| : fileChooser ("movie", File::nonexistent, true, false, false, | |||
| "*", String::empty, "(choose a video file to play)"), | |||
| dshowComp (type) | |||
| { | |||
| addAndMakeVisible (&dshowComp); | |||
| addAndMakeVisible (&fileChooser); | |||
| fileChooser.addListener (this); | |||
| fileChooser.setBrowseButtonText ("browse"); | |||
| } | |||
| void resized() | |||
| { | |||
| dshowComp.setBounds (0, 0, getWidth(), getHeight() - 60); | |||
| if (transportControl != 0) | |||
| transportControl->setBounds (0, dshowComp.getBottom() + 4, getWidth(), 26); | |||
| fileChooser.setBounds (0, getHeight() - 24, getWidth(), 24); | |||
| } | |||
| void filenameComponentChanged (FilenameComponent*) | |||
| { | |||
| // this is called when the user changes the filename in the file chooser box | |||
| if (dshowComp.loadMovie (fileChooser.getCurrentFile())) | |||
| { | |||
| addAndMakeVisible (transportControl = new TransportControl (dshowComp)); | |||
| resized(); | |||
| dshowComp.play(); | |||
| } | |||
| else | |||
| { | |||
| AlertWindow::showMessageBox (AlertWindow::WarningIcon, | |||
| "Couldn't load the file!", | |||
| "Sorry, DirectShow didn't manage to load that file!"); | |||
| } | |||
| } | |||
| private: | |||
| DirectShowComponent dshowComp; | |||
| FilenameComponent fileChooser; | |||
| //============================================================================== | |||
| // A quick-and-dirty transport control, containing a play button and a position slider.. | |||
| class TransportControl : public Component, | |||
| public ButtonListener, | |||
| public SliderListener, | |||
| public Timer | |||
| { | |||
| public: | |||
| TransportControl (DirectShowComponent& dshowComp_) | |||
| : playButton ("Play/Pause"), | |||
| position (String::empty), | |||
| dshowComp (dshowComp_) | |||
| { | |||
| addAndMakeVisible (&playButton); | |||
| playButton.addListener (this); | |||
| addAndMakeVisible (&position); | |||
| position.setRange (0, dshowComp.getMovieDuration(), 0); | |||
| position.setSliderStyle (Slider::LinearHorizontal); | |||
| position.setTextBoxStyle (Slider::NoTextBox, false, 80, 20); | |||
| position.addListener (this); | |||
| startTimer (1000 / 50); | |||
| } | |||
| void buttonClicked (Button* buttonThatWasClicked) | |||
| { | |||
| if (dshowComp.isPlaying()) | |||
| dshowComp.stop(); | |||
| else | |||
| dshowComp.play(); | |||
| } | |||
| void sliderValueChanged (Slider* sliderThatWasMoved) | |||
| { | |||
| dshowComp.setPosition (position.getValue()); | |||
| } | |||
| void resized() | |||
| { | |||
| const int playButtonWidth = 90; | |||
| playButton.setBounds (0, 0, playButtonWidth, getHeight()); | |||
| position.setBounds (playButtonWidth, 0, getWidth() - playButtonWidth, getHeight()); | |||
| } | |||
| void timerCallback() | |||
| { | |||
| if (! position.isMouseButtonDown()) | |||
| position.setValue (dshowComp.getPosition(), false); | |||
| } | |||
| private: | |||
| TextButton playButton; | |||
| Slider position; | |||
| DirectShowComponent& dshowComp; | |||
| }; | |||
| ScopedPointer<TransportControl> transportControl; | |||
| }; | |||
| //============================================================================== | |||
| class DirectShowDemo : public Component | |||
| { | |||
| public: | |||
| //============================================================================== | |||
| DirectShowDemo() | |||
| : dsComp1 (DirectShowComponent::dshowVMR7), | |||
| dsComp2 (DirectShowComponent::dshowEVR) | |||
| { | |||
| setName ("DirectShow"); | |||
| // add a movie component.. | |||
| addAndMakeVisible (&dsComp1); | |||
| addAndMakeVisible (&dsComp2); | |||
| } | |||
| ~DirectShowDemo() | |||
| { | |||
| dsComp1.setVisible (false); | |||
| dsComp2.setVisible (false); | |||
| } | |||
| void resized() | |||
| { | |||
| dsComp1.setBoundsRelative (0.05f, 0.05f, 0.425f, 0.9f); | |||
| dsComp2.setBoundsRelative (0.525f, 0.05f, 0.425f, 0.9f); | |||
| } | |||
| private: | |||
| //============================================================================== | |||
| DirectShowWindowWithFileBrowser dsComp1, dsComp2; | |||
| }; | |||
| //============================================================================== | |||
| Component* createDirectShowDemo() | |||
| { | |||
| return new DirectShowDemo(); | |||
| } | |||
| #endif | |||
| @@ -61,5 +61,8 @@ Component* createCodeEditorDemo(); | |||
| Component* createCameraDemo(); | |||
| #endif | |||
| #if JUCE_DIRECTSHOW | |||
| Component* createDirectShowDemo(); | |||
| #endif | |||
| #endif // __JUCEDEMO_HEADERS_JUCEHEADER__ | |||
| @@ -37,5 +37,6 @@ | |||
| JUCE_PLUGINHOST_AU="default" JUCE_ONLY_BUILD_CORE_LIBRARY="enabled" | |||
| JUCE_WEB_BROWSER="default" JUCE_SUPPORT_CARBON="default" JUCE_CHECK_MEMORY_LEAKS="default" | |||
| JUCE_CATCH_UNHANDLED_EXCEPTIONS="default" JUCE_STRINGS_ARE_UNICODE="default" | |||
| JUCE_USE_XRENDER="default" JUCE_USE_XCURSOR="default" JUCE_DIRECT2D="default"/> | |||
| JUCE_USE_XRENDER="default" JUCE_USE_XCURSOR="default" JUCE_DIRECT2D="default" | |||
| JUCE_DIRECTSHOW="default" JUCE_MEDIAFOUNDATION="default"/> | |||
| </JUCERPROJECT> | |||
| @@ -16,6 +16,8 @@ | |||
| //#define JUCE_ASIO | |||
| //#define JUCE_WASAPI | |||
| //#define JUCE_DIRECTSOUND | |||
| //#define JUCE_DIRECTSHOW | |||
| //#define JUCE_MEDIAFOUNDATION | |||
| //#define JUCE_ALSA | |||
| //#define JUCE_QUICKTIME | |||
| //#define JUCE_OPENGL | |||
| @@ -16,6 +16,8 @@ | |||
| //#define JUCE_ASIO | |||
| #define JUCE_WASAPI 1 | |||
| #define JUCE_DIRECTSOUND 1 | |||
| //#define JUCE_DIRECTSHOW | |||
| //#define JUCE_MEDIAFOUNDATION | |||
| #define JUCE_ALSA 1 | |||
| //#define JUCE_QUICKTIME | |||
| //#define JUCE_OPENGL | |||
| @@ -57,5 +57,6 @@ | |||
| JUCE_PLUGINHOST_AU="enabled" JUCE_ONLY_BUILD_CORE_LIBRARY="default" | |||
| JUCE_WEB_BROWSER="default" JUCE_SUPPORT_CARBON="default" JUCE_CHECK_MEMORY_LEAKS="default" | |||
| JUCE_CATCH_UNHANDLED_EXCEPTIONS="default" JUCE_STRINGS_ARE_UNICODE="default" | |||
| JUCE_USE_XRENDER="default" JUCE_USE_XCURSOR="default" JUCE_DIRECT2D="default"/> | |||
| JUCE_USE_XRENDER="default" JUCE_USE_XCURSOR="default" JUCE_DIRECT2D="default" | |||
| JUCE_DIRECTSHOW="default" JUCE_MEDIAFOUNDATION="default"/> | |||
| </JUCERPROJECT> | |||
| @@ -45,5 +45,5 @@ | |||
| JUCE_PLUGINHOST_VST="default" JUCE_PLUGINHOST_AU="default" JUCE_ONLY_BUILD_CORE_LIBRARY="default" | |||
| JUCE_WEB_BROWSER="default" JUCE_SUPPORT_CARBON="default" JUCE_CHECK_MEMORY_LEAKS="default" | |||
| JUCE_CATCH_UNHANDLED_EXCEPTIONS="default" JUCE_USE_XCURSOR="default" | |||
| JUCE_DIRECT2D="default"/> | |||
| JUCE_DIRECT2D="default" JUCE_DIRECTSHOW="default" JUCE_MEDIAFOUNDATION="default"/> | |||
| </JUCERPROJECT> | |||
| @@ -16,6 +16,8 @@ | |||
| //#define JUCE_ASIO | |||
| //#define JUCE_WASAPI | |||
| //#define JUCE_DIRECTSOUND | |||
| //#define JUCE_DIRECTSHOW | |||
| //#define JUCE_MEDIAFOUNDATION | |||
| //#define JUCE_ALSA | |||
| #define JUCE_QUICKTIME 0 | |||
| //#define JUCE_OPENGL | |||
| @@ -38,5 +38,6 @@ | |||
| JUCE_PLUGINHOST_AU="default" JUCE_ONLY_BUILD_CORE_LIBRARY="enabled" | |||
| JUCE_WEB_BROWSER="default" JUCE_SUPPORT_CARBON="default" JUCE_CHECK_MEMORY_LEAKS="default" | |||
| JUCE_CATCH_UNHANDLED_EXCEPTIONS="default" JUCE_STRINGS_ARE_UNICODE="default" | |||
| JUCE_USE_XRENDER="default" JUCE_USE_XCURSOR="default" JUCE_DIRECT2D="default"/> | |||
| JUCE_USE_XRENDER="default" JUCE_USE_XCURSOR="default" JUCE_DIRECT2D="default" | |||
| JUCE_DIRECTSHOW="default" JUCE_MEDIAFOUNDATION="default"/> | |||
| </JUCERPROJECT> | |||
| @@ -16,6 +16,8 @@ | |||
| //#define JUCE_ASIO | |||
| //#define JUCE_WASAPI | |||
| //#define JUCE_DIRECTSOUND | |||
| //#define JUCE_DIRECTSHOW | |||
| //#define JUCE_MEDIAFOUNDATION | |||
| //#define JUCE_ALSA | |||
| //#define JUCE_QUICKTIME | |||
| //#define JUCE_OPENGL | |||
| @@ -45,5 +45,6 @@ | |||
| JUCE_PLUGINHOST_AU="default" JUCE_ONLY_BUILD_CORE_LIBRARY="default" | |||
| JUCE_WEB_BROWSER="default" JUCE_SUPPORT_CARBON="default" JUCE_CHECK_MEMORY_LEAKS="default" | |||
| JUCE_CATCH_UNHANDLED_EXCEPTIONS="default" JUCE_STRINGS_ARE_UNICODE="default" | |||
| JUCE_USE_XRENDER="default" JUCE_USE_XCURSOR="default" JUCE_DIRECT2D="default"/> | |||
| JUCE_USE_XRENDER="default" JUCE_USE_XCURSOR="default" JUCE_DIRECT2D="default" | |||
| JUCE_DIRECTSHOW="default" JUCE_MEDIAFOUNDATION="default"/> | |||
| </JUCERPROJECT> | |||
| @@ -16,6 +16,8 @@ | |||
| //#define JUCE_ASIO | |||
| //#define JUCE_WASAPI | |||
| //#define JUCE_DIRECTSOUND | |||
| //#define JUCE_DIRECTSHOW | |||
| //#define JUCE_MEDIAFOUNDATION | |||
| //#define JUCE_ALSA | |||
| //#define JUCE_QUICKTIME | |||
| //#define JUCE_OPENGL | |||
| @@ -86,6 +86,25 @@ | |||
| #define JUCE_DIRECTSOUND 1 | |||
| #endif | |||
| /** JUCE_DIRECTSHOW: Enables DirectShow media-streaming architecture | |||
| (MS Windows only). | |||
| */ | |||
| #ifndef JUCE_DIRECTSHOW | |||
| #define JUCE_DIRECTSHOW 1 | |||
| #endif | |||
| /** JUCE_MEDIAFOUNDATION: Enables Media Foundation multimedia platform | |||
| (Windows Vista and above). | |||
| */ | |||
| #ifndef JUCE_MEDIAFOUNDATION | |||
| #define JUCE_MEDIAFOUNDATION 1 | |||
| #endif | |||
| #if ! JUCE_WINDOWS | |||
| #undef JUCE_DIRECTSHOW | |||
| #undef JUCE_MEDIAFOUNDATION | |||
| #endif | |||
| /** JUCE_ALSA: Enables ALSA audio devices (Linux only). */ | |||
| #ifndef JUCE_ALSA | |||
| #define JUCE_ALSA 1 | |||
| @@ -73,7 +73,7 @@ namespace JuceDummyNamespace {} | |||
| */ | |||
| #define JUCE_MAJOR_VERSION 1 | |||
| #define JUCE_MINOR_VERSION 53 | |||
| #define JUCE_BUILDNUMBER 99 | |||
| #define JUCE_BUILDNUMBER 100 | |||
| /** Current Juce version number. | |||
| @@ -305,6 +305,25 @@ namespace JuceDummyNamespace {} | |||
| #define JUCE_DIRECTSOUND 1 | |||
| #endif | |||
| /** JUCE_DIRECTSHOW: Enables DirectShow media-streaming architecture | |||
| (MS Windows only). | |||
| */ | |||
| #ifndef JUCE_DIRECTSHOW | |||
| #define JUCE_DIRECTSHOW 1 | |||
| #endif | |||
| /** JUCE_MEDIAFOUNDATION: Enables Media Foundation multimedia platform | |||
| (Windows Vista and above). | |||
| */ | |||
| #ifndef JUCE_MEDIAFOUNDATION | |||
| #define JUCE_MEDIAFOUNDATION 1 | |||
| #endif | |||
| #if ! JUCE_WINDOWS | |||
| #undef JUCE_DIRECTSHOW | |||
| #undef JUCE_MEDIAFOUNDATION | |||
| #endif | |||
| /** JUCE_ALSA: Enables ALSA audio devices (Linux only). */ | |||
| #ifndef JUCE_ALSA | |||
| #define JUCE_ALSA 1 | |||
| @@ -64223,6 +64242,202 @@ private: | |||
| /*** End of inlined file: juce_ColourSelector.h ***/ | |||
| #endif | |||
| #ifndef __JUCE_DIRECTSHOWCOMPONENT_JUCEHEADER__ | |||
| /*** Start of inlined file: juce_DirectShowComponent.h ***/ | |||
| #ifndef __JUCE_DIRECTSHOWCOMPONENT_JUCEHEADER__ | |||
| #define __JUCE_DIRECTSHOWCOMPONENT_JUCEHEADER__ | |||
| #if JUCE_DIRECTSHOW || DOXYGEN | |||
| /** | |||
| A window that can play back a DirectShow video. | |||
| @note Controller is not implemented | |||
| */ | |||
| class JUCE_API DirectShowComponent : public Component | |||
| { | |||
| public: | |||
| /** DirectShow video renderer type. | |||
| See MSDN for adivce about choosing the right renderer. | |||
| */ | |||
| enum VideoRendererType | |||
| { | |||
| dshowDefault, /**< VMR7 for Windows XP, EVR for Windows Vista and later */ | |||
| dshowVMR7, /**< Video Mixing Renderer 7 */ | |||
| dshowEVR /**< Enhanced Video Renderer */ | |||
| }; | |||
| /** Creates a DirectShowComponent, initially blank. | |||
| Use the loadMovie() method to load a video once you've added the | |||
| component to a window, (or put it on the desktop as a heavyweight window). | |||
| Loading a video when the component isn't visible can cause problems, as | |||
| DirectShow needs a window handle to initialise properly. | |||
| @see VideoRendererType | |||
| */ | |||
| DirectShowComponent (VideoRendererType type = dshowDefault); | |||
| /** Destructor. */ | |||
| ~DirectShowComponent(); | |||
| /** Returns true if DirectShow is installed and working on this machine. */ | |||
| static bool isDirectShowAvailable(); | |||
| /** Tries to load a DirectShow video from a file or URL into the player. | |||
| It's best to call this function once you've added the component to a window, | |||
| (or put it on the desktop as a heavyweight window). Loading a video when the | |||
| component isn't visible can cause problems, because DirectShow needs a window | |||
| handle to do its stuff. | |||
| @param fileOrURLPath the file or URL path to open | |||
| @returns true if the video opens successfully | |||
| */ | |||
| bool loadMovie (const String& fileOrURLPath); | |||
| /** Tries to load a DirectShow video from a file into the player. | |||
| It's best to call this function once you've added the component to a window, | |||
| (or put it on the desktop as a heavyweight window). Loading a video when the | |||
| component isn't visible can cause problems, because DirectShow needs a window | |||
| handle to do its stuff. | |||
| @param videoFile the video file to open | |||
| @returns true if the video opens successfully | |||
| */ | |||
| bool loadMovie (const File& videoFile); | |||
| /** Tries to load a DirectShow video from a URL into the player. | |||
| It's best to call this function once you've added the component to a window, | |||
| (or put it on the desktop as a heavyweight window). Loading a video when the | |||
| component isn't visible can cause problems, because DirectShow needs a window | |||
| handle to do its stuff. | |||
| @param videoURL the video URL to open | |||
| @returns true if the video opens successfully | |||
| */ | |||
| bool loadMovie (const URL& videoURL); | |||
| /** Closes the video, if one is open. */ | |||
| void closeMovie(); | |||
| /** Returns the file path or URL from which the video file was loaded. | |||
| If there isn't one, this returns an empty string. | |||
| */ | |||
| const File getCurrentMoviePath() const; | |||
| /** Returns true if there's currently a video open. */ | |||
| bool isMovieOpen() const; | |||
| /** Returns the length of the video, in seconds. */ | |||
| double getMovieDuration() const; | |||
| /** Returns the video's natural size, in pixels. | |||
| You can use this to resize the component to show the video at its preferred | |||
| scale. | |||
| If no video is loaded, the size returned will be 0 x 0. | |||
| */ | |||
| void getMovieNormalSize (int& width, int& height) const; | |||
| /** This will position the component within a given area, keeping its aspect | |||
| ratio correct according to the video's normal size. | |||
| The component will be made as large as it can go within the space, and will | |||
| be aligned according to the justification value if this means there are gaps at | |||
| the top or sides. | |||
| @note Not implemented | |||
| */ | |||
| void setBoundsWithCorrectAspectRatio (const Rectangle<int>& spaceToFitWithin, | |||
| const RectanglePlacement& placement); | |||
| /** Starts the video playing. */ | |||
| void play(); | |||
| /** Stops the video playing. */ | |||
| void stop(); | |||
| /** Returns true if the video is currently playing. */ | |||
| bool isPlaying() const; | |||
| /** Moves the video's position back to the start. */ | |||
| void goToStart(); | |||
| /** Sets the video's position to a given time. */ | |||
| void setPosition (double seconds); | |||
| /** Returns the current play position of the video. */ | |||
| double getPosition() const; | |||
| /** Changes the video playback rate. | |||
| A value of 1 is normal speed, greater values play it proportionately faster, | |||
| smaller values play it slower. | |||
| */ | |||
| void setSpeed (float newSpeed); | |||
| /** Changes the video's playback volume. | |||
| @param newVolume the volume in the range 0 (silent) to 1.0 (full) | |||
| */ | |||
| void setMovieVolume (float newVolume); | |||
| /** Returns the video's playback volume. | |||
| @returns the volume in the range 0 (silent) to 1.0 (full) | |||
| */ | |||
| float getMovieVolume() const; | |||
| /** Tells the video whether it should loop. */ | |||
| void setLooping (bool shouldLoop); | |||
| /** Returns true if the video is currently looping. | |||
| @see setLooping | |||
| */ | |||
| bool isLooping() const; | |||
| /** @internal */ | |||
| void paint (Graphics& g); | |||
| private: | |||
| String videoPath; | |||
| bool videoLoaded, looping; | |||
| class DirectShowContext; | |||
| friend class DirectShowContext; | |||
| friend class ScopedPointer <DirectShowContext>; | |||
| ScopedPointer <DirectShowContext> context; | |||
| class DirectShowComponentWatcher; | |||
| friend class DirectShowComponentWatcher; | |||
| friend class ScopedPointer <DirectShowComponentWatcher>; | |||
| ScopedPointer <DirectShowComponentWatcher> componentWatcher; | |||
| bool needToUpdateViewport, needToRecreateNativeWindow; | |||
| void updateContextPosition(); | |||
| void showContext (bool shouldBeVisible); | |||
| void recreateNativeWindowAsync(); | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DirectShowComponent); | |||
| }; | |||
| #endif | |||
| #endif // __JUCE_DIRECTSHOWCOMPONENT_JUCEHEADER__ | |||
| /*** End of inlined file: juce_DirectShowComponent.h ***/ | |||
| #endif | |||
| #ifndef __JUCE_DROPSHADOWER_JUCEHEADER__ | |||
| @@ -64786,7 +65001,7 @@ public: | |||
| /** For windowed contexts, this moves the context within the bounds of | |||
| its parent window. | |||
| */ | |||
| virtual void updateWindowPosition (int x, int y, int w, int h, int outerWindowHeight) = 0; | |||
| virtual void updateWindowPosition (const Rectangle<int>& bounds) = 0; | |||
| /** For windowed contexts, this triggers a repaint of the window. | |||
| @@ -69544,6 +69759,14 @@ END_JUCE_NAMESPACE | |||
| #pragma comment (lib, "D2d1.lib") | |||
| #endif | |||
| #if JUCE_DIRECTSHOW | |||
| #pragma comment (lib, "strmiids.lib") | |||
| #endif | |||
| #if JUCE_MEDIAFOUNDATION | |||
| #pragma comment (lib, "mfuuid.lib") | |||
| #endif | |||
| /*** End of inlined file: juce_win32_AutoLinkLibraries.h ***/ | |||
| @@ -33,7 +33,7 @@ | |||
| */ | |||
| #define JUCE_MAJOR_VERSION 1 | |||
| #define JUCE_MINOR_VERSION 53 | |||
| #define JUCE_BUILDNUMBER 99 | |||
| #define JUCE_BUILDNUMBER 100 | |||
| /** Current Juce version number. | |||
| @@ -0,0 +1,221 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||
| Copyright 2004-11 by Raw Material Software Ltd. | |||
| ------------------------------------------------------------------------------ | |||
| JUCE can be redistributed and/or modified under the terms of the GNU General | |||
| Public License (Version 2), as published by the Free Software Foundation. | |||
| A copy of the license is included in the JUCE distribution, or can be found | |||
| online at www.gnu.org/licenses. | |||
| JUCE is distributed in the hope that it will be useful, but WITHOUT ANY | |||
| WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||
| A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||
| ------------------------------------------------------------------------------ | |||
| To release a closed-source product which uses JUCE, commercial licenses are | |||
| available: visit www.rawmaterialsoftware.com/juce for more information. | |||
| ============================================================================== | |||
| */ | |||
| #ifndef __JUCE_DIRECTSHOWCOMPONENT_JUCEHEADER__ | |||
| #define __JUCE_DIRECTSHOWCOMPONENT_JUCEHEADER__ | |||
| #include "../juce_Component.h" | |||
| #if JUCE_DIRECTSHOW || DOXYGEN | |||
| //============================================================================== | |||
| /** | |||
| A window that can play back a DirectShow video. | |||
| @note Controller is not implemented | |||
| */ | |||
| class JUCE_API DirectShowComponent : public Component | |||
| { | |||
| public: | |||
| //============================================================================== | |||
| /** DirectShow video renderer type. | |||
| See MSDN for adivce about choosing the right renderer. | |||
| */ | |||
| enum VideoRendererType | |||
| { | |||
| dshowDefault, /**< VMR7 for Windows XP, EVR for Windows Vista and later */ | |||
| dshowVMR7, /**< Video Mixing Renderer 7 */ | |||
| dshowEVR /**< Enhanced Video Renderer */ | |||
| }; | |||
| /** Creates a DirectShowComponent, initially blank. | |||
| Use the loadMovie() method to load a video once you've added the | |||
| component to a window, (or put it on the desktop as a heavyweight window). | |||
| Loading a video when the component isn't visible can cause problems, as | |||
| DirectShow needs a window handle to initialise properly. | |||
| @see VideoRendererType | |||
| */ | |||
| DirectShowComponent (VideoRendererType type = dshowDefault); | |||
| /** Destructor. */ | |||
| ~DirectShowComponent(); | |||
| /** Returns true if DirectShow is installed and working on this machine. */ | |||
| static bool isDirectShowAvailable(); | |||
| //============================================================================== | |||
| /** Tries to load a DirectShow video from a file or URL into the player. | |||
| It's best to call this function once you've added the component to a window, | |||
| (or put it on the desktop as a heavyweight window). Loading a video when the | |||
| component isn't visible can cause problems, because DirectShow needs a window | |||
| handle to do its stuff. | |||
| @param fileOrURLPath the file or URL path to open | |||
| @returns true if the video opens successfully | |||
| */ | |||
| bool loadMovie (const String& fileOrURLPath); | |||
| /** Tries to load a DirectShow video from a file into the player. | |||
| It's best to call this function once you've added the component to a window, | |||
| (or put it on the desktop as a heavyweight window). Loading a video when the | |||
| component isn't visible can cause problems, because DirectShow needs a window | |||
| handle to do its stuff. | |||
| @param videoFile the video file to open | |||
| @returns true if the video opens successfully | |||
| */ | |||
| bool loadMovie (const File& videoFile); | |||
| /** Tries to load a DirectShow video from a URL into the player. | |||
| It's best to call this function once you've added the component to a window, | |||
| (or put it on the desktop as a heavyweight window). Loading a video when the | |||
| component isn't visible can cause problems, because DirectShow needs a window | |||
| handle to do its stuff. | |||
| @param videoURL the video URL to open | |||
| @returns true if the video opens successfully | |||
| */ | |||
| bool loadMovie (const URL& videoURL); | |||
| /** Closes the video, if one is open. */ | |||
| void closeMovie(); | |||
| /** Returns the file path or URL from which the video file was loaded. | |||
| If there isn't one, this returns an empty string. | |||
| */ | |||
| const File getCurrentMoviePath() const; | |||
| /** Returns true if there's currently a video open. */ | |||
| bool isMovieOpen() const; | |||
| /** Returns the length of the video, in seconds. */ | |||
| double getMovieDuration() const; | |||
| /** Returns the video's natural size, in pixels. | |||
| You can use this to resize the component to show the video at its preferred | |||
| scale. | |||
| If no video is loaded, the size returned will be 0 x 0. | |||
| */ | |||
| void getMovieNormalSize (int& width, int& height) const; | |||
| /** This will position the component within a given area, keeping its aspect | |||
| ratio correct according to the video's normal size. | |||
| The component will be made as large as it can go within the space, and will | |||
| be aligned according to the justification value if this means there are gaps at | |||
| the top or sides. | |||
| @note Not implemented | |||
| */ | |||
| void setBoundsWithCorrectAspectRatio (const Rectangle<int>& spaceToFitWithin, | |||
| const RectanglePlacement& placement); | |||
| /** Starts the video playing. */ | |||
| void play(); | |||
| /** Stops the video playing. */ | |||
| void stop(); | |||
| /** Returns true if the video is currently playing. */ | |||
| bool isPlaying() const; | |||
| /** Moves the video's position back to the start. */ | |||
| void goToStart(); | |||
| /** Sets the video's position to a given time. */ | |||
| void setPosition (double seconds); | |||
| /** Returns the current play position of the video. */ | |||
| double getPosition() const; | |||
| /** Changes the video playback rate. | |||
| A value of 1 is normal speed, greater values play it proportionately faster, | |||
| smaller values play it slower. | |||
| */ | |||
| void setSpeed (float newSpeed); | |||
| /** Changes the video's playback volume. | |||
| @param newVolume the volume in the range 0 (silent) to 1.0 (full) | |||
| */ | |||
| void setMovieVolume (float newVolume); | |||
| /** Returns the video's playback volume. | |||
| @returns the volume in the range 0 (silent) to 1.0 (full) | |||
| */ | |||
| float getMovieVolume() const; | |||
| /** Tells the video whether it should loop. */ | |||
| void setLooping (bool shouldLoop); | |||
| /** Returns true if the video is currently looping. | |||
| @see setLooping | |||
| */ | |||
| bool isLooping() const; | |||
| //============================================================================== | |||
| /** @internal */ | |||
| void paint (Graphics& g); | |||
| private: | |||
| //============================================================================== | |||
| String videoPath; | |||
| bool videoLoaded, looping; | |||
| class DirectShowContext; | |||
| friend class DirectShowContext; | |||
| friend class ScopedPointer <DirectShowContext>; | |||
| ScopedPointer <DirectShowContext> context; | |||
| class DirectShowComponentWatcher; | |||
| friend class DirectShowComponentWatcher; | |||
| friend class ScopedPointer <DirectShowComponentWatcher>; | |||
| ScopedPointer <DirectShowComponentWatcher> componentWatcher; | |||
| bool needToUpdateViewport, needToRecreateNativeWindow; | |||
| //============================================================================== | |||
| void updateContextPosition(); | |||
| void showContext (bool shouldBeVisible); | |||
| void recreateNativeWindowAsync(); | |||
| //============================================================================== | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DirectShowComponent); | |||
| }; | |||
| #endif | |||
| #endif // __JUCE_DIRECTSHOWCOMPONENT_JUCEHEADER__ | |||
| @@ -359,11 +359,7 @@ void OpenGLComponent::updateContextPosition() | |||
| const ScopedLock sl (contextLock); | |||
| if (context != nullptr) | |||
| context->updateWindowPosition (getScreenX() - topComp->getScreenX(), | |||
| getScreenY() - topComp->getScreenY(), | |||
| getWidth(), | |||
| getHeight(), | |||
| topComp->getHeight()); | |||
| context->updateWindowPosition (topComp->getLocalArea (this, getLocalBounds())); | |||
| } | |||
| } | |||
| } | |||
| @@ -132,7 +132,7 @@ public: | |||
| /** For windowed contexts, this moves the context within the bounds of | |||
| its parent window. | |||
| */ | |||
| virtual void updateWindowPosition (int x, int y, int w, int h, int outerWindowHeight) = 0; | |||
| virtual void updateWindowPosition (const Rectangle<int>& bounds) = 0; | |||
| /** For windowed contexts, this triggers a repaint of the window. | |||
| @@ -587,6 +587,9 @@ | |||
| #ifndef __JUCE_COLOURSELECTOR_JUCEHEADER__ | |||
| #include "gui/components/special/juce_ColourSelector.h" | |||
| #endif | |||
| #ifndef __JUCE_DIRECTSHOWCOMPONENT_JUCEHEADER__ | |||
| #include "gui/components/special/juce_DirectShowComponent.h" | |||
| #endif | |||
| #ifndef __JUCE_DROPSHADOWER_JUCEHEADER__ | |||
| #include "gui/components/special/juce_DropShadower.h" | |||
| #endif | |||
| @@ -3213,11 +3213,11 @@ public: | |||
| return renderContext; | |||
| } | |||
| void updateWindowPosition (int x, int y, int w, int h, int) | |||
| void updateWindowPosition (const Rectangle<int>& bounds) | |||
| { | |||
| ScopedXLock xlock; | |||
| XMoveResizeWindow (display, embeddedWindow, | |||
| x, y, jmax (1, w), jmax (1, h)); | |||
| bounds.getX(), bounds.getY(), jmax (1, bounds.getWidth()), jmax (1, bounds.getHeight())); | |||
| } | |||
| void swapBuffers() | |||
| @@ -215,9 +215,7 @@ public: | |||
| const OpenGLPixelFormat getPixelFormat() const { return pixelFormat; } | |||
| void* getRawContext() const noexcept { return renderContext; } | |||
| void updateWindowPosition (int /*x*/, int /*y*/, int /*w*/, int /*h*/, int /*outerWindowHeight*/) | |||
| { | |||
| } | |||
| void updateWindowPosition (const Rectangle<int>&) {} | |||
| void swapBuffers() | |||
| { | |||
| @@ -424,9 +422,10 @@ public: | |||
| const OpenGLPixelFormat getPixelFormat() const { return pixelFormat; } | |||
| void* getRawContext() const noexcept { return glLayer; } | |||
| void updateWindowPosition (int x, int y, int w, int h, int outerWindowHeight) | |||
| void updateWindowPosition (const Rectangle<int>& bounds) | |||
| { | |||
| view.frame = CGRectMake ((CGFloat) x, (CGFloat) y, (CGFloat) w, (CGFloat) h); | |||
| view.frame = CGRectMake ((CGFloat) bounds.getX(), (CGFloat) bounds.getY(), | |||
| (CGFloat) bounds.getWidth(), (CGFloat) bounds.getHeight()); | |||
| if (lastWidth != w || lastHeight != h) | |||
| { | |||
| @@ -48,3 +48,11 @@ | |||
| #pragma comment (lib, "Dwrite.lib") | |||
| #pragma comment (lib, "D2d1.lib") | |||
| #endif | |||
| #if JUCE_DIRECTSHOW | |||
| #pragma comment (lib, "strmiids.lib") | |||
| #endif | |||
| #if JUCE_MEDIAFOUNDATION | |||
| #pragma comment (lib, "mfuuid.lib") | |||
| #endif | |||
| @@ -0,0 +1,941 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||
| Copyright 2004-11 by Raw Material Software Ltd. | |||
| ------------------------------------------------------------------------------ | |||
| JUCE can be redistributed and/or modified under the terms of the GNU General | |||
| Public License (Version 2), as published by the Free Software Foundation. | |||
| A copy of the license is included in the JUCE distribution, or can be found | |||
| online at www.gnu.org/licenses. | |||
| JUCE is distributed in the hope that it will be useful, but WITHOUT ANY | |||
| WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||
| A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||
| ------------------------------------------------------------------------------ | |||
| To release a closed-source product which uses JUCE, commercial licenses are | |||
| available: visit www.rawmaterialsoftware.com/juce for more information. | |||
| ============================================================================== | |||
| */ | |||
| #if JUCE_INCLUDED_FILE | |||
| //====================================================================== | |||
| namespace DirectShowHelpers | |||
| { | |||
| bool checkDShowAvailability() | |||
| { | |||
| ComSmartPtr <IGraphBuilder> graph; | |||
| return SUCCEEDED (graph.CoCreateInstance (CLSID_FilterGraph)); | |||
| } | |||
| //====================================================================== | |||
| class VideoRenderer | |||
| { | |||
| public: | |||
| VideoRenderer() {} | |||
| virtual ~VideoRenderer() {} | |||
| virtual HRESULT create (ComSmartPtr <IGraphBuilder>& graphBuilder, | |||
| ComSmartPtr <IBaseFilter>& baseFilter, HWND hwnd) = 0; | |||
| virtual void setVideoWindow (HWND hwnd) = 0; | |||
| virtual void setVideoPosition (HWND hwnd, long videoWidth, long videoHeight) = 0; | |||
| virtual void repaintVideo (HWND hwnd, HDC hdc) = 0; | |||
| virtual void displayModeChanged() = 0; | |||
| virtual HRESULT getVideoSize (long& videoWidth, long& videoHeight) = 0; | |||
| }; | |||
| //====================================================================== | |||
| class VMR7 : public VideoRenderer | |||
| { | |||
| public: | |||
| VMR7() {} | |||
| HRESULT create (ComSmartPtr <IGraphBuilder>& graphBuilder, | |||
| ComSmartPtr <IBaseFilter>& baseFilter, HWND hwnd) | |||
| { | |||
| ComSmartPtr <IVMRFilterConfig> filterConfig; | |||
| HRESULT hr = baseFilter.CoCreateInstance (CLSID_VideoMixingRenderer); | |||
| if (SUCCEEDED (hr)) | |||
| hr = graphBuilder->AddFilter (baseFilter, L"VMR-7"); | |||
| if (SUCCEEDED (hr)) | |||
| hr = baseFilter.QueryInterface (IID_IVMRFilterConfig, filterConfig); | |||
| if (SUCCEEDED (hr)) | |||
| hr = filterConfig->SetRenderingMode (VMRMode_Windowless); | |||
| if (SUCCEEDED (hr)) | |||
| hr = baseFilter.QueryInterface (IID_IVMRWindowlessControl, windowlessControl); | |||
| if (SUCCEEDED (hr)) | |||
| hr = windowlessControl->SetVideoClippingWindow (hwnd); | |||
| if (SUCCEEDED (hr)) | |||
| hr = windowlessControl->SetAspectRatioMode (VMR_ARMODE_LETTER_BOX); | |||
| return hr; | |||
| } | |||
| void setVideoWindow (HWND hwnd) | |||
| { | |||
| windowlessControl->SetVideoClippingWindow (hwnd); | |||
| } | |||
| void setVideoPosition (HWND hwnd, long videoWidth, long videoHeight) | |||
| { | |||
| RECT src, dest; | |||
| SetRect (&src, 0, 0, videoWidth, videoHeight); | |||
| GetClientRect (hwnd, &dest); | |||
| windowlessControl->SetVideoPosition (&src, &dest); | |||
| } | |||
| void repaintVideo (HWND hwnd, HDC hdc) | |||
| { | |||
| windowlessControl->RepaintVideo (hwnd, hdc); | |||
| } | |||
| void displayModeChanged() | |||
| { | |||
| windowlessControl->DisplayModeChanged(); | |||
| } | |||
| HRESULT getVideoSize (long& videoWidth, long& videoHeight) | |||
| { | |||
| return windowlessControl->GetNativeVideoSize (&videoWidth, &videoHeight, nullptr, nullptr); | |||
| } | |||
| private: | |||
| ComSmartPtr <IVMRWindowlessControl> windowlessControl; | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VMR7); | |||
| }; | |||
| //====================================================================== | |||
| #if JUCE_MEDIAFOUNDATION | |||
| class EVR : public VideoRenderer | |||
| { | |||
| public: | |||
| EVR() {} | |||
| HRESULT create (ComSmartPtr <IGraphBuilder>& graphBuilder, | |||
| ComSmartPtr <IBaseFilter>& baseFilter, HWND hwnd) | |||
| { | |||
| ComSmartPtr <IMFGetService> getService; | |||
| HRESULT hr = baseFilter.CoCreateInstance (CLSID_EnhancedVideoRenderer); | |||
| if (SUCCEEDED (hr)) | |||
| hr = graphBuilder->AddFilter (baseFilter, L"EVR"); | |||
| if (SUCCEEDED (hr)) | |||
| hr = baseFilter.QueryInterface (IID_IMFGetService, getService); | |||
| if (SUCCEEDED (hr)) | |||
| hr = getService->GetService (MR_VIDEO_RENDER_SERVICE, IID_IMFVideoDisplayControl, | |||
| (LPVOID*) videoDisplayControl.resetAndGetPointerAddress()); | |||
| if (SUCCEEDED (hr)) | |||
| hr = videoDisplayControl->SetVideoWindow (hwnd); | |||
| if (SUCCEEDED (hr)) | |||
| hr = videoDisplayControl->SetAspectRatioMode (MFVideoARMode_PreservePicture); | |||
| return hr; | |||
| } | |||
| void setVideoWindow (HWND hwnd) | |||
| { | |||
| videoDisplayControl->SetVideoWindow (hwnd); | |||
| } | |||
| void setVideoPosition (HWND hwnd, long /*videoWidth*/, long /*videoHeight*/) | |||
| { | |||
| const MFVideoNormalizedRect src = { 0.0f, 0.0f, 1.0f, 1.0f }; | |||
| RECT dest; | |||
| GetClientRect (hwnd, &dest); | |||
| videoDisplayControl->SetVideoPosition (&src, &dest); | |||
| } | |||
| void repaintVideo (HWND /*hwnd*/, HDC /*hdc*/) | |||
| { | |||
| videoDisplayControl->RepaintVideo(); | |||
| } | |||
| void displayModeChanged() {} | |||
| HRESULT getVideoSize (long& videoWidth, long& videoHeight) | |||
| { | |||
| SIZE sz; | |||
| HRESULT hr = videoDisplayControl->GetNativeVideoSize (&sz, nullptr); | |||
| videoWidth = sz.cx; | |||
| videoHeight = sz.cy; | |||
| return hr; | |||
| } | |||
| private: | |||
| ComSmartPtr <IMFVideoDisplayControl> videoDisplayControl; | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EVR); | |||
| }; | |||
| #endif | |||
| } | |||
| //====================================================================== | |||
| class DirectShowComponent::DirectShowContext | |||
| { | |||
| public: | |||
| DirectShowContext (DirectShowComponent& component_, VideoRendererType type_) | |||
| : component (component_), | |||
| hwnd (0), | |||
| hdc (0), | |||
| state (uninitializedState), | |||
| hasVideo (false), | |||
| videoWidth (0), | |||
| videoHeight (0), | |||
| type (type_) | |||
| { | |||
| CoInitialize (0); | |||
| if (type == dshowDefault) | |||
| { | |||
| type = dshowVMR7; | |||
| #if JUCE_MEDIAFOUNDATION | |||
| if (SystemStats::getOperatingSystemType() >= SystemStats::WinVista) | |||
| type = dshowEVR; | |||
| #endif | |||
| } | |||
| } | |||
| ~DirectShowContext() | |||
| { | |||
| release(); | |||
| CoUninitialize(); | |||
| } | |||
| //====================================================================== | |||
| HWND getNativeWindowHandle() const | |||
| { | |||
| return nativeWindow != nullptr ? nativeWindow->getHandle() : 0; | |||
| } | |||
| //====================================================================== | |||
| void updateWindowPosition (const Rectangle<int>& newBounds) | |||
| { | |||
| nativeWindow->setWindowPosition (newBounds); | |||
| } | |||
| void showWindow (bool shouldBeVisible) | |||
| { | |||
| nativeWindow->showWindow (shouldBeVisible); | |||
| } | |||
| //====================================================================== | |||
| void repaint() | |||
| { | |||
| if (hasVideo) | |||
| videoRenderer->repaintVideo (nativeWindow->getHandle(), nativeWindow->getContext()); | |||
| } | |||
| void updateVideoPosition() | |||
| { | |||
| if (hasVideo) | |||
| videoRenderer->setVideoPosition (nativeWindow->getHandle(), videoWidth, videoHeight); | |||
| } | |||
| void displayResolutionChanged() | |||
| { | |||
| if (hasVideo) | |||
| videoRenderer->displayModeChanged(); | |||
| } | |||
| //====================================================================== | |||
| void peerChanged() | |||
| { | |||
| deleteNativeWindow(); | |||
| mediaEvent->SetNotifyWindow (0, 0, 0); | |||
| if (videoRenderer != nullptr) | |||
| videoRenderer->setVideoWindow (nullptr); | |||
| createNativeWindow(); | |||
| mediaEvent->SetNotifyWindow ((OAHWND) hwnd, graphEventID, 0); | |||
| if (videoRenderer != nullptr) | |||
| videoRenderer->setVideoWindow (hwnd); | |||
| } | |||
| //====================================================================== | |||
| bool loadFile (const String& fileOrURLPath) | |||
| { | |||
| jassert (state == uninitializedState); | |||
| if (! createNativeWindow()) | |||
| return false; | |||
| HRESULT hr = graphBuilder.CoCreateInstance (CLSID_FilterGraph); | |||
| // basic playback interfaces | |||
| if (SUCCEEDED (hr)) hr = graphBuilder.QueryInterface (IID_IMediaControl, mediaControl); | |||
| if (SUCCEEDED (hr)) hr = graphBuilder.QueryInterface (IID_IMediaPosition, mediaPosition); | |||
| if (SUCCEEDED (hr)) hr = graphBuilder.QueryInterface (IID_IMediaEventEx, mediaEvent); | |||
| if (SUCCEEDED (hr)) hr = graphBuilder.QueryInterface (IID_IBasicAudio, basicAudio); | |||
| // video renderer interface | |||
| if (SUCCEEDED (hr)) | |||
| { | |||
| #if JUCE_MEDIAFOUNDATION | |||
| if (type == dshowEVR) | |||
| videoRenderer = new DirectShowHelpers::EVR(); | |||
| else | |||
| #endif | |||
| videoRenderer = new DirectShowHelpers::VMR7(); | |||
| hr = videoRenderer->create (graphBuilder, baseFilter, hwnd); | |||
| } | |||
| // build filter graph | |||
| if (SUCCEEDED (hr)) | |||
| hr = graphBuilder->RenderFile (fileOrURLPath.toWideCharPointer(), nullptr); | |||
| // remove video renderer if not connected (no video) | |||
| if (SUCCEEDED (hr)) | |||
| { | |||
| if (isRendererConnected()) | |||
| { | |||
| hasVideo = true; | |||
| hr = videoRenderer->getVideoSize (videoWidth, videoHeight); | |||
| } | |||
| else | |||
| { | |||
| hasVideo = false; | |||
| graphBuilder->RemoveFilter (baseFilter); | |||
| videoRenderer = nullptr; | |||
| baseFilter = nullptr; | |||
| } | |||
| } | |||
| // set window to receive events | |||
| if (SUCCEEDED (hr)) | |||
| hr = mediaEvent->SetNotifyWindow ((OAHWND) hwnd, graphEventID, 0); | |||
| if (SUCCEEDED (hr)) | |||
| { | |||
| state = stoppedState; | |||
| return true; | |||
| } | |||
| release(); | |||
| return false; | |||
| } | |||
| void release() | |||
| { | |||
| if (mediaControl != nullptr) | |||
| mediaControl->Stop(); | |||
| if (mediaEvent != nullptr) | |||
| mediaEvent->SetNotifyWindow (0, 0, 0); | |||
| if (videoRenderer != nullptr) | |||
| videoRenderer->setVideoWindow (0); | |||
| hasVideo = false; | |||
| videoRenderer = nullptr; | |||
| baseFilter = nullptr; | |||
| basicAudio = nullptr; | |||
| mediaEvent = nullptr; | |||
| mediaPosition = nullptr; | |||
| mediaControl = nullptr; | |||
| graphBuilder = nullptr; | |||
| state = uninitializedState; | |||
| videoWidth = 0; | |||
| videoHeight = 0; | |||
| if (nativeWindow != nullptr) | |||
| deleteNativeWindow(); | |||
| } | |||
| void graphEventProc() | |||
| { | |||
| LONG ec; | |||
| LONG_PTR p1, p2; | |||
| jassert (mediaEvent != nullptr); | |||
| while (SUCCEEDED (mediaEvent->GetEvent (&ec, &p1, &p2, 0))) | |||
| { | |||
| switch (ec) | |||
| { | |||
| case EC_REPAINT: | |||
| component.repaint(); | |||
| break; | |||
| case EC_COMPLETE: | |||
| if (component.isLooping()) | |||
| component.goToStart(); | |||
| else | |||
| component.stop(); | |||
| break; | |||
| case EC_USERABORT: | |||
| case EC_ERRORABORT: | |||
| case EC_ERRORABORTEX: | |||
| component.closeMovie(); | |||
| break; | |||
| default: | |||
| break; | |||
| } | |||
| mediaEvent->FreeEventParams (ec, p1, p2); | |||
| } | |||
| } | |||
| //====================================================================== | |||
| void run() | |||
| { | |||
| mediaControl->Run(); | |||
| state = runningState; | |||
| } | |||
| void stop() | |||
| { | |||
| mediaControl->Stop(); | |||
| state = stoppedState; | |||
| } | |||
| void pause() | |||
| { | |||
| mediaControl->Pause(); | |||
| state = pausedState; | |||
| } | |||
| //====================================================================== | |||
| bool isInitialised() const noexcept { return state != uninitializedState; } | |||
| bool isRunning() const noexcept { return state == runningState; } | |||
| bool isPaused() const noexcept { return state == pausedState; } | |||
| bool isStopped() const noexcept { return state == stoppedState; } | |||
| bool containsVideo() const noexcept { return hasVideo; } | |||
| int getVideoWidth() const noexcept { return (int) videoWidth; } | |||
| int getVideoHeight() const noexcept { return (int) videoHeight; } | |||
| //====================================================================== | |||
| double getDuration() const | |||
| { | |||
| REFTIME duration; | |||
| mediaPosition->get_Duration (&duration); | |||
| return duration; | |||
| } | |||
| double getPosition() const | |||
| { | |||
| REFTIME seconds; | |||
| mediaPosition->get_CurrentPosition (&seconds); | |||
| return seconds; | |||
| } | |||
| //====================================================================== | |||
| void setSpeed (const float newSpeed) { mediaPosition->put_Rate (newSpeed); } | |||
| void setPosition (const double seconds) { mediaPosition->put_CurrentPosition (seconds); } | |||
| void setVolume (const float newVolume) { basicAudio->put_Volume (convertToDShowVolume (newVolume)); } | |||
| // in DirectShow, full volume is 0, silence is -10000 | |||
| static long convertToDShowVolume (const float vol) noexcept | |||
| { | |||
| if (vol >= 1.0f) return 0; | |||
| if (vol <= 0.0f) return -10000; | |||
| return roundToInt ((vol * 10000.0f) - 10000.0f); | |||
| } | |||
| float getVolume() const | |||
| { | |||
| long volume; | |||
| basicAudio->get_Volume (&volume); | |||
| return (volume + 10000) / 10000.0f; | |||
| } | |||
| private: | |||
| //====================================================================== | |||
| enum { graphEventID = WM_APP + 0x43f0 }; | |||
| DirectShowComponent& component; | |||
| HWND hwnd; | |||
| HDC hdc; | |||
| enum State { uninitializedState, runningState, pausedState, stoppedState }; | |||
| State state; | |||
| bool hasVideo; | |||
| long videoWidth, videoHeight; | |||
| VideoRendererType type; | |||
| ComSmartPtr <IGraphBuilder> graphBuilder; | |||
| ComSmartPtr <IMediaControl> mediaControl; | |||
| ComSmartPtr <IMediaPosition> mediaPosition; | |||
| ComSmartPtr <IMediaEventEx> mediaEvent; | |||
| ComSmartPtr <IBasicAudio> basicAudio; | |||
| ComSmartPtr <IBaseFilter> baseFilter; | |||
| ScopedPointer <DirectShowHelpers::VideoRenderer> videoRenderer; | |||
| //====================================================================== | |||
| class NativeWindowClass : public DeletedAtShutdown | |||
| { | |||
| private: | |||
| NativeWindowClass() | |||
| : atom (0) | |||
| { | |||
| String windowClassName ("JUCE_DIRECTSHOW_"); | |||
| windowClassName << (int) (Time::currentTimeMillis() & 0x7fffffff); | |||
| HINSTANCE moduleHandle = (HINSTANCE) PlatformUtilities::getCurrentModuleInstanceHandle(); | |||
| TCHAR moduleFile [1024] = { 0 }; | |||
| GetModuleFileName (moduleHandle, moduleFile, 1024); | |||
| WNDCLASSEX wcex = { 0 }; | |||
| wcex.cbSize = sizeof (wcex); | |||
| wcex.style = CS_OWNDC; | |||
| wcex.lpfnWndProc = (WNDPROC) wndProc; | |||
| wcex.lpszClassName = windowClassName.toWideCharPointer(); | |||
| wcex.hInstance = moduleHandle; | |||
| atom = RegisterClassEx (&wcex); | |||
| jassert (atom != 0); | |||
| } | |||
| ~NativeWindowClass() | |||
| { | |||
| if (atom != 0) | |||
| UnregisterClass (getWindowClassName(), (HINSTANCE) PlatformUtilities::getCurrentModuleInstanceHandle()); | |||
| clearSingletonInstance(); | |||
| } | |||
| static LRESULT CALLBACK wndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) | |||
| { | |||
| DirectShowContext* c = (DirectShowContext*) GetWindowLongPtr (hwnd, GWLP_USERDATA); | |||
| if (c != nullptr) | |||
| { | |||
| jassert (c->getNativeWindowHandle() == hwnd); | |||
| switch (msg) | |||
| { | |||
| case WM_ERASEBKGND: return 1; | |||
| case WM_DISPLAYCHANGE: c->displayResolutionChanged(); break; | |||
| case graphEventID: c->graphEventProc(); return 0; | |||
| default: break; | |||
| } | |||
| } | |||
| return DefWindowProc (hwnd, msg, wParam, lParam); | |||
| } | |||
| public: | |||
| bool isRegistered() const noexcept { return atom != 0; } | |||
| LPCTSTR getWindowClassName() const noexcept { return (LPCTSTR) MAKELONG (atom, 0); } | |||
| juce_DeclareSingleton_SingleThreaded_Minimal (NativeWindowClass); | |||
| private: | |||
| ATOM atom; | |||
| JUCE_DECLARE_NON_COPYABLE (NativeWindowClass); | |||
| }; | |||
| //====================================================================== | |||
| class NativeWindow | |||
| { | |||
| public: | |||
| NativeWindow (HWND parentToAddTo, void* const userData) | |||
| : hwnd (0), hdc (0) | |||
| { | |||
| NativeWindowClass* const wc = NativeWindowClass::getInstance(); | |||
| if (wc->isRegistered()) | |||
| { | |||
| DWORD exstyle = 0; | |||
| DWORD type = WS_CHILD; | |||
| hwnd = CreateWindowEx (exstyle, wc->getWindowClassName(), | |||
| L"", type, 0, 0, 0, 0, parentToAddTo, 0, | |||
| (HINSTANCE) PlatformUtilities::getCurrentModuleInstanceHandle(), 0); | |||
| if (hwnd != 0) | |||
| { | |||
| hdc = GetDC (hwnd); | |||
| SetWindowLongPtr (hwnd, GWLP_USERDATA, (LONG_PTR) userData); | |||
| } | |||
| } | |||
| jassert (hwnd != 0); | |||
| } | |||
| ~NativeWindow() | |||
| { | |||
| if (hwnd != 0) | |||
| { | |||
| SetWindowLongPtr (hwnd, GWLP_USERDATA, (LONG_PTR) 0); | |||
| DestroyWindow (hwnd); | |||
| } | |||
| } | |||
| HWND getHandle() const noexcept { return hwnd; } | |||
| HDC getContext() const noexcept { return hdc; } | |||
| void setWindowPosition (const Rectangle<int>& newBounds) | |||
| { | |||
| SetWindowPos (hwnd, 0, newBounds.getX(), newBounds.getY(), | |||
| newBounds.getWidth(), newBounds.getHeight(), | |||
| SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOOWNERZORDER); | |||
| } | |||
| void showWindow (const bool shouldBeVisible) | |||
| { | |||
| ShowWindow (hwnd, shouldBeVisible ? SW_SHOWNA : SW_HIDE); | |||
| } | |||
| private: | |||
| HWND hwnd; | |||
| HDC hdc; | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NativeWindow); | |||
| }; | |||
| ScopedPointer<NativeWindow> nativeWindow; | |||
| //====================================================================== | |||
| bool createNativeWindow() | |||
| { | |||
| jassert (nativeWindow == nullptr); | |||
| ComponentPeer* topLevelPeer = component.getTopLevelComponent()->getPeer(); | |||
| jassert (topLevelPeer != nullptr); | |||
| if (topLevelPeer != nullptr) | |||
| { | |||
| nativeWindow = new NativeWindow ((HWND) topLevelPeer->getNativeHandle(), this); | |||
| hwnd = nativeWindow->getHandle(); | |||
| if (hwnd != 0) | |||
| { | |||
| hdc = GetDC (hwnd); | |||
| component.updateContextPosition(); | |||
| component.showContext (component.isShowing()); | |||
| return true; | |||
| } | |||
| else | |||
| { | |||
| nativeWindow = nullptr; | |||
| } | |||
| } | |||
| return false; | |||
| } | |||
| void deleteNativeWindow() | |||
| { | |||
| jassert (nativeWindow != nullptr); | |||
| ReleaseDC (hwnd, hdc); | |||
| hwnd = 0; | |||
| hdc = 0; | |||
| nativeWindow = nullptr; | |||
| } | |||
| bool isRendererConnected() | |||
| { | |||
| ComSmartPtr <IEnumPins> enumPins; | |||
| HRESULT hr = baseFilter->EnumPins (enumPins.resetAndGetPointerAddress()); | |||
| if (SUCCEEDED (hr)) | |||
| hr = enumPins->Reset(); | |||
| ComSmartPtr<IPin> pin; | |||
| while (SUCCEEDED (hr) | |||
| && enumPins->Next (1, pin.resetAndGetPointerAddress(), nullptr) == S_OK) | |||
| { | |||
| ComSmartPtr<IPin> otherPin; | |||
| hr = pin->ConnectedTo (otherPin.resetAndGetPointerAddress()); | |||
| if (SUCCEEDED (hr)) | |||
| { | |||
| PIN_DIRECTION direction; | |||
| hr = pin->QueryDirection (&direction); | |||
| if (SUCCEEDED (hr) && direction == PINDIR_INPUT) | |||
| return true; | |||
| } | |||
| else if (hr == VFW_E_NOT_CONNECTED) | |||
| { | |||
| hr = S_OK; | |||
| } | |||
| } | |||
| return false; | |||
| } | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DirectShowContext); | |||
| }; | |||
| juce_ImplementSingleton_SingleThreaded (DirectShowComponent::DirectShowContext::NativeWindowClass); | |||
| //====================================================================== | |||
| class DirectShowComponent::DirectShowComponentWatcher : public ComponentMovementWatcher | |||
| { | |||
| public: | |||
| DirectShowComponentWatcher (DirectShowComponent* const owner_) | |||
| : ComponentMovementWatcher (owner_), | |||
| owner (owner_) | |||
| { | |||
| } | |||
| void componentMovedOrResized (bool /*wasMoved*/, bool /*wasResized*/) | |||
| { | |||
| if (owner->videoLoaded) | |||
| owner->updateContextPosition(); | |||
| } | |||
| void componentPeerChanged() | |||
| { | |||
| if (owner->videoLoaded) | |||
| owner->recreateNativeWindowAsync(); | |||
| } | |||
| void componentVisibilityChanged() | |||
| { | |||
| if (owner->videoLoaded) | |||
| owner->showContext (owner->isShowing()); | |||
| } | |||
| //====================================================================== | |||
| private: | |||
| DirectShowComponent* const owner; | |||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DirectShowComponentWatcher); | |||
| }; | |||
| //====================================================================== | |||
| DirectShowComponent::DirectShowComponent (VideoRendererType type) | |||
| : videoLoaded (false), | |||
| looping (false), | |||
| needToUpdateViewport (true), | |||
| needToRecreateNativeWindow (false) | |||
| { | |||
| setOpaque (true); | |||
| context = new DirectShowContext (*this, type); | |||
| componentWatcher = new DirectShowComponentWatcher (this); | |||
| } | |||
| DirectShowComponent::~DirectShowComponent() | |||
| { | |||
| componentWatcher = nullptr; | |||
| } | |||
| bool DirectShowComponent::isDirectShowAvailable() | |||
| { | |||
| static bool isDSAvailable = DirectShowHelpers::checkDShowAvailability(); | |||
| return isDSAvailable; | |||
| } | |||
| void DirectShowComponent::recreateNativeWindowAsync() | |||
| { | |||
| needToRecreateNativeWindow = true; | |||
| repaint(); | |||
| } | |||
| void DirectShowComponent::updateContextPosition() | |||
| { | |||
| needToUpdateViewport = true; | |||
| if (getWidth() > 0 && getHeight() > 0) | |||
| { | |||
| Component* const topComp = getTopLevelComponent(); | |||
| if (topComp->getPeer() != nullptr) | |||
| context->updateWindowPosition (topComp->getLocalArea (this, getLocalBounds())); | |||
| } | |||
| } | |||
| void DirectShowComponent::showContext (const bool shouldBeVisible) | |||
| { | |||
| context->showWindow (shouldBeVisible); | |||
| } | |||
| void DirectShowComponent::paint (Graphics& g) | |||
| { | |||
| if (videoLoaded) | |||
| { | |||
| if (needToRecreateNativeWindow) | |||
| { | |||
| context->peerChanged(); | |||
| needToRecreateNativeWindow = false; | |||
| } | |||
| if (needToUpdateViewport) | |||
| { | |||
| context->updateVideoPosition(); | |||
| needToUpdateViewport = false; | |||
| } | |||
| context->repaint(); | |||
| ComponentPeer* const peer = getPeer(); | |||
| if (peer != nullptr) | |||
| { | |||
| const Point<int> topLeft (getScreenPosition() - peer->getScreenPosition()); | |||
| peer->addMaskedRegion (topLeft.getX(), topLeft.getY(), getWidth(), getHeight()); | |||
| } | |||
| } | |||
| else | |||
| { | |||
| g.fillAll (Colours::grey); | |||
| } | |||
| } | |||
| //====================================================================== | |||
| bool DirectShowComponent::loadMovie (const String& fileOrURLPath) | |||
| { | |||
| closeMovie(); | |||
| videoLoaded = context->loadFile (fileOrURLPath); | |||
| if (videoLoaded) | |||
| { | |||
| videoPath = fileOrURLPath; | |||
| context->updateVideoPosition(); | |||
| } | |||
| return videoLoaded; | |||
| } | |||
| bool DirectShowComponent::loadMovie (const File& videoFile) | |||
| { | |||
| return loadMovie (videoFile.getFullPathName()); | |||
| } | |||
| bool DirectShowComponent::loadMovie (const URL& videoURL) | |||
| { | |||
| return loadMovie (videoURL.toString (false)); | |||
| } | |||
| void DirectShowComponent::closeMovie() | |||
| { | |||
| if (videoLoaded) | |||
| context->release(); | |||
| videoLoaded = false; | |||
| videoPath = String::empty; | |||
| } | |||
| //====================================================================== | |||
| const File DirectShowComponent::getCurrentMoviePath() const { return videoPath; } | |||
| bool DirectShowComponent::isMovieOpen() const { return videoLoaded; } | |||
| double DirectShowComponent::getMovieDuration() const { return videoLoaded ? context->getDuration() : 0.0; } | |||
| void DirectShowComponent::setLooping (const bool shouldLoop) { looping = shouldLoop; } | |||
| bool DirectShowComponent::isLooping() const { return looping; } | |||
| void DirectShowComponent::getMovieNormalSize (int &width, int &height) const | |||
| { | |||
| width = context->getVideoWidth(); | |||
| height = context->getVideoHeight(); | |||
| } | |||
| //====================================================================== | |||
| void DirectShowComponent::setBoundsWithCorrectAspectRatio (const Rectangle<int>& spaceToFitWithin, | |||
| const RectanglePlacement& placement) | |||
| { | |||
| int normalWidth, normalHeight; | |||
| getMovieNormalSize (normalWidth, normalHeight); | |||
| const Rectangle<int> normalSize (0, 0, normalWidth, normalHeight); | |||
| if (! (spaceToFitWithin.isEmpty() || normalSize.isEmpty())) | |||
| setBounds (placement.appliedTo (normalSize, spaceToFitWithin)); | |||
| else | |||
| setBounds (spaceToFitWithin); | |||
| } | |||
| //====================================================================== | |||
| void DirectShowComponent::play() | |||
| { | |||
| if (videoLoaded) | |||
| context->run(); | |||
| } | |||
| void DirectShowComponent::stop() | |||
| { | |||
| if (videoLoaded) | |||
| context->stop(); | |||
| } | |||
| bool DirectShowComponent::isPlaying() const | |||
| { | |||
| return context->isRunning(); | |||
| } | |||
| void DirectShowComponent::goToStart() | |||
| { | |||
| setPosition (0.0); | |||
| } | |||
| void DirectShowComponent::setPosition (const double seconds) | |||
| { | |||
| if (videoLoaded) | |||
| context->setPosition (seconds); | |||
| } | |||
| double DirectShowComponent::getPosition() const | |||
| { | |||
| return videoLoaded ? context->getPosition() : 0.0; | |||
| } | |||
| void DirectShowComponent::setSpeed (const float newSpeed) | |||
| { | |||
| if (videoLoaded) | |||
| context->setSpeed (newSpeed); | |||
| } | |||
| void DirectShowComponent::setMovieVolume (const float newVolume) | |||
| { | |||
| if (videoLoaded) | |||
| context->setVolume (newVolume); | |||
| } | |||
| float DirectShowComponent::getMovieVolume() const | |||
| { | |||
| return videoLoaded ? context->getVolume() : 0.0f; | |||
| } | |||
| #endif | |||
| @@ -307,7 +307,7 @@ MemoryMappedFile::MemoryMappedFile (const File& file, MemoryMappedFile::AccessMo | |||
| { | |||
| jassert (mode == readOnly || mode == readWrite); | |||
| DWORD accessMode = GENERIC_READ, shareMode = FILE_SHARE_READ, createType = OPEN_EXISTING; | |||
| DWORD accessMode = GENERIC_READ, createType = OPEN_EXISTING; | |||
| DWORD protect = PAGE_READONLY, access = FILE_MAP_READ; | |||
| if (mode == readWrite) | |||
| @@ -74,6 +74,7 @@ BEGIN_JUCE_NAMESPACE | |||
| #include "../../gui/components/menus/juce_MenuBarModel.h" | |||
| #include "../../gui/components/special/juce_OpenGLComponent.h" | |||
| #include "../../gui/components/special/juce_QuickTimeMovieComponent.h" | |||
| #include "../../gui/components/special/juce_DirectShowComponent.h" | |||
| #include "../../gui/components/mouse/juce_DragAndDropContainer.h" | |||
| #include "../../gui/components/mouse/juce_MouseInputSource.h" | |||
| #include "../../gui/components/keyboard/juce_KeyPressMappingSet.h" | |||
| @@ -114,6 +115,7 @@ BEGIN_JUCE_NAMESPACE | |||
| #include "juce_win32_Misc.cpp" | |||
| #include "juce_win32_ActiveXComponent.cpp" | |||
| #include "juce_win32_QuickTimeMovieComponent.cpp" | |||
| #include "juce_win32_DirectShowComponent.cpp" | |||
| #include "juce_win32_WebBrowserComponent.cpp" | |||
| #include "juce_win32_OpenGLComponent.cpp" | |||
| #include "juce_win32_AudioCDReader.cpp" | |||
| @@ -183,6 +183,14 @@ | |||
| #import <QTOControl.dll> | |||
| #endif | |||
| #if JUCE_DIRECTSHOW && JUCE_BUILD_NATIVE | |||
| #include <DShow.h> | |||
| #endif | |||
| #if JUCE_MEDIAFOUNDATION && JUCE_BUILD_NATIVE | |||
| #include <evr.h> | |||
| #endif | |||
| //============================================================================== | |||
| #if JUCE_MSVC | |||
| #pragma warning (pop) | |||
| @@ -287,10 +287,10 @@ public: | |||
| return false; | |||
| } | |||
| void updateWindowPosition (int x, int y, int w, int h, int) | |||
| void updateWindowPosition (const Rectangle<int>& bounds) | |||
| { | |||
| SetWindowPos ((HWND) nativeWindow->getNativeHandle(), 0, | |||
| x, y, w, h, | |||
| bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight(), | |||
| SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOOWNERZORDER); | |||
| } | |||