Browse Source

New class: DirectShowComponent, for native video playback in Windows. Added a demo page for this to the juce demo app.

tags/2021-05-28
Julian Storer 14 years ago
parent
commit
b94782d388
50 changed files with 2643 additions and 47 deletions
  1. +6
    -0
      Builds/Linux/Makefile
  2. +6
    -0
      Builds/MacOSX/Juce.xcodeproj/project.pbxproj
  3. +2
    -0
      Builds/VisualStudio2005/Juce.vcproj
  4. +2
    -0
      Builds/VisualStudio2008/Juce.vcproj
  5. +2
    -0
      Builds/VisualStudio2008_DLL/Juce.vcproj
  6. +2
    -0
      Builds/VisualStudio2010/Juce.vcxproj
  7. +6
    -0
      Builds/VisualStudio2010/Juce.vcxproj.filters
  8. +6
    -0
      Builds/iOS/Juce.xcodeproj/project.pbxproj
  9. +5
    -1
      Juce.jucer
  10. +2
    -1
      extras/Introjucer/Introjucer.jucer
  11. +2
    -0
      extras/Introjucer/JuceLibraryCode/AppConfig.h
  12. +1
    -0
      extras/JuceDemo/Builds/Android/jni/Android.mk
  13. +6
    -0
      extras/JuceDemo/Builds/Linux/Makefile
  14. +4
    -0
      extras/JuceDemo/Builds/MacOSX/Juce Demo.xcodeproj/project.pbxproj
  15. +1
    -0
      extras/JuceDemo/Builds/VisualStudio2005/Juce Demo.vcproj
  16. +1
    -0
      extras/JuceDemo/Builds/VisualStudio2008/Juce Demo.vcproj
  17. +1
    -0
      extras/JuceDemo/Builds/VisualStudio2010/Juce Demo.vcxproj
  18. +3
    -0
      extras/JuceDemo/Builds/VisualStudio2010/Juce Demo.vcxproj.filters
  19. +4
    -0
      extras/JuceDemo/Builds/iOS/Juce Demo.xcodeproj/project.pbxproj
  20. +4
    -1
      extras/JuceDemo/Juce Demo.jucer
  21. +2
    -0
      extras/JuceDemo/JuceLibraryCode/AppConfig.h
  22. +19
    -0
      extras/JuceDemo/Source/MainDemoWindow.cpp
  23. +155
    -0
      extras/JuceDemo/Source/demos/DirectShowDemo.cpp
  24. +3
    -0
      extras/JuceDemo/Source/jucedemo_headers.h
  25. +2
    -1
      extras/amalgamator/Amalgamator.jucer
  26. +2
    -0
      extras/amalgamator/JuceLibraryCode/AppConfig.h
  27. +2
    -0
      extras/audio plugin host/JuceLibraryCode/AppConfig.h
  28. +2
    -1
      extras/audio plugin host/Plugin Host.jucer
  29. +1
    -1
      extras/audio plugins/demo/JuceDemoPlugin.jucer
  30. +2
    -0
      extras/audio plugins/demo/JuceLibraryCode/AppConfig.h
  31. +2
    -1
      extras/binarybuilder/BinaryBuilder.jucer
  32. +2
    -0
      extras/binarybuilder/JuceLibraryCode/AppConfig.h
  33. +2
    -1
      extras/example projects/HelloWorld.jucer
  34. +2
    -0
      extras/example projects/JuceLibraryCode/AppConfig.h
  35. +19
    -0
      juce_Config.h
  36. +940
    -20
      juce_amalgamated.cpp
  37. +225
    -2
      juce_amalgamated.h
  38. +1
    -1
      src/core/juce_StandardHeader.h
  39. +221
    -0
      src/gui/components/special/juce_DirectShowComponent.h
  40. +1
    -5
      src/gui/components/special/juce_OpenGLComponent.cpp
  41. +1
    -1
      src/gui/components/special/juce_OpenGLComponent.h
  42. +3
    -0
      src/juce_app_includes.h
  43. +2
    -2
      src/native/linux/juce_linux_Windowing.cpp
  44. +4
    -5
      src/native/mac/juce_mac_OpenGLComponent.mm
  45. +8
    -0
      src/native/windows/juce_win32_AutoLinkLibraries.h
  46. +941
    -0
      src/native/windows/juce_win32_DirectShowComponent.cpp
  47. +1
    -1
      src/native/windows/juce_win32_Files.cpp
  48. +2
    -0
      src/native/windows/juce_win32_NativeCode.cpp
  49. +8
    -0
      src/native/windows/juce_win32_NativeIncludes.h
  50. +2
    -2
      src/native/windows/juce_win32_OpenGLComponent.cpp

+ 6
- 0
Builds/Linux/Makefile View File

@@ -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"


+ 6
- 0
Builds/MacOSX/Juce.xcodeproj/project.pbxproj View File

@@ -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,


+ 2
- 0
Builds/VisualStudio2005/Juce.vcproj View File

@@ -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"/>


+ 2
- 0
Builds/VisualStudio2008/Juce.vcproj View File

@@ -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"/>


+ 2
- 0
Builds/VisualStudio2008_DLL/Juce.vcproj View File

@@ -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"/>


+ 2
- 0
Builds/VisualStudio2010/Juce.vcxproj View File

@@ -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"/>


+ 6
- 0
Builds/VisualStudio2010/Juce.vcxproj.filters View File

@@ -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>


+ 6
- 0
Builds/iOS/Juce.xcodeproj/project.pbxproj View File

@@ -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,


+ 5
- 1
Juce.jucer View File

@@ -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>

+ 2
- 1
extras/Introjucer/Introjucer.jucer View File

@@ -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>

+ 2
- 0
extras/Introjucer/JuceLibraryCode/AppConfig.h View File

@@ -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


+ 1
- 0
extras/JuceDemo/Builds/Android/jni/Android.mk View File

@@ -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\


+ 6
- 0
extras/JuceDemo/Builds/Linux/Makefile View File

@@ -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"


+ 4
- 0
extras/JuceDemo/Builds/MacOSX/Juce Demo.xcodeproj/project.pbxproj View File

@@ -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,


+ 1
- 0
extras/JuceDemo/Builds/VisualStudio2005/Juce Demo.vcproj View File

@@ -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"/>


+ 1
- 0
extras/JuceDemo/Builds/VisualStudio2008/Juce Demo.vcproj View File

@@ -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"/>


+ 1
- 0
extras/JuceDemo/Builds/VisualStudio2010/Juce Demo.vcxproj View File

@@ -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"/>


+ 3
- 0
extras/JuceDemo/Builds/VisualStudio2010/Juce Demo.vcxproj.filters View File

@@ -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>


+ 4
- 0
extras/JuceDemo/Builds/iOS/Juce Demo.xcodeproj/project.pbxproj View File

@@ -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,


+ 4
- 1
extras/JuceDemo/Juce Demo.jucer View File

@@ -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>

+ 2
- 0
extras/JuceDemo/JuceLibraryCode/AppConfig.h View File

@@ -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


+ 19
- 0
extras/JuceDemo/Source/MainDemoWindow.cpp View File

@@ -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,


+ 155
- 0
extras/JuceDemo/Source/demos/DirectShowDemo.cpp View File

@@ -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

+ 3
- 0
extras/JuceDemo/Source/jucedemo_headers.h View File

@@ -61,5 +61,8 @@ Component* createCodeEditorDemo();
Component* createCameraDemo();
#endif
#if JUCE_DIRECTSHOW
Component* createDirectShowDemo();
#endif
#endif // __JUCEDEMO_HEADERS_JUCEHEADER__

+ 2
- 1
extras/amalgamator/Amalgamator.jucer View File

@@ -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>

+ 2
- 0
extras/amalgamator/JuceLibraryCode/AppConfig.h View File

@@ -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


+ 2
- 0
extras/audio plugin host/JuceLibraryCode/AppConfig.h View File

@@ -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


+ 2
- 1
extras/audio plugin host/Plugin Host.jucer View File

@@ -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>

+ 1
- 1
extras/audio plugins/demo/JuceDemoPlugin.jucer View File

@@ -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>

+ 2
- 0
extras/audio plugins/demo/JuceLibraryCode/AppConfig.h View File

@@ -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


+ 2
- 1
extras/binarybuilder/BinaryBuilder.jucer View File

@@ -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>

+ 2
- 0
extras/binarybuilder/JuceLibraryCode/AppConfig.h View File

@@ -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


+ 2
- 1
extras/example projects/HelloWorld.jucer View File

@@ -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>

+ 2
- 0
extras/example projects/JuceLibraryCode/AppConfig.h View File

@@ -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


+ 19
- 0
juce_Config.h View File

@@ -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


+ 940
- 20
juce_amalgamated.cpp
File diff suppressed because it is too large
View File


+ 225
- 2
juce_amalgamated.h View File

@@ -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 ***/




+ 1
- 1
src/core/juce_StandardHeader.h View File

@@ -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.


+ 221
- 0
src/gui/components/special/juce_DirectShowComponent.h View File

@@ -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__

+ 1
- 5
src/gui/components/special/juce_OpenGLComponent.cpp View File

@@ -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()));
}
}
}


+ 1
- 1
src/gui/components/special/juce_OpenGLComponent.h View File

@@ -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.


+ 3
- 0
src/juce_app_includes.h View File

@@ -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


+ 2
- 2
src/native/linux/juce_linux_Windowing.cpp View File

@@ -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()


+ 4
- 5
src/native/mac/juce_mac_OpenGLComponent.mm View File

@@ -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)
{


+ 8
- 0
src/native/windows/juce_win32_AutoLinkLibraries.h View File

@@ -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

+ 941
- 0
src/native/windows/juce_win32_DirectShowComponent.cpp View File

@@ -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

+ 1
- 1
src/native/windows/juce_win32_Files.cpp View File

@@ -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)


+ 2
- 0
src/native/windows/juce_win32_NativeCode.cpp View File

@@ -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"


+ 8
- 0
src/native/windows/juce_win32_NativeIncludes.h View File

@@ -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)


+ 2
- 2
src/native/windows/juce_win32_OpenGLComponent.cpp View File

@@ -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);
}


Loading…
Cancel
Save