]> git.saurik.com Git - wxWidgets.git/commitdiff
Massive reworking of wxMediaCtrl code - backend everything, search for backends via...
authorRyan Norton <wxprojects@comcast.net>
Sun, 14 Nov 2004 23:26:55 +0000 (23:26 +0000)
committerRyan Norton <wxprojects@comcast.net>
Sun, 14 Nov 2004 23:26:55 +0000 (23:26 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30527 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

17 files changed:
Makefile.in
build/bakefiles/files.bkl
build/msw/makefile.bcc
build/msw/makefile.gcc
build/msw/makefile.vc
build/msw/makefile.wat
build/msw/wx_base.dsp
build/msw/wx_core.dsp
build/msw/wx_media.dsp
include/wx/mac/carbon/mediactrl.h [deleted file]
include/wx/mediactrl.h
include/wx/msw/mediactrl.h [deleted file]
samples/mediaplayer/mediaplayer.cpp
src/common/mediactrlcmn.cpp [new file with mode: 0644]
src/mac/carbon/mediactrl.cpp
src/msw/mediactrl.cpp
src/wxWindows.dsp

index 0ef1d2ad80dd8de9b90f1d046ce30a52972264a9..997146b14425fb0fdd2469c4badc8d82c392d73f 100644 (file)
@@ -891,7 +891,7 @@ MEDIADLL_CXXFLAGS = $(__mediadll_PCH_INC) -D__WX$(TOOLKIT)__ \
        $(__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)__ \
@@ -899,7 +899,7 @@ 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)__ \
@@ -2077,11 +2077,11 @@ COND_TOOLKIT_MAC_ADVANCED_PLATFORM_HDR =  \
 @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 =  \
@@ -2571,7 +2571,7 @@ COND_USE_GUI_1___MONOLIB_GUI_SRC_OBJECTS =  \
        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 \
@@ -4006,7 +4006,7 @@ COND_USE_GUI_1___MONOLIB_GUI_SRC_OBJECTS_1 =  \
        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 \
@@ -10050,7 +10050,7 @@ monodll_wizard.o: $(srcdir)/src/generic/wizard.cpp $(MONODLL_ODEP)
 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)
@@ -13368,7 +13368,7 @@ monolib_wizard.o: $(srcdir)/src/generic/wizard.cpp $(MONOLIB_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)
@@ -22494,7 +22494,7 @@ advlib_gprint.o: $(srcdir)/src/gtk/gnome/gprint.cpp $(ADVLIB_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)
@@ -22506,7 +22506,7 @@ mediadll_emptydmy.o: $(srcdir)/src/common/emptydmy.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)
@@ -23665,6 +23665,12 @@ SAMPLES_DIST: ALL_GUI_DIST
        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
index be57c3e664065ad479cd179566f02400859fb630..2f3e081654a4e3ba1901379f1a03967c3432e01a 100644 (file)
@@ -2343,7 +2343,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
 <!-- ====================================================================== -->
 
 <set var="MEDIA_CMN_SRC" hints="files">
-    src/common/emptydmy.cpp
+    src/common/mediactrlcmn.cpp
 </set>
 
 <set var="MEDIA_CMN_HDR" hints="files">
@@ -2354,7 +2354,6 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
     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">
@@ -2366,7 +2365,6 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
     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">
index 56becd707d022e454d3879f02be73e7b24e50449..f2224aa0c0082ad4e0cd09433e74a8edc2e43bf4 100644 (file)
@@ -254,6 +254,7 @@ MONODLL_OBJECTS =  \
        $(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 \
@@ -355,6 +356,7 @@ MONOLIB_OBJECTS =  \
        $(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 \
@@ -457,6 +459,7 @@ BASEDLL_OBJECTS =  \
        $(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 \
@@ -543,6 +546,7 @@ BASELIB_OBJECTS =  \
        $(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 \
@@ -677,6 +681,7 @@ MEDIADLL_CXXFLAGS = $(__RUNTIME_LIBS) -I$(BCCDIR)\include $(__DEBUGINFO) \
        -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) \
@@ -686,6 +691,7 @@ MEDIALIB_CXXFLAGS = $(__RUNTIME_LIBS) -I$(BCCDIR)\include $(__DEBUGINFO) \
        $(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) \
@@ -990,6 +996,7 @@ ____MONOLIB_GUI_SRC_FILENAMES_OBJECTS =  \
        $(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 \
@@ -1096,7 +1103,6 @@ ____CORE_SRC_FILENAMES_OBJECTS =  \
        $(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 \
@@ -1292,7 +1298,6 @@ ____CORE_SRC_FILENAMES_OBJECTS =  \
        $(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 \
@@ -1470,6 +1475,7 @@ ____MONOLIB_GUI_SRC_FILENAMES_1_OBJECTS =  \
        $(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 \
@@ -1576,7 +1582,6 @@ ____CORE_SRC_FILENAMES_1_OBJECTS =  \
        $(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 \
@@ -1772,7 +1777,6 @@ ____CORE_SRC_FILENAMES_1_OBJECTS =  \
        $(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 \
@@ -1989,7 +1993,6 @@ ____CORE_SRC_FILENAMES_2_OBJECTS =  \
        $(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 \
@@ -2185,7 +2188,6 @@ ____CORE_SRC_FILENAMES_2_OBJECTS =  \
        $(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 \
@@ -2386,7 +2388,6 @@ ____CORE_SRC_FILENAMES_3_OBJECTS =  \
        $(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 \
@@ -2582,7 +2583,6 @@ ____CORE_SRC_FILENAMES_3_OBJECTS =  \
        $(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 \
@@ -3824,6 +3824,9 @@ $(OBJS)\monodll_registry.obj: ..\..\src\msw\registry.cpp
 $(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) $**
 
@@ -4067,6 +4070,9 @@ $(OBJS)\monodll_taskbar.obj: ..\..\src\msw\taskbar.cpp
 $(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) $**
 
@@ -4458,11 +4464,6 @@ $(OBJS)\monodll_settings.obj: ..\..\src\msw\settings.cpp
        $(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) $**
@@ -5440,6 +5441,9 @@ $(OBJS)\monolib_registry.obj: ..\..\src\msw\registry.cpp
 $(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) $**
 
@@ -5683,6 +5687,9 @@ $(OBJS)\monolib_taskbar.obj: ..\..\src\msw\taskbar.cpp
 $(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) $**
 
@@ -6074,11 +6081,6 @@ $(OBJS)\monolib_settings.obj: ..\..\src\msw\settings.cpp
        $(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) $**
@@ -7056,6 +7058,9 @@ $(OBJS)\basedll_registry.obj: ..\..\src\msw\registry.cpp
 $(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) $**
 
@@ -7278,6 +7283,9 @@ $(OBJS)\baselib_registry.obj: ..\..\src\msw\registry.cpp
 $(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) $**
 
@@ -7735,11 +7743,6 @@ $(OBJS)\coredll_settings.obj: ..\..\src\msw\settings.cpp
        $(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) $**
@@ -8874,11 +8877,6 @@ $(OBJS)\corelib_settings.obj: ..\..\src\msw\settings.cpp
        $(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) $**
@@ -9757,12 +9755,18 @@ $(OBJS)\advlib_joystick.obj: ..\..\src\msw\joystick.cpp
 $(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) $**
 
index 76c86d91ad5d54791f91b4c996735d3556750297..e2909e0897d2a9abcf9f3f0df95cf2cf2cb5c280 100644 (file)
@@ -239,6 +239,7 @@ MONODLL_OBJECTS =  \
        $(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 \
@@ -340,6 +341,7 @@ MONOLIB_OBJECTS =  \
        $(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 \
@@ -441,6 +443,7 @@ BASEDLL_OBJECTS =  \
        $(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 \
@@ -527,6 +530,7 @@ BASELIB_OBJECTS =  \
        $(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 \
@@ -660,6 +664,7 @@ MEDIADLL_CXXFLAGS = $(__DEBUGINFO) $(__OPTIMIZEFLAG) $(GCCFLAGS) \
        $(__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) \
@@ -669,6 +674,7 @@ MEDIALIB_CXXFLAGS = $(__DEBUGINFO) $(__OPTIMIZEFLAG) $(GCCFLAGS) \
        $(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) \
@@ -977,6 +983,7 @@ ____MONOLIB_GUI_SRC_FILENAMES_OBJECTS =  \
        $(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 \
@@ -1084,7 +1091,6 @@ ____CORE_SRC_FILENAMES_OBJECTS =  \
        $(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 \
@@ -1282,7 +1288,6 @@ ____CORE_SRC_FILENAMES_OBJECTS =  \
        $(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 \
@@ -1463,6 +1468,7 @@ ____MONOLIB_GUI_SRC_FILENAMES_1_OBJECTS =  \
        $(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 \
@@ -1570,7 +1576,6 @@ ____CORE_SRC_FILENAMES_1_OBJECTS =  \
        $(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 \
@@ -1768,7 +1773,6 @@ ____CORE_SRC_FILENAMES_1_OBJECTS =  \
        $(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 \
@@ -1999,7 +2003,6 @@ ____CORE_SRC_FILENAMES_2_OBJECTS =  \
        $(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 \
@@ -2197,7 +2200,6 @@ ____CORE_SRC_FILENAMES_2_OBJECTS =  \
        $(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 \
@@ -2404,7 +2406,6 @@ ____CORE_SRC_FILENAMES_3_OBJECTS =  \
        $(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 \
@@ -2602,7 +2603,6 @@ ____CORE_SRC_FILENAMES_3_OBJECTS =  \
        $(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 \
@@ -3878,6 +3878,9 @@ $(OBJS)\monodll_registry.o: ../../src/msw/registry.cpp
 $(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) $<
 
@@ -4121,6 +4124,9 @@ $(OBJS)\monodll_taskbar.o: ../../src/msw/taskbar.cpp
 $(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) $<
 
@@ -4512,11 +4518,6 @@ $(OBJS)\monodll_settings.o: ../../src/msw/settings.cpp
        $(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) $<
@@ -5594,6 +5595,9 @@ $(OBJS)\monolib_registry.o: ../../src/msw/registry.cpp
 $(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) $<
 
@@ -5837,6 +5841,9 @@ $(OBJS)\monolib_taskbar.o: ../../src/msw/taskbar.cpp
 $(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) $<
 
@@ -6228,11 +6235,6 @@ $(OBJS)\monolib_settings.o: ../../src/msw/settings.cpp
        $(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) $<
@@ -7310,6 +7312,9 @@ $(OBJS)\basedll_registry.o: ../../src/msw/registry.cpp
 $(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) $<
 
@@ -7532,6 +7537,9 @@ $(OBJS)\baselib_registry.o: ../../src/msw/registry.cpp
 $(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) $<
 
@@ -7989,11 +7997,6 @@ $(OBJS)\coredll_settings.o: ../../src/msw/settings.cpp
        $(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) $<
@@ -9228,11 +9231,6 @@ $(OBJS)\corelib_settings.o: ../../src/msw/settings.cpp
        $(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) $<
@@ -10211,12 +10209,18 @@ $(OBJS)\advlib_joystick.o: ../../src/msw/joystick.cpp
 $(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) $<
 
index 186ba8bd48693da0ac3d79503e55fc2b7f9a3f27..a2d0d6ec03fb19c09ead9999edb0c117e573efc0 100644 (file)
@@ -255,6 +255,7 @@ MONODLL_OBJECTS =  \
        $(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 \
@@ -362,6 +363,7 @@ MONOLIB_OBJECTS =  \
        $(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 \
@@ -470,6 +472,7 @@ BASEDLL_OBJECTS =  \
        $(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 \
@@ -562,6 +565,7 @@ BASELIB_OBJECTS =  \
        $(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 \
@@ -719,6 +723,7 @@ MEDIADLL_CXXFLAGS = /M$(__RUNTIME_LIBS)$(__DEBUGRUNTIME_201) /DWIN32 \
        /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) \
@@ -731,6 +736,7 @@ MEDIALIB_CXXFLAGS = /M$(__RUNTIME_LIBS)$(__DEBUGRUNTIME_213) /DWIN32 \
        /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) \
@@ -1199,6 +1205,7 @@ ____MONOLIB_GUI_SRC_FILENAMES_OBJECTS =  \
        $(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 \
@@ -1305,7 +1312,6 @@ ____CORE_SRC_FILENAMES_OBJECTS =  \
        $(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 \
@@ -1501,7 +1507,6 @@ ____CORE_SRC_FILENAMES_OBJECTS =  \
        $(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 \
@@ -1697,6 +1702,7 @@ ____MONOLIB_GUI_SRC_FILENAMES_1_OBJECTS =  \
        $(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 \
@@ -1803,7 +1809,6 @@ ____CORE_SRC_FILENAMES_1_OBJECTS =  \
        $(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 \
@@ -1999,7 +2004,6 @@ ____CORE_SRC_FILENAMES_1_OBJECTS =  \
        $(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 \
@@ -2306,7 +2310,6 @@ ____CORE_SRC_FILENAMES_2_OBJECTS =  \
        $(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 \
@@ -2502,7 +2505,6 @@ ____CORE_SRC_FILENAMES_2_OBJECTS =  \
        $(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 \
@@ -2721,7 +2723,6 @@ ____CORE_SRC_FILENAMES_3_OBJECTS =  \
        $(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 \
@@ -2917,7 +2918,6 @@ ____CORE_SRC_FILENAMES_3_OBJECTS =  \
        $(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 \
@@ -4445,6 +4445,9 @@ $(OBJS)\monodll_registry.obj: ..\..\src\msw\registry.cpp
 $(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) $**
 
@@ -4688,6 +4691,9 @@ $(OBJS)\monodll_taskbar.obj: ..\..\src\msw\taskbar.cpp
 $(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) $**
 
@@ -5079,11 +5085,6 @@ $(OBJS)\monodll_settings.obj: ..\..\src\msw\settings.cpp
        $(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) $**
@@ -6061,6 +6062,9 @@ $(OBJS)\monolib_registry.obj: ..\..\src\msw\registry.cpp
 $(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) $**
 
@@ -6304,6 +6308,9 @@ $(OBJS)\monolib_taskbar.obj: ..\..\src\msw\taskbar.cpp
 $(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) $**
 
@@ -6695,11 +6702,6 @@ $(OBJS)\monolib_settings.obj: ..\..\src\msw\settings.cpp
        $(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) $**
@@ -7677,6 +7679,9 @@ $(OBJS)\basedll_registry.obj: ..\..\src\msw\registry.cpp
 $(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) $**
 
@@ -7899,6 +7904,9 @@ $(OBJS)\baselib_registry.obj: ..\..\src\msw\registry.cpp
 $(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) $**
 
@@ -8356,11 +8364,6 @@ $(OBJS)\coredll_settings.obj: ..\..\src\msw\settings.cpp
        $(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) $**
@@ -9495,11 +9498,6 @@ $(OBJS)\corelib_settings.obj: ..\..\src\msw\settings.cpp
        $(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) $**
@@ -10378,12 +10376,18 @@ $(OBJS)\advlib_joystick.obj: ..\..\src\msw\joystick.cpp
 $(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) $**
 
index c998f341e03c45e137b0e3753ede2c6e33b07ca8..f83b5aab74dad28585c8873b19e1ea65565de4bf 100644 (file)
@@ -113,6 +113,7 @@ ____MONOLIB_GUI_SRC_FILENAMES_OBJECTS =  &
        $(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 &
@@ -221,7 +222,6 @@ ____CORE_SRC_FILENAMES_OBJECTS =  &
        $(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 &
@@ -419,7 +419,6 @@ ____CORE_SRC_FILENAMES_OBJECTS =  &
        $(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 &
@@ -602,6 +601,7 @@ ____MONOLIB_GUI_SRC_FILENAMES_1_OBJECTS =  &
        $(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 &
@@ -710,7 +710,6 @@ ____CORE_SRC_FILENAMES_1_OBJECTS =  &
        $(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 &
@@ -908,7 +907,6 @@ ____CORE_SRC_FILENAMES_1_OBJECTS =  &
        $(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 &
@@ -1145,7 +1143,6 @@ ____CORE_SRC_FILENAMES_2_OBJECTS =  &
        $(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 &
@@ -1343,7 +1340,6 @@ ____CORE_SRC_FILENAMES_2_OBJECTS =  &
        $(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 &
@@ -1552,7 +1548,6 @@ ____CORE_SRC_FILENAMES_3_OBJECTS =  &
        $(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 &
@@ -1750,7 +1745,6 @@ ____CORE_SRC_FILENAMES_3_OBJECTS =  &
        $(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 &
@@ -2396,6 +2390,7 @@ MONODLL_OBJECTS =  &
        $(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 &
@@ -2498,6 +2493,7 @@ MONOLIB_OBJECTS =  &
        $(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 &
@@ -2601,6 +2597,7 @@ BASEDLL_OBJECTS =  &
        $(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 &
@@ -2688,6 +2685,7 @@ BASELIB_OBJECTS =  &
        $(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 &
@@ -2824,6 +2822,7 @@ MEDIADLL_CXXFLAGS = -bd $(__DEBUGINFO) $(__OPTIMIZEFLAG) -bm $(__RUNTIME_LIBS) &
        /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) &
@@ -2833,6 +2832,7 @@ MEDIALIB_CXXFLAGS = $(__DEBUGINFO) $(__OPTIMIZEFLAG) -bm $(__RUNTIME_LIBS) &
        $(__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) &
@@ -4101,6 +4101,9 @@ $(OBJS)\monodll_registry.obj :  .AUTODEPEND ..\..\src\msw\registry.cpp
 $(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) $<
 
@@ -4344,6 +4347,9 @@ $(OBJS)\monodll_taskbar.obj :  .AUTODEPEND ..\..\src\msw\taskbar.cpp
 $(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) $<
 
@@ -4735,11 +4741,6 @@ $(OBJS)\monodll_settings.obj :  .AUTODEPEND ..\..\src\msw\settings.cpp
        $(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) $<
@@ -5817,6 +5818,9 @@ $(OBJS)\monolib_registry.obj :  .AUTODEPEND ..\..\src\msw\registry.cpp
 $(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) $<
 
@@ -6060,6 +6064,9 @@ $(OBJS)\monolib_taskbar.obj :  .AUTODEPEND ..\..\src\msw\taskbar.cpp
 $(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) $<
 
@@ -6451,11 +6458,6 @@ $(OBJS)\monolib_settings.obj :  .AUTODEPEND ..\..\src\msw\settings.cpp
        $(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) $<
@@ -7533,6 +7535,9 @@ $(OBJS)\basedll_registry.obj :  .AUTODEPEND ..\..\src\msw\registry.cpp
 $(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) $<
 
@@ -7755,6 +7760,9 @@ $(OBJS)\baselib_registry.obj :  .AUTODEPEND ..\..\src\msw\registry.cpp
 $(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) $<
 
@@ -8212,11 +8220,6 @@ $(OBJS)\coredll_settings.obj :  .AUTODEPEND ..\..\src\msw\settings.cpp
        $(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) $<
@@ -9451,11 +9454,6 @@ $(OBJS)\corelib_settings.obj :  .AUTODEPEND ..\..\src\msw\settings.cpp
        $(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) $<
@@ -10434,12 +10432,18 @@ $(OBJS)\advlib_joystick.obj :  .AUTODEPEND ..\..\src\msw\joystick.cpp
 $(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) $<
 
index 707f0cc492a4c301d3fe85c1695b8bf128f5a9be..6f673798fc8da3104c21d541d1d480e2a0c9bfa6 100644 (file)
@@ -739,6 +739,10 @@ SOURCE=..\..\src\msw\snglinst.cpp
 # 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
index ad6a341af86e1e0b4f75a23b5b22804bc13b53d6..a538fcc057d797c925e522e51a6ae3f6ddd505d1 100644 (file)
@@ -3530,10 +3530,6 @@ SOURCE=..\..\src\msw\stattext.cpp
 # 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"
@@ -7447,10 +7443,6 @@ SOURCE=..\..\include\wx\msw\mdi.h
 # 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
index 85ec193d5c09c7a102175cf3d0d57233a750ecd5..873742d5dea158e090e9d9eeb6ce4e568f955d94 100644 (file)
@@ -447,6 +447,14 @@ LIB32=link.exe -lib
 # 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 ""
@@ -630,14 +638,6 @@ InputPath=..\include\wx\msw\setup.h
 
 !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"
diff --git a/include/wx/mac/carbon/mediactrl.h b/include/wx/mac/carbon/mediactrl.h
deleted file mode 100644 (file)
index 6143d8f..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-// 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
index b504a010e402c62c2d4727b771f2a138578a24d9..69acc08e9077ecd4d55cf934b51a2336c5051734 100644 (file)
@@ -1,4 +1,4 @@
-/////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
 // 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_
+
+
diff --git a/include/wx/msw/mediactrl.h b/include/wx/msw/mediactrl.h
deleted file mode 100644 (file)
index 96b32af..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-// 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
-
index b8ca9a9f3e6daa8c3e2721e3cd051e8fd0c32d18..c7f1b38a077310da93122d1575c4980e77e59682 100644 (file)
@@ -1,4 +1,4 @@
-/////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
 // Name:        mediaplayer.cpp
 // Purpose:     wxMediaCtrl sample
 // Author:      Ryan Norton
@@ -7,14 +7,28 @@
 // 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"
@@ -28,7 +42,7 @@
 #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
@@ -53,14 +102,18 @@ public:
     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);
@@ -72,52 +125,60 @@ public:
     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)
@@ -132,161 +193,112 @@ const wxChar* wxGetMediaStateText(int 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);
 
 
     //
@@ -298,15 +310,8 @@ MyFrame::MyFrame(const wxString& title)
     //
     //  [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
@@ -317,43 +322,193 @@ MyFrame::MyFrame(const wxString& title)
     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;
@@ -363,23 +518,23 @@ void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
     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);
@@ -396,69 +551,100 @@ void MyFrame::OnOpenFile(wxCommandEvent& WXUNUSED(event))
     }
 }
 
-//
-//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
+//
diff --git a/src/common/mediactrlcmn.cpp b/src/common/mediactrlcmn.cpp
new file mode 100644 (file)
index 0000000..53ba955
--- /dev/null
@@ -0,0 +1,422 @@
+/////////////////////////////////////////////////////////////////////////////
+// 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
+
+
index 506f104b5069a70508c3e6556a25ae554630e35e..b5d21a3b83ad224a36d0c9e087adcc0f39b28754 100644 (file)
@@ -1,17 +1,25 @@
 /////////////////////////////////////////////////////////////////////////////
-// 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)
     {
     }
@@ -71,140 +146,134 @@ public:
     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;
 
@@ -226,17 +295,19 @@ bool wxMediaCtrl::Load(const wxString& fileName)
 
     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;
@@ -268,12 +339,17 @@ bool wxMediaCtrl::Load(const wxURI& location)
 
     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
@@ -284,60 +360,69 @@ void wxMediaCtrl::FinishLoad()
     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();
 
@@ -349,25 +434,37 @@ bool wxMediaCtrl::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);
@@ -378,21 +475,35 @@ bool wxMediaCtrl::SetPosition(long where)
     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 )
@@ -401,48 +512,54 @@ wxMediaState wxMediaCtrl::GetState()
         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
+
+
+
+
+
index 13369b2a61058c8b422ba7058f324e9ca6fc74a5..1bde220f0ffe81a713ae845dea0ab397931280c9 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 // 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
@@ -9,13 +9,17 @@
 // 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();
@@ -113,12 +92,12 @@ public:
 
     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);
@@ -127,11 +106,15 @@ public:
 
     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;
@@ -139,25 +122,39 @@ public:
     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();
@@ -168,251 +165,233 @@ public:
 
     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);
 
@@ -421,50 +400,91 @@ bool wxDXMediaCtrlImpl::Load(const wxString& fileName)
         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();
@@ -473,22 +493,44 @@ bool wxDXMediaCtrlImpl::Load(const wxString& fileName)
     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() );
 
@@ -499,10 +541,18 @@ bool wxDXMediaCtrlImpl::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,
@@ -512,27 +562,47 @@ bool wxDXMediaCtrlImpl::SetPosition(long where)
                                     ) );
 }
 
-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);
@@ -547,55 +617,106 @@ wxMediaState wxDXMediaCtrlImpl::GetState()
     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)
@@ -611,40 +732,77 @@ void wxDXMediaCtrlImpl::Cleanup()
     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;
@@ -666,65 +824,115 @@ typedef struct {
 #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;
 
@@ -732,16 +940,53 @@ bool wxWMMEMediaCtrlImpl::Load(const wxString& fileName)
                          (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();
@@ -750,37 +995,71 @@ bool wxWMMEMediaCtrlImpl::Load(const wxString& fileName)
     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);
 
@@ -792,95 +1071,640 @@ wxMediaState wxWMMEMediaCtrlImpl::GetState()
         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
 
+
index 2ffb70e97f827aef5113e68fc56bc8477b724b0f..ea5c20a9ac644aac662c43c6dc70aeb3b3dc9584 100644 (file)
@@ -650,6 +650,10 @@ SOURCE=.\common\matrix.cpp
 # 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
@@ -3339,10 +3343,6 @@ SOURCE=..\include\wx\msw\mdi.h
 # 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