$(__INC_ZLIB_p) $(__INC_ODBC_p) $(__INC_REGEX_p) $(__INC_EXPAT_p) \
-DWXUSINGDLL -DWXMAKINGDLL_MEDIA $(PIC_FLAG) $(CPPFLAGS) $(CXXFLAGS)
MEDIADLL_OBJECTS = \
- mediadll_emptydmy.o \
+ mediadll_mediactrlcmn.o \
$(__MEDIA_PLATFORM_SRC_OBJECTS_2)
MEDIADLL_ODEP = $(___pch_wxprec_mediadll_wx_wxprec_h_gch___depname)
MEDIALIB_CXXFLAGS = $(__medialib_PCH_INC) -D__WX$(TOOLKIT)__ \
$(__INC_ZLIB_p) $(__INC_ODBC_p) $(__INC_REGEX_p) $(__INC_EXPAT_p) \
$(CPPFLAGS) $(CXXFLAGS)
MEDIALIB_OBJECTS = \
- medialib_emptydmy.o \
+ medialib_mediactrlcmn.o \
$(__MEDIA_PLATFORM_SRC_OBJECTS_3)
MEDIALIB_ODEP = $(___pch_wxprec_medialib_wx_wxprec_h_gch___depname)
ODBCDLL_CXXFLAGS = $(__odbcdll_PCH_INC) -D__WX$(TOOLKIT)__ \
@COND_TOOLKIT_X11@ wx/unix/joystick.h wx/unix/sound.h wx/unix/taskbarx11.h
@COND_TOOLKIT_COCOA@MEDIA_PLATFORM_HDR =
@COND_TOOLKIT_GTK@MEDIA_PLATFORM_HDR =
-@COND_TOOLKIT_MAC@MEDIA_PLATFORM_HDR = wx/mac/carbon/mediactrl.h
+@COND_TOOLKIT_MAC@MEDIA_PLATFORM_HDR =
@COND_TOOLKIT_MOTIF@MEDIA_PLATFORM_HDR =
-@COND_TOOLKIT_MSW@MEDIA_PLATFORM_HDR = wx/msw/mediactrl.h
+@COND_TOOLKIT_MSW@MEDIA_PLATFORM_HDR =
@COND_TOOLKIT_PM@MEDIA_PLATFORM_HDR =
-@COND_TOOLKIT_WINCE@MEDIA_PLATFORM_HDR = wx/msw/mediactrl.h
+@COND_TOOLKIT_WINCE@MEDIA_PLATFORM_HDR =
@COND_TOOLKIT_X11@MEDIA_PLATFORM_HDR =
@COND_USE_GUI_1_WXUNIV_0@GUI_CORE_HEADERS = $(GUI_HDR)
COND_USE_GUI_1_WXUNIV_1_GUI_CORE_HEADERS = \
monodll_tipdlg.o \
monodll_wizard.o \
$(__ADVANCED_PLATFORM_SRC_OBJECTS) \
- monodll_emptydmy.o \
+ monodll_mediactrlcmn.o \
$(__MEDIA_PLATFORM_SRC_OBJECTS) \
$(__HTML_SRC_PLATFORM_OBJECTS) \
monodll_helpctrl.o \
monolib_tipdlg.o \
monolib_wizard.o \
$(__ADVANCED_PLATFORM_SRC_OBJECTS_1) \
- monolib_emptydmy.o \
+ monolib_mediactrlcmn.o \
$(__MEDIA_PLATFORM_SRC_OBJECTS_1) \
$(__HTML_SRC_PLATFORM_OBJECTS_1) \
monolib_helpctrl.o \
monodll_eggtrayicon.o: $(srcdir)/src/gtk/eggtrayicon.c $(MONODLL_ODEP)
$(CCC) -c -o $@ $(MONODLL_CFLAGS) $<
-monodll_emptydmy.o: $(srcdir)/src/common/emptydmy.cpp $(MONODLL_ODEP)
+monodll_mediactrlcmn.o: $(srcdir)/src/common/mediactrlcmn.cpp $(MONODLL_ODEP)
$(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $<
monodll_helpbest.o: $(srcdir)/src/msw/helpbest.cpp $(MONODLL_ODEP)
monolib_eggtrayicon.o: $(srcdir)/src/gtk/eggtrayicon.c $(MONOLIB_ODEP)
$(CCC) -c -o $@ $(MONOLIB_CFLAGS) $<
-monolib_emptydmy.o: $(srcdir)/src/common/emptydmy.cpp $(MONOLIB_ODEP)
+monolib_mediactrlcmn.o: $(srcdir)/src/common/mediactrlcmn.cpp $(MONOLIB_ODEP)
$(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $<
monolib_helpbest.o: $(srcdir)/src/msw/helpbest.cpp $(MONOLIB_ODEP)
@COND_TOOLKIT_X11@advlib_taskbarx11.o: $(srcdir)/src/unix/taskbarx11.cpp $(ADVLIB_ODEP)
@COND_TOOLKIT_X11@ $(CXXC) -c -o $@ $(ADVLIB_CXXFLAGS) $<
-mediadll_emptydmy.o: $(srcdir)/src/common/emptydmy.cpp $(MEDIADLL_ODEP)
+mediadll_mediactrlcmn.o: $(srcdir)/src/common/mediactrlcmn.cpp $(MEDIADLL_ODEP)
$(CXXC) -c -o $@ $(MEDIADLL_CXXFLAGS) $<
@COND_TOOLKIT_MSW@mediadll_mediactrl.o: $(srcdir)/src/msw/mediactrl.cpp $(MEDIADLL_ODEP)
@COND_TOOLKIT_MAC@mediadll_mediactrl.o: $(srcdir)/src/mac/carbon/mediactrl.cpp $(MEDIADLL_ODEP)
@COND_TOOLKIT_MAC@ $(CXXC) -c -o $@ $(MEDIADLL_CXXFLAGS) $<
-medialib_emptydmy.o: $(srcdir)/src/common/emptydmy.cpp $(MEDIALIB_ODEP)
+medialib_mediactrlcmn.o: $(srcdir)/src/common/mediactrlcmn.cpp $(MEDIALIB_ODEP)
$(CXXC) -c -o $@ $(MEDIALIB_CXXFLAGS) $<
@COND_TOOLKIT_MSW@medialib_mediactrl.o: $(srcdir)/src/msw/mediactrl.cpp $(MEDIALIB_ODEP)
cp $(SAMPDIR)/mdi/*.xpm $(DISTDIR)/samples/mdi
cp $(SAMPDIR)/mdi/bitmaps/*.xpm $(DISTDIR)/samples/mdi/bitmaps
+ mkdir $(DISTDIR)/samples/mediaplayer
+ cp $(SAMPDIR)/mediaplayer/Makefile.in $(DISTDIR)/samples/mediaplayer
+ cp $(SAMPDIR)/mediaplayer/makefile.unx $(DISTDIR)/samples/mediaplayer
+ cp $(SAMPDIR)/mediaplayer/*.cpp $(DISTDIR)/samples/mediaplayer
+ cp $(SAMPDIR)/mediaplayer/*.xpm $(DISTDIR)/samples/mediaplayer
+
mkdir $(DISTDIR)/samples/memcheck
cp $(SAMPDIR)/memcheck/Makefile.in $(DISTDIR)/samples/memcheck
cp $(SAMPDIR)/memcheck/makefile.unx $(DISTDIR)/samples/memcheck
<!-- ====================================================================== -->
<set var="MEDIA_CMN_SRC" hints="files">
- src/common/emptydmy.cpp
+ src/common/mediactrlcmn.cpp
</set>
<set var="MEDIA_CMN_HDR" hints="files">
src/msw/mediactrl.cpp
</set>
<set var="MEDIA_MSW_HDR" hints="files">
- wx/msw/mediactrl.h
</set>
<!-- not built on WindowsCE: -->
<set var="MEDIA_MSW_ONLY_SRC" hints="files">
src/mac/carbon/mediactrl.cpp
</set>
<set var="MEDIA_MAC_HDR" hints="files">
- wx/mac/carbon/mediactrl.h
</set>
<set var="MEDIA_COCOA_SRC" hints="files">
$(OBJS)\monodll_regconf.obj \
$(OBJS)\monodll_registry.obj \
$(OBJS)\monodll_snglinst.obj \
+ $(OBJS)\monodll_stdpaths.obj \
$(OBJS)\monodll_thread.obj \
$(OBJS)\monodll_utils.obj \
$(OBJS)\monodll_utilsexc.obj \
$(OBJS)\monolib_regconf.obj \
$(OBJS)\monolib_registry.obj \
$(OBJS)\monolib_snglinst.obj \
+ $(OBJS)\monolib_stdpaths.obj \
$(OBJS)\monolib_thread.obj \
$(OBJS)\monolib_utils.obj \
$(OBJS)\monolib_utilsexc.obj \
$(OBJS)\basedll_regconf.obj \
$(OBJS)\basedll_registry.obj \
$(OBJS)\basedll_snglinst.obj \
+ $(OBJS)\basedll_stdpaths.obj \
$(OBJS)\basedll_thread.obj \
$(OBJS)\basedll_utils.obj \
$(OBJS)\basedll_utilsexc.obj \
$(OBJS)\baselib_regconf.obj \
$(OBJS)\baselib_registry.obj \
$(OBJS)\baselib_snglinst.obj \
+ $(OBJS)\baselib_stdpaths.obj \
$(OBJS)\baselib_thread.obj \
$(OBJS)\baselib_utils.obj \
$(OBJS)\baselib_utilsexc.obj \
-H=$(OBJS)\wxprec_mediadll.csm $(CPPFLAGS) $(CXXFLAGS)
MEDIADLL_OBJECTS = \
$(OBJS)\mediadll_dummy.obj \
+ $(OBJS)\mediadll_mediactrlcmn.obj \
$(OBJS)\mediadll_mediactrl.obj
MEDIALIB_CXXFLAGS = $(__RUNTIME_LIBS) -I$(BCCDIR)\include $(__DEBUGINFO) \
$(__OPTIMIZEFLAG) -tWM -D__WXMSW__ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) \
$(CXXFLAGS)
MEDIALIB_OBJECTS = \
$(OBJS)\medialib_dummy.obj \
+ $(OBJS)\medialib_mediactrlcmn.obj \
$(OBJS)\medialib_mediactrl.obj
ODBCDLL_CXXFLAGS = $(__RUNTIME_LIBS) -I$(BCCDIR)\include $(__DEBUGINFO) \
$(__OPTIMIZEFLAG) -tWM -D__WXMSW__ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) \
$(OBJS)\monodll_sound.obj \
$(OBJS)\monodll_taskbar.obj \
$(OBJS)\monodll_joystick.obj \
+ $(OBJS)\monodll_mediactrlcmn.obj \
$(OBJS)\monodll_mediactrl.obj \
$(OBJS)\monodll_helpbest.obj \
$(OBJS)\monodll_helpctrl.obj \
$(OBJS)\monodll_region.obj \
$(OBJS)\monodll_renderer.obj \
$(OBJS)\monodll_settings.obj \
- $(OBJS)\monodll_stdpaths.obj \
$(OBJS)\monodll_timer.obj \
$(OBJS)\monodll_tooltip.obj \
$(OBJS)\monodll_toplevel.obj \
$(OBJS)\monodll_region.obj \
$(OBJS)\monodll_renderer.obj \
$(OBJS)\monodll_settings.obj \
- $(OBJS)\monodll_stdpaths.obj \
$(OBJS)\monodll_timer.obj \
$(OBJS)\monodll_tooltip.obj \
$(OBJS)\monodll_toplevel.obj \
$(OBJS)\monolib_sound.obj \
$(OBJS)\monolib_taskbar.obj \
$(OBJS)\monolib_joystick.obj \
+ $(OBJS)\monolib_mediactrlcmn.obj \
$(OBJS)\monolib_mediactrl.obj \
$(OBJS)\monolib_helpbest.obj \
$(OBJS)\monolib_helpctrl.obj \
$(OBJS)\monolib_region.obj \
$(OBJS)\monolib_renderer.obj \
$(OBJS)\monolib_settings.obj \
- $(OBJS)\monolib_stdpaths.obj \
$(OBJS)\monolib_timer.obj \
$(OBJS)\monolib_tooltip.obj \
$(OBJS)\monolib_toplevel.obj \
$(OBJS)\monolib_region.obj \
$(OBJS)\monolib_renderer.obj \
$(OBJS)\monolib_settings.obj \
- $(OBJS)\monolib_stdpaths.obj \
$(OBJS)\monolib_timer.obj \
$(OBJS)\monolib_tooltip.obj \
$(OBJS)\monolib_toplevel.obj \
$(OBJS)\coredll_region.obj \
$(OBJS)\coredll_renderer.obj \
$(OBJS)\coredll_settings.obj \
- $(OBJS)\coredll_stdpaths.obj \
$(OBJS)\coredll_timer.obj \
$(OBJS)\coredll_tooltip.obj \
$(OBJS)\coredll_toplevel.obj \
$(OBJS)\coredll_region.obj \
$(OBJS)\coredll_renderer.obj \
$(OBJS)\coredll_settings.obj \
- $(OBJS)\coredll_stdpaths.obj \
$(OBJS)\coredll_timer.obj \
$(OBJS)\coredll_tooltip.obj \
$(OBJS)\coredll_toplevel.obj \
$(OBJS)\corelib_region.obj \
$(OBJS)\corelib_renderer.obj \
$(OBJS)\corelib_settings.obj \
- $(OBJS)\corelib_stdpaths.obj \
$(OBJS)\corelib_timer.obj \
$(OBJS)\corelib_tooltip.obj \
$(OBJS)\corelib_toplevel.obj \
$(OBJS)\corelib_region.obj \
$(OBJS)\corelib_renderer.obj \
$(OBJS)\corelib_settings.obj \
- $(OBJS)\corelib_stdpaths.obj \
$(OBJS)\corelib_timer.obj \
$(OBJS)\corelib_tooltip.obj \
$(OBJS)\corelib_toplevel.obj \
$(OBJS)\monodll_snglinst.obj: ..\..\src\msw\snglinst.cpp
$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $**
+$(OBJS)\monodll_stdpaths.obj: ..\..\src\msw\stdpaths.cpp
+ $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $**
+
$(OBJS)\monodll_thread.obj: ..\..\src\msw\thread.cpp
$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $**
$(OBJS)\monodll_joystick.obj: ..\..\src\msw\joystick.cpp
$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $**
+$(OBJS)\monodll_mediactrlcmn.obj: ..\..\src\common\mediactrlcmn.cpp
+ $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $**
+
$(OBJS)\monodll_mediactrl.obj: ..\..\src\msw\mediactrl.cpp
$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $**
$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $**
!endif
-!if "$(USE_GUI)" == "1"
-$(OBJS)\monodll_stdpaths.obj: ..\..\src\msw\stdpaths.cpp
- $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $**
-!endif
-
!if "$(USE_GUI)" == "1"
$(OBJS)\monodll_timer.obj: ..\..\src\msw\timer.cpp
$(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) $**
$(OBJS)\monolib_snglinst.obj: ..\..\src\msw\snglinst.cpp
$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $**
+$(OBJS)\monolib_stdpaths.obj: ..\..\src\msw\stdpaths.cpp
+ $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $**
+
$(OBJS)\monolib_thread.obj: ..\..\src\msw\thread.cpp
$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $**
$(OBJS)\monolib_joystick.obj: ..\..\src\msw\joystick.cpp
$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $**
+$(OBJS)\monolib_mediactrlcmn.obj: ..\..\src\common\mediactrlcmn.cpp
+ $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $**
+
$(OBJS)\monolib_mediactrl.obj: ..\..\src\msw\mediactrl.cpp
$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $**
$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $**
!endif
-!if "$(USE_GUI)" == "1"
-$(OBJS)\monolib_stdpaths.obj: ..\..\src\msw\stdpaths.cpp
- $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $**
-!endif
-
!if "$(USE_GUI)" == "1"
$(OBJS)\monolib_timer.obj: ..\..\src\msw\timer.cpp
$(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) $**
$(OBJS)\basedll_snglinst.obj: ..\..\src\msw\snglinst.cpp
$(CXX) -q -c -P -o$@ $(BASEDLL_CXXFLAGS) $**
+$(OBJS)\basedll_stdpaths.obj: ..\..\src\msw\stdpaths.cpp
+ $(CXX) -q -c -P -o$@ $(BASEDLL_CXXFLAGS) $**
+
$(OBJS)\basedll_thread.obj: ..\..\src\msw\thread.cpp
$(CXX) -q -c -P -o$@ $(BASEDLL_CXXFLAGS) $**
$(OBJS)\baselib_snglinst.obj: ..\..\src\msw\snglinst.cpp
$(CXX) -q -c -P -o$@ $(BASELIB_CXXFLAGS) $**
+$(OBJS)\baselib_stdpaths.obj: ..\..\src\msw\stdpaths.cpp
+ $(CXX) -q -c -P -o$@ $(BASELIB_CXXFLAGS) $**
+
$(OBJS)\baselib_thread.obj: ..\..\src\msw\thread.cpp
$(CXX) -q -c -P -o$@ $(BASELIB_CXXFLAGS) $**
$(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) $**
!endif
-!if "$(USE_GUI)" == "1"
-$(OBJS)\coredll_stdpaths.obj: ..\..\src\msw\stdpaths.cpp
- $(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) $**
-!endif
-
!if "$(USE_GUI)" == "1"
$(OBJS)\coredll_timer.obj: ..\..\src\msw\timer.cpp
$(CXX) -q -c -P -o$@ $(COREDLL_CXXFLAGS) $**
$(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) $**
!endif
-!if "$(USE_GUI)" == "1"
-$(OBJS)\corelib_stdpaths.obj: ..\..\src\msw\stdpaths.cpp
- $(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) $**
-!endif
-
!if "$(USE_GUI)" == "1"
$(OBJS)\corelib_timer.obj: ..\..\src\msw\timer.cpp
$(CXX) -q -c -P -o$@ $(CORELIB_CXXFLAGS) $**
$(OBJS)\mediadll_dummy.obj: ..\..\src\msw\dummy.cpp
$(CXX) -q -c -P -o$@ $(MEDIADLL_CXXFLAGS) -H $**
+$(OBJS)\mediadll_mediactrlcmn.obj: ..\..\src\common\mediactrlcmn.cpp
+ $(CXX) -q -c -P -o$@ $(MEDIADLL_CXXFLAGS) $**
+
$(OBJS)\mediadll_mediactrl.obj: ..\..\src\msw\mediactrl.cpp
$(CXX) -q -c -P -o$@ $(MEDIADLL_CXXFLAGS) $**
$(OBJS)\medialib_dummy.obj: ..\..\src\msw\dummy.cpp
$(CXX) -q -c -P -o$@ $(MEDIALIB_CXXFLAGS) -H $**
+$(OBJS)\medialib_mediactrlcmn.obj: ..\..\src\common\mediactrlcmn.cpp
+ $(CXX) -q -c -P -o$@ $(MEDIALIB_CXXFLAGS) $**
+
$(OBJS)\medialib_mediactrl.obj: ..\..\src\msw\mediactrl.cpp
$(CXX) -q -c -P -o$@ $(MEDIALIB_CXXFLAGS) $**
$(OBJS)\monodll_regconf.o \
$(OBJS)\monodll_registry.o \
$(OBJS)\monodll_snglinst.o \
+ $(OBJS)\monodll_stdpaths.o \
$(OBJS)\monodll_thread.o \
$(OBJS)\monodll_utils.o \
$(OBJS)\monodll_utilsexc.o \
$(OBJS)\monolib_regconf.o \
$(OBJS)\monolib_registry.o \
$(OBJS)\monolib_snglinst.o \
+ $(OBJS)\monolib_stdpaths.o \
$(OBJS)\monolib_thread.o \
$(OBJS)\monolib_utils.o \
$(OBJS)\monolib_utilsexc.o \
$(OBJS)\basedll_regconf.o \
$(OBJS)\basedll_registry.o \
$(OBJS)\basedll_snglinst.o \
+ $(OBJS)\basedll_stdpaths.o \
$(OBJS)\basedll_thread.o \
$(OBJS)\basedll_utils.o \
$(OBJS)\basedll_utilsexc.o \
$(OBJS)\baselib_regconf.o \
$(OBJS)\baselib_registry.o \
$(OBJS)\baselib_snglinst.o \
+ $(OBJS)\baselib_stdpaths.o \
$(OBJS)\baselib_thread.o \
$(OBJS)\baselib_utils.o \
$(OBJS)\baselib_utilsexc.o \
$(__EXCEPTIONSFLAG_14) $(CPPFLAGS) $(CXXFLAGS)
MEDIADLL_OBJECTS = \
$(OBJS)\mediadll_dummy.o \
+ $(OBJS)\mediadll_mediactrlcmn.o \
$(OBJS)\mediadll_mediactrl.o
MEDIALIB_CXXFLAGS = $(__DEBUGINFO) $(__OPTIMIZEFLAG) $(GCCFLAGS) \
-DHAVE_W32API_H -D__WXMSW__ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) \
$(CPPFLAGS) $(CXXFLAGS)
MEDIALIB_OBJECTS = \
$(OBJS)\medialib_dummy.o \
+ $(OBJS)\medialib_mediactrlcmn.o \
$(OBJS)\medialib_mediactrl.o
ODBCDLL_CXXFLAGS = $(__DEBUGINFO) $(__OPTIMIZEFLAG) $(GCCFLAGS) -DHAVE_W32API_H \
-D__WXMSW__ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) $(__UNICODE_DEFINE_p) \
$(OBJS)\monodll_sound.o \
$(OBJS)\monodll_taskbar.o \
$(OBJS)\monodll_joystick.o \
+ $(OBJS)\monodll_mediactrlcmn.o \
$(OBJS)\monodll_mediactrl.o \
$(OBJS)\monodll_helpbest.o \
$(OBJS)\monodll_helpctrl.o \
$(OBJS)\monodll_region.o \
$(OBJS)\monodll_renderer.o \
$(OBJS)\monodll_settings.o \
- $(OBJS)\monodll_stdpaths.o \
$(OBJS)\monodll_timer.o \
$(OBJS)\monodll_tooltip.o \
$(OBJS)\monodll_toplevel.o \
$(OBJS)\monodll_region.o \
$(OBJS)\monodll_renderer.o \
$(OBJS)\monodll_settings.o \
- $(OBJS)\monodll_stdpaths.o \
$(OBJS)\monodll_timer.o \
$(OBJS)\monodll_tooltip.o \
$(OBJS)\monodll_toplevel.o \
$(OBJS)\monolib_sound.o \
$(OBJS)\monolib_taskbar.o \
$(OBJS)\monolib_joystick.o \
+ $(OBJS)\monolib_mediactrlcmn.o \
$(OBJS)\monolib_mediactrl.o \
$(OBJS)\monolib_helpbest.o \
$(OBJS)\monolib_helpctrl.o \
$(OBJS)\monolib_region.o \
$(OBJS)\monolib_renderer.o \
$(OBJS)\monolib_settings.o \
- $(OBJS)\monolib_stdpaths.o \
$(OBJS)\monolib_timer.o \
$(OBJS)\monolib_tooltip.o \
$(OBJS)\monolib_toplevel.o \
$(OBJS)\monolib_region.o \
$(OBJS)\monolib_renderer.o \
$(OBJS)\monolib_settings.o \
- $(OBJS)\monolib_stdpaths.o \
$(OBJS)\monolib_timer.o \
$(OBJS)\monolib_tooltip.o \
$(OBJS)\monolib_toplevel.o \
$(OBJS)\coredll_region.o \
$(OBJS)\coredll_renderer.o \
$(OBJS)\coredll_settings.o \
- $(OBJS)\coredll_stdpaths.o \
$(OBJS)\coredll_timer.o \
$(OBJS)\coredll_tooltip.o \
$(OBJS)\coredll_toplevel.o \
$(OBJS)\coredll_region.o \
$(OBJS)\coredll_renderer.o \
$(OBJS)\coredll_settings.o \
- $(OBJS)\coredll_stdpaths.o \
$(OBJS)\coredll_timer.o \
$(OBJS)\coredll_tooltip.o \
$(OBJS)\coredll_toplevel.o \
$(OBJS)\corelib_region.o \
$(OBJS)\corelib_renderer.o \
$(OBJS)\corelib_settings.o \
- $(OBJS)\corelib_stdpaths.o \
$(OBJS)\corelib_timer.o \
$(OBJS)\corelib_tooltip.o \
$(OBJS)\corelib_toplevel.o \
$(OBJS)\corelib_region.o \
$(OBJS)\corelib_renderer.o \
$(OBJS)\corelib_settings.o \
- $(OBJS)\corelib_stdpaths.o \
$(OBJS)\corelib_timer.o \
$(OBJS)\corelib_tooltip.o \
$(OBJS)\corelib_toplevel.o \
$(OBJS)\monodll_snglinst.o: ../../src/msw/snglinst.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $<
+$(OBJS)\monodll_stdpaths.o: ../../src/msw/stdpaths.cpp
+ $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $<
+
$(OBJS)\monodll_thread.o: ../../src/msw/thread.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $<
$(OBJS)\monodll_joystick.o: ../../src/msw/joystick.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $<
+$(OBJS)\monodll_mediactrlcmn.o: ../../src/common/mediactrlcmn.cpp
+ $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $<
+
$(OBJS)\monodll_mediactrl.o: ../../src/msw/mediactrl.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $<
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $<
endif
-ifeq ($(USE_GUI),1)
-$(OBJS)\monodll_stdpaths.o: ../../src/msw/stdpaths.cpp
- $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $<
-endif
-
ifeq ($(USE_GUI),1)
$(OBJS)\monodll_timer.o: ../../src/msw/timer.cpp
$(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $<
$(OBJS)\monolib_snglinst.o: ../../src/msw/snglinst.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $<
+$(OBJS)\monolib_stdpaths.o: ../../src/msw/stdpaths.cpp
+ $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $<
+
$(OBJS)\monolib_thread.o: ../../src/msw/thread.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $<
$(OBJS)\monolib_joystick.o: ../../src/msw/joystick.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $<
+$(OBJS)\monolib_mediactrlcmn.o: ../../src/common/mediactrlcmn.cpp
+ $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $<
+
$(OBJS)\monolib_mediactrl.o: ../../src/msw/mediactrl.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $<
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $<
endif
-ifeq ($(USE_GUI),1)
-$(OBJS)\monolib_stdpaths.o: ../../src/msw/stdpaths.cpp
- $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $<
-endif
-
ifeq ($(USE_GUI),1)
$(OBJS)\monolib_timer.o: ../../src/msw/timer.cpp
$(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $<
$(OBJS)\basedll_snglinst.o: ../../src/msw/snglinst.cpp
$(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $<
+$(OBJS)\basedll_stdpaths.o: ../../src/msw/stdpaths.cpp
+ $(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $<
+
$(OBJS)\basedll_thread.o: ../../src/msw/thread.cpp
$(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $<
$(OBJS)\baselib_snglinst.o: ../../src/msw/snglinst.cpp
$(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $<
+$(OBJS)\baselib_stdpaths.o: ../../src/msw/stdpaths.cpp
+ $(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $<
+
$(OBJS)\baselib_thread.o: ../../src/msw/thread.cpp
$(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $<
$(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $<
endif
-ifeq ($(USE_GUI),1)
-$(OBJS)\coredll_stdpaths.o: ../../src/msw/stdpaths.cpp
- $(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $<
-endif
-
ifeq ($(USE_GUI),1)
$(OBJS)\coredll_timer.o: ../../src/msw/timer.cpp
$(CXX) -c -o $@ $(COREDLL_CXXFLAGS) $<
$(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $<
endif
-ifeq ($(USE_GUI),1)
-$(OBJS)\corelib_stdpaths.o: ../../src/msw/stdpaths.cpp
- $(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $<
-endif
-
ifeq ($(USE_GUI),1)
$(OBJS)\corelib_timer.o: ../../src/msw/timer.cpp
$(CXX) -c -o $@ $(CORELIB_CXXFLAGS) $<
$(OBJS)\mediadll_dummy.o: ../../src/msw/dummy.cpp
$(CXX) -c -o $@ $(MEDIADLL_CXXFLAGS) $<
+$(OBJS)\mediadll_mediactrlcmn.o: ../../src/common/mediactrlcmn.cpp
+ $(CXX) -c -o $@ $(MEDIADLL_CXXFLAGS) $<
+
$(OBJS)\mediadll_mediactrl.o: ../../src/msw/mediactrl.cpp
$(CXX) -c -o $@ $(MEDIADLL_CXXFLAGS) $<
$(OBJS)\medialib_dummy.o: ../../src/msw/dummy.cpp
$(CXX) -c -o $@ $(MEDIALIB_CXXFLAGS) $<
+$(OBJS)\medialib_mediactrlcmn.o: ../../src/common/mediactrlcmn.cpp
+ $(CXX) -c -o $@ $(MEDIALIB_CXXFLAGS) $<
+
$(OBJS)\medialib_mediactrl.o: ../../src/msw/mediactrl.cpp
$(CXX) -c -o $@ $(MEDIALIB_CXXFLAGS) $<
$(OBJS)\monodll_regconf.obj \
$(OBJS)\monodll_registry.obj \
$(OBJS)\monodll_snglinst.obj \
+ $(OBJS)\monodll_stdpaths.obj \
$(OBJS)\monodll_thread.obj \
$(OBJS)\monodll_utils.obj \
$(OBJS)\monodll_utilsexc.obj \
$(OBJS)\monolib_regconf.obj \
$(OBJS)\monolib_registry.obj \
$(OBJS)\monolib_snglinst.obj \
+ $(OBJS)\monolib_stdpaths.obj \
$(OBJS)\monolib_thread.obj \
$(OBJS)\monolib_utils.obj \
$(OBJS)\monolib_utilsexc.obj \
$(OBJS)\basedll_regconf.obj \
$(OBJS)\basedll_registry.obj \
$(OBJS)\basedll_snglinst.obj \
+ $(OBJS)\basedll_stdpaths.obj \
$(OBJS)\basedll_thread.obj \
$(OBJS)\basedll_utils.obj \
$(OBJS)\basedll_utilsexc.obj \
$(OBJS)\baselib_regconf.obj \
$(OBJS)\baselib_registry.obj \
$(OBJS)\baselib_snglinst.obj \
+ $(OBJS)\baselib_stdpaths.obj \
$(OBJS)\baselib_thread.obj \
$(OBJS)\baselib_utils.obj \
$(OBJS)\baselib_utilsexc.obj \
/Yu"wx/wxprec.h" /Fp"$(OBJS)\wxprec_mediadll.pch" $(CPPFLAGS) $(CXXFLAGS)
MEDIADLL_OBJECTS = \
$(OBJS)\mediadll_dummy.obj \
+ $(OBJS)\mediadll_mediactrlcmn.obj \
$(OBJS)\mediadll_mediactrl.obj
MEDIALIB_CXXFLAGS = /M$(__RUNTIME_LIBS)$(__DEBUGRUNTIME_213) /DWIN32 \
$(__DEBUGINFO) \
/Fp"$(OBJS)\wxprec_medialib.pch" $(CPPFLAGS) $(CXXFLAGS)
MEDIALIB_OBJECTS = \
$(OBJS)\medialib_dummy.obj \
+ $(OBJS)\medialib_mediactrlcmn.obj \
$(OBJS)\medialib_mediactrl.obj
ODBCDLL_CXXFLAGS = /M$(__RUNTIME_LIBS)$(__DEBUGRUNTIME_226) /DWIN32 \
$(__DEBUGINFO) \
$(OBJS)\monodll_sound.obj \
$(OBJS)\monodll_taskbar.obj \
$(OBJS)\monodll_joystick.obj \
+ $(OBJS)\monodll_mediactrlcmn.obj \
$(OBJS)\monodll_mediactrl.obj \
$(OBJS)\monodll_helpbest.obj \
$(OBJS)\monodll_helpctrl.obj \
$(OBJS)\monodll_region.obj \
$(OBJS)\monodll_renderer.obj \
$(OBJS)\monodll_settings.obj \
- $(OBJS)\monodll_stdpaths.obj \
$(OBJS)\monodll_timer.obj \
$(OBJS)\monodll_tooltip.obj \
$(OBJS)\monodll_toplevel.obj \
$(OBJS)\monodll_region.obj \
$(OBJS)\monodll_renderer.obj \
$(OBJS)\monodll_settings.obj \
- $(OBJS)\monodll_stdpaths.obj \
$(OBJS)\monodll_timer.obj \
$(OBJS)\monodll_tooltip.obj \
$(OBJS)\monodll_toplevel.obj \
$(OBJS)\monolib_sound.obj \
$(OBJS)\monolib_taskbar.obj \
$(OBJS)\monolib_joystick.obj \
+ $(OBJS)\monolib_mediactrlcmn.obj \
$(OBJS)\monolib_mediactrl.obj \
$(OBJS)\monolib_helpbest.obj \
$(OBJS)\monolib_helpctrl.obj \
$(OBJS)\monolib_region.obj \
$(OBJS)\monolib_renderer.obj \
$(OBJS)\monolib_settings.obj \
- $(OBJS)\monolib_stdpaths.obj \
$(OBJS)\monolib_timer.obj \
$(OBJS)\monolib_tooltip.obj \
$(OBJS)\monolib_toplevel.obj \
$(OBJS)\monolib_region.obj \
$(OBJS)\monolib_renderer.obj \
$(OBJS)\monolib_settings.obj \
- $(OBJS)\monolib_stdpaths.obj \
$(OBJS)\monolib_timer.obj \
$(OBJS)\monolib_tooltip.obj \
$(OBJS)\monolib_toplevel.obj \
$(OBJS)\coredll_region.obj \
$(OBJS)\coredll_renderer.obj \
$(OBJS)\coredll_settings.obj \
- $(OBJS)\coredll_stdpaths.obj \
$(OBJS)\coredll_timer.obj \
$(OBJS)\coredll_tooltip.obj \
$(OBJS)\coredll_toplevel.obj \
$(OBJS)\coredll_region.obj \
$(OBJS)\coredll_renderer.obj \
$(OBJS)\coredll_settings.obj \
- $(OBJS)\coredll_stdpaths.obj \
$(OBJS)\coredll_timer.obj \
$(OBJS)\coredll_tooltip.obj \
$(OBJS)\coredll_toplevel.obj \
$(OBJS)\corelib_region.obj \
$(OBJS)\corelib_renderer.obj \
$(OBJS)\corelib_settings.obj \
- $(OBJS)\corelib_stdpaths.obj \
$(OBJS)\corelib_timer.obj \
$(OBJS)\corelib_tooltip.obj \
$(OBJS)\corelib_toplevel.obj \
$(OBJS)\corelib_region.obj \
$(OBJS)\corelib_renderer.obj \
$(OBJS)\corelib_settings.obj \
- $(OBJS)\corelib_stdpaths.obj \
$(OBJS)\corelib_timer.obj \
$(OBJS)\corelib_tooltip.obj \
$(OBJS)\corelib_toplevel.obj \
$(OBJS)\monodll_snglinst.obj: ..\..\src\msw\snglinst.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $**
+$(OBJS)\monodll_stdpaths.obj: ..\..\src\msw\stdpaths.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $**
+
$(OBJS)\monodll_thread.obj: ..\..\src\msw\thread.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $**
$(OBJS)\monodll_joystick.obj: ..\..\src\msw\joystick.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $**
+$(OBJS)\monodll_mediactrlcmn.obj: ..\..\src\common\mediactrlcmn.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $**
+
$(OBJS)\monodll_mediactrl.obj: ..\..\src\msw\mediactrl.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $**
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $**
!endif
-!if "$(USE_GUI)" == "1"
-$(OBJS)\monodll_stdpaths.obj: ..\..\src\msw\stdpaths.cpp
- $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $**
-!endif
-
!if "$(USE_GUI)" == "1"
$(OBJS)\monodll_timer.obj: ..\..\src\msw\timer.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) $**
$(OBJS)\monolib_snglinst.obj: ..\..\src\msw\snglinst.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $**
+$(OBJS)\monolib_stdpaths.obj: ..\..\src\msw\stdpaths.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $**
+
$(OBJS)\monolib_thread.obj: ..\..\src\msw\thread.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $**
$(OBJS)\monolib_joystick.obj: ..\..\src\msw\joystick.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $**
+$(OBJS)\monolib_mediactrlcmn.obj: ..\..\src\common\mediactrlcmn.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $**
+
$(OBJS)\monolib_mediactrl.obj: ..\..\src\msw\mediactrl.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $**
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $**
!endif
-!if "$(USE_GUI)" == "1"
-$(OBJS)\monolib_stdpaths.obj: ..\..\src\msw\stdpaths.cpp
- $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $**
-!endif
-
!if "$(USE_GUI)" == "1"
$(OBJS)\monolib_timer.obj: ..\..\src\msw\timer.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) $**
$(OBJS)\basedll_snglinst.obj: ..\..\src\msw\snglinst.cpp
$(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) $**
+$(OBJS)\basedll_stdpaths.obj: ..\..\src\msw\stdpaths.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) $**
+
$(OBJS)\basedll_thread.obj: ..\..\src\msw\thread.cpp
$(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) $**
$(OBJS)\baselib_snglinst.obj: ..\..\src\msw\snglinst.cpp
$(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) $**
+$(OBJS)\baselib_stdpaths.obj: ..\..\src\msw\stdpaths.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) $**
+
$(OBJS)\baselib_thread.obj: ..\..\src\msw\thread.cpp
$(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) $**
$(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) $**
!endif
-!if "$(USE_GUI)" == "1"
-$(OBJS)\coredll_stdpaths.obj: ..\..\src\msw\stdpaths.cpp
- $(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) $**
-!endif
-
!if "$(USE_GUI)" == "1"
$(OBJS)\coredll_timer.obj: ..\..\src\msw\timer.cpp
$(CXX) /c /nologo /TP /Fo$@ $(COREDLL_CXXFLAGS) $**
$(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) $**
!endif
-!if "$(USE_GUI)" == "1"
-$(OBJS)\corelib_stdpaths.obj: ..\..\src\msw\stdpaths.cpp
- $(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) $**
-!endif
-
!if "$(USE_GUI)" == "1"
$(OBJS)\corelib_timer.obj: ..\..\src\msw\timer.cpp
$(CXX) /c /nologo /TP /Fo$@ $(CORELIB_CXXFLAGS) $**
$(OBJS)\mediadll_dummy.obj: ..\..\src\msw\dummy.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MEDIADLL_CXXFLAGS) /Ycwx/wxprec.h $**
+$(OBJS)\mediadll_mediactrlcmn.obj: ..\..\src\common\mediactrlcmn.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(MEDIADLL_CXXFLAGS) $**
+
$(OBJS)\mediadll_mediactrl.obj: ..\..\src\msw\mediactrl.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MEDIADLL_CXXFLAGS) $**
$(OBJS)\medialib_dummy.obj: ..\..\src\msw\dummy.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MEDIALIB_CXXFLAGS) /Ycwx/wxprec.h $**
+$(OBJS)\medialib_mediactrlcmn.obj: ..\..\src\common\mediactrlcmn.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(MEDIALIB_CXXFLAGS) $**
+
$(OBJS)\medialib_mediactrl.obj: ..\..\src\msw\mediactrl.cpp
$(CXX) /c /nologo /TP /Fo$@ $(MEDIALIB_CXXFLAGS) $**
$(OBJS)\monodll_sound.obj &
$(OBJS)\monodll_taskbar.obj &
$(OBJS)\monodll_joystick.obj &
+ $(OBJS)\monodll_mediactrlcmn.obj &
$(OBJS)\monodll_mediactrl.obj &
$(OBJS)\monodll_helpbest.obj &
$(OBJS)\monodll_helpctrl.obj &
$(OBJS)\monodll_region.obj &
$(OBJS)\monodll_renderer.obj &
$(OBJS)\monodll_settings.obj &
- $(OBJS)\monodll_stdpaths.obj &
$(OBJS)\monodll_timer.obj &
$(OBJS)\monodll_tooltip.obj &
$(OBJS)\monodll_toplevel.obj &
$(OBJS)\monodll_region.obj &
$(OBJS)\monodll_renderer.obj &
$(OBJS)\monodll_settings.obj &
- $(OBJS)\monodll_stdpaths.obj &
$(OBJS)\monodll_timer.obj &
$(OBJS)\monodll_tooltip.obj &
$(OBJS)\monodll_toplevel.obj &
$(OBJS)\monolib_sound.obj &
$(OBJS)\monolib_taskbar.obj &
$(OBJS)\monolib_joystick.obj &
+ $(OBJS)\monolib_mediactrlcmn.obj &
$(OBJS)\monolib_mediactrl.obj &
$(OBJS)\monolib_helpbest.obj &
$(OBJS)\monolib_helpctrl.obj &
$(OBJS)\monolib_region.obj &
$(OBJS)\monolib_renderer.obj &
$(OBJS)\monolib_settings.obj &
- $(OBJS)\monolib_stdpaths.obj &
$(OBJS)\monolib_timer.obj &
$(OBJS)\monolib_tooltip.obj &
$(OBJS)\monolib_toplevel.obj &
$(OBJS)\monolib_region.obj &
$(OBJS)\monolib_renderer.obj &
$(OBJS)\monolib_settings.obj &
- $(OBJS)\monolib_stdpaths.obj &
$(OBJS)\monolib_timer.obj &
$(OBJS)\monolib_tooltip.obj &
$(OBJS)\monolib_toplevel.obj &
$(OBJS)\coredll_region.obj &
$(OBJS)\coredll_renderer.obj &
$(OBJS)\coredll_settings.obj &
- $(OBJS)\coredll_stdpaths.obj &
$(OBJS)\coredll_timer.obj &
$(OBJS)\coredll_tooltip.obj &
$(OBJS)\coredll_toplevel.obj &
$(OBJS)\coredll_region.obj &
$(OBJS)\coredll_renderer.obj &
$(OBJS)\coredll_settings.obj &
- $(OBJS)\coredll_stdpaths.obj &
$(OBJS)\coredll_timer.obj &
$(OBJS)\coredll_tooltip.obj &
$(OBJS)\coredll_toplevel.obj &
$(OBJS)\corelib_region.obj &
$(OBJS)\corelib_renderer.obj &
$(OBJS)\corelib_settings.obj &
- $(OBJS)\corelib_stdpaths.obj &
$(OBJS)\corelib_timer.obj &
$(OBJS)\corelib_tooltip.obj &
$(OBJS)\corelib_toplevel.obj &
$(OBJS)\corelib_region.obj &
$(OBJS)\corelib_renderer.obj &
$(OBJS)\corelib_settings.obj &
- $(OBJS)\corelib_stdpaths.obj &
$(OBJS)\corelib_timer.obj &
$(OBJS)\corelib_tooltip.obj &
$(OBJS)\corelib_toplevel.obj &
$(OBJS)\monodll_regconf.obj &
$(OBJS)\monodll_registry.obj &
$(OBJS)\monodll_snglinst.obj &
+ $(OBJS)\monodll_stdpaths.obj &
$(OBJS)\monodll_thread.obj &
$(OBJS)\monodll_utils.obj &
$(OBJS)\monodll_utilsexc.obj &
$(OBJS)\monolib_regconf.obj &
$(OBJS)\monolib_registry.obj &
$(OBJS)\monolib_snglinst.obj &
+ $(OBJS)\monolib_stdpaths.obj &
$(OBJS)\monolib_thread.obj &
$(OBJS)\monolib_utils.obj &
$(OBJS)\monolib_utilsexc.obj &
$(OBJS)\basedll_regconf.obj &
$(OBJS)\basedll_registry.obj &
$(OBJS)\basedll_snglinst.obj &
+ $(OBJS)\basedll_stdpaths.obj &
$(OBJS)\basedll_thread.obj &
$(OBJS)\basedll_utils.obj &
$(OBJS)\basedll_utilsexc.obj &
$(OBJS)\baselib_regconf.obj &
$(OBJS)\baselib_registry.obj &
$(OBJS)\baselib_snglinst.obj &
+ $(OBJS)\baselib_stdpaths.obj &
$(OBJS)\baselib_thread.obj &
$(OBJS)\baselib_utils.obj &
$(OBJS)\baselib_utilsexc.obj &
/fh=$(OBJS)\wxprec_mediadll.pch $(__EXCEPTIONSFLAG) $(CPPFLAGS) $(CXXFLAGS)
MEDIADLL_OBJECTS = &
$(OBJS)\mediadll_dummy.obj &
+ $(OBJS)\mediadll_mediactrlcmn.obj &
$(OBJS)\mediadll_mediactrl.obj
MEDIALIB_CXXFLAGS = $(__DEBUGINFO) $(__OPTIMIZEFLAG) -bm $(__RUNTIME_LIBS) &
-d__WXMSW__ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) $(__UNICODE_DEFINE_p) &
$(__EXCEPTIONSFLAG) $(CPPFLAGS) $(CXXFLAGS)
MEDIALIB_OBJECTS = &
$(OBJS)\medialib_dummy.obj &
+ $(OBJS)\medialib_mediactrlcmn.obj &
$(OBJS)\medialib_mediactrl.obj
ODBCDLL_CXXFLAGS = -bd $(__DEBUGINFO) $(__OPTIMIZEFLAG) -bm $(__RUNTIME_LIBS) &
-d__WXMSW__ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) $(__UNICODE_DEFINE_p) &
$(OBJS)\monodll_snglinst.obj : .AUTODEPEND ..\..\src\msw\snglinst.cpp
$(CXX) -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
+$(OBJS)\monodll_stdpaths.obj : .AUTODEPEND ..\..\src\msw\stdpaths.cpp
+ $(CXX) -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
+
$(OBJS)\monodll_thread.obj : .AUTODEPEND ..\..\src\msw\thread.cpp
$(CXX) -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
$(OBJS)\monodll_joystick.obj : .AUTODEPEND ..\..\src\msw\joystick.cpp
$(CXX) -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
+$(OBJS)\monodll_mediactrlcmn.obj : .AUTODEPEND ..\..\src\common\mediactrlcmn.cpp
+ $(CXX) -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
+
$(OBJS)\monodll_mediactrl.obj : .AUTODEPEND ..\..\src\msw\mediactrl.cpp
$(CXX) -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
$(CXX) -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
!endif
-!ifeq USE_GUI 1
-$(OBJS)\monodll_stdpaths.obj : .AUTODEPEND ..\..\src\msw\stdpaths.cpp
- $(CXX) -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
-!endif
-
!ifeq USE_GUI 1
$(OBJS)\monodll_timer.obj : .AUTODEPEND ..\..\src\msw\timer.cpp
$(CXX) -zq -fo=$^@ $(MONODLL_CXXFLAGS) $<
$(OBJS)\monolib_snglinst.obj : .AUTODEPEND ..\..\src\msw\snglinst.cpp
$(CXX) -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
+$(OBJS)\monolib_stdpaths.obj : .AUTODEPEND ..\..\src\msw\stdpaths.cpp
+ $(CXX) -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
+
$(OBJS)\monolib_thread.obj : .AUTODEPEND ..\..\src\msw\thread.cpp
$(CXX) -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
$(OBJS)\monolib_joystick.obj : .AUTODEPEND ..\..\src\msw\joystick.cpp
$(CXX) -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
+$(OBJS)\monolib_mediactrlcmn.obj : .AUTODEPEND ..\..\src\common\mediactrlcmn.cpp
+ $(CXX) -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
+
$(OBJS)\monolib_mediactrl.obj : .AUTODEPEND ..\..\src\msw\mediactrl.cpp
$(CXX) -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
$(CXX) -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
!endif
-!ifeq USE_GUI 1
-$(OBJS)\monolib_stdpaths.obj : .AUTODEPEND ..\..\src\msw\stdpaths.cpp
- $(CXX) -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
-!endif
-
!ifeq USE_GUI 1
$(OBJS)\monolib_timer.obj : .AUTODEPEND ..\..\src\msw\timer.cpp
$(CXX) -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $<
$(OBJS)\basedll_snglinst.obj : .AUTODEPEND ..\..\src\msw\snglinst.cpp
$(CXX) -zq -fo=$^@ $(BASEDLL_CXXFLAGS) $<
+$(OBJS)\basedll_stdpaths.obj : .AUTODEPEND ..\..\src\msw\stdpaths.cpp
+ $(CXX) -zq -fo=$^@ $(BASEDLL_CXXFLAGS) $<
+
$(OBJS)\basedll_thread.obj : .AUTODEPEND ..\..\src\msw\thread.cpp
$(CXX) -zq -fo=$^@ $(BASEDLL_CXXFLAGS) $<
$(OBJS)\baselib_snglinst.obj : .AUTODEPEND ..\..\src\msw\snglinst.cpp
$(CXX) -zq -fo=$^@ $(BASELIB_CXXFLAGS) $<
+$(OBJS)\baselib_stdpaths.obj : .AUTODEPEND ..\..\src\msw\stdpaths.cpp
+ $(CXX) -zq -fo=$^@ $(BASELIB_CXXFLAGS) $<
+
$(OBJS)\baselib_thread.obj : .AUTODEPEND ..\..\src\msw\thread.cpp
$(CXX) -zq -fo=$^@ $(BASELIB_CXXFLAGS) $<
$(CXX) -zq -fo=$^@ $(COREDLL_CXXFLAGS) $<
!endif
-!ifeq USE_GUI 1
-$(OBJS)\coredll_stdpaths.obj : .AUTODEPEND ..\..\src\msw\stdpaths.cpp
- $(CXX) -zq -fo=$^@ $(COREDLL_CXXFLAGS) $<
-!endif
-
!ifeq USE_GUI 1
$(OBJS)\coredll_timer.obj : .AUTODEPEND ..\..\src\msw\timer.cpp
$(CXX) -zq -fo=$^@ $(COREDLL_CXXFLAGS) $<
$(CXX) -zq -fo=$^@ $(CORELIB_CXXFLAGS) $<
!endif
-!ifeq USE_GUI 1
-$(OBJS)\corelib_stdpaths.obj : .AUTODEPEND ..\..\src\msw\stdpaths.cpp
- $(CXX) -zq -fo=$^@ $(CORELIB_CXXFLAGS) $<
-!endif
-
!ifeq USE_GUI 1
$(OBJS)\corelib_timer.obj : .AUTODEPEND ..\..\src\msw\timer.cpp
$(CXX) -zq -fo=$^@ $(CORELIB_CXXFLAGS) $<
$(OBJS)\mediadll_dummy.obj : .AUTODEPEND ..\..\src\msw\dummy.cpp
$(CXX) -zq -fo=$^@ $(MEDIADLL_CXXFLAGS) $<
+$(OBJS)\mediadll_mediactrlcmn.obj : .AUTODEPEND ..\..\src\common\mediactrlcmn.cpp
+ $(CXX) -zq -fo=$^@ $(MEDIADLL_CXXFLAGS) $<
+
$(OBJS)\mediadll_mediactrl.obj : .AUTODEPEND ..\..\src\msw\mediactrl.cpp
$(CXX) -zq -fo=$^@ $(MEDIADLL_CXXFLAGS) $<
$(OBJS)\medialib_dummy.obj : .AUTODEPEND ..\..\src\msw\dummy.cpp
$(CXX) -zq -fo=$^@ $(MEDIALIB_CXXFLAGS) $<
+$(OBJS)\medialib_mediactrlcmn.obj : .AUTODEPEND ..\..\src\common\mediactrlcmn.cpp
+ $(CXX) -zq -fo=$^@ $(MEDIALIB_CXXFLAGS) $<
+
$(OBJS)\medialib_mediactrl.obj : .AUTODEPEND ..\..\src\msw\mediactrl.cpp
$(CXX) -zq -fo=$^@ $(MEDIALIB_CXXFLAGS) $<
# End Source File
# Begin Source File
+SOURCE=..\..\src\msw\stdpaths.cpp
+# End Source File
+# Begin Source File
+
SOURCE=..\..\src\msw\thread.cpp
# End Source File
# Begin Source File
# End Source File
# Begin Source File
-SOURCE=..\..\src\msw\stdpaths.cpp
-# End Source File
-# Begin Source File
-
SOURCE=..\..\src\msw\tabctrl.cpp
!IF "$(CFG)" == "core - Win32 DLL Universal Unicode Release"
# End Source File
# Begin Source File
-SOURCE=..\..\include\wx\msw\mediactrl.h
-# End Source File
-# Begin Source File
-
SOURCE=..\..\include\wx\msw\menu.h
# End Source File
# Begin Source File
# Name "media - Win32 Unicode Debug"
# Name "media - Win32 Release"
# Name "media - Win32 Debug"
+# Begin Group "Common Sources"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\..\src\common\mediactrlcmn.cpp
+# End Source File
+# End Group
# Begin Group "MSW Sources"
# PROP Default_Filter ""
!ENDIF
-# End Source File
-# End Group
-# Begin Group "MSW Headers"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=..\..\include\wx\msw\mediactrl.h
# End Source File
# End Group
# Begin Group "Common Headers"
+++ /dev/null
-/////////////////////////////////////////////////////////////////////////////
-// Name: wx/msw/moviectrl.h
-// Purpose: wxMediaCtrl mac
-// Author: Ryan Norton <wxprojects@comcast.net>
-// Modified by:
-// Created: 11/07/04
-// RCS-ID: $Id$
-// Copyright: (c) Ryan Norton
-// Licence: wxWindows licence
-/////////////////////////////////////////////////////////////////////////////
-
-#include "wx/defs.h"
-
-#if wxUSE_MEDIACTRL
-
-#include "wx/control.h"
-#include "wx/uri.h"
-
-#ifdef __WXMSW__
- typedef struct MovieRecord* WXMOVIE;
-#else
- typedef struct MovieType** WXMOVIE;
-#endif
-
-enum wxMediaState
-{
- wxMEDIASTATE_STOPPED,
- wxMEDIASTATE_PAUSED,
- wxMEDIASTATE_PLAYING
-};
-
-
-class wxMediaCtrl : public wxControl
-{
-public:
- wxMediaCtrl() : m_bLoaded(false)
- { }
-
- wxMediaCtrl(wxWindow* parent, wxWindowID id, const wxString& fileName,
- const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
- long style = 0, long driver = 0, const wxString& name = wxPanelNameStr) : m_bLoaded(false)
- { Create(parent, id, fileName, pos, size, style, driver, name); }
-
-
- wxMediaCtrl(wxWindow* parent, wxWindowID id, const wxURI& location,
- const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
- long style = 0, long driver = 0, const wxString& name = wxPanelNameStr) : m_bLoaded(false)
- { Create(parent, id, location, pos, size, style, driver, name); }
-
- ~wxMediaCtrl();
-
- bool Create(wxWindow* parent, wxWindowID id, const wxString& fileName,
- const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
- long style = 0, long driver = 0, const wxString& name = wxPanelNameStr);
-
- bool Create(wxWindow* parent, wxWindowID id, const wxURI& location,
- const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
- long style = 0, long driver = 0, const wxString& name = wxPanelNameStr);
-
- bool Play();
- bool Pause();
- bool Stop();
-
- bool Load(const wxString& fileName);
- bool Load(const wxURI& location);
-
- wxMediaState GetState();
-
- double GetPlaybackRate();
- bool SetPlaybackRate(double dRate);
-
- bool SetPosition(long where);
- long GetPosition();
- long GetDuration();
-
-protected:
- virtual void DoMoveWindow(int x, int y, int w, int h);
- bool DoCreate(wxWindow* parent, wxWindowID id,
- const wxPoint& pos, const wxSize& size,
- long style, const wxString& name);
-
- wxSize DoGetBestSize() const;
- bool InitQT();
- void Cleanup();
- void FinishLoad();
-
- bool m_bLoaded;
-
- WXMOVIE m_movie;
- wxSize m_bestSize;
- class _wxQTTimer* m_timer;
-
- friend class _wxQTTimer;
-
- DECLARE_DYNAMIC_CLASS(wxMediaCtrl);
-};
-
-//Event stuff
-class WXDLLEXPORT wxMediaEvent : public wxNotifyEvent
-{
-public:
- wxMediaEvent(wxEventType commandType = wxEVT_NULL, int id = 0)
- : wxNotifyEvent(commandType, id)
- { }
-
- wxMediaEvent(const wxMediaEvent &clone)
- : wxNotifyEvent(clone.GetEventType(), clone.GetId())
- { }
-
- virtual wxEvent *Clone() const { return new wxMediaEvent(*this); }
-
- DECLARE_DYNAMIC_CLASS(wxMediaEvent)
-};
-
-#define wxMEDIA_FINISHED_ID 13000
-DECLARE_EVENT_TYPE(wxEVT_MEDIA_FINISHED, wxMEDIA_FINISHED_ID)
-typedef void (wxEvtHandler::*wxMediaEventFunction)(wxMediaEvent&);
-#define EVT_MEDIA_FINISHED(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_FINISHED, winid, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) (wxMediaEventFunction) & fn, (wxObject *) NULL ),
-
-#endif // wxUSE_MOVIECTRL
\ No newline at end of file
-/////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
// Name: wx/mediactrl.h
// Purpose: wxMediaCtrl class
// Author: Ryan Norton <wxprojects@comcast.net>
// RCS-ID: $Id$
// Copyright: (c) Ryan Norton
// Licence: wxWindows licence
-/////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
-#if defined(__WXMSW__)
-#include "wx/msw/mediactrl.h"
-#elif defined(__WXMAC__)
-#include "wx/mac/carbon/mediactrl.h"
+// ============================================================================
+// Definitions
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// Header guard
+// ----------------------------------------------------------------------------
+#ifndef _WX_MEDIACTRL_H_
+#define _WX_MEDIACTRL_H_
+
+// ----------------------------------------------------------------------------
+// Pre-compiled header stuff
+// ----------------------------------------------------------------------------
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
+#pragma interface "mediactrl.h"
#endif
+// ----------------------------------------------------------------------------
+// Compilation guard
+// ----------------------------------------------------------------------------
+#if wxUSE_MEDIACTRL
+
+// ----------------------------------------------------------------------------
+// Includes
+// ----------------------------------------------------------------------------
+
+#include "wx/control.h"
+#include "wx/uri.h"
+
+// ============================================================================
+// Declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+//
+// Enumerations
+//
+// ----------------------------------------------------------------------------
+
+enum wxMediaState
+{
+ wxMEDIASTATE_STOPPED,
+ wxMEDIASTATE_PAUSED,
+ wxMEDIASTATE_PLAYING
+};
+
+enum wxMediaTimeFormat
+{
+ wxMEDIATIMEFORMAT_TIME
+};
+
+#define wxMEDIABACKEND_DIRECTSHOW wxT("wxAMMediaBackend")
+#define wxMEDIABACKEND_MCI wxT("wxMCIMediaBackend")
+#define wxMEDIABACKEND_QUICKTIME wxT("wxQTMediaBackend")
+
+// ----------------------------------------------------------------------------
+//
+// wxMediaCtrl
+//
+// ----------------------------------------------------------------------------
+
+class wxMediaCtrl : public wxControl
+{
+public:
+ wxMediaCtrl() : m_imp(NULL), m_bLoaded(false), m_bLoop(false)
+ { }
+
+ wxMediaCtrl(wxWindow* parent, wxWindowID id,
+ const wxString& fileName = wxT(""),
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = 0,
+ const wxString& szBackend = wxT(""),
+ const wxValidator& validator = wxDefaultValidator,
+ const wxString& name = wxT("mediaCtrl"))
+ : m_imp(NULL), m_bLoaded(false), m_bLoop(false)
+ { Create(parent, id, fileName, pos, size, style,
+ szBackend, validator, name); }
+
+ wxMediaCtrl(wxWindow* parent, wxWindowID id,
+ const wxURI& location,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = 0,
+ const wxString& szBackend = wxT(""),
+ const wxValidator& validator = wxDefaultValidator,
+ const wxString& name = wxT("mediaCtrl"))
+ : m_imp(NULL), m_bLoop(false)
+ { Create(parent, id, location, pos, size, style,
+ szBackend, validator, name); }
+
+ ~wxMediaCtrl();
+
+ bool Create(wxWindow* parent, wxWindowID id,
+ const wxString& fileName = wxT(""),
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = 0,
+ const wxString& szBackend = wxT(""),
+ const wxValidator& validator = wxDefaultValidator,
+ const wxString& name = wxT("mediaCtrl"));
+
+ bool Create(wxWindow* parent, wxWindowID id,
+ const wxURI& location,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = 0,
+ const wxString& szBackend = wxT(""),
+ const wxValidator& validator = wxDefaultValidator,
+ const wxString& name = wxT("mediaCtrl"));
+
+ bool DoCreate(wxClassInfo* instance,
+ wxWindow* parent, wxWindowID id,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ long style = 0,
+ const wxValidator& validator = wxDefaultValidator,
+ const wxString& name = wxT("mediaCtrl"));
+
+ static wxClassInfo* NextBackend();
+
+
+ bool Play();
+ bool Pause();
+ bool Stop();
+
+ bool Load(const wxString& fileName);
+ bool Load(const wxURI& location);
+
+ void Loop(bool bLoop = true);
+ bool IsLooped();
+
+ wxMediaState GetState();
+
+ double GetPlaybackRate();
+ bool SetPlaybackRate(double dRate);
+
+ bool SetPosition(wxLongLong where);
+ wxLongLong GetPosition();
+ wxLongLong GetDuration();
+
+protected:
+ void OnMediaFinished(const class wxMediaEvent& evt);
+ virtual void DoMoveWindow(int x, int y, int w, int h);
+ wxSize DoGetBestSize() const;
+
+ class wxMediaBackend* m_imp;
+ bool m_bLoaded;
+ bool m_bLoop;
+
+ DECLARE_DYNAMIC_CLASS(wxMediaCtrl);
+};
+
+// ----------------------------------------------------------------------------
+//
+// wxMediaBackend
+//
+// Currently an internal class - API stability not gauranteed.
+//
+// ----------------------------------------------------------------------------
+
+class wxMediaBackend : public wxObject
+{
+public:
+ wxMediaBackend()
+ { }
+
+ virtual ~wxMediaBackend();
+
+ virtual bool CreateControl(wxControl* ctrl, wxWindow* parent,
+ wxWindowID id,
+ const wxPoint& pos, const wxSize& size,
+ long style,
+ const wxValidator& validator,
+ const wxString& name)
+ { return false; }
+
+ virtual bool Play()
+ { return false; }
+ virtual bool Pause()
+ { return false; }
+ virtual bool Stop()
+ { return false; }
+
+ virtual bool Load(const wxString& WXUNUSED(fileName))
+ { return false; }
+ virtual bool Load(const wxURI& WXUNUSED(location))
+ { return false; }
+
+ virtual bool SetPosition(wxLongLong WXUNUSED(where))
+ { return 0; }
+ virtual wxLongLong GetPosition()
+ { return 0; }
+ virtual wxLongLong GetDuration()
+ { return 0; }
+
+ virtual void Move(int WXUNUSED(x), int WXUNUSED(y),
+ int WXUNUSED(w), int WXUNUSED(h))
+ { }
+ virtual wxSize GetVideoSize() const
+ { return wxSize(0,0); }
+
+ virtual double GetPlaybackRate()
+ { return 0.0; }
+ virtual bool SetPlaybackRate(double WXUNUSED(dRate))
+ { return false; }
+
+ virtual wxMediaState GetState()
+ { return wxMEDIASTATE_STOPPED; }
+
+ DECLARE_CLASS(wxMediaBackend)
+};
+
+// ----------------------------------------------------------------------------
+//
+// wxMediaEvent
+//
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxMediaEvent : public wxNotifyEvent
+{
+public:
+ // ------------------------------------------------------------------------
+ // wxMediaEvent Constructor
+ //
+ // Normal constructor, much the same as wxNotifyEvent
+ // ------------------------------------------------------------------------
+ wxMediaEvent(wxEventType commandType = wxEVT_NULL, int id = 0)
+ : wxNotifyEvent(commandType, id)
+ { }
+
+ // ------------------------------------------------------------------------
+ // wxMediaEvent Copy Constructor
+ //
+ // Normal copy constructor, much the same as wxNotifyEvent
+ // ------------------------------------------------------------------------
+ wxMediaEvent(const wxMediaEvent &clone)
+ : wxNotifyEvent(clone)
+ { }
+
+ // ------------------------------------------------------------------------
+ // wxMediaEvent::Clone
+ //
+ // Allocates a copy of this object.
+ // Required for wxEvtHandler::AddPendingEvent
+ // ------------------------------------------------------------------------
+ virtual wxEvent *Clone() const
+ { return new wxMediaEvent(*this); }
+
+
+ // Put this class on wxWidget's RTTI table
+ DECLARE_DYNAMIC_CLASS(wxMediaEvent)
+};
+
+//Event ID to give to our events
+#define wxMEDIA_FINISHED_ID 13000
+#define wxMEDIA_STOP_ID 13001
+
+//Define our event types - we need to call DEFINE_EVENT_TYPE(EVT) later
+DECLARE_EVENT_TYPE(wxEVT_MEDIA_FINISHED, wxMEDIA_FINISHED_ID)
+DECLARE_EVENT_TYPE(wxEVT_MEDIA_STOP, wxMEDIA_STOP_ID)
+
+//Function type(s) our events need
+typedef void (wxEvtHandler::*wxMediaEventFunction)(wxMediaEvent&);
+
+//Macro for usage with message maps
+#define EVT_MEDIA_FINISHED(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_FINISHED, winid, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) (wxMediaEventFunction) & fn, (wxObject *) NULL ),
+#define EVT_MEDIA_STOP(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_STOP, winid, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) (wxMediaEventFunction) & fn, (wxObject *) NULL ),
+
+// ----------------------------------------------------------------------------
+// End compilation gaurd
+// ----------------------------------------------------------------------------
+#endif // wxUSE_MEDIACTRL
+
+// ----------------------------------------------------------------------------
+// End header guard and header itself
+// ----------------------------------------------------------------------------
+#endif // _WX_MEDIACTRL_H_
+
+
+++ /dev/null
-/////////////////////////////////////////////////////////////////////////////
-// Name: wx/msw/mediactrl.h
-// Purpose: DirectX7+ wxMediaCtrl MSW
-// Author: Ryan Norton <wxprojects@comcast.net>
-// Modified by:
-// Created: 11/07/04
-// RCS-ID: $Id$
-// Copyright: (c) Ryan Norton
-// Licence: wxWindows licence
-/////////////////////////////////////////////////////////////////////////////
-
-#include "wx/defs.h"
-
-#if wxUSE_MEDIACTRL
-
-#include "wx/control.h"
-#include "wx/uri.h"
-
-enum wxMediaState
-{
- wxMEDIASTATE_STOPPED,
- wxMEDIASTATE_PAUSED,
- wxMEDIASTATE_PLAYING
-};
-
-class wxMediaCtrl : public wxControl
-{
-public:
- wxMediaCtrl() : m_imp(NULL)
- { }
-
- wxMediaCtrl(wxWindow* parent, wxWindowID id, const wxString& fileName,
- const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
- long style = 0, long driver = 0, const wxString& name = wxPanelNameStr) : m_imp(NULL)
- { Create(parent, id, fileName, pos, size, style, driver, name); }
-
-
- wxMediaCtrl(wxWindow* parent, wxWindowID id, const wxURI& location,
- const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
- long style = 0, long driver = 0, const wxString& name = wxPanelNameStr) : m_imp(NULL)
- { Create(parent, id, location, pos, size, style, driver, name); }
-
- ~wxMediaCtrl();
-
- bool Create(wxWindow* parent, wxWindowID id, const wxString& fileName,
- const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
- long style = 0, long driver = 0, const wxString& name = wxPanelNameStr);
-
- bool Create(wxWindow* parent, wxWindowID id, const wxURI& location,
- const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
- long style = 0, long driver = 0, const wxString& name = wxPanelNameStr);
-
- bool Play();
- bool Pause();
- bool Stop();
-
- bool Load(const wxString& fileName);
- bool Load(const wxURI& location);
-
- wxMediaState GetState();
-
- double GetPlaybackRate();
- bool SetPlaybackRate(double dRate);
-
- bool SetPosition(long where);
- long GetPosition();
- long GetDuration();
-
-protected:
- virtual void DoMoveWindow(int x, int y, int w, int h);
- wxSize DoGetBestSize() const;
-
- //msw-specific - we need to overload the window proc
- WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
-
- class wxMediaCtrlImpl* m_imp;
- bool m_bLoaded;
-
- DECLARE_DYNAMIC_CLASS(wxMediaCtrl);
-};
-
-//Event stuff
-class WXDLLEXPORT wxMediaEvent : public wxNotifyEvent
-{
-public:
- wxMediaEvent(wxEventType commandType = wxEVT_NULL, int id = 0)
- : wxNotifyEvent(commandType, id)
- { }
-
- wxMediaEvent(const wxMediaEvent &clone)
- : wxNotifyEvent(clone.GetEventType(), clone.GetId())
- { }
-
- virtual wxEvent *Clone() const { return new wxMediaEvent(*this); }
-
- DECLARE_DYNAMIC_CLASS(wxMediaEvent)
-};
-
-#define wxMEDIA_FINISHED_ID 13000
-DECLARE_EVENT_TYPE(wxEVT_MEDIA_FINISHED, wxMEDIA_FINISHED_ID)
-typedef void (wxEvtHandler::*wxMediaEventFunction)(wxMediaEvent&);
-#define EVT_MEDIA_FINISHED(winid, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_MEDIA_FINISHED, winid, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) (wxMediaEventFunction) & fn, (wxObject *) NULL ),
-
-#endif // wxUSE_MEDIACTRL
-
-/////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
// Name: mediaplayer.cpp
// Purpose: wxMediaCtrl sample
// Author: Ryan Norton
// RCS-ID: $Id$
// Copyright: (c) Ryan Norton
// Licence: wxWindows licence
-/////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+
+// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+// MediaPlayer
+//
+// This is a simple example of how to use all the funtionality of
+// the wxMediaCtrl class in wxWidgets.
+//
+// To use this sample, simply select Open File from the file menu,
+// select the file you want to play - and MediaPlayer will play the file,
+// showing video if neccessary.
+//
+// You can select one of the menu options, or move the slider around
+// to manipulate what is playing.
+// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// ============================================================================
-// declarations
+// Definitions
// ============================================================================
// ----------------------------------------------------------------------------
-// headers
+// Pre-compiled header stuff
// ----------------------------------------------------------------------------
#include "wx/wxprec.h"
#endif
// ----------------------------------------------------------------------------
-// resources
+// Headers
// ----------------------------------------------------------------------------
#include "wx/mediactrl.h" //for wxMediaCtrl
#include "wx/timer.h" //timer for updating status bar
#include "wx/textdlg.h" //for getting user text from OpenURL
+// ----------------------------------------------------------------------------
+// Bail out if the user doesn't want one of the
+// things we need
+// ----------------------------------------------------------------------------
-#if !wxUSE_MEDIACTRL
-#error "wxUSE_MEDIACTRL must be enabled to use this sample!"
+#if !wxUSE_GUI
+#error "This is a GUI sample"
#endif
-// ----------------------------------------------------------------------------
+#if !wxUSE_MEDIACTRL || !wxUSE_MENUS || !wxUSE_SLIDER || !wxUSE_TIMER
+#error "menus, slider, mediactrl, and timers must all enabled for this sample!"
+#endif
+
+// ============================================================================
// Declarations
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// Enumurations
+// ----------------------------------------------------------------------------
+
+// IDs for the controls and the menu commands
+enum
+{
+ // menu items
+ wxID_LOOP = 1,
+ wxID_OPENFILE,
+ wxID_PLAY,
+ wxID_PAUSE,
+// wxID_STOP, [built-in to wxWidgets]
+// wxID_ABOUT, [built-in to wxWidgets]
+// wxID_EXIT, [built-in to wxWidgets]
+
+ // id for our slider
+ wxID_SLIDER,
+
+ // id for our wxMediaCtrl
+ wxID_MEDIACTRL
+};
+
+// ----------------------------------------------------------------------------
+// MyApp
// ----------------------------------------------------------------------------
class MyApp : public wxApp
virtual bool OnInit();
};
+// ----------------------------------------------------------------------------
+// MyFrame
+// ----------------------------------------------------------------------------
+
class MyFrame : public wxFrame
{
public:
- // ctor(s)
+ // Ctor/Dtor
MyFrame(const wxString& title);
~MyFrame();
- // event handlers (these functions should _not_ be virtual)
+ // Menu event handlers
void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
void OnLoop(wxCommandEvent& event);
void OnPause(wxCommandEvent& event);
void OnStop(wxCommandEvent& event);
+ // Slider event handlers
void OnSeek(wxCommandEvent& event);
- void OnMediaFinished(wxMediaEvent& event);
+ // Media event handlers
+ void OnMediaStop(wxMediaEvent& event);
private:
+ // Rebuild base status string (see Implementation)
void ResetStatus();
- wxMediaCtrl* m_mediactrl;
- wxSlider* m_slider;
- wxBoxSizer* m_sizer;
- class MyTimer* m_timer;
+ wxMediaCtrl* m_mediactrl; //Our media control
+ wxSlider* m_slider; //The slider below our media control
+ class MyTimer* m_timer; //Timer to write info to status bar
+ wxString m_basestatus; //Base status string (see ResetStatus())
+ int m_nLoops; //Counter, incremented each time media loops
+
+ // So that mytimer can access MyFrame's members
friend class MyTimer;
- wxString m_basestatus;
+};
- bool m_bLoop;
+// ----------------------------------------------------------------------------
+// MyTimer
+// ----------------------------------------------------------------------------
+
+class MyTimer : public wxTimer
+{
+public:
+ //Ctor
+ MyTimer(MyFrame* frame) {m_frame = frame;}
- // any class wishing to process wxWidgets events must use this macro
- DECLARE_EVENT_TABLE()
+ //Called each time the timer's timeout expires
+ void Notify();
+
+ MyFrame* m_frame; //The MyFrame
};
+// ============================================================================
//
-//ResetStatus
-//-----------
-//Here we just make a simple status string
-//with some useful info about the media
-//We display info here in seconds (wxMediaCtrl
-//uses milliseconds - that's why we divide by 1000)
+// Implementation
//
-void MyFrame::ResetStatus()
-{
- m_basestatus = wxString::Format(_T("Size(x,y):%i,%i Length(Seconds):%u Speed:%1.1fx"),
- m_mediactrl->GetBestSize().x,
- m_mediactrl->GetBestSize().y,
- (unsigned)(m_mediactrl->GetDuration() / 1000),
- m_mediactrl->GetPlaybackRate()
- );
-
- m_slider->SetRange(0, m_mediactrl->GetDuration() / 1000);
-}
+// ============================================================================
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+//
+// [Functions]
//
-//wxGetMediaStateText
-//-------------------
-//Converts a wxMediaCtrl state into something
-//useful that we can display
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+// ----------------------------------------------------------------------------
+// wxGetMediaStateText
//
+// Converts a wxMediaCtrl state into something useful that we can display
+// to the user
+// ----------------------------------------------------------------------------
const wxChar* wxGetMediaStateText(int nState)
{
switch(nState)
}
}
-class MyTimer : public wxTimer
-{
-public:
- MyTimer(MyFrame* frame) {m_frame = frame;}
-
- //
- //Notify
- //-----------
- //Updates the main frame's status bar with the current
- //position within the media and state the media is in
- //
- void Notify()
- {
- long lPosition = m_frame->m_mediactrl->GetPosition() / 1000;
- m_frame->m_slider->SetValue(lPosition);
-
- m_frame->SetStatusText(wxString::Format(_T("%s Pos:%u State:%s"),
- m_frame->m_basestatus.c_str(),
- (unsigned int)lPosition,
- wxGetMediaStateText(m_frame->m_mediactrl->GetState())
- )
- );
- }
-
- MyFrame* m_frame;
-};
-
-
-// ----------------------------------------------------------------------------
-// constants
-// ----------------------------------------------------------------------------
-
-// IDs for the controls and the menu commands
-enum
-{
- // menu items
- Minimal_Quit = wxID_EXIT,
- Minimal_Loop,
- Minimal_OpenFile,
- Minimal_Play,
- Minimal_Pause,
- Minimal_Stop,
- Minimal_About = wxID_ABOUT,
-
- // id for our slider
- Minimal_Slider = 1,
-
- // id for our wxMediaCtrl
- Minimal_Media
-};
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+//
+// MyApp
+//
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ----------------------------------------------------------------------------
-// event tables and other macros for wxWidgets
+// This sets up this wxApp as the global wxApp that gui calls in wxWidgets
+// use. For example, if you were to be in windows and use a file dialog,
+// wxWidgets would use wxTheApp->GetHInstance() which would get the instance
+// handle of the application. These routines in wx _DO NOT_ check to see if
+// the wxApp exists, and thus will crash the application if you try it.
+//
+// IMPLEMENT_APP does this, and also implements the platform-specific entry
+// routine, such as main or WinMain(). Use IMPLEMENT_APP_NO_MAIN if you do
+// not desire this behavior.
// ----------------------------------------------------------------------------
-
-BEGIN_EVENT_TABLE(MyFrame, wxFrame)
- //Menu events
- EVT_MENU(Minimal_Quit, MyFrame::OnQuit)
- EVT_MENU(Minimal_About, MyFrame::OnAbout)
- EVT_MENU(Minimal_Loop, MyFrame::OnLoop)
- EVT_MENU(Minimal_OpenFile, MyFrame::OnOpenFile)
- EVT_MENU(Minimal_Play, MyFrame::OnPlay)
- EVT_MENU(Minimal_Pause, MyFrame::OnPause)
- EVT_MENU(Minimal_Stop, MyFrame::OnStop)
-
- //Slider events
- EVT_SLIDER(Minimal_Slider, MyFrame::OnSeek)
-
- //wxMediaCtrl events
- EVT_MEDIA_FINISHED(Minimal_Media, MyFrame::OnMediaFinished)
-END_EVENT_TABLE()
-
-//main/WinMain()
IMPLEMENT_APP(MyApp)
-// ============================================================================
-// implementation
-// ============================================================================
// ----------------------------------------------------------------------------
-// MyApp
+// MyApp::OnInit
+//
+// Where execution starts - akin to a main or WinMain.
+// 1) Create the frame and show it to the user
+// 2) return true specifying that we want execution to continue past OnInit
// ----------------------------------------------------------------------------
-
-// 'Main program' equivalent: the program execution "starts" here
bool MyApp::OnInit()
{
- MyFrame *frame = new MyFrame(_T("Minimal wxWidgets App"));
+ MyFrame *frame = new MyFrame(_T("MediaPlayer wxWidgets Sample"));
frame->Show(true);
return true;
}
-// ----------------------------------------------------------------------------
-// main frame
-// ----------------------------------------------------------------------------
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+//
+// MyFrame
//
-//MyFrame
-//-------
-//Creates our menus and controls
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+// ----------------------------------------------------------------------------
+// MyFrame Constructor
//
+// 1) Create our menus
+// 2) Create our controls and add them to some sizers
+// 3) Create our status bar
+// 4) Connect our events
+// 5) Start our timer
+// ----------------------------------------------------------------------------
MyFrame::MyFrame(const wxString& title)
- : wxFrame(NULL, wxID_ANY, title), m_timer(NULL)
+ : wxFrame(NULL, wxID_ANY, title)
{
//
// Create Menus
//
-#if wxUSE_MENUS
wxMenu *menuFile = new wxMenu;
wxMenu *helpMenu = new wxMenu;
- helpMenu->Append(Minimal_About, _T("&About...\tF1"), _T("Show about dialog"));
+ helpMenu->Append(wxID_ABOUT,
+ _T("&About...\tF1"),
+ _T("Show about dialog"));
- menuFile->Append(Minimal_OpenFile, _T("&Open File"), _T("Open a File"));
+ menuFile->Append(wxID_OPENFILE, _T("&Open File"), _T("Open a File"));
menuFile->AppendSeparator();
- menuFile->Append(Minimal_Play, _T("&Play"), _T("Resume playback"));
- menuFile->Append(Minimal_Pause, _T("P&ause"), _T("Pause playback"));
- menuFile->Append(Minimal_Stop, _T("&Stop"), _T("Stop playback"));
+ menuFile->Append(wxID_PLAY, _T("&Play"), _T("Resume playback"));
+ menuFile->Append(wxID_PAUSE, _T("P&ause"), _T("Pause playback"));
+ menuFile->Append(wxID_STOP, _T("&Stop"), _T("Stop playback"));
menuFile->AppendSeparator();
- menuFile->AppendCheckItem(Minimal_Loop, _T("&Loop"), _T("Loop Selected Media"));
+ menuFile->AppendCheckItem(wxID_LOOP,
+ _T("&Loop"),
+ _T("Loop Selected Media"));
menuFile->AppendSeparator();
- menuFile->Append(Minimal_Quit, _T("E&xit\tAlt-X"), _T("Quit this program"));
+ menuFile->Append(wxID_EXIT,
+ _T("E&xit\tAlt-X"),
+ _T("Quit this program"));
wxMenuBar *menuBar = new wxMenuBar();
menuBar->Append(menuFile, _T("&File"));
menuBar->Append(helpMenu, _T("&Help"));
SetMenuBar(menuBar);
-#endif // wxUSE_MENUS
//
// Create and attach the first/main sizer
//
-
- m_sizer = new wxBoxSizer(wxVERTICAL);
- this->SetSizer(m_sizer);
+ wxBoxSizer* vertsizer = new wxBoxSizer(wxVERTICAL);
+ this->SetSizer(vertsizer);
this->SetAutoLayout(true);
//
// Create our media control
//
-
- m_mediactrl = new wxMediaCtrl(this, Minimal_Media, wxT(""));
- m_sizer->Add(m_mediactrl, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
+ m_mediactrl = new wxMediaCtrl(this, wxID_MEDIACTRL);
+ vertsizer->Add(m_mediactrl, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
//
// Create our slider
//
-
- m_slider = new wxSlider(this, Minimal_Slider, 0, //init
+ m_slider = new wxSlider(this, wxID_SLIDER, 0, //init
0, //start
0, //end
wxDefaultPosition, wxDefaultSize,
wxSL_HORIZONTAL );
- m_sizer->Add(m_slider, 0, wxALIGN_CENTER_HORIZONTAL|wxALL|wxEXPAND , 5);
+ vertsizer->Add(m_slider, 0, wxALIGN_CENTER_HORIZONTAL|wxALL|wxEXPAND , 5);
//
//
// [m_slider]
//
-
wxBoxSizer* horzsizer = new wxBoxSizer(wxHORIZONTAL);
- m_sizer->Add(horzsizer, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
-
- //
- // We arn't looping initially
- //
-
- m_bLoop = false;
+ vertsizer->Add(horzsizer, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
//
// Create our status bar
ResetStatus();
SetStatusText(m_basestatus);
#endif // wxUSE_STATUSBAR
+
+ //
+ // Connect events.
+ //
+ // There are two ways in wxWidgets to use events -
+ // Message Maps and Connections.
+ //
+ // Message Maps are implemented by putting
+ // DECLARE_MESSAGE_MAP in your wxEvtHandler-derived
+ // class you want to use for events, such as MyFrame.
+ //
+ // Then after your class declaration you put
+ // BEGIN_EVENT_TABLE(MyFrame, wxFrame)
+ // EVT_XXX(XXX)...
+ // END_EVENT_TABLE()
+ //
+ // Where MyFrame is the class with the DECLARE_MESSAGE_MAP
+ // in it. EVT_XXX(XXX) are each of your handlers, such
+ // as EVT_MENU for menu events and the XXX inside
+ // is the parameters to the event macro - in the case
+ // of EVT_MENU the menu id and then the function to call.
+ //
+ // However, with wxEvtHandler::Connect you can avoid a
+ // global message map for your class and those annoying
+ // macros. You can also change the context in which
+ // the call the handler (more later).
+ //
+ // The downside is that due to the limitation that
+ // wxWidgets doesn't use templates in certain areas,
+ // You have to triple-cast the event function.
+ //
+ // There are five parameters to wxEvtHandler::Connect -
+ //
+ // The first is the id of the instance whose events
+ // you want to handle - i.e. a menu id for menus,
+ // a control id for controls (wxControl::GetId())
+ // and so on.
+ //
+ // The second is the event id. This is the same
+ // as the message maps (EVT_MENU) except prefixed
+ // with "wx" (wxEVT_MENU).
+ //
+ // The third is the function handler for the event -
+ // You need to cast it to the specific event handler
+ // type, then to a wxEventFunction, then to a
+ // wxObjectEventFunction - I.E.
+ // (wxObjectEventFunction)(wxEventFunction)
+ // (wxCommandEventFunction) &MyFrame::MyHandler
+ //
+ // The fourth is an optional userdata param -
+ // this is of historical relevance only and is
+ // there only for backwards compatability.
+ //
+ // The fifth is the context in which to call the
+ // handler - by default (this param is optional)
+ // this. For example in your event handler
+ // if you were to call "this->MyFunc()"
+ // it would literally do this->MyFunc. However,
+ // if you were to pass myHandler as the fifth
+ // parameter, for instance, you would _really_
+ // be calling myHandler->MyFunc, even though
+ // the compiler doesn't really know it.
+ //
//
- // Create a timer to update our status bar
+ // Menu events
//
+ this->Connect(wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED,
+ (wxObjectEventFunction) (wxEventFunction)
+ (wxCommandEventFunction) &MyFrame::OnQuit);
+
+ this->Connect(wxID_ABOUT, wxEVT_COMMAND_MENU_SELECTED,
+ (wxObjectEventFunction) (wxEventFunction)
+ (wxCommandEventFunction) &MyFrame::OnAbout);
+
+ this->Connect(wxID_LOOP, wxEVT_COMMAND_MENU_SELECTED,
+ (wxObjectEventFunction) (wxEventFunction)
+ (wxCommandEventFunction) &MyFrame::OnLoop);
+
+ this->Connect(wxID_OPENFILE, wxEVT_COMMAND_MENU_SELECTED,
+ (wxObjectEventFunction) (wxEventFunction)
+ (wxCommandEventFunction) &MyFrame::OnOpenFile);
+ this->Connect(wxID_PLAY, wxEVT_COMMAND_MENU_SELECTED,
+ (wxObjectEventFunction) (wxEventFunction)
+ (wxCommandEventFunction) &MyFrame::OnPlay);
+
+ this->Connect(wxID_PAUSE, wxEVT_COMMAND_MENU_SELECTED,
+ (wxObjectEventFunction) (wxEventFunction)
+ (wxCommandEventFunction) &MyFrame::OnPause);
+
+ this->Connect(wxID_STOP, wxEVT_COMMAND_MENU_SELECTED,
+ (wxObjectEventFunction) (wxEventFunction)
+ (wxCommandEventFunction) &MyFrame::OnStop);
+
+
+ //
+ // Slider events
+ //
+ this->Connect(wxID_SLIDER, wxEVT_COMMAND_SLIDER_UPDATED,
+ (wxObjectEventFunction) (wxEventFunction)
+ (wxCommandEventFunction) &MyFrame::OnSeek);
+
+ //
+ // Media Control events
+ //
+ this->Connect(wxID_MEDIACTRL, wxEVT_MEDIA_STOP,
+ (wxObjectEventFunction) (wxEventFunction)
+ (wxCommandEventFunction) &MyFrame::OnMediaStop);
+
+ //
+ // End of Events
+ //
+
+ //
+ // Set our loop counter to 0
+ //
+ m_nLoops = 0;
+
+ //
+ // Create a timer to update our status bar
+ //
m_timer = new MyTimer(this);
m_timer->Start(100);
}
+// ----------------------------------------------------------------------------
+// MyFrame Destructor
//
-//~MyFrame
-//--------
-//Deletes child objects implicitly and our timer explicitly
-//
+// 1) Deletes child objects implicitly
+// 2) Delete our timer explicitly
+// ----------------------------------------------------------------------------
MyFrame::~MyFrame()
{
delete m_timer;
}
+// ----------------------------------------------------------------------------
+// MyFrame::ResetStatus
+//
+// Here we just make a simple status string with some useful info about
+// the media that we won't change later - such as the length of the media.
+//
+// We then append some other info that changes in MyTimer::Notify, then
+// set the status bar to this text.
//
-//OnQuit
-//------
-//Called from file->quit.
-//Closes this application.
+// In real applications, you'd want to find a better way to do this,
+// such as static text controls (wxStaticText).
+//
+// We display info here in seconds (wxMediaCtrl uses milliseconds - that's why
+// we divide by 1000).
+//
+// We also reset our loop counter here.
+// ----------------------------------------------------------------------------
+void MyFrame::ResetStatus()
+{
+ m_basestatus = wxString::Format(_T("Size(x,y):%i,%i ")
+ _T("Length(Seconds):%u Speed:%1.1fx"),
+ m_mediactrl->GetBestSize().x,
+ m_mediactrl->GetBestSize().y,
+ (unsigned)((m_mediactrl->GetDuration() / 1000).ToLong()),
+ m_mediactrl->GetPlaybackRate()
+ );
+
+ m_slider->SetRange(0, (m_mediactrl->GetDuration() / 1000).ToLong());
+
+ m_nLoops = 0;
+}
+
+// ----------------------------------------------------------------------------
+// MyFrame::OnQuit
//
+// Called from file->quit.
+// Closes this application.
+// ----------------------------------------------------------------------------
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
// true is to force the frame to close
Close(true);
}
-//
-//OnAbout
-//-------
-//Called from help->about.
-//Gets some info about this application.
-//
+// ----------------------------------------------------------------------------
+// MyFrame::OnAbout
+//
+// Called from help->about.
+// Gets some info about this application.
+// ----------------------------------------------------------------------------
void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
{
wxString msg;
wxMessageBox(msg, _T("About wxMediaCtrl test"), wxOK | wxICON_INFORMATION, this);
}
+// ----------------------------------------------------------------------------
+// MyFrame::OnLoop
//
-//OnLoop
-//------
-//Called from file->loop.
-//Changes the state of whether we want to loop or not.
-//
+// Called from file->loop.
+// Changes the state of whether we want to loop or not.
+// ----------------------------------------------------------------------------
void MyFrame::OnLoop(wxCommandEvent& WXUNUSED(event))
{
- m_bLoop = !m_bLoop;
+ m_mediactrl->Loop( !m_mediactrl->IsLooped() );
}
+// ----------------------------------------------------------------------------
+// MyFrame::OnOpenFile
//
-//OnOpenFile
-//----------
-//Called from file->openfile.
-//Opens and plays a media file
-//
+// Called from file->openfile.
+// Opens and plays a media file
+// ----------------------------------------------------------------------------
void MyFrame::OnOpenFile(wxCommandEvent& WXUNUSED(event))
{
wxFileDialog fd(this);
}
}
-//
-//OnPlay
-//------
-//Called from file->play.
-//Resumes the media if it is paused or stopped.
-//
+// ----------------------------------------------------------------------------
+// MyFrame::OnPlay
+//
+// Called from file->play.
+// Resumes the media if it is paused or stopped.
+// ----------------------------------------------------------------------------
void MyFrame::OnPlay(wxCommandEvent& WXUNUSED(event))
{
if( !m_mediactrl->Play() )
wxMessageBox(wxT("Couldn't play movie!"));
}
-//
-//OnPause
-//-------
-//Called from file->pause.
-//Pauses the media in-place.
-//
+// ----------------------------------------------------------------------------
+// MyFrame::OnPause
+//
+// Called from file->pause.
+// Pauses the media in-place.
+// ----------------------------------------------------------------------------
void MyFrame::OnPause(wxCommandEvent& WXUNUSED(event))
{
if( !m_mediactrl->Pause() )
wxMessageBox(wxT("Couldn't pause movie!"));
}
-//
-//OnStop
-//------
-//Called from file->stop.
-//Where it stops depends on whether you can seek in the
-//media control or not - if you can it stops and seeks to the beginning,
-//otherwise it will appear to be at the end - but it will start over again
-//when play() is called
-//
+// ----------------------------------------------------------------------------
+// MyFrame::OnStop
+//
+// Called from file->stop.
+// Where it stops depends on whether you can seek in the
+// media control or not - if you can it stops and seeks to the beginning,
+// otherwise it will appear to be at the end - but it will start over again
+// when Play() is called
+// ----------------------------------------------------------------------------
void MyFrame::OnStop(wxCommandEvent& WXUNUSED(event))
{
if( !m_mediactrl->Stop() )
wxMessageBox(wxT("Couldn't stop movie!"));
}
-//
-//OnSeek
-//------
-//Called from file->seek.
-//Called when the user moves the slider -
-//seeks to a position within the media
-//
+// ----------------------------------------------------------------------------
+// MyFrame::OnSeek
+//
+// Called from file->seek.
+// Called when the user moves the slider -
+// seeks to a position within the media
+// ----------------------------------------------------------------------------
void MyFrame::OnSeek(wxCommandEvent& WXUNUSED(event))
{
if( !m_mediactrl->SetPosition( m_slider->GetValue() * 1000 ) )
wxMessageBox(wxT("Couldn't seek in movie!"));
}
+// ----------------------------------------------------------------------------
+// MyFrame::OnMediaStop
+//
+// Called when the media is about to stop playing.
+// Here we just increase our loop counter
+// ----------------------------------------------------------------------------
+void MyFrame::OnMediaStop(wxMediaEvent& WXUNUSED(event))
+{
+ ++m_nLoops;
+}
+
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
-//OnMediaFinished
-//---------------
-//Called when the media stops playing.
-//Here we loop it if the user wants to (has been selected from file menu)
+// MyTimer
//
-void MyFrame::OnMediaFinished(wxMediaEvent& WXUNUSED(event))
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+// ----------------------------------------------------------------------------
+// MyTimer::Notify
+//
+// 1) Update our slider with the position were are in in the media
+// 2) Update our status bar with the base text from MyFrame::ResetStatus,
+// append some non-static (changing) info to it, then set the
+// status bar text to that result
+// ----------------------------------------------------------------------------
+void MyTimer::Notify()
{
- if(m_bLoop)
- {
- if ( !m_mediactrl->Play() )
- wxMessageBox(wxT("Couldn't loop movie!"));
- }
+ long lPosition = (m_frame->m_mediactrl->GetPosition() / 1000).ToLong();
+ m_frame->m_slider->SetValue(lPosition);
+
+#if wxUSE_STATUSBAR
+ m_frame->SetStatusText(wxString::Format(
+ _T("%s Pos:%u State:%s Loops:%i"),
+ m_frame->m_basestatus.c_str(),
+ (unsigned int)lPosition,
+ wxGetMediaStateText(m_frame->m_mediactrl->GetState()),
+ m_frame->m_nLoops
+ )
+ );
+#endif
}
+
+//
+// End of MediaPlayer sample
+//
--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+// Name: common/mediactrl.cpp
+// Purpose: wxMediaCtrl common code
+// Author: Ryan Norton <wxprojects@comcast.net>
+// Modified by:
+// Created: 11/07/04
+// RCS-ID: $Id$
+// Copyright: (c) Ryan Norton
+// Licence: wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+//===========================================================================
+// Definitions
+//===========================================================================
+
+//---------------------------------------------------------------------------
+// Pre-compiled header stuff
+//---------------------------------------------------------------------------
+
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
+#pragma implementation "mediactrl.h"
+#endif
+
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+//---------------------------------------------------------------------------
+// Includes
+//---------------------------------------------------------------------------
+#include "wx/mediactrl.h"
+#include "wx/hash.h"
+
+//---------------------------------------------------------------------------
+// Compilation guard
+//---------------------------------------------------------------------------
+#if wxUSE_MEDIACTRL
+
+//===========================================================================
+//
+// Implementation
+//
+//===========================================================================
+
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+// RTTI and Event implementations
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+IMPLEMENT_CLASS(wxMediaCtrl, wxControl);
+IMPLEMENT_CLASS(wxMediaBackend, wxObject);
+IMPLEMENT_DYNAMIC_CLASS(wxMediaEvent, wxEvent);
+DEFINE_EVENT_TYPE(wxEVT_MEDIA_FINISHED);
+DEFINE_EVENT_TYPE(wxEVT_MEDIA_STOP);
+
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+//
+// wxMediaCtrl
+//
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+//---------------------------------------------------------------------------
+// wxMediaCtrl::Create (file version)
+// wxMediaCtrl::Create (URL version)
+//
+// Searches for a backend that is installed on the system (backends
+// starting with lower characters in the alphabet are given priority),
+// and creates the control from it
+//
+// This searches by searching the global RTTI hashtable, class by class,
+// attempting to call CreateControl on each one found that is a derivative
+// of wxMediaBackend - if it succeededs Create returns true, otherwise
+// it keeps iterating through the hashmap.
+//---------------------------------------------------------------------------
+bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id,
+ const wxString& fileName,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxString& szBackend,
+ const wxValidator& validator,
+ const wxString& name)
+{
+ if(!szBackend.empty())
+ {
+ if(!DoCreate(wxClassInfo::FindClass(szBackend), parent, id,
+ pos, size, style, validator, name))
+ {
+ m_imp = NULL;
+ return false;
+ }
+
+ if (!fileName.empty())
+ {
+ if (!m_imp->Load(fileName))
+ {
+ delete m_imp;
+ m_imp = NULL;
+ return false;
+ }
+ }
+
+ return true;
+ }
+ else
+ {
+ wxClassInfo::sm_classTable->BeginFind();
+
+ wxClassInfo* classInfo = NextBackend();
+
+ while(classInfo)
+ {
+ if(!DoCreate(classInfo, parent, id,
+ pos, size, style, validator, name))
+ continue;
+
+ if (!fileName.empty())
+ {
+ if (m_imp->Load(fileName))
+ return true;
+ else
+ delete m_imp;
+ }
+ else
+ return true;
+
+ classInfo = NextBackend();
+ }
+
+ m_imp = NULL;
+ return false;
+ }
+}
+
+bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id,
+ const wxURI& location,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxString& szBackend,
+ const wxValidator& validator,
+ const wxString& name)
+{
+ if(!szBackend.empty())
+ {
+ if(!DoCreate(wxClassInfo::FindClass(szBackend), parent, id,
+ pos, size, style, validator, name))
+ {
+ m_imp = NULL;
+ return false;
+ }
+
+ if (!m_imp->Load(location))
+ {
+ delete m_imp;
+ m_imp = NULL;
+ return false;
+ }
+
+ return true;
+ }
+ else
+ {
+ wxClassInfo::sm_classTable->BeginFind();
+
+ wxClassInfo* classInfo = NextBackend();
+
+ while(classInfo)
+ {
+ if(!DoCreate(classInfo, parent, id,
+ pos, size, style, validator, name))
+ continue;
+
+ if (m_imp->Load(location))
+ return true;
+ else
+ delete m_imp;
+
+ classInfo = NextBackend();
+ }
+
+ m_imp = NULL;
+ return false;
+ }
+}
+
+//---------------------------------------------------------------------------
+// wxMediaCtrl::DoCreate
+//
+// Attempts to create the control from a backend
+//---------------------------------------------------------------------------
+bool wxMediaCtrl::DoCreate(wxClassInfo* classInfo,
+ wxWindow* parent, wxWindowID id,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxValidator& validator,
+ const wxString& name)
+{
+ m_imp = (wxMediaBackend*)classInfo->CreateObject();
+
+ if( m_imp->CreateControl(this, parent, id, pos, size,
+ style, validator, name) )
+ {
+ this->Connect(GetId(), wxEVT_MEDIA_FINISHED,
+ (wxObjectEventFunction) (wxEventFunction)
+ (wxMediaEventFunction)
+ &wxMediaCtrl::OnMediaFinished);
+ return true;
+ }
+
+ delete m_imp;
+ return false;
+}
+
+//---------------------------------------------------------------------------
+// wxMediaCtrl::NextBackend
+//
+//
+// Search through the RTTI hashmap one at a
+// time, attempting to create each derivative
+// of wxMediaBackend
+//
+//
+// STL isn't compatable with and will have a compilation error
+// on a wxNode, however, wxHashTable::compatibility_iterator is
+// incompatible with the old 2.4 stable version - but since
+// we're in 2.5 only we don't need to worry about this
+// static
+//---------------------------------------------------------------------------
+wxClassInfo* wxMediaCtrl::NextBackend()
+{
+ wxHashTable::compatibility_iterator
+ node = wxClassInfo::sm_classTable->Next();
+ while (node)
+ {
+ wxClassInfo* classInfo = (wxClassInfo *)node->GetData();
+ if ( classInfo->IsKindOf(CLASSINFO(wxMediaBackend)) &&
+ classInfo != CLASSINFO(wxMediaBackend) )
+ {
+ return classInfo;
+ }
+ node = wxClassInfo::sm_classTable->Next();
+ }
+
+ //
+ // Nope - couldn't successfully find one... fail
+ //
+ return NULL;
+}
+
+
+//---------------------------------------------------------------------------
+// wxMediaCtrl Destructor
+//
+// Free up the backend if it exists
+//---------------------------------------------------------------------------
+wxMediaCtrl::~wxMediaCtrl()
+{
+ if (m_imp)
+ delete m_imp;
+}
+
+//---------------------------------------------------------------------------
+// wxMediaCtrl::Load (file version)
+// wxMediaCtrl::Load (URL version)
+//
+// Here we call load of the backend - keeping
+// track of whether it was successful or not - which
+// will determine which later method calls work
+//---------------------------------------------------------------------------
+bool wxMediaCtrl::Load(const wxString& fileName)
+{
+ if(m_imp)
+ return (m_bLoaded = m_imp->Load(fileName));
+ return false;
+}
+
+bool wxMediaCtrl::Load(const wxURI& location)
+{
+ if(m_imp)
+ return (m_bLoaded = m_imp->Load(location));
+ return false;
+}
+
+//---------------------------------------------------------------------------
+// wxMediaCtrl::Play
+// wxMediaCtrl::Pause
+// wxMediaCtrl::Stop
+// wxMediaCtrl::GetPlaybackRate
+// wxMediaCtrl::SetPlaybackRate
+// wxMediaCtrl::SetPosition
+// wxMediaCtrl::GetPosition
+// wxMediaCtrl::GetDuration
+// wxMediaCtrl::GetState
+// wxMediaCtrl::DoGetBestSize
+//
+// 1) Check to see whether the backend exists and is loading
+// 2) Call the backend's version of the method, returning success
+// if the backend's version succeeds
+//---------------------------------------------------------------------------
+bool wxMediaCtrl::Play()
+{
+ if(m_imp && m_bLoaded)
+ return m_imp->Play();
+ return 0;
+}
+
+bool wxMediaCtrl::Pause()
+{
+ if(m_imp && m_bLoaded)
+ return m_imp->Pause();
+ return 0;
+}
+
+bool wxMediaCtrl::Stop()
+{
+ if(m_imp && m_bLoaded)
+ return m_imp->Stop();
+ return 0;
+}
+
+double wxMediaCtrl::GetPlaybackRate()
+{
+ if(m_imp && m_bLoaded)
+ return m_imp->GetPlaybackRate();
+ return 0;
+}
+
+bool wxMediaCtrl::SetPlaybackRate(double dRate)
+{
+ if(m_imp && m_bLoaded)
+ return m_imp->SetPlaybackRate(dRate);
+ return false;
+}
+
+bool wxMediaCtrl::SetPosition(wxLongLong where)
+{
+ if(m_imp && m_bLoaded)
+ return m_imp->SetPosition(where);
+ return false;
+}
+
+wxLongLong wxMediaCtrl::GetPosition()
+{
+ if(m_imp && m_bLoaded)
+ return m_imp->GetPosition();
+ return 0;
+}
+
+wxLongLong wxMediaCtrl::GetDuration()
+{
+ if(m_imp && m_bLoaded)
+ return m_imp->GetDuration();
+ return 0;
+}
+
+wxMediaState wxMediaCtrl::GetState()
+{
+ if(m_imp && m_bLoaded)
+ return m_imp->GetState();
+ return wxMEDIASTATE_STOPPED;
+}
+
+wxSize wxMediaCtrl::DoGetBestSize() const
+{
+ if(m_imp)
+ return m_imp->GetVideoSize();
+ return wxSize(0,0);
+}
+
+//---------------------------------------------------------------------------
+// wxMediaCtrl::DoMoveWindow
+//
+// 1) Call parent's version so that our control's window moves where
+// it's supposed to
+// 2) If the backend exists and is loaded, move the video
+// of the media to where our control's window is now located
+//---------------------------------------------------------------------------
+void wxMediaCtrl::DoMoveWindow(int x, int y, int w, int h)
+{
+ wxControl::DoMoveWindow(x,y,w,h);
+
+ if(m_imp)
+ m_imp->Move(x, y, w, h);
+}
+
+void wxMediaCtrl::Loop(bool bLoop)
+{
+ m_bLoop = bLoop;
+}
+
+bool wxMediaCtrl::IsLooped()
+{
+ return m_bLoop;
+}
+
+void wxMediaCtrl::OnMediaFinished(const wxMediaEvent& WXUNUSED(evt))
+{
+ if(m_bLoop)
+ {
+#ifdef __WXDEBUG__
+ wxASSERT( Play() );
+#else
+ Play();
+#endif
+ }
+}
+
+//DARWIN gcc compiler badly screwed up - needs destructor impl in source
+wxMediaBackend::~wxMediaBackend()
+{ }
+#include <wx/html/forcelnk.h>
+FORCE_LINK(basewxmediabackends);
+
+//---------------------------------------------------------------------------
+// End of compilation guard and of file
+//---------------------------------------------------------------------------
+#endif //wxUSE_MEDIACTRL
+
+
/////////////////////////////////////////////////////////////////////////////
-// Name: mac/carbon/moviectrl.cpp
-// Purpose: wxMediaCtrl MAC CARBON QT
+// Name: mac/carbon/mediactrl.cpp
+// Purpose: Built-in Media Backends for Mac
// Author: Ryan Norton <wxprojects@comcast.net>
-// Modified by:
+// Modified by:
// Created: 11/07/04
// RCS-ID: $Id$
// Copyright: (c) Ryan Norton
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-//#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-//#pragma implementation "moviectrl.h"
-//#endif
+//===========================================================================
+// DECLARATIONS
+//===========================================================================
+
+//---------------------------------------------------------------------------
+// Pre-compiled header stuff
+//---------------------------------------------------------------------------
+
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
+#pragma implementation "mediactrl.h"
+#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#pragma hdrstop
#endif
-#include "wx/defs.h"
+//---------------------------------------------------------------------------
+// Includes
+//---------------------------------------------------------------------------
+#include "wx/mediactrl.h"
+//---------------------------------------------------------------------------
+// Compilation guard
+//---------------------------------------------------------------------------
#if wxUSE_MEDIACTRL
-#include "wx/mac/carbon/mediactrl.h"
+//===========================================================================
+// BACKEND DECLARATIONS
+//===========================================================================
-#include "wx/timer.h"
-
-IMPLEMENT_CLASS(wxMediaCtrl, wxControl);
-IMPLEMENT_DYNAMIC_CLASS(wxMediaEvent, wxEvent);
-DEFINE_EVENT_TYPE(wxEVT_MEDIA_FINISHED);
+//---------------------------------------------------------------------------
+//
+// wxQTMediaBackend
+//
+//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+// QT Includes
+//---------------------------------------------------------------------------
//uma is for wxMacFSSpec
-#ifdef __WXMAC__
#include "wx/mac/uma.h"
+#include "wx/timer.h"
#include <Movies.h>
#include <Gestalt.h>
-#else
-//quicktime media layer for mac emulation on pc
-#include <qtml.h>
-#endif
+#include <QuickTimeComponents.h> //Standard QT stuff
-#include <QuickTimeComponents.h>
+//Determines whether version 6 of QT is installed
+Boolean _wxIsQuickTime4Installed (void)
+{
+ short error;
+ long result;
-#ifdef __WXMAC__
-#define MSWMOVIECHECK
-#else
-#define MSWMOVIECHECK if(!m_bLoaded) return 0;
-#endif
+ error = Gestalt (gestaltQuickTime, &result);
+ return (error == noErr) && (((result >> 16) & 0xffff) >= 0x0400);
+}
+
+class wxQTMediaBackend : public wxMediaBackend
+{
+public:
+
+ wxQTMediaBackend();
+ ~wxQTMediaBackend();
+
+ virtual bool CreateControl(wxControl* ctrl, wxWindow* parent,
+ wxWindowID id,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxValidator& validator,
+ const wxString& name);
+
+ virtual bool Play();
+ virtual bool Pause();
+ virtual bool Stop();
+
+ virtual bool Load(const wxString& fileName);
+ virtual bool Load(const wxURI& location);
+
+ virtual wxMediaState GetState();
+
+ virtual bool SetPosition(wxLongLong where);
+ virtual wxLongLong GetPosition();
+ virtual wxLongLong GetDuration();
+
+ virtual void Move(int x, int y, int w, int h);
+ wxSize GetVideoSize() const;
+
+ virtual double GetPlaybackRate();
+ virtual bool SetPlaybackRate(double dRate);
+
+ void Cleanup();
+ void FinishLoad();
+
+ wxSize m_bestSize; //Original movie size
+ struct MovieType** m_movie; //QT Movie handle/instance
+ wxControl* m_ctrl; //Parent control
+ bool m_bVideo; //Whether or not we have video
+ class _wxQTTimer* m_timer; //Timer for streaming the movie
+
+ DECLARE_DYNAMIC_CLASS(wxQTMediaBackend);
+};
+
+
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+//
+// wxQTMediaBackend
+//
+// TODO: Use a less cludgy way to pause/get state/set state
+// TODO: Dynamically load from qtml.dll
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+IMPLEMENT_DYNAMIC_CLASS(wxQTMediaBackend, wxMediaBackend);
//Time between timer calls
-#define MOVIE_DELAY 50
+#define MOVIE_DELAY 100
-// ------------------------------------------------------------------
+// --------------------------------------------------------------------------
// wxQTTimer - Handle Asyncronous Playing
-// ------------------------------------------------------------------
+// --------------------------------------------------------------------------
class _wxQTTimer : public wxTimer
{
public:
- _wxQTTimer(Movie movie, wxMediaCtrl* parent) :
+ _wxQTTimer(Movie movie, wxQTMediaBackend* parent) :
m_movie(movie), m_bPaused(false), m_parent(parent)
{
}
bool GetPaused() {return m_bPaused;}
void SetPaused(bool bPaused) {m_bPaused = bPaused;}
+ //-----------------------------------------------------------------------
+ // _wxQTTimer::Notify
+ //
+ // 1) Checks to see if the movie is done, and if not continues
+ // streaming the movie
+ // 2) Sends the wxEVT_MEDIA_STOP event if we have reached the end of
+ // the movie.
+ //-----------------------------------------------------------------------
void Notify()
{
if (!m_bPaused)
{
if(!IsMovieDone(m_movie))
- MoviesTask(m_movie, MOVIE_DELAY); //Give QT time to play movie
+ MoviesTask(m_movie, MOVIE_DELAY);
else
{
- Stop();
- m_parent->Stop();
- wxASSERT(::GetMoviesError() == noErr);
- wxMediaEvent theEvent(wxEVT_MEDIA_FINISHED, m_parent->GetId());
- m_parent->GetParent()->ProcessEvent(theEvent);
+ wxMediaEvent theEvent(wxEVT_MEDIA_STOP,
+ m_parent->m_ctrl->GetId());
+ m_parent->m_ctrl->ProcessEvent(theEvent);
+
+ if(theEvent.IsAllowed())
+ {
+ Stop();
+ m_parent->Stop();
+ wxASSERT(::GetMoviesError() == noErr);
+
+ //send the event to our child
+ wxMediaEvent theEvent(wxEVT_MEDIA_FINISHED,
+ m_parent->m_ctrl->GetId());
+ m_parent->m_ctrl->ProcessEvent(theEvent);
+ }
}
}
}
protected:
- Movie m_movie;
- bool m_bPaused;
- wxMediaCtrl* m_parent;
+ Movie m_movie; //Our movie instance
+ bool m_bPaused; //Whether we are paused or not
+ wxQTMediaBackend* m_parent; //Backend pointer
};
-//Determines whether version 6 of QT is installed
-Boolean _wxIsQuickTime4Installed (void)
+//---------------------------------------------------------------------------
+// wxQTMediaBackend Destructor
+//
+// Sets m_timer to NULL signifying we havn't loaded anything yet
+//---------------------------------------------------------------------------
+wxQTMediaBackend::wxQTMediaBackend() : m_timer(NULL)
{
-#ifdef __WXMAC__
- short error;
- long result;
-
- error = Gestalt (gestaltQuickTime, &result);
- return (error == noErr) && (((result >> 16) & 0xffff) >= 0x0400);
-#else
- return true;
-#endif
-}
-
-bool wxMediaCtrl::InitQT ()
-{
- if (_wxIsQuickTime4Installed())
- {
- #ifndef __WXMAC__
- int nError;
- //-2093 no dll
- if ((nError = InitializeQTML(0)) != noErr)
- {
- wxFAIL_MSG(wxString::Format(wxT("Couldn't Initialize Quicktime-%i"), nError));
- }
- #endif
- EnterMovies();
- return true;
- }
- else
- {
- wxFAIL_MSG(wxT("Quicktime is not installed, or Your Version of Quicktime is <= 4."));
- return false;
- }
}
-bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id, const wxString& fileName,
- const wxPoint& pos, const wxSize& size,
- long style, long WXUNUSED(driver), const wxString& name)
+//---------------------------------------------------------------------------
+// wxQTMediaBackend Destructor
+//
+// 1) Cleans up the QuickTime movie instance
+// 2) Decrements the QuickTime reference counter - if this reaches
+// 0, QuickTime shuts down
+// 3) Decrements the QuickTime Windows Media Layer reference counter -
+// if this reaches 0, QuickTime shuts down the Windows Media Layer
+//---------------------------------------------------------------------------
+wxQTMediaBackend::~wxQTMediaBackend()
{
- if(!DoCreate(parent, id, pos, size, style, name))
- return false;
-
- if(!fileName.empty())
- {
- if (!Load(fileName))
- return false;
-
- if(!Play())
- return false;
- }
+ if(m_timer)
+ Cleanup();
- return true;
+ //Note that ExitMovies() is not neccessary...
+ ExitMovies();
}
-bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id, const wxURI& location,
- const wxPoint& pos, const wxSize& size,
- long style, long WXUNUSED(driver), const wxString& name)
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::CreateControl
+//
+// 1) Intializes QuickTime
+// 2) Creates the control window
+//---------------------------------------------------------------------------
+bool wxQTMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent,
+ wxWindowID id,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxValidator& validator,
+ const wxString& name)
{
- if(!DoCreate(parent, id, pos, size, style, name))
+ if (!_wxIsQuickTime4Installed())
return false;
-
- if(!location.IsReference())
- {
- if (!Load(location))
- return false;
- if(!Play())
- return false;
- }
-
- return true;
-}
-
-bool wxMediaCtrl::DoCreate(wxWindow* parent, wxWindowID id,
- const wxPoint& pos, const wxSize& size,
- long style, const wxString& name)
-{
- //do some window stuff
- if ( !wxControl::Create(parent, id, pos, size,
-#ifdef __WXMAC__
- MacRemoveBordersFromStyle(style),
-#else
- style | wxNO_BORDER,
-#endif
- wxDefaultValidator, name) )
+ EnterMovies();
+
+ //
+ // Create window
+ // By default wxWindow(s) is created with a border -
+ // so we need to get rid of those
+ //
+ // Since we don't have a child window like most other
+ // backends, we don't need wxCLIP_CHILDREN
+ //
+ if ( !ctrl->wxControl::Create(parent, id, pos, size,
+ m_ctrl->MacRemoveBordersFromStyle(style),
+ validator, name) )
return false;
+ //
//Set our background color to black by default
- SetBackgroundColour(*wxBLACK);
+ //
+ ctrl->SetBackgroundColour(*wxBLACK);
+ m_ctrl = ctrl;
return true;
}
-bool wxMediaCtrl::Load(const wxString& fileName)
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Load (file version)
+//
+// 1) Get an FSSpec from the Windows path name
+// 2) Open the movie
+// 3) Obtain the movie instance from the movie resource
+// 4)
+//---------------------------------------------------------------------------
+bool wxQTMediaBackend::Load(const wxString& fileName)
{
- if(m_bLoaded)
+ if(m_timer)
Cleanup();
- if ( !InitQT() )
- return false;
-
OSErr err = noErr;
short movieResFile;
FSSpec sfFile;
-#ifdef __WXMAC__
- wxMacFilename2FSSpec( fileName , &sfFile ) ;
-#else
- if (NativePathNameToFSSpec ((char*) fileName.mb_str(), &sfFile, 0) != noErr)
- return false;
-#endif
+
+ wxMacFilename2FSSpec( fileName , &sfFile );
+
if (OpenMovieFile (&sfFile, &movieResFile, fsRdPerm) != noErr)
return false;
FinishLoad();
- return m_bLoaded;
+ return ::GetMoviesError() == noErr;
}
-bool wxMediaCtrl::Load(const wxURI& location)
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+bool wxQTMediaBackend::Load(const wxURI& location)
{
- if(m_bLoaded)
+ if(m_timer)
Cleanup();
- if ( !InitQT() )
- return false;
-
wxString theURI = location.BuildURI();
OSErr err = noErr;
FinishLoad();
- return m_bLoaded;
+ return ::GetMoviesError() == noErr;
}
-void wxMediaCtrl::FinishLoad()
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+void wxQTMediaBackend::FinishLoad()
{
- m_timer = new _wxQTTimer(m_movie, (wxMediaCtrl*) this);
+ m_timer = new _wxQTTimer(m_movie, (wxQTMediaBackend*) this);
wxASSERT(m_timer);
//get the real size of the movie
m_bestSize.x = outRect.right - outRect.left;
m_bestSize.y = outRect.bottom - outRect.top;
- //reparent movie
-if(GetMovieIndTrackType(m_movie, 1, VisualMediaCharacteristic/*AudioMediaCharacteristic*/, movieTrackCharacteristic | movieTrackEnabledOnly) != NULL)
- {
-
-#ifdef __WXMSW__
- CreatePortAssociation(this->GetHWND(), NULL, 0L);
-#endif
- SetMovieGWorld(m_movie, (CGrafPtr)
-
-#ifdef __WXMSW__
- GetNativeWindowPort(this->GetHWND())
-#else
- GetWindowPort((WindowRef)this->MacGetTopLevelWindowRef())
-#endif
- , nil);
+ //reparent movie/*AudioMediaCharacteristic*/
+ if(GetMovieIndTrackType(m_movie, 1,
+ VisualMediaCharacteristic,
+ movieTrackCharacteristic |
+ movieTrackEnabledOnly) != NULL)
+ {
+ SetMovieGWorld(m_movie,
+ (CGrafPtr)
+ GetWindowPort(
+ (WindowRef)
+ m_ctrl->MacGetTopLevelWindowRef()
+ ),
+ nil);
}
-// wxPrintf(wxT("%u\n"), ::GetMovieTimeScale(m_movie));
//we want millisecond precision
::SetMovieTimeScale(m_movie, 1000);
-
- m_bLoaded = (::GetMoviesError() == noErr);
-
- //work around refresh issues
- wxSize size = GetParent()->GetSize();
- GetParent()->SetSize(wxSize(size.x+1, size.y+1));
- GetParent()->Refresh();
- GetParent()->Update();
- GetParent()->SetSize(size);
- GetParent()->Refresh();
- GetParent()->Update();
+ wxASSERT(::GetMoviesError() == noErr);
+
+ //
+ //Here, if the parent of the control has a sizer - we
+ //tell it to recalculate the size of this control since
+ //the user opened a seperate media file
+ //
+ m_ctrl->InvalidateBestSize();
+ m_ctrl->GetParent()->Layout();
+ m_ctrl->GetParent()->Refresh();
+ m_ctrl->GetParent()->Update();
}
-bool wxMediaCtrl::Play()
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+bool wxQTMediaBackend::Play()
{
- MSWMOVIECHECK
::StartMovie(m_movie);
m_timer->SetPaused(false);
m_timer->Start(MOVIE_DELAY, wxTIMER_CONTINUOUS);
return ::GetMoviesError() == noErr;
}
-bool wxMediaCtrl::Pause()
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+bool wxQTMediaBackend::Pause()
{
- MSWMOVIECHECK
::StopMovie(m_movie);
m_timer->SetPaused(true);
m_timer->Stop();
return ::GetMoviesError() == noErr;
}
-bool wxMediaCtrl::Stop()
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+bool wxQTMediaBackend::Stop()
{
- MSWMOVIECHECK
m_timer->SetPaused(false);
m_timer->Stop();
return ::GetMoviesError() == noErr;
}
-double wxMediaCtrl::GetPlaybackRate()
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+double wxQTMediaBackend::GetPlaybackRate()
{
- MSWMOVIECHECK
return ( ((double)::GetMovieRate(m_movie)) / 0x10000);
}
-bool wxMediaCtrl::SetPlaybackRate(double dRate)
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+bool wxQTMediaBackend::SetPlaybackRate(double dRate)
{
- MSWMOVIECHECK
::SetMovieRate(m_movie, (Fixed) (dRate * 0x10000));
return ::GetMoviesError() == noErr;
}
-bool wxMediaCtrl::SetPosition(long where)
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+bool wxQTMediaBackend::SetPosition(wxLongLong where)
{
- MSWMOVIECHECK
TimeRecord theTimeRecord;
memset(&theTimeRecord, 0, sizeof(TimeRecord));
- theTimeRecord.value.lo = where;
+ theTimeRecord.value.lo = where.GetValue();
theTimeRecord.scale = ::GetMovieTimeScale(m_movie);
theTimeRecord.base = ::GetMovieTimeBase(m_movie);
::SetMovieTime(m_movie, &theTimeRecord);
return true;
}
-long wxMediaCtrl::GetPosition()
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+wxLongLong wxQTMediaBackend::GetPosition()
{
- MSWMOVIECHECK
return ::GetMovieTime(m_movie, NULL);
}
-long wxMediaCtrl::GetDuration()
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+wxLongLong wxQTMediaBackend::GetDuration()
{
- MSWMOVIECHECK
return ::GetMovieDuration(m_movie);
}
-wxMediaState wxMediaCtrl::GetState()
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+wxMediaState wxQTMediaBackend::GetState()
{
- if ( !m_bLoaded || (m_timer->IsRunning() == false && m_timer->GetPaused() == false) )
+ if ( !m_timer || (m_timer->IsRunning() == false &&
+ m_timer->GetPaused() == false) )
return wxMEDIASTATE_STOPPED;
if( m_timer->IsRunning() == true )
return wxMEDIASTATE_PAUSED;
}
-void wxMediaCtrl::Cleanup()
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+void wxQTMediaBackend::Cleanup()
{
delete m_timer;
m_timer = NULL;
StopMovie(m_movie);
DisposeMovie(m_movie);
-
- //Note that ExitMovies() is not neccessary, but
- //the docs are fuzzy on whether or not TerminateQTML is
- ExitMovies();
-
-#ifndef __WXMAC__
- TerminateQTML();
-#endif
-}
-
-wxMediaCtrl::~wxMediaCtrl()
-{
- if(m_bLoaded)
- Cleanup();
}
-wxSize wxMediaCtrl::DoGetBestSize() const
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+wxSize wxQTMediaBackend::GetVideoSize() const
{
return m_bestSize;
}
-void wxMediaCtrl::DoMoveWindow(int x, int y, int w, int h)
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+void wxQTMediaBackend::Move(int x, int y, int w, int h)
{
- wxControl::DoMoveWindow(x,y,w,h);
-
- if(m_bLoaded)
+ if(m_timer)
{
-#ifdef __WXMAC__
Rect theRect = {y, x, y+h, x+w};
-#else
- Rect theRect = {0, 0, h, w};
-#endif
+
::SetMovieBox(m_movie, &theRect);
wxASSERT(::GetMoviesError() == noErr);
}
}
-#endif //wxUSE_MOVIECTRL
+
+//in source file that contains stuff you don't directly use
+#include <wx/html/forcelnk.h>
+FORCE_LINK_ME(basewxmediabackends);
+
+#endif //wxUSE_MEDIACTRL
+
+
+
+
+
/////////////////////////////////////////////////////////////////////////////
// Name: msw/mediactrl.cpp
-// Purpose: wxMediaCtrl MSW
+// Purpose: Built-in Media Backends for Windows
// Author: Ryan Norton <wxprojects@comcast.net>
// Modified by:
// Created: 11/07/04
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
+//===========================================================================
+// DECLARATIONS
+//===========================================================================
+
//---------------------------------------------------------------------------
-// Pre-wx includes
+// Pre-compiled header stuff
//---------------------------------------------------------------------------
-//#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-//#pragma implementation "moviectrl.h"
-//#endif
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
+#pragma implementation "mediactrl.h"
+#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#pragma hdrstop
#endif
+//---------------------------------------------------------------------------
+// Includes
+//---------------------------------------------------------------------------
#include "wx/mediactrl.h"
+//---------------------------------------------------------------------------
+// Compilation guard
+//---------------------------------------------------------------------------
#if wxUSE_MEDIACTRL
-//###########################################################################
-// DECLARATIONS
-//###########################################################################
-
-IMPLEMENT_CLASS(wxMediaCtrl, wxControl);
-IMPLEMENT_DYNAMIC_CLASS(wxMediaEvent, wxEvent);
-DEFINE_EVENT_TYPE(wxEVT_MEDIA_FINISHED);
-
//---------------------------------------------------------------------------
-// wxMediaCtrlImpl
+// Externals (somewhere in src/msw/app.cpp)
//---------------------------------------------------------------------------
+extern "C" WXDLLIMPEXP_BASE HINSTANCE wxGetInstance(void);
+#ifdef __WXWINCE__
+extern wxChar *wxCanvasClassName;
+#else
+extern const wxChar *wxCanvasClassName;
+#endif
-class wxMediaCtrlImpl
-{
-public:
- wxMediaCtrlImpl() : m_bLoaded(false)
- { }
-
- virtual ~wxMediaCtrlImpl()
- { }
-
- virtual bool Create(wxMediaCtrl* WXUNUSED(ctrl))
- { return false; }
-
- virtual bool Play() { return false; }
- virtual bool Pause() { return false; }
- virtual bool Stop() { return false; }
-
- virtual bool Load(const wxString&) { return false; }
- virtual bool Load(const wxURI&) { return false; }
-
- virtual wxMediaState GetState() { return wxMEDIASTATE_STOPPED; }
-
- virtual bool SetPosition(long) { return 0; }
- virtual long GetPosition() { return 0; }
- virtual long GetDuration() { return 0; }
-
- virtual void DoMoveWindow(int, int, int, int) { }
- virtual wxSize DoGetBestSize() const { return wxSize(0,0); }
-
- virtual double GetPlaybackRate() { return 0; }
- virtual bool SetPlaybackRate(double) { return false; }
-
- virtual bool MSWWindowProc(WXUINT, WXWPARAM, WXLPARAM) { return false; }
-
- bool IsLoaded()
- { return m_bLoaded; }
-
- bool m_bLoaded;
-};
+//===========================================================================
+// BACKEND DECLARATIONS
+//===========================================================================
//---------------------------------------------------------------------------
-// wxDXMediaCtrlImpl
+//
+// wxAMMediaBackend
+//
//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+// Compilation guard for DirectShow
+//---------------------------------------------------------------------------
#if wxUSE_DIRECTSHOW
+//---------------------------------------------------------------------------
+// DirectShow includes
+//---------------------------------------------------------------------------
#include <dshow.h>
-#define WM_GRAPHNOTIFY WM_USER+13
-
-#ifdef __WXDEBUG__
-#define wxDSVERIFY(x) wxASSERT( SUCCEEDED ((x)) )
-#else
-#define wxDSVERIFY(x) (x)
-#endif
-
-class wxDXMediaCtrlImpl : public wxMediaCtrlImpl
+class wxAMMediaBackend : public wxMediaBackend
{
public:
- wxDXMediaCtrlImpl();
+ wxAMMediaBackend();
- virtual ~wxDXMediaCtrlImpl();
+ virtual ~wxAMMediaBackend();
- virtual bool Create(wxMediaCtrl* ctrl);
+ virtual bool CreateControl(wxControl* ctrl, wxWindow* parent,
+ wxWindowID id,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxValidator& validator,
+ const wxString& name);
virtual bool Play();
virtual bool Pause();
virtual wxMediaState GetState();
- virtual bool SetPosition(long where);
- virtual long GetPosition();
- virtual long GetDuration();
+ virtual bool SetPosition(wxLongLong where);
+ virtual wxLongLong GetPosition();
+ virtual wxLongLong GetDuration();
- virtual void DoMoveWindow(int x, int y, int w, int h);
- wxSize DoGetBestSize() const;
+ virtual void Move(int x, int y, int w, int h);
+ wxSize GetVideoSize() const;
virtual double GetPlaybackRate();
virtual bool SetPlaybackRate(double);
bool m_bVideo;
- bool MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
+ static LRESULT CALLBACK NotifyWndProc(HWND hWnd, UINT nMsg,
+ WPARAM wParam, LPARAM lParam);
+
+ LRESULT CALLBACK OnNotifyWndProc(HWND hWnd, UINT nMsg,
+ WPARAM wParam, LPARAM lParam);
- wxMediaCtrl* m_ctrl;
+ wxControl* m_ctrl;
- IGraphBuilder* m_pGB;
+ IGraphBuilder* m_pGB;
IMediaControl* m_pMC;
IMediaEventEx* m_pME;
IVideoWindow* m_pVW;
IBasicVideo* m_pBV;
IMediaSeeking* m_pMS;
+ HWND m_hNotifyWnd;
wxSize m_bestSize;
+
+ DECLARE_DYNAMIC_CLASS(wxAMMediaBackend);
};
#endif //wxUSE_DIRECTSHOW
//---------------------------------------------------------------------------
-// wxWMMEMediaCtrlImpl
+//
+// wxMCIMediaBackend
+//
//---------------------------------------------------------------------------
+//---------------------------------------------------------------------------
+// MCI Includes
+//---------------------------------------------------------------------------
#include <mmsystem.h>
-class wxWMMEMediaCtrlImpl : public wxMediaCtrlImpl
+class wxMCIMediaBackend : public wxMediaBackend
{
public:
- wxWMMEMediaCtrlImpl();
- ~wxWMMEMediaCtrlImpl();
+ wxMCIMediaBackend();
+ ~wxMCIMediaBackend();
- virtual bool Create(wxMediaCtrl* ctrl);
+ virtual bool CreateControl(wxControl* ctrl, wxWindow* parent,
+ wxWindowID id,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxValidator& validator,
+ const wxString& name);
virtual bool Play();
virtual bool Pause();
virtual wxMediaState GetState();
- virtual bool SetPosition(long where);
- virtual long GetPosition();
- virtual long GetDuration();
+ virtual bool SetPosition(wxLongLong where);
+ virtual wxLongLong GetPosition();
+ virtual wxLongLong GetDuration();
- virtual void DoMoveWindow(int x, int y, int w, int h);
- wxSize DoGetBestSize() const;
+ virtual void Move(int x, int y, int w, int h);
+ wxSize GetVideoSize() const;
virtual double GetPlaybackRate();
- virtual bool SetPlaybackRate(double);
+ virtual bool SetPlaybackRate(double dRate);
- bool MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
+ static LRESULT CALLBACK NotifyWndProc(HWND hWnd, UINT nMsg,
+ WPARAM wParam, LPARAM lParam);
- MCIDEVICEID m_hDev;
- wxMediaCtrl* m_ctrl;
- bool m_bVideo;
-};
+ LRESULT CALLBACK OnNotifyWndProc(HWND hWnd, UINT nMsg,
+ WPARAM wParam, LPARAM lParam);
-//###########################################################################
-//
-// IMPLEMENTATION
-//
-//###########################################################################
+ MCIDEVICEID m_hDev; //Our MCI Device ID/Handler
+ wxControl* m_ctrl; //Parent control
+ HWND m_hNotifyWnd; //Window to use for MCI events
+ bool m_bVideo; //Whether or not we have video
+
+ DECLARE_DYNAMIC_CLASS(wxMCIMediaBackend);
+};
//---------------------------------------------------------------------------
//
-// wxMediaCtrl
+// wxQTMediaBackend
//
//---------------------------------------------------------------------------
-bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id, const wxString& fileName,
- const wxPoint& pos, const wxSize& size,
- long style, long WXUNUSED(driver), const wxString& name)
-{
- //base create
- if ( !wxControl::Create(parent, id, pos, size, (style | wxNO_BORDER) | wxCLIP_CHILDREN,
- wxDefaultValidator, name) )
- return false;
-
- //Set our background color to black by default
- SetBackgroundColour(*wxBLACK);
+//---------------------------------------------------------------------------
+// QT Compilation Guard
+//---------------------------------------------------------------------------
+#if wxUSE_QUICKTIME
-#if wxUSE_DIRECTSHOW
- m_imp = new wxDXMediaCtrlImpl;
- if(!m_imp->Create(this))
- {
- delete m_imp;
-#endif
- m_imp = new wxWMMEMediaCtrlImpl;
- if(!m_imp->Create(this))
- {
- delete m_imp;
- m_imp = NULL;
- return false;
- }
-#if wxUSE_DIRECTSHOW
- }
-#endif
+//---------------------------------------------------------------------------
+// QT Includes
+//---------------------------------------------------------------------------
+#include <qtml.h> //Windoze QT include
+#include <QuickTimeComponents.h> //Standard QT stuff
- if(!fileName.empty())
- {
- if (!Load(fileName))
- return false;
- }
+class wxQTMediaBackend : public wxMediaBackend
+{
+public:
- return true;
-}
+ wxQTMediaBackend();
+ ~wxQTMediaBackend();
-bool wxMediaCtrl::Create(wxWindow* parent, wxWindowID id, const wxURI& location,
- const wxPoint& pos, const wxSize& size,
- long style, long WXUNUSED(driver), const wxString& name)
-{
- //base create
- if ( !wxControl::Create(parent, id, pos, size, (style | wxNO_BORDER) | wxCLIP_CHILDREN,
- wxDefaultValidator, name) )
- return false;
+ virtual bool CreateControl(wxControl* ctrl, wxWindow* parent,
+ wxWindowID id,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxValidator& validator,
+ const wxString& name);
- //Set our background color to black by default
- SetBackgroundColour(*wxBLACK);
+ virtual bool Play();
+ virtual bool Pause();
+ virtual bool Stop();
-#if wxUSE_DIRECTSHOW
- m_imp = new wxDXMediaCtrlImpl;
- if(!m_imp->Create(this))
- {
- delete m_imp;
-#endif
- m_imp = new wxWMMEMediaCtrlImpl;
- if(!m_imp->Create(this))
- {
- delete m_imp;
- m_imp = NULL;
- return false;
- }
-#if wxUSE_DIRECTSHOW
- }
-#endif
+ virtual bool Load(const wxString& fileName);
+ virtual bool Load(const wxURI& location);
- if (!Load(location))
- return false;
+ virtual wxMediaState GetState();
- return true;
-}
+ virtual bool SetPosition(wxLongLong where);
+ virtual wxLongLong GetPosition();
+ virtual wxLongLong GetDuration();
-bool wxMediaCtrl::Load(const wxString& fileName)
-{
- if(m_imp)
- return m_imp->Load(fileName);
- return false;
-}
+ virtual void Move(int x, int y, int w, int h);
+ wxSize GetVideoSize() const;
-bool wxMediaCtrl::Load(const wxURI& location)
-{
- if(m_imp)
- return m_imp->Load(location);
- return false;
-}
+ virtual double GetPlaybackRate();
+ virtual bool SetPlaybackRate(double dRate);
-bool wxMediaCtrl::Play()
-{
- if(m_imp && m_imp->IsLoaded())
- return m_imp->Play();
- return false;
-}
+ void Cleanup();
+ void FinishLoad();
-bool wxMediaCtrl::Pause()
-{
- if(m_imp && m_imp->IsLoaded())
- return m_imp->Pause();
- return false;
-}
+ wxSize m_bestSize; //Original movie size
+ struct MovieRecord* m_movie; //QT Movie handle/instance
+ wxControl* m_ctrl; //Parent control
+ bool m_bVideo; //Whether or not we have video
+ class _wxQTTimer* m_timer; //Timer for streaming the movie
-bool wxMediaCtrl::Stop()
-{
- if(m_imp && m_imp->IsLoaded())
- return m_imp->Stop();
- return false;
-}
+ DECLARE_DYNAMIC_CLASS(wxQTMediaBackend);
+};
-double wxMediaCtrl::GetPlaybackRate()
-{
- if(m_imp && m_imp->IsLoaded())
- return m_imp->GetPlaybackRate();
- return 0;
-}
+//---------------------------------------------------------------------------
+// End QT Compilation Guard
+//---------------------------------------------------------------------------
+#endif //wxUSE_QUICKTIME
-bool wxMediaCtrl::SetPlaybackRate(double dRate)
-{
- if(m_imp && m_imp->IsLoaded())
- return m_imp->SetPlaybackRate(dRate);
- return false;
-}
+//===========================================================================
+// IMPLEMENTATION
+//===========================================================================
-bool wxMediaCtrl::SetPosition(long where)
-{
- if(m_imp && m_imp->IsLoaded())
- return m_imp->SetPosition(where);
- return false;
-}
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+//
+// wxAMMediaBackend
+//
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-long wxMediaCtrl::GetPosition()
-{
- if(m_imp && m_imp->IsLoaded())
- return m_imp->GetPosition();
- return 0;
-}
+//---------------------------------------------------------------------------
+// Only use if user wants it -
+//---------------------------------------------------------------------------
+#if wxUSE_DIRECTSHOW
-long wxMediaCtrl::GetDuration()
-{
- if(m_imp && m_imp->IsLoaded())
- return m_imp->GetDuration();
- return 0;
-}
+IMPLEMENT_DYNAMIC_CLASS(wxAMMediaBackend, wxMediaBackend);
-wxMediaState wxMediaCtrl::GetState()
-{
- if(m_imp && m_imp->IsLoaded())
- return m_imp->GetState();
- return wxMEDIASTATE_STOPPED;
-}
+// Numerical value for when the graph reaches the stop position
+#define WM_GRAPHNOTIFY WM_USER+13
-WXLRESULT wxMediaCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
-{
- if(m_imp && m_imp->IsLoaded() && m_imp->MSWWindowProc(nMsg, wParam, lParam) )
- return wxControl::MSWDefWindowProc(nMsg, wParam, lParam);
- //pass the event to our parent
- return wxControl::MSWWindowProc(nMsg, wParam, lParam);
+//---------------------------------------------------------------------------
+// Usual debugging macros
+//---------------------------------------------------------------------------
+#ifdef __WXDEBUG__
+#define wxAMVERIFY(x) \
+{ \
+ HRESULT hrdsv = (x); \
+ if ( FAILED(hrdsv) ) \
+ { \
+ /*TCHAR szError[MAX_ERROR_TEXT_LEN];*/ \
+ /*if( AMGetErrorText(hrdsv, szError, MAX_ERROR_TEXT_LEN) == 0)*/ \
+ /*{*/ \
+ /*wxFAIL_MSG( wxString::Format(wxT("DirectShow error \"%s\" ")*/\
+ /*wxT("occured at line %i in ")*/ \
+ /*wxT("mediactrl.cpp"),*/ \
+ /*szError, __LINE__) );*/ \
+ /*}*/ \
+ /*else*/ \
+ wxFAIL_MSG( wxString::Format(wxT("Unknown error (%i) ") \
+ wxT("occured at") \
+ wxT(" line %i in mediactrl.cpp."), \
+ (int)hrdsv, __LINE__) ); \
+ } \
}
+#define wxVERIFY(x) wxASSERT((x))
+#else
+#define wxAMVERIFY(x) (x)
+#define wxVERIFY(x) (x)
+#endif
-wxSize wxMediaCtrl::DoGetBestSize() const
-{
- if(m_imp && m_imp->IsLoaded())
- return m_imp->DoGetBestSize();
- return wxSize(0,0);
-}
+//---------------------------------------------------------------------------
+// Standard macros for ease of use
+//---------------------------------------------------------------------------
+#define SAFE_RELEASE(x) { if (x) x->Release(); x = NULL; }
-void wxMediaCtrl::DoMoveWindow(int x, int y, int w, int h)
+//---------------------------------------------------------------------------
+// wxAMMediaBackend Constructor
+//
+// Sets m_hNotifyWnd to NULL to signify that we haven't loaded anything yet
+//---------------------------------------------------------------------------
+wxAMMediaBackend::wxAMMediaBackend() : m_hNotifyWnd(NULL)
{
- wxControl::DoMoveWindow(x,y,w,h);
-
- if(m_imp && m_imp->IsLoaded())
- m_imp->DoMoveWindow(x, y, w, h);
}
-wxMediaCtrl::~wxMediaCtrl()
+//---------------------------------------------------------------------------
+// wxAMMediaBackend Destructor
+//
+// Cleans up everything
+//---------------------------------------------------------------------------
+wxAMMediaBackend::~wxAMMediaBackend()
{
- if (m_imp)
- delete m_imp;
+ if (m_hNotifyWnd)
+ Cleanup();
}
-
//---------------------------------------------------------------------------
+// wxAMMediaBackend::CreateControl
//
-// wxDXMediaCtrlImpl
+// ActiveMovie does not really have any native control to speak of,
+// so we just create a normal control with a black background.
//
-//---------------------------------------------------------------------------
-
-#if wxUSE_DIRECTSHOW
-
-wxDXMediaCtrlImpl::wxDXMediaCtrlImpl() : m_pGB(NULL)
-{
-}
-
-bool wxDXMediaCtrlImpl::Create(wxMediaCtrl* ctrl)
-{
+// We also check to see if ActiveMovie is installed
+//---------------------------------------------------------------------------
+bool wxAMMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent,
+ wxWindowID id,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxValidator& validator,
+ const wxString& name)
+{
//create our filter graph
- HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
+ HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void**)&m_pGB);
//directshow not installed?
if ( FAILED(hr) )
return false;
- m_ctrl = ctrl;
+ //release the filter graph - we don't need it yet
+ m_pGB->Release();
+ m_pGB = NULL;
+
+ //
+ // Create window
+ // By default wxWindow(s) is created with a border -
+ // so we need to get rid of those, and create with
+ // wxCLIP_CHILDREN, so that if the driver/backend
+ // is a child window, it refereshes properly
+ //
+ if ( !ctrl->wxControl::Create(parent, id, pos, size,
+ (style | wxNO_BORDER) | wxCLIP_CHILDREN,
+ validator, name) )
+ return false;
+ //
+ //Set our background color to black by default
+ //
+ ctrl->SetBackgroundColour(*wxBLACK);
+
+ m_ctrl = ctrl;
return true;
}
-#define SAFE_RELEASE(x) { if (x) x->Release(); x = NULL; }
-bool wxDXMediaCtrlImpl::Load(const wxString& fileName)
+//---------------------------------------------------------------------------
+// wxAMMediaBackend::Load (file version)
+//
+// Creates an Active Movie filter graph from a file or url
+//---------------------------------------------------------------------------
+bool wxAMMediaBackend::Load(const wxString& fileName)
{
- if(m_bLoaded)
+ if(m_hNotifyWnd)
Cleanup();
- SAFE_RELEASE(m_pGB);
-
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void**)&m_pGB);
return false;
//get the interfaces, all of them
- wxDSVERIFY( m_pGB->QueryInterface(IID_IMediaControl, (void**)&m_pMC) );
- wxDSVERIFY( m_pGB->QueryInterface(IID_IMediaEventEx, (void**)&m_pME) );
- wxDSVERIFY( m_pGB->QueryInterface(IID_IMediaSeeking, (void**)&m_pMS) );
- wxDSVERIFY( m_pGB->QueryInterface(IID_IVideoWindow, (void**)&m_pVW) );
- wxDSVERIFY( m_pGB->QueryInterface(IID_IBasicAudio, (void**)&m_pBA) );
- wxDSVERIFY( m_pGB->QueryInterface(IID_IBasicVideo, (void**)&m_pBV) );
-
+ wxAMVERIFY( m_pGB->QueryInterface(IID_IMediaControl, (void**)&m_pMC) );
+ wxAMVERIFY( m_pGB->QueryInterface(IID_IMediaEventEx, (void**)&m_pME) );
+ wxAMVERIFY( m_pGB->QueryInterface(IID_IMediaSeeking, (void**)&m_pMS) );
+ wxAMVERIFY( m_pGB->QueryInterface(IID_IVideoWindow, (void**)&m_pVW) );
+ wxAMVERIFY( m_pGB->QueryInterface(IID_IBasicAudio, (void**)&m_pBA) );
+ wxAMVERIFY( m_pGB->QueryInterface(IID_IBasicVideo, (void**)&m_pBV) );
+
+ //We could tell if the media has audio or not by
+ //something like
+ //-----
//long lVolume;
- //pBA->get_Volume(&lVolume);
- //E_NOTIMPL
-
- //get the _actual_ size of the movie & remember it
- long nX, nY, nSX, nSY;
- if (FAILED(m_pVW->GetWindowPosition(&nX,&nY,&nSX,&nSY)))
- {
- m_bVideo = false;
-
- nSX = nSY = 0;
- }
- else
+ //pBA->get_Volume(&lVolume) == E_NOTIMPL
+ //-----
+ //here...
+
+ //
+ //Obtain the _actual_ size of the movie & remember it
+ //
+ long nX,
+ nY;
+
+ m_bestSize.x = m_bestSize.y = 0;
+
+ m_bVideo = SUCCEEDED( m_pVW->GetWindowPosition( &nX,
+ &nY,
+ (long*)&m_bestSize.x,
+ (long*)&m_bestSize.y) );
+
+ //
+ //If we have video in the media - set it up so that
+ //its a child window of the control, its visible,
+ //and that the control is the owner of the video window
+ //
+ if (m_bVideo)
{
- m_bVideo = true;
+ wxAMVERIFY( m_pVW->put_Owner((OAHWND)m_ctrl->GetHandle()) );
+ wxAMVERIFY( m_pVW->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS) );
+ wxAMVERIFY( m_pVW->put_Visible(OATRUE) ); //OATRUE == -1
}
- m_bestSize.x = nSX;
- m_bestSize.y = nSY;
-
- if (m_bVideo)
+ //
+ // Create a hidden window and register to handle
+ // directshow events for this graph
+ // Note that wxCanvasClassName is already registered
+ // and used by all wxWindows and normal wxControls
+ //
+ m_hNotifyWnd = ::CreateWindow
+ (
+ wxCanvasClassName,
+ NULL,
+ 0, 0, 0, 0,
+ 0,
+ (HWND) NULL,
+ (HMENU)NULL,
+ wxGetInstance(),
+ (LPVOID) NULL
+ );
+
+ if(!m_hNotifyWnd)
{
- wxDSVERIFY( m_pVW->put_Owner((OAHWND)m_ctrl->GetHandle()) );
- wxDSVERIFY( m_pVW->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS) );
- wxDSVERIFY( m_pVW->put_Visible(OATRUE) ); //OATRUE == -1
- }
+ wxLogSysError( wxT("Could not create hidden needed for ")
+ wxT("registering for DirectShow events!") );
- //make it so that wxEVT_MOVIE_FINISHED works
- wxDSVERIFY( m_pME->SetNotifyWindow((OAHWND)m_ctrl->GetHandle(), WM_GRAPHNOTIFY, 0) );
+ return false;
+ }
+
+ ::SetWindowLongPtr(m_hNotifyWnd, GWLP_WNDPROC,
+ (LONG_PTR)wxAMMediaBackend::NotifyWndProc);
- //set the time format
- wxDSVERIFY( m_pMS->SetTimeFormat(&TIME_FORMAT_MEDIA_TIME) );
+ ::SetWindowLong(m_hNotifyWnd, GWL_USERDATA,
+ (LONG) this);
- //so that DoGetBestSize will work :)
- m_bLoaded = true;
+ wxAMVERIFY( m_pME->SetNotifyWindow((OAHWND)m_hNotifyWnd,
+ WM_GRAPHNOTIFY, 0) );
- //work around refresh issues
+ //
+ //set the time format
+ //
+ wxAMVERIFY( m_pMS->SetTimeFormat(&TIME_FORMAT_MEDIA_TIME) );
+
+ //
+ // Force the parent window of this control to recalculate
+ // the size of this if sizers are being used
+ // and render the results immediately
+ //
m_ctrl->InvalidateBestSize();
m_ctrl->GetParent()->Layout();
m_ctrl->GetParent()->Refresh();
return true;
}
-bool wxDXMediaCtrlImpl::Load(const wxURI& location)
+//---------------------------------------------------------------------------
+// wxAMMediaBackend::Load (URL Version)
+//
+// Loads media from a URL. Interestingly enough DirectShow
+// appears (?) to escape the URL for us, at least on normal
+// files
+//---------------------------------------------------------------------------
+bool wxAMMediaBackend::Load(const wxURI& location)
{
return Load(location.BuildUnescapedURI());
}
-bool wxDXMediaCtrlImpl::Play()
+//---------------------------------------------------------------------------
+// wxAMMediaBackend::Play
+//
+// Plays the stream. If it is non-seekable, it will restart it.
+//---------------------------------------------------------------------------
+bool wxAMMediaBackend::Play()
{
return SUCCEEDED( m_pMC->Run() );
}
-bool wxDXMediaCtrlImpl::Pause()
+//---------------------------------------------------------------------------
+// wxAMMediaBackend::Pause
+//
+// Pauses the stream.
+//---------------------------------------------------------------------------
+bool wxAMMediaBackend::Pause()
{
return SUCCEEDED( m_pMC->Pause() );
}
-bool wxDXMediaCtrlImpl::Stop()
+//---------------------------------------------------------------------------
+// wxAMMediaBackend::Stop
+//
+// Stops the stream.
+//---------------------------------------------------------------------------
+bool wxAMMediaBackend::Stop()
{
bool bOK = SUCCEEDED( m_pMC->Stop() );
return bOK;
}
-bool wxDXMediaCtrlImpl::SetPosition(long where)
+//---------------------------------------------------------------------------
+// wxAMMediaBackend::SetPosition
+//
+// 1) Translates the current position's time to directshow time,
+// which is in a scale of 100 nanoseconds
+// 2) Sets the play position of the IMediaSeeking interface -
+// passing NULL as the stop position means to keep the old
+// stop position
+//---------------------------------------------------------------------------
+bool wxAMMediaBackend::SetPosition(wxLongLong where)
{
- //DS uses 100 nanos - so we need a 10 mult
- LONGLONG pos = ((LONGLONG)where) * 10000;
+ LONGLONG pos = ((LONGLONG)where.GetValue()) * 10000;
return SUCCEEDED( m_pMS->SetPositions(
&pos,
) );
}
-long wxDXMediaCtrlImpl::GetPosition()
+//---------------------------------------------------------------------------
+// wxAMMediaBackend::GetPosition
+//
+// 1) Obtains the current play and stop positions from IMediaSeeking
+// 2) Returns the play position translated to our time base
+//---------------------------------------------------------------------------
+wxLongLong wxAMMediaBackend::GetPosition()
{
LONGLONG outCur, outStop;
- wxDSVERIFY( m_pMS->GetPositions(&outCur, &outStop) );
+ wxAMVERIFY( m_pMS->GetPositions(&outCur, &outStop) );
//h,m,s,milli - outdur is in 100 nanos
return outCur/10000;
}
-long wxDXMediaCtrlImpl::GetDuration()
+//---------------------------------------------------------------------------
+// wxAMMediaBackend::GetDuration
+//
+// 1) Obtains the duration of the media from the IMediaSeeking interface
+// 2) Converts that value to our time base, and returns it
+//---------------------------------------------------------------------------
+wxLongLong wxAMMediaBackend::GetDuration()
{
LONGLONG outDuration;
- wxDSVERIFY( m_pMS->GetDuration(&outDuration) );
+ wxAMVERIFY( m_pMS->GetDuration(&outDuration) );
//h,m,s,milli - outdur is in 100 nanos
return outDuration/10000;
}
-wxMediaState wxDXMediaCtrlImpl::GetState()
+//---------------------------------------------------------------------------
+// wxAMMediaBackend::GetState
+//
+// Obtains the state from the IMediaControl interface.
+// Note that it's enumeration values for stopping/playing
+// etc. are the same as ours, so we just do a straight cast.
+// TODO: MS recommends against INFINITE here for
+// IMediaControl::GetState- do it in stages
+//---------------------------------------------------------------------------
+wxMediaState wxAMMediaBackend::GetState()
{
- //TODO: MS recommends against INFINITE here - do it in stages
HRESULT hr;
OAFilterState theState;
hr = m_pMC->GetState(INFINITE, &theState);
return (wxMediaState) theState;
}
-double wxDXMediaCtrlImpl::GetPlaybackRate()
+//---------------------------------------------------------------------------
+// wxAMMediaBackend::GetPlaybackRate
+//
+// Pretty simple way of obtaining the playback rate from
+// the IMediaSeeking interface
+//---------------------------------------------------------------------------
+double wxAMMediaBackend::GetPlaybackRate()
{
double dRate;
- wxDSVERIFY( m_pMS->GetRate(&dRate) );
+ wxAMVERIFY( m_pMS->GetRate(&dRate) );
return dRate;
}
-bool wxDXMediaCtrlImpl::SetPlaybackRate(double dRate)
+//---------------------------------------------------------------------------
+// wxAMMediaBackend::SetPlaybackRate
+//
+// Sets the playback rate of the media - DirectShow is pretty good
+// about this, actually
+//---------------------------------------------------------------------------
+bool wxAMMediaBackend::SetPlaybackRate(double dRate)
{
return SUCCEEDED( m_pMS->SetRate(dRate) );
}
-bool wxDXMediaCtrlImpl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
+//---------------------------------------------------------------------------
+// wxAMMediaBackend::NotifyWndProc
+//
+// Here we check to see if DirectShow tells us we've reached the stop
+// position in our stream - if it has, it may not actually stop
+// the stream - which we need to do...
+//---------------------------------------------------------------------------
+LRESULT CALLBACK wxAMMediaBackend::NotifyWndProc(HWND hWnd, UINT nMsg,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ wxAMMediaBackend* backend = (wxAMMediaBackend*)
+ ::GetWindowLong(hWnd, GWL_USERDATA);
+
+ return backend->OnNotifyWndProc(hWnd, nMsg, wParam, lParam);
+}
+
+LRESULT CALLBACK wxAMMediaBackend::OnNotifyWndProc(HWND hWnd, UINT nMsg,
+ WPARAM wParam,
+ LPARAM lParam)
{
if (nMsg == WM_GRAPHNOTIFY)
{
- LONG evCode, evParam1, evParam2;
- HRESULT hr=S_OK;
-
- // Process all queued events
+ LONG evCode,
+ evParam1,
+ evParam2;
+
+ //
+ // DirectShow keeps a list of queued events, and we need
+ // to go through them one by one, stopping at (Hopefully only one)
+ // EC_COMPLETE message
+ //
while(SUCCEEDED(m_pME->GetEvent(&evCode, (LONG_PTR *) &evParam1,
(LONG_PTR *) &evParam2, 0)
)
)
{
- // Free memory associated with callback, since we're not using it
- hr = m_pME->FreeEventParams(evCode, evParam1, evParam2);
+ // Cleanup memory that GetEvent allocated
+ wxAMVERIFY( m_pME->FreeEventParams(evCode, evParam1, evParam2) );
// If this is the end of the clip, notify handler
if(EC_COMPLETE == evCode)
{
- //Interestingly enough, DirectShow does not actually stop
- //the filters - even when it reaches the end!
-#ifdef __WXDEBUG__
- wxASSERT( Stop() );
-#else
- Stop();
-#endif
-
- wxMediaEvent theEvent(wxEVT_MEDIA_FINISHED, m_ctrl->GetId());
- m_ctrl->GetParent()->ProcessEvent(theEvent);
+ //send the event to our child
+ wxMediaEvent theEvent(wxEVT_MEDIA_STOP, m_ctrl->GetId());
+ m_ctrl->ProcessEvent(theEvent);
+
+ //if the user didn't veto it, stop the stream
+ if (theEvent.IsAllowed())
+ {
+ //Interestingly enough, DirectShow does not actually stop
+ //the filters - even when it reaches the end!
+ wxVERIFY( Stop() );
+
+ //send the event to our child
+ wxMediaEvent theEvent(wxEVT_MEDIA_FINISHED,
+ m_ctrl->GetId());
+ m_ctrl->ProcessEvent(theEvent);
+ }
}
}
- return true;
}
- return false;
+ return DefWindowProc(hWnd, nMsg, wParam, lParam);
}
-void wxDXMediaCtrlImpl::Cleanup()
+//---------------------------------------------------------------------------
+// wxAMMediaBackend::Cleanup
+//
+// 1) Hide/disowns the video window (MS says bad things will happen if
+// you don't)
+// 2) Releases all the directshow interfaces we use
+// TODO: Maybe there's a way to redirect the IGraphBuilder each time
+// we load, rather then creating and destroying the interfaces
+// each time?
+//---------------------------------------------------------------------------
+void wxAMMediaBackend::Cleanup()
{
// Hide then disown the window
if(m_pVW)
SAFE_RELEASE(m_pBA);
SAFE_RELEASE(m_pBV);
SAFE_RELEASE(m_pVW);
-}
-
-wxDXMediaCtrlImpl::~wxDXMediaCtrlImpl()
-{
- if (m_bLoaded)
- Cleanup();
-
SAFE_RELEASE(m_pGB);
+
+ // Get rid of our hidden Window
+ DestroyWindow(m_hNotifyWnd);
+ m_hNotifyWnd = NULL;
}
-wxSize wxDXMediaCtrlImpl::DoGetBestSize() const
+
+//---------------------------------------------------------------------------
+// wxAMMediaBackend::GetVideoSize
+//
+// Obtains the cached original video size
+//---------------------------------------------------------------------------
+wxSize wxAMMediaBackend::GetVideoSize() const
{
return m_bestSize;
}
-void wxDXMediaCtrlImpl::DoMoveWindow(int x, int y, int w, int h)
+//---------------------------------------------------------------------------
+// wxAMMediaBackend::Move
+//
+// Resizes the IVideoWindow to the size of the control window
+//---------------------------------------------------------------------------
+void wxAMMediaBackend::Move(int x, int y, int w, int h)
{
- if(m_bLoaded && m_bVideo)
+ if(m_hNotifyWnd && m_bVideo)
{
- wxDSVERIFY( m_pVW->SetWindowPosition(0, 0, w, h) );
+ wxAMVERIFY( m_pVW->SetWindowPosition(0, 0, w, h) );
}
}
+//---------------------------------------------------------------------------
+// End of wxAMMediaBackend
+//---------------------------------------------------------------------------
#endif //wxUSE_DIRECTSHOW
-//---------------------------------------------------------------------------
-//
-// wxWMMEMediaCtrlImpl
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
+// wxMCIMediaBackend
+//
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+
+IMPLEMENT_DYNAMIC_CLASS(wxMCIMediaBackend, wxMediaBackend);
+
+//---------------------------------------------------------------------------
+// Usual debugging macros for MCI returns
//---------------------------------------------------------------------------
+#ifdef __WXDEBUG__
+#define wxMCIVERIFY(arg) \
+{ \
+ DWORD nRet; \
+ if ( (nRet = (arg)) != 0) \
+ { \
+ TCHAR sz[5000]; \
+ mciGetErrorString(nRet, sz, 5000); \
+ wxFAIL_MSG(wxString::Format(_T("MCI Error:%s"), sz)); \
+ } \
+}
+#else
+#define wxMCIVERIFY(arg) (arg);
+#endif
+
+//---------------------------------------------------------------------------
+// Simulation for <digitalv.h>
//
-// Cruft to simulate digitalv.h
-//
+// Mingw and possibly other compilers don't have the digitalv.h header
+// that is needed to have some essential features of mci work with
+// windows - so we provide the declarations for the types we use here
+//---------------------------------------------------------------------------
typedef struct {
DWORD_PTR dwCallback;
#ifndef _WIN32
WORD wReserved2;
#endif
- LPSTR lpstrText;
-} MCI_DGV_WINDOW_PARMSA;
+ wxChar* lpstrText;
+} MCI_DGV_WINDOW_PARMS;
typedef struct {
- DWORD_PTR dwCallback;
- HWND hWnd;
-#ifndef _WIN32
- WORD wReserved1;
-#endif
- UINT nCmdShow;
-#ifndef _WIN32
- WORD wReserved2;
-#endif
- LPWSTR lpstrText;
-} MCI_DGV_WINDOW_PARMSW;
-#ifdef UNICODE
-typedef MCI_DGV_WINDOW_PARMSW MCI_DGV_WINDOW_PARMS;
-#else
-typedef MCI_DGV_WINDOW_PARMSA MCI_DGV_WINDOW_PARMS;
-#endif // UNICODE
+ DWORD_PTR dwCallback;
+ DWORD dwTimeFormat;
+ DWORD dwAudio;
+ DWORD dwFileFormat;
+ DWORD dwSpeed;
+} MCI_DGV_SET_PARMS;
-wxWMMEMediaCtrlImpl::wxWMMEMediaCtrlImpl() : m_bVideo(false)
-{
-/* TCHAR sz[5000];
- mciGetErrorString(nError, sz, 5000);
- wxMessageBox(wxString::Format(_T("Error:%s"), sz));
- */
+//---------------------------------------------------------------------------
+// wxMCIMediaBackend Constructor
+//
+// Here we don't need to do much except say we don't have any video :)
+//---------------------------------------------------------------------------
+wxMCIMediaBackend::wxMCIMediaBackend() : m_hNotifyWnd(NULL), m_bVideo(false)
+{
}
-wxWMMEMediaCtrlImpl::~wxWMMEMediaCtrlImpl()
+//---------------------------------------------------------------------------
+// wxMCIMediaBackend Destructor
+//
+// We close the mci device - note that there may not be an mci device here,
+// or it may fail - but we don't really care, since we're destructing
+//---------------------------------------------------------------------------
+wxMCIMediaBackend::~wxMCIMediaBackend()
{
- mciSendCommand(m_hDev, MCI_CLOSE, 0, 0);
+ if(m_hNotifyWnd)
+ {
+ mciSendCommand(m_hDev, MCI_CLOSE, 0, 0);
+ DestroyWindow(m_hNotifyWnd);
+ m_hNotifyWnd = NULL;
+ }
}
-bool wxWMMEMediaCtrlImpl::Create(wxMediaCtrl* ctrl)
+//---------------------------------------------------------------------------
+// wxMCIMediaBackend::Create
+//
+// Here we just tell wxMediaCtrl that mci does exist (which it does, on all
+// msw systems, at least in some form dating back to win16 days)
+//---------------------------------------------------------------------------
+bool wxMCIMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent,
+ wxWindowID id,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxValidator& validator,
+ const wxString& name)
{
+ //
+ // Create window
+ // By default wxWindow(s) is created with a border -
+ // so we need to get rid of those, and create with
+ // wxCLIP_CHILDREN, so that if the driver/backend
+ // is a child window, it refereshes properly
+ //
+ if ( !ctrl->wxControl::Create(parent, id, pos, size,
+ (style & ~wxBORDER_MASK) | wxCLIP_CHILDREN,
+ validator, name) )
+ return false;
+
+ //
+ //Set our background color to black by default
+ //
+ ctrl->SetBackgroundColour(*wxBLACK);
+
m_ctrl = ctrl;
return true;
}
-bool wxWMMEMediaCtrlImpl::Load(const wxString& fileName)
+//---------------------------------------------------------------------------
+// wxMCIMediaBackend::Load (file version)
+//
+// Here we have MCI load a file and device, set the time format to our
+// default (milliseconds), and set the video (if any) to play in the control
+//---------------------------------------------------------------------------
+bool wxMCIMediaBackend::Load(const wxString& fileName)
{
- if(m_bLoaded)
+ //
+ //if the user already called load close the previous MCI device
+ //
+ if(m_hNotifyWnd)
+ {
mciSendCommand(m_hDev, MCI_CLOSE, 0, 0);
+ DestroyWindow(m_hNotifyWnd);
+ m_hNotifyWnd = NULL;
+ }
+ //
+ //Opens a file and has MCI select a device. Normally you'd put
+ //MCI_OPEN_TYPE in addition to MCI_OPEN_ELEMENT - however if you
+ //omit this it tells MCI to select the device instead. This is
+ //good because we have no reliable way of "enumerating" the devices
+ //in MCI
+ //
MCI_OPEN_PARMS openParms;
- MCI_SET_PARMS setParms;
-
openParms.lpstrElementName = (wxChar*) fileName.c_str();
- //Here's where the trick lies - if you don't specify MCI_OPEN_TYPE,
- //then it actually automagically finds the device for you!
- if ( mciSendCommand(0, MCI_OPEN,
- MCI_OPEN_ELEMENT,
- (DWORD)(LPVOID)&openParms) != 0)
- return false;
+ if ( mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT,
+ (DWORD)(LPVOID)&openParms) != 0)
+ return false;
m_hDev = openParms.wDeviceID;
+ //
+ //Now set the time format for the device to milliseconds
+ //
+ MCI_SET_PARMS setParms;
setParms.dwCallback = 0;
setParms.dwTimeFormat = MCI_FORMAT_MILLISECONDS;
(DWORD)(LPVOID)&setParms) != 0)
return false;
+ //
+ //Now tell the MCI device to display the video in our wxMediaCtrl
+ //
MCI_DGV_WINDOW_PARMS windowParms;
-
windowParms.hWnd = (HWND)m_ctrl->GetHandle();
- m_bVideo = (mciSendCommand(m_hDev, MCI_WINDOW,
- 0x00010000L //MCI_DGV_WINDOW_HWND
- ,
- (DWORD)(LPVOID)&windowParms) == 0);
- m_bLoaded = true;
- //work around refresh issues
+ m_bVideo = (mciSendCommand(m_hDev, MCI_WINDOW,
+ 0x00010000L, //MCI_DGV_WINDOW_HWND
+ (DWORD)(LPVOID)&windowParms) == 0);
+
+ //
+ // Create a hidden window and register to handle
+ // MCI events
+ // Note that wxCanvasClassName is already registered
+ // and used by all wxWindows and normal wxControls
+ //
+ m_hNotifyWnd = ::CreateWindow
+ (
+ wxCanvasClassName,
+ NULL,
+ 0, 0, 0, 0,
+ 0,
+ (HWND) NULL,
+ (HMENU)NULL,
+ wxGetInstance(),
+ (LPVOID) NULL
+ );
+
+ if(!m_hNotifyWnd)
+ {
+ wxLogSysError( wxT("Could not create hidden needed for ")
+ wxT("registering for DirectShow events!") );
+
+ return false;
+ }
+
+ ::SetWindowLong(m_hNotifyWnd, GWL_WNDPROC,
+ (LONG)wxMCIMediaBackend::NotifyWndProc);
+
+ ::SetWindowLong(m_hNotifyWnd, GWL_USERDATA,
+ (LONG) this);
+
+ //
+ //Here, if the parent of the control has a sizer - we
+ //tell it to recalculate the size of this control since
+ //the user opened a seperate media file
+ //
m_ctrl->InvalidateBestSize();
m_ctrl->GetParent()->Layout();
m_ctrl->GetParent()->Refresh();
return true;
}
-bool wxWMMEMediaCtrlImpl::Load(const wxURI& WXUNUSED(location))
+//---------------------------------------------------------------------------
+// wxMCIMediaBackend::Load (URL version)
+//
+// MCI doesn't support URLs directly (?)
+//
+// TODO: Use wxURL/wxFileSystem and mmioInstallProc
+//---------------------------------------------------------------------------
+bool wxMCIMediaBackend::Load(const wxURI& WXUNUSED(location))
{
return false;
}
-bool wxWMMEMediaCtrlImpl::Play()
+//---------------------------------------------------------------------------
+// wxMCIMediaBackend::Play
+//
+// Plays/Resumes the MCI device... a couple notes:
+// 1) Certain drivers will crash and burn if we don't pass them an
+// MCI_PLAY_PARMS, despite the documentation that says otherwise...
+// 2) There is a MCI_RESUME command, but MCI_PLAY does the same thing
+// and will resume from a stopped state also, so there's no need to
+// call both, for example
+//---------------------------------------------------------------------------
+bool wxMCIMediaBackend::Play()
{
- //the directshow driver ("mpegvideo") will crash if we don't do a playParms here
MCI_PLAY_PARMS playParms;
- playParms.dwCallback = (DWORD)(HWND)m_ctrl->GetHWND();
- bool bOK = mciSendCommand(m_hDev, MCI_PLAY, MCI_NOTIFY, (DWORD)(LPVOID)&playParms) == 0;
- return (bOK) ;/*||
- (mciSendCommand(m_hDev, MCI_RESUME, 0, 0) == 0);*/
+ playParms.dwCallback = (DWORD)m_hNotifyWnd;
+
+ return ( mciSendCommand(m_hDev, MCI_PLAY, MCI_NOTIFY,
+ (DWORD)(LPVOID)&playParms) == 0 );
}
-bool wxWMMEMediaCtrlImpl::Pause()
+//---------------------------------------------------------------------------
+// wxMCIMediaBackend::Pause
+//
+// Pauses the MCI device - nothing special
+//---------------------------------------------------------------------------
+bool wxMCIMediaBackend::Pause()
{
return (mciSendCommand(m_hDev, MCI_PAUSE, MCI_WAIT, 0) == 0);
}
-bool wxWMMEMediaCtrlImpl::Stop()
+//---------------------------------------------------------------------------
+// wxMCIMediaBackend::Stop
+//
+// Stops the MCI device & seeks to the beginning as wxMediaCtrl docs outline
+//---------------------------------------------------------------------------
+bool wxMCIMediaBackend::Stop()
{
return (mciSendCommand(m_hDev, MCI_STOP, MCI_WAIT, 0) == 0) &&
(mciSendCommand(m_hDev, MCI_SEEK, MCI_SEEK_TO_START, 0) == 0);
}
-
-wxMediaState wxWMMEMediaCtrlImpl::GetState()
+//---------------------------------------------------------------------------
+// wxMCIMediaBackend::GetState
+//
+// Here we get the state and convert it to a wxMediaState -
+// since we use direct comparisons with MCI_MODE_PLAY and
+// MCI_MODE_PAUSE, we don't care if the MCI_STATUS call
+// fails or not
+//---------------------------------------------------------------------------
+wxMediaState wxMCIMediaBackend::GetState()
{
MCI_STATUS_PARMS statusParms;
statusParms.dwItem = MCI_STATUS_MODE;
+
mciSendCommand(m_hDev, MCI_STATUS, MCI_STATUS_ITEM,
(DWORD)(LPVOID)&statusParms);
return wxMEDIASTATE_STOPPED;
}
-bool wxWMMEMediaCtrlImpl::SetPosition(long where)
+//---------------------------------------------------------------------------
+// wxMCIMediaBackend::SetPosition
+//
+// Here we set the position of the device in the stream.
+// Note that MCI actually stops the device after you seek it if the
+// device is playing/paused, so we need to play the file after
+// MCI seeks like normal APIs would
+//---------------------------------------------------------------------------
+bool wxMCIMediaBackend::SetPosition(wxLongLong where)
{
MCI_SEEK_PARMS seekParms;
seekParms.dwCallback = 0;
- seekParms.dwTo = where;
+ seekParms.dwTo = where.GetValue();
+ //device was playing?
bool bReplay = GetState() == wxMEDIASTATE_PLAYING;
- if( mciSendCommand(m_hDev, MCI_SEEK, MCI_TO, (DWORD)(LPVOID)&seekParms) != 0)
+ if( mciSendCommand(m_hDev, MCI_SEEK, MCI_TO,
+ (DWORD)(LPVOID)&seekParms) != 0)
return false;
+ //If the device was playing, resume it
if (bReplay)
return Play();
else
return true;
}
-long wxWMMEMediaCtrlImpl::GetPosition()
+//---------------------------------------------------------------------------
+// wxMCIMediaBackend::GetPosition
+//
+// Gets the position of the device in the stream using the current
+// time format... nothing special here...
+//---------------------------------------------------------------------------
+wxLongLong wxMCIMediaBackend::GetPosition()
{
MCI_STATUS_PARMS statusParms;
-
statusParms.dwItem = MCI_STATUS_POSITION;
+
if (mciSendCommand(m_hDev, MCI_STATUS, MCI_STATUS_ITEM,
- (DWORD)(LPSTR)&statusParms) != 0)
+ (DWORD)(LPSTR)&statusParms) != 0)
return 0;
return statusParms.dwReturn;
}
-long wxWMMEMediaCtrlImpl::GetDuration()
+//---------------------------------------------------------------------------
+// wxMCIMediaBackend::GetDuration
+//
+// Gets the duration of the stream... nothing special
+//---------------------------------------------------------------------------
+wxLongLong wxMCIMediaBackend::GetDuration()
{
MCI_STATUS_PARMS statusParms;
-
statusParms.dwItem = MCI_STATUS_LENGTH;
+
if (mciSendCommand(m_hDev, MCI_STATUS, MCI_STATUS_ITEM,
- (DWORD)(LPSTR)&statusParms) != 0)
+ (DWORD)(LPSTR)&statusParms) != 0)
return 0;
return statusParms.dwReturn;
}
-void wxWMMEMediaCtrlImpl::DoMoveWindow(int, int, int, int)
+//---------------------------------------------------------------------------
+// wxMCIMediaBackend::Move
+//
+// Moves the window to a location
+//---------------------------------------------------------------------------
+void wxMCIMediaBackend::Move(int WXUNUSED(x), int WXUNUSED(y),
+ int w, int h)
{
+ if (m_hNotifyWnd && m_bVideo)
+ {
+ MCI_DGV_RECT_PARMS putParms; //ifdefed MCI_DGV_PUT_PARMS
+ putParms.rc.top = 0;
+ putParms.rc.bottom = 0;
+ putParms.rc.right = w;
+ putParms.rc.bottom = h;
+
+ wxMCIVERIFY( mciSendCommand(m_hDev, MCI_PUT,
+ 0x00040000L, //MCI_DGV_PUT_DESTINATION
+ (DWORD)(LPSTR)&putParms) );
+ }
}
-wxSize wxWMMEMediaCtrlImpl::DoGetBestSize() const
+//---------------------------------------------------------------------------
+// wxMCIMediaBackend::GetVideoSize
+//
+// Gets the original size of the movie for sizers
+//---------------------------------------------------------------------------
+wxSize wxMCIMediaBackend::GetVideoSize() const
{
if(m_bVideo)
{
- MCI_DGV_RECT_PARMS rect;
+ MCI_DGV_RECT_PARMS whereParms; //ifdefed MCI_DGV_WHERE_PARMS
- mciSendCommand(m_hDev, MCI_WHERE, 0x00020000L//MCI_DGV_WHERE_SOURCE
- ,
- (DWORD)(LPSTR)&rect);
- return wxSize(rect.rc.right, rect.rc.bottom);
+ wxMCIVERIFY( mciSendCommand(m_hDev, MCI_WHERE,
+ 0x00020000L, //MCI_DGV_WHERE_SOURCE
+ (DWORD)(LPSTR)&whereParms) );
+
+ return wxSize(whereParms.rc.right, whereParms.rc.bottom);
}
return wxSize(0,0);
}
-double wxWMMEMediaCtrlImpl::GetPlaybackRate()
+//---------------------------------------------------------------------------
+// wxMCIMediaBackend::GetPlaybackRate
+//
+// TODO
+//---------------------------------------------------------------------------
+double wxMCIMediaBackend::GetPlaybackRate()
{
return 1.0;
}
-bool wxWMMEMediaCtrlImpl::SetPlaybackRate(double)
+//---------------------------------------------------------------------------
+// wxMCIMediaBackend::SetPlaybackRate
+//
+// TODO
+//---------------------------------------------------------------------------
+bool wxMCIMediaBackend::SetPlaybackRate(double WXUNUSED(dRate))
{
+/*
+ MCI_WAVE_SET_SAMPLESPERSEC
+ MCI_DGV_SET_PARMS setParms;
+ setParms.dwSpeed = (DWORD) (dRate * 1000.0);
+
+ return (mciSendCommand(m_hDev, MCI_SET,
+ 0x00020000L, //MCI_DGV_SET_SPEED
+ (DWORD)(LPSTR)&setParms) == 0);
+*/
return false;
}
-bool wxWMMEMediaCtrlImpl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
+//---------------------------------------------------------------------------
+// [static] wxMCIMediaBackend::MSWWindowProc
+//
+// Here we process a message when MCI reaches the stopping point
+// in the stream
+//---------------------------------------------------------------------------
+LRESULT CALLBACK wxMCIMediaBackend::NotifyWndProc(HWND hWnd, UINT nMsg,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ wxMCIMediaBackend* backend = (wxMCIMediaBackend*)
+ ::GetWindowLong(hWnd, GWL_USERDATA);
+ wxASSERT(backend);
+
+ return backend->OnNotifyWndProc(hWnd, nMsg, wParam, lParam);
+}
+
+LRESULT CALLBACK wxMCIMediaBackend::OnNotifyWndProc(HWND hWnd, UINT nMsg,
+ WPARAM wParam,
+ LPARAM lParam)
{
if(nMsg == MM_MCINOTIFY)
{
- wxASSERT(lParam == (WXLPARAM) m_hDev);
- if(wParam == (WXWPARAM) MCI_NOTIFY_SUCCESSFUL && lParam == (WXLPARAM) m_hDev)
+ wxASSERT(lParam == (LPARAM) m_hDev);
+ if(wParam == MCI_NOTIFY_SUCCESSFUL && lParam == (LPARAM)m_hDev)
{
-#ifdef __WXDEBUG__
- wxASSERT(mciSendCommand(m_hDev, MCI_SEEK, MCI_SEEK_TO_START, 0) == 0);
-#else
- mciSendCommand(m_hDev, MCI_SEEK, MCI_SEEK_TO_START, 0);
-#endif
+ wxMediaEvent theEvent(wxEVT_MEDIA_STOP, m_ctrl->GetId());
+ m_ctrl->ProcessEvent(theEvent);
+
+ if(theEvent.IsAllowed())
+ {
+ wxMCIVERIFY( mciSendCommand(m_hDev, MCI_SEEK,
+ MCI_SEEK_TO_START, 0) );
- wxMediaEvent theEvent(wxEVT_MEDIA_FINISHED, m_ctrl->GetId());
- m_ctrl->GetParent()->ProcessEvent(theEvent);
+ //send the event to our child
+ wxMediaEvent theEvent(wxEVT_MEDIA_FINISHED,
+ m_ctrl->GetId());
+ m_ctrl->ProcessEvent(theEvent);
+ }
}
- return true;
}
- return false;
+ return DefWindowProc(hWnd, nMsg, wParam, lParam);
}
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+//
+// wxQTMediaBackend
+//
+// TODO: Use a less cludgy way to pause/get state/set state
+// TODO: Dynamically load from qtml.dll
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+#if wxUSE_QUICKTIME
+
+IMPLEMENT_DYNAMIC_CLASS(wxQTMediaBackend, wxMediaBackend);
+
+//Time between timer calls
+#define MOVIE_DELAY 100
+
+#include "wx/timer.h"
+
+// --------------------------------------------------------------------------
+// wxQTTimer - Handle Asyncronous Playing
+// --------------------------------------------------------------------------
+class _wxQTTimer : public wxTimer
+{
+public:
+ _wxQTTimer(Movie movie, wxQTMediaBackend* parent) :
+ m_movie(movie), m_bPaused(false), m_parent(parent)
+ {
+ }
+
+ ~_wxQTTimer()
+ {
+ }
+
+ bool GetPaused() {return m_bPaused;}
+ void SetPaused(bool bPaused) {m_bPaused = bPaused;}
+
+ //-----------------------------------------------------------------------
+ // _wxQTTimer::Notify
+ //
+ // 1) Checks to see if the movie is done, and if not continues
+ // streaming the movie
+ // 2) Sends the wxEVT_MEDIA_STOP event if we have reached the end of
+ // the movie.
+ //-----------------------------------------------------------------------
+ void Notify()
+ {
+ if (!m_bPaused)
+ {
+ if(!IsMovieDone(m_movie))
+ MoviesTask(m_movie, MOVIE_DELAY);
+ else
+ {
+ wxMediaEvent theEvent(wxEVT_MEDIA_STOP,
+ m_parent->m_ctrl->GetId());
+ m_parent->m_ctrl->ProcessEvent(theEvent);
+
+ if(theEvent.IsAllowed())
+ {
+ Stop();
+ m_parent->Stop();
+ wxASSERT(::GetMoviesError() == noErr);
+
+ //send the event to our child
+ wxMediaEvent theEvent(wxEVT_MEDIA_FINISHED,
+ m_parent->m_ctrl->GetId());
+ m_parent->m_ctrl->ProcessEvent(theEvent);
+ }
+ }
+ }
+ }
+
+protected:
+ Movie m_movie; //Our movie instance
+ bool m_bPaused; //Whether we are paused or not
+ wxQTMediaBackend* m_parent; //Backend pointer
+};
+
+//---------------------------------------------------------------------------
+// wxQTMediaBackend Destructor
+//
+// Sets m_timer to NULL signifying we havn't loaded anything yet
+//---------------------------------------------------------------------------
+wxQTMediaBackend::wxQTMediaBackend() : m_timer(NULL)
+{
+}
+
+//---------------------------------------------------------------------------
+// wxQTMediaBackend Destructor
+//
+// 1) Cleans up the QuickTime movie instance
+// 2) Decrements the QuickTime reference counter - if this reaches
+// 0, QuickTime shuts down
+// 3) Decrements the QuickTime Windows Media Layer reference counter -
+// if this reaches 0, QuickTime shuts down the Windows Media Layer
+//---------------------------------------------------------------------------
+wxQTMediaBackend::~wxQTMediaBackend()
+{
+ if(m_timer)
+ Cleanup();
+
+ //Note that ExitMovies() is not neccessary, but
+ //the docs are fuzzy on whether or not TerminateQTML is
+ ExitMovies();
+ TerminateQTML();
+}
+
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::CreateControl
+//
+// 1) Intializes QuickTime
+// 2) Creates the control window
+//---------------------------------------------------------------------------
+bool wxQTMediaBackend::CreateControl(wxControl* ctrl, wxWindow* parent,
+ wxWindowID id,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxValidator& validator,
+ const wxString& name)
+{
+ int nError;
+ if ((nError = InitializeQTML(0)) != noErr) //-2093 no dll
+ {
+ wxFAIL_MSG(wxString::Format(wxT("Couldn't Initialize Quicktime-%i"), nError));
+ return false;
+ }
+ EnterMovies();
+
+ //
+ // Create window
+ // By default wxWindow(s) is created with a border -
+ // so we need to get rid of those
+ //
+ // Since we don't have a child window like most other
+ // backends, we don't need wxCLIP_CHILDREN
+ //
+ if ( !ctrl->wxControl::Create(parent, id, pos, size,
+ (style & ~wxBORDER_MASK),
+ validator, name) )
+ return false;
+
+ //
+ //Set our background color to black by default
+ //
+ ctrl->SetBackgroundColour(*wxBLACK);
+
+ m_ctrl = ctrl;
+ return true;
+}
+
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Load (file version)
+//
+// 1) Get an FSSpec from the Windows path name
+// 2) Open the movie
+// 3) Obtain the movie instance from the movie resource
+// 4)
+//---------------------------------------------------------------------------
+bool wxQTMediaBackend::Load(const wxString& fileName)
+{
+ if(m_timer)
+ Cleanup();
+ OSErr err = noErr;
+ short movieResFile;
+ FSSpec sfFile;
+
+ if (NativePathNameToFSSpec ((char*) fileName.mb_str(), &sfFile, 0) != noErr)
+ return false;
+
+ if (OpenMovieFile (&sfFile, &movieResFile, fsRdPerm) != noErr)
+ return false;
+
+ short movieResID = 0;
+ Str255 movieName;
+
+ err = NewMovieFromFile (
+ &m_movie,
+ movieResFile,
+ &movieResID,
+ movieName,
+ newMovieActive,
+ NULL); //wasChanged
+
+ CloseMovieFile (movieResFile);
+
+ if (err != noErr)
+ return false;
+
+ FinishLoad();
+
+ return ::GetMoviesError() == noErr;
+}
+
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+bool wxQTMediaBackend::Load(const wxURI& location)
+{
+ if(m_timer)
+ Cleanup();
+
+ wxString theURI = location.BuildURI();
+
+ OSErr err = noErr;
+
+ Handle theHandle = NewHandleClear(theURI.length() + 1);
+ wxASSERT(theHandle);
+
+ BlockMove(theURI.mb_str(), *theHandle, theURI.length() + 1);
+
+ //create the movie from the handle that refers to the URI
+ err = NewMovieFromDataRef(&m_movie, newMovieActive,
+ NULL, theHandle,
+ URLDataHandlerSubType);
+
+ DisposeHandle(theHandle);
+
+ if (err != noErr)
+ return false;
+
+ //preroll movie for streaming
+ //TODO:Async this?
+ TimeValue timeNow;
+ Fixed playRate;
+ timeNow = GetMovieTime(m_movie, NULL);
+ playRate = GetMoviePreferredRate(m_movie);
+ PrePrerollMovie(m_movie, timeNow, playRate, NULL, NULL);
+ PrerollMovie(m_movie, timeNow, playRate);
+ SetMovieRate(m_movie, playRate);
+
+ FinishLoad();
+
+ return ::GetMoviesError() == noErr;
+}
+
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+void wxQTMediaBackend::FinishLoad()
+{
+ m_timer = new _wxQTTimer(m_movie, (wxQTMediaBackend*) this);
+ wxASSERT(m_timer);
+
+ //get the real size of the movie
+ Rect outRect;
+ ::GetMovieNaturalBoundsRect (m_movie, &outRect);
+ wxASSERT(::GetMoviesError() == noErr);
+
+ m_bestSize.x = outRect.right - outRect.left;
+ m_bestSize.y = outRect.bottom - outRect.top;
+
+ //reparent movie/*AudioMediaCharacteristic*/
+ if(GetMovieIndTrackType(m_movie, 1,
+ VisualMediaCharacteristic,
+ movieTrackCharacteristic |
+ movieTrackEnabledOnly) != NULL)
+ {
+ CreatePortAssociation(m_ctrl->GetHWND(), NULL, 0L);
+
+ SetMovieGWorld(m_movie,
+ (CGrafPtr) GetNativeWindowPort(m_ctrl->GetHWND()),
+ nil);
+ }
+
+ //we want millisecond precision
+ ::SetMovieTimeScale(m_movie, 1000);
+ wxASSERT(::GetMoviesError() == noErr);
+
+ //
+ //Here, if the parent of the control has a sizer - we
+ //tell it to recalculate the size of this control since
+ //the user opened a seperate media file
+ //
+ m_ctrl->InvalidateBestSize();
+ m_ctrl->GetParent()->Layout();
+ m_ctrl->GetParent()->Refresh();
+ m_ctrl->GetParent()->Update();
+}
+
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+bool wxQTMediaBackend::Play()
+{
+ ::StartMovie(m_movie);
+ m_timer->SetPaused(false);
+ m_timer->Start(MOVIE_DELAY, wxTIMER_CONTINUOUS);
+ return ::GetMoviesError() == noErr;
+}
+
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+bool wxQTMediaBackend::Pause()
+{
+ ::StopMovie(m_movie);
+ m_timer->SetPaused(true);
+ m_timer->Stop();
+ return ::GetMoviesError() == noErr;
+}
+
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+bool wxQTMediaBackend::Stop()
+{
+ m_timer->SetPaused(false);
+ m_timer->Stop();
+
+ ::StopMovie(m_movie);
+ if(::GetMoviesError() != noErr)
+ return false;
+
+ ::GoToBeginningOfMovie(m_movie);
+ return ::GetMoviesError() == noErr;
+}
+
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+double wxQTMediaBackend::GetPlaybackRate()
+{
+ return ( ((double)::GetMovieRate(m_movie)) / 0x10000);
+}
+
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+bool wxQTMediaBackend::SetPlaybackRate(double dRate)
+{
+ ::SetMovieRate(m_movie, (Fixed) (dRate * 0x10000));
+ return ::GetMoviesError() == noErr;
+}
+
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+bool wxQTMediaBackend::SetPosition(wxLongLong where)
+{
+ TimeRecord theTimeRecord;
+ memset(&theTimeRecord, 0, sizeof(TimeRecord));
+ theTimeRecord.value.lo = where.GetValue();
+ theTimeRecord.scale = ::GetMovieTimeScale(m_movie);
+ theTimeRecord.base = ::GetMovieTimeBase(m_movie);
+ ::SetMovieTime(m_movie, &theTimeRecord);
+
+ if (::GetMoviesError() != noErr)
+ return false;
+
+ return true;
+}
+
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+wxLongLong wxQTMediaBackend::GetPosition()
+{
+ return ::GetMovieTime(m_movie, NULL);
+}
+
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+wxLongLong wxQTMediaBackend::GetDuration()
+{
+ return ::GetMovieDuration(m_movie);
+}
+
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+wxMediaState wxQTMediaBackend::GetState()
+{
+ if ( !m_timer || (m_timer->IsRunning() == false &&
+ m_timer->GetPaused() == false) )
+ return wxMEDIASTATE_STOPPED;
+
+ if( m_timer->IsRunning() == true )
+ return wxMEDIASTATE_PLAYING;
+ else
+ return wxMEDIASTATE_PAUSED;
+}
+
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+void wxQTMediaBackend::Cleanup()
+{
+ delete m_timer;
+ m_timer = NULL;
+
+ StopMovie(m_movie);
+ DisposeMovie(m_movie);
+}
+
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+wxSize wxQTMediaBackend::GetVideoSize() const
+{
+ return m_bestSize;
+}
+
+//---------------------------------------------------------------------------
+// wxQTMediaBackend::Move
+//
+// TODO
+//---------------------------------------------------------------------------
+void wxQTMediaBackend::Move(int x, int y, int w, int h)
+{
+ if(m_timer)
+ {
+ Rect theRect = {0, 0, h, w};
+
+ ::SetMovieBox(m_movie, &theRect);
+ wxASSERT(::GetMoviesError() == noErr);
+ }
+}
+
+//---------------------------------------------------------------------------
+// End QT Compilation Guard
+//---------------------------------------------------------------------------
+#endif //wxUSE_QUICKTIME
+
+//in source file that contains stuff you don't directly use
+#include <wx/html/forcelnk.h>
+FORCE_LINK_ME(basewxmediabackends);
+
+//---------------------------------------------------------------------------
+// End wxMediaCtrl Compilation Guard and this file
+//---------------------------------------------------------------------------
#endif //wxUSE_MEDIACTRL
+
# End Source File
# Begin Source File
+SOURCE=.\common\mediactrlcmn.cpp
+# End Source File
+# Begin Source File
+
SOURCE=.\common\memory.cpp
# End Source File
# Begin Source File
# End Source File
# Begin Source File
-SOURCE=..\include\wx\msw\mediactrl.h
-# End Source File
-# Begin Source File
-
SOURCE=..\include\wx\msw\menu.h
# End Source File
# Begin Source File