<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><TITLE></TITLE>
<META http-equiv=Content-Type content=text/html;charset=ISO-8859-1>
<META content="MSHTML 6.00.2800.1106" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY text=#000000 bgColor=#ffffff>
<DIV><FONT face=Arial size=2>check out the <A
href="http://wiki.winehq.org/FlattenDllDirectories">http://wiki.winehq.org/FlattenDllDirectories</A> page
on Wine wiki, you'll get all the correct names (in some cases, windows changed
from 16 bit drivers to 32 bit drivers)</FONT></DIV>
<DIV><FONT face=Arial size=2>btw, our default settings should also be changed
accordingly</FONT></DIV>
<DIV><FONT face=Arial size=2>A+</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<BLOCKQUOTE
style="PADDING-RIGHT: 0px; PADDING-LEFT: 5px; MARGIN-LEFT: 5px; BORDER-LEFT: #000000 2px solid; MARGIN-RIGHT: 0px">
<DIV style="FONT: 10pt arial">----- Original Message ----- </DIV>
<DIV
style="BACKGROUND: #e4e4e4; FONT: 10pt arial; font-color: black"><B>From:</B>
<A title=remi.assailly@free.fr href="mailto:remi.assailly@free.fr">R�mi
Assailly</A> </DIV>
<DIV style="FONT: 10pt arial"><B>To:</B> <A title=wine-patches@winehq.org
href="mailto:wine-patches@winehq.org">wine-patches@winehq.org</A> </DIV>
<DIV style="FONT: 10pt arial"><B>Sent:</B> Friday, July 22, 2005 3:43 PM</DIV>
<DIV style="FONT: 10pt arial"><B>Subject:</B> Move mcicda to the top-level
dlls directory</DIV>
<DIV><BR></DIV><FONT size=-1>Hi all<BR>I saw that WinXP kept mciseq.drv,
mciwave.drv and mciavi.drv.<BR>Should we do the same thing or just keep the
dlls files ?<BR><BR>Changelog:<BR></FONT><SMALL>Moved mcicda to the top-level
dlls directory.</SMALL><BR>
<P>
<HR>
<P></P>diff -Nru wine/configure winedev/configure<BR>--- wine/configure
2005-07-21 20:36:42.000000000 +0200<BR>+++ winedev/configure 2005-07-22
14:45:10.000000000 +0200<BR>@@ -20203,7 +20203,7
@@<BR> MAKE_PROG_RULES=programs/Makeprog.rules<BR> <BR> <BR>-
ac_config_files="$ac_config_files Make.rules dlls/Makedll.rules
dlls/Maketest.rules libs/Makelib.rules programs/Makeprog.rules Makefile
dlls/Makefile dlls/activeds/Makefile dlls/advapi32/Makefile
dlls/advapi32/tests/Makefile dlls/advpack/Makefile dlls/advpack/tests/Makefile
dlls/amstream/Makefile dlls/atl/Makefile dlls/avicap32/Makefile
dlls/avifil32/Makefile dlls/cabinet/Makefile dlls/capi2032/Makefile
dlls/cards/Makefile dlls/cfgmgr32/Makefile dlls/comcat/Makefile
dlls/comctl32/Makefile dlls/comctl32/tests/Makefile dlls/commdlg/Makefile
dlls/crtdll/Makefile dlls/crypt32/Makefile dlls/crypt32/tests/Makefile
dlls/cryptdll/Makefile dlls/ctl3d/Makefile dlls/d3d8/Makefile
dlls/d3d9/Makefile dlls/d3dim/Makefile dlls/d3drm/Makefile dlls/d3dx8/Makefile
dlls/d3dxof/Makefile dlls/dbghelp/Makefile dlls/dciman32/Makefile
dlls/ddraw/Makefile dlls/ddraw/tests/Makefile dlls/devenum/Makefile
dlls/dinput/Makefile dlls/dinput/tests/Makefile dlls/dinput8/Makefile
dlls/dmband/Makefile dlls/dmcompos/Makefile dlls/dmime/Makefile
dlls/dmloader/Makefile dlls/dmscript/Makefile dlls/dmstyle/Makefile
dlls/dmsynth/Makefile dlls/dmusic/Makefile dlls/dmusic32/Makefile
dlls/dplay/Makefile dlls/dplayx/Makefile dlls/dpnet/Makefile
dlls/dpnhpast/Makefile dlls/dsound/Makefile dlls/dsound/tests/Makefile
dlls/dswave/Makefile dlls/dxdiagn/Makefile dlls/dxerr8/Makefile
dlls/dxerr9/Makefile dlls/dxguid/Makefile dlls/gdi/Makefile
dlls/gdi/tests/Makefile dlls/glu32/Makefile dlls/glut32/Makefile
dlls/hhctrl.ocx/Makefile dlls/iccvid/Makefile dlls/icmp/Makefile
dlls/ifsmgr.vxd/Makefile dlls/imagehlp/Makefile dlls/imm32/Makefile
dlls/iphlpapi/Makefile dlls/iphlpapi/tests/Makefile dlls/itss/Makefile
dlls/kernel/Makefile dlls/kernel/tests/Makefile dlls/lzexpand/Makefile
dlls/lzexpand/tests/Makefile dlls/mapi32/Makefile dlls/mapi32/tests/Makefile
dlls/midimap/Makefile dlls/mlang/Makefile dlls/mlang/tests/Makefile
dlls/mmdevldr.vxd/Makefile dlls/monodebg.vxd/Makefile dlls/mpr/Makefile
dlls/msacm/Makefile dlls/msacm/imaadp32/Makefile dlls/msacm/msadp32/Makefile
dlls/msacm/msg711/Makefile dlls/msacm/winemp3/Makefile
dlls/msacm/tests/Makefile dlls/mscms/Makefile dlls/mscms/tests/Makefile
dlls/msdmo/Makefile dlls/mshtml/Makefile dlls/mshtml/tests/Makefile
dlls/msi/Makefile dlls/msi/tests/Makefile dlls/msimg32/Makefile
dlls/msisys/Makefile dlls/msnet32/Makefile dlls/msrle32/Makefile
dlls/msvcrt/Makefile dlls/msvcrt/tests/Makefile dlls/msvcrt20/Makefile
dlls/msvcrt40/Makefile dlls/msvcrtd/Makefile dlls/msvcrtd/tests/Makefile
dlls/msvidc32/Makefile dlls/msvideo/Makefile dlls/mswsock/Makefile
dlls/netapi32/Makefile dlls/netapi32/tests/Makefile dlls/newdev/Makefile
dlls/ntdll/Makefile dlls/ntdll/tests/Makefile dlls/odbc32/Makefile
dlls/odbccp32/Makefile dlls/ole32/Makefile dlls/ole32/tests/Makefile
dlls/oleacc/Makefile dlls/oleaut32/Makefile dlls/oleaut32/tests/Makefile
dlls/olecli/Makefile dlls/oledlg/Makefile dlls/olepro32/Makefile
dlls/olesvr/Makefile dlls/opengl32/Makefile dlls/powrprof/Makefile
dlls/psapi/Makefile dlls/psapi/tests/Makefile dlls/qcap/Makefile
dlls/quartz/Makefile dlls/quartz/tests/Makefile dlls/rasapi32/Makefile
dlls/riched20/Makefile dlls/richedit/Makefile dlls/rpcrt4/Makefile
dlls/rpcrt4/tests/Makefile dlls/rsabase/Makefile dlls/rsabase/tests/Makefile
dlls/rsaenh/Makefile dlls/rsaenh/tests/Makefile dlls/secur32/Makefile
dlls/sensapi/Makefile dlls/serialui/Makefile dlls/setupapi/Makefile
dlls/shdocvw/Makefile dlls/shell32/Makefile dlls/shell32/tests/Makefile
dlls/shfolder/Makefile dlls/shlwapi/Makefile dlls/shlwapi/tests/Makefile
dlls/snmpapi/Makefile dlls/stdole2.tlb/Makefile dlls/stdole32.tlb/Makefile
dlls/sti/Makefile dlls/strmiids/Makefile dlls/tapi32/Makefile
dlls/ttydrv/Makefile dlls/twain/Makefile dlls/unicows/Makefile
dlls/url/Makefile dlls/urlmon/Makefile dlls/urlmon/tests/Makefile
dlls/user/Makefile dlls/user/tests/Makefile dlls/uuid/Makefile
dlls/uxtheme/Makefile dlls/vdhcp.vxd/Makefile dlls/vdmdbg/Makefile
dlls/version/Makefile dlls/version/tests/Makefile dlls/vmm.vxd/Makefile
dlls/vnbt.vxd/Makefile dlls/vnetbios.vxd/Makefile dlls/vtdapi.vxd/Makefile
dlls/vwin32.vxd/Makefile dlls/win32s/Makefile dlls/winaspi/Makefile
dlls/wined3d/Makefile dlls/winedos/Makefile dlls/wineps/Makefile
dlls/wininet/Makefile dlls/wininet/tests/Makefile dlls/winmm/Makefile
dlls/winmm/joystick/Makefile dlls/winmm/mcianim/Makefile
dlls/winmm/mciavi/Makefile dlls/winmm/mcicda/Makefile
dlls/winmm/mciseq/Makefile dlls/winmm/mciwave/Makefile
dlls/winmm/tests/Makefile dlls/winmm/wavemap/Makefile
dlls/winmm/winealsa/Makefile dlls/winmm/winearts/Makefile
dlls/winmm/wineaudioio/Makefile dlls/winmm/winejack/Makefile
dlls/winmm/winenas/Makefile dlls/winmm/wineoss/Makefile dlls/winnls/Makefile
dlls/winsock/Makefile dlls/winsock/tests/Makefile dlls/winspool/Makefile
dlls/winspool/tests/Makefile dlls/wintab32/Makefile dlls/wintrust/Makefile
dlls/wldap32/Makefile dlls/wow32/Makefile dlls/wsock32/Makefile
dlls/wtsapi32/Makefile dlls/x11drv/Makefile documentation/Makefile
fonts/Makefile include/Makefile libs/Makefile libs/port/Makefile
libs/unicode/Makefile libs/wine/Makefile libs/wpp/Makefile loader/Makefile
programs/Makefile programs/avitools/Makefile programs/clock/Makefile
programs/cmdlgtst/Makefile programs/control/Makefile programs/expand/Makefile
programs/hh/Makefile programs/msiexec/Makefile programs/notepad/Makefile
programs/progman/Makefile programs/regedit/Makefile programs/regsvr32/Makefile
programs/rpcss/Makefile programs/rundll32/Makefile programs/start/Makefile
programs/taskmgr/Makefile programs/uninstaller/Makefile programs/view/Makefile
programs/wcmd/Makefile programs/wineboot/Makefile
programs/winebrowser/Makefile programs/winecfg/Makefile
programs/wineconsole/Makefile programs/winedbg/Makefile
programs/winefile/Makefile programs/winemenubuilder/Makefile
programs/winemine/Makefile programs/winepath/Makefile
programs/winetest/Makefile programs/winevdm/Makefile programs/winhelp/Makefile
programs/winver/Makefile server/Makefile tools/Makefile tools/widl/Makefile
tools/winapi/Makefile tools/winebuild/Makefile tools/winedump/Makefile
tools/winegcc/Makefile tools/wmc/Makefile
tools/wrc/Makefile"<BR>+
ac_config_files="$ac_config_files Make.rules dlls/Makedll.rules
dlls/Maketest.rules libs/Makelib.rules programs/Makeprog.rules Makefile
dlls/Makefile dlls/activeds/Makefile dlls/advapi32/Makefile
dlls/advapi32/tests/Makefile dlls/advpack/Makefile dlls/advpack/tests/Makefile
dlls/amstream/Makefile dlls/atl/Makefile dlls/avicap32/Makefile
dlls/avifil32/Makefile dlls/cabinet/Makefile dlls/capi2032/Makefile
dlls/cards/Makefile dlls/cfgmgr32/Makefile dlls/comcat/Makefile
dlls/comctl32/Makefile dlls/comctl32/tests/Makefile dlls/commdlg/Makefile
dlls/crtdll/Makefile dlls/crypt32/Makefile dlls/crypt32/tests/Makefile
dlls/cryptdll/Makefile dlls/ctl3d/Makefile dlls/d3d8/Makefile
dlls/d3d9/Makefile dlls/d3dim/Makefile dlls/d3drm/Makefile dlls/d3dx8/Makefile
dlls/d3dxof/Makefile dlls/dbghelp/Makefile dlls/dciman32/Makefile
dlls/ddraw/Makefile dlls/ddraw/tests/Makefile dlls/devenum/Makefile
dlls/dinput/Makefile dlls/dinput/tests/Makefile dlls/dinput8/Makefile
dlls/dmband/Makefile dlls/dmcompos/Makefile dlls/dmime/Makefile
dlls/dmloader/Makefile dlls/dmscript/Makefile dlls/dmstyle/Makefile
dlls/dmsynth/Makefile dlls/dmusic/Makefile dlls/dmusic32/Makefile
dlls/dplay/Makefile dlls/dplayx/Makefile dlls/dpnet/Makefile
dlls/dpnhpast/Makefile dlls/dsound/Makefile dlls/dsound/tests/Makefile
dlls/dswave/Makefile dlls/dxdiagn/Makefile dlls/dxerr8/Makefile
dlls/dxerr9/Makefile dlls/dxguid/Makefile dlls/gdi/Makefile
dlls/gdi/tests/Makefile dlls/glu32/Makefile dlls/glut32/Makefile
dlls/hhctrl.ocx/Makefile dlls/iccvid/Makefile dlls/icmp/Makefile
dlls/ifsmgr.vxd/Makefile dlls/imagehlp/Makefile dlls/imm32/Makefile
dlls/iphlpapi/Makefile dlls/iphlpapi/tests/Makefile dlls/itss/Makefile
dlls/kernel/Makefile dlls/kernel/tests/Makefile dlls/lzexpand/Makefile
dlls/lzexpand/tests/Makefile dlls/mapi32/Makefile dlls/mapi32/tests/Makefile
dlls/mcicda/Makefile dlls/midimap/Makefile dlls/mlang/Makefile
dlls/mlang/tests/Makefile dlls/mmdevldr.vxd/Makefile
dlls/monodebg.vxd/Makefile dlls/mpr/Makefile dlls/msacm/Makefile
dlls/msacm/imaadp32/Makefile dlls/msacm/msadp32/Makefile
dlls/msacm/msg711/Makefile dlls/msacm/winemp3/Makefile
dlls/msacm/tests/Makefile dlls/mscms/Makefile dlls/mscms/tests/Makefile
dlls/msdmo/Makefile dlls/mshtml/Makefile dlls/mshtml/tests/Makefile
dlls/msi/Makefile dlls/msi/tests/Makefile dlls/msimg32/Makefile
dlls/msisys/Makefile dlls/msnet32/Makefile dlls/msrle32/Makefile
dlls/msvcrt/Makefile dlls/msvcrt/tests/Makefile dlls/msvcrt20/Makefile
dlls/msvcrt40/Makefile dlls/msvcrtd/Makefile dlls/msvcrtd/tests/Makefile
dlls/msvidc32/Makefile dlls/msvideo/Makefile dlls/mswsock/Makefile
dlls/netapi32/Makefile dlls/netapi32/tests/Makefile dlls/newdev/Makefile
dlls/ntdll/Makefile dlls/ntdll/tests/Makefile dlls/odbc32/Makefile
dlls/odbccp32/Makefile dlls/ole32/Makefile dlls/ole32/tests/Makefile
dlls/oleacc/Makefile dlls/oleaut32/Makefile dlls/oleaut32/tests/Makefile
dlls/olecli/Makefile dlls/oledlg/Makefile dlls/olepro32/Makefile
dlls/olesvr/Makefile dlls/opengl32/Makefile dlls/powrprof/Makefile
dlls/psapi/Makefile dlls/psapi/tests/Makefile dlls/qcap/Makefile
dlls/quartz/Makefile dlls/quartz/tests/Makefile dlls/rasapi32/Makefile
dlls/riched20/Makefile dlls/richedit/Makefile dlls/rpcrt4/Makefile
dlls/rpcrt4/tests/Makefile dlls/rsabase/Makefile dlls/rsabase/tests/Makefile
dlls/rsaenh/Makefile dlls/rsaenh/tests/Makefile dlls/secur32/Makefile
dlls/sensapi/Makefile dlls/serialui/Makefile dlls/setupapi/Makefile
dlls/shdocvw/Makefile dlls/shell32/Makefile dlls/shell32/tests/Makefile
dlls/shfolder/Makefile dlls/shlwapi/Makefile dlls/shlwapi/tests/Makefile
dlls/snmpapi/Makefile dlls/stdole2.tlb/Makefile dlls/stdole32.tlb/Makefile
dlls/sti/Makefile dlls/strmiids/Makefile dlls/tapi32/Makefile
dlls/ttydrv/Makefile dlls/twain/Makefile dlls/unicows/Makefile
dlls/url/Makefile dlls/urlmon/Makefile dlls/urlmon/tests/Makefile
dlls/user/Makefile dlls/user/tests/Makefile dlls/uuid/Makefile
dlls/uxtheme/Makefile dlls/vdhcp.vxd/Makefile dlls/vdmdbg/Makefile
dlls/version/Makefile dlls/version/tests/Makefile dlls/vmm.vxd/Makefile
dlls/vnbt.vxd/Makefile dlls/vnetbios.vxd/Makefile dlls/vtdapi.vxd/Makefile
dlls/vwin32.vxd/Makefile dlls/win32s/Makefile dlls/winaspi/Makefile
dlls/wined3d/Makefile dlls/winedos/Makefile dlls/wineps/Makefile
dlls/wininet/Makefile dlls/wininet/tests/Makefile dlls/winmm/Makefile
dlls/winmm/joystick/Makefile dlls/winmm/mcianim/Makefile
dlls/winmm/mciavi/Makefile dlls/winmm/mciseq/Makefile
dlls/winmm/mciwave/Makefile dlls/winmm/tests/Makefile
dlls/winmm/wavemap/Makefile dlls/winmm/winealsa/Makefile
dlls/winmm/winearts/Makefile dlls/winmm/wineaudioio/Makefile
dlls/winmm/winejack/Makefile dlls/winmm/winenas/Makefile
dlls/winmm/wineoss/Makefile dlls/winnls/Makefile dlls/winsock/Makefile
dlls/winsock/tests/Makefile dlls/winspool/Makefile
dlls/winspool/tests/Makefile dlls/wintab32/Makefile dlls/wintrust/Makefile
dlls/wldap32/Makefile dlls/wow32/Makefile dlls/wsock32/Makefile
dlls/wtsapi32/Makefile dlls/x11drv/Makefile documentation/Makefile
fonts/Makefile include/Makefile libs/Makefile libs/port/Makefile
libs/unicode/Makefile libs/wine/Makefile libs/wpp/Makefile loader/Makefile
programs/Makefile programs/avitools/Makefile programs/clock/Makefile
programs/cmdlgtst/Makefile programs/control/Makefile programs/expand/Makefile
programs/hh/Makefile programs/msiexec/Makefile programs/notepad/Makefile
programs/progman/Makefile programs/regedit/Makefile programs/regsvr32/Makefile
programs/rpcss/Makefile programs/rundll32/Makefile programs/start/Makefile
programs/taskmgr/Makefile programs/uninstaller/Makefile programs/view/Makefile
programs/wcmd/Makefile programs/wineboot/Makefile
programs/winebrowser/Makefile programs/winecfg/Makefile
programs/wineconsole/Makefile programs/winedbg/Makefile
programs/winefile/Makefile programs/winemenubuilder/Makefile
programs/winemine/Makefile programs/winepath/Makefile
programs/winetest/Makefile programs/winevdm/Makefile programs/winhelp/Makefile
programs/winver/Makefile server/Makefile tools/Makefile tools/widl/Makefile
tools/winapi/Makefile tools/winebuild/Makefile tools/winedump/Makefile
tools/winegcc/Makefile tools/wmc/Makefile
tools/wrc/Makefile"<BR> <BR> <BR> cat >confcache
<<\_ACEOF<BR>@@ -20816,6 +20816,7 @@<BR>
"dlls/lzexpand/tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES
dlls/lzexpand/tests/Makefile" ;;<BR> "dlls/mapi32/Makefile" )
CONFIG_FILES="$CONFIG_FILES dlls/mapi32/Makefile" ;;<BR>
"dlls/mapi32/tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES
dlls/mapi32/tests/Makefile" ;;<BR>+ "dlls/mcicda/Makefile" )
CONFIG_FILES="$CONFIG_FILES dlls/mcicda/Makefile" ;;<BR>
"dlls/midimap/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/midimap/Makefile"
;;<BR> "dlls/mlang/Makefile" ) CONFIG_FILES="$CONFIG_FILES
dlls/mlang/Makefile" ;;<BR> "dlls/mlang/tests/Makefile" )
CONFIG_FILES="$CONFIG_FILES dlls/mlang/tests/Makefile" ;;<BR>@@ -20926,7
+20927,6 @@<BR> "dlls/winmm/joystick/Makefile" )
CONFIG_FILES="$CONFIG_FILES dlls/winmm/joystick/Makefile" ;;<BR>
"dlls/winmm/mcianim/Makefile" ) CONFIG_FILES="$CONFIG_FILES
dlls/winmm/mcianim/Makefile" ;;<BR> "dlls/winmm/mciavi/Makefile" )
CONFIG_FILES="$CONFIG_FILES dlls/winmm/mciavi/Makefile" ;;<BR>-
"dlls/winmm/mcicda/Makefile" ) CONFIG_FILES="$CONFIG_FILES
dlls/winmm/mcicda/Makefile" ;;<BR> "dlls/winmm/mciseq/Makefile" )
CONFIG_FILES="$CONFIG_FILES dlls/winmm/mciseq/Makefile" ;;<BR>
"dlls/winmm/mciwave/Makefile" ) CONFIG_FILES="$CONFIG_FILES
dlls/winmm/mciwave/Makefile" ;;<BR> "dlls/winmm/tests/Makefile" )
CONFIG_FILES="$CONFIG_FILES dlls/winmm/tests/Makefile" ;;<BR>diff -Nru
wine/configure.ac winedev/configure.ac<BR>--- wine/configure.ac 2005-07-21
20:36:42.000000000 +0200<BR>+++ winedev/configure.ac 2005-07-22
14:44:01.000000000 +0200<BR>@@ -1612,6 +1612,7
@@<BR> dlls/lzexpand/tests/Makefile<BR> dlls/mapi32/Makefile<BR> dlls/mapi32/tests/Makefile<BR>+dlls/mcicda/Makefile<BR> dlls/midimap/Makefile<BR> dlls/mlang/Makefile<BR> dlls/mlang/tests/Makefile<BR>@@
-1722,7 +1723,6
@@<BR> dlls/winmm/joystick/Makefile<BR> dlls/winmm/mcianim/Makefile<BR> dlls/winmm/mciavi/Makefile<BR>-dlls/winmm/mcicda/Makefile<BR> dlls/winmm/mciseq/Makefile<BR> dlls/winmm/mciwave/Makefile<BR> dlls/winmm/tests/Makefile<BR>diff
-Nru wine/dlls/Makefile.in winedev/dlls/Makefile.in<BR>---
wine/dlls/Makefile.in 2005-07-21 20:36:42.000000000 +0200<BR>+++
winedev/dlls/Makefile.in 2005-07-22 14:43:11.000000000 +0200<BR>@@ -70,6 +70,7
@@<BR> kernel \<BR> lzexpand \<BR> mapi32 \<BR>+ mcicda
\<BR> midimap \<BR> mlang \<BR> mmdevldr.vxd \<BR>@@ -154,7
+155,6 @@<BR> winmm/joystick \<BR> winmm/mcianim \<BR>
winmm/mciavi \<BR>- winmm/mcicda \<BR> winmm/mciseq \<BR>
winmm/mciwave \<BR> winmm/wavemap \<BR>@@ -316,7 +316,7 @@<BR>
mapi32.dll.so \<BR> mcianim.drv.so \<BR> mciavi.drv.so \<BR>-
mcicda.drv.so \<BR>+ mcicda.dll.so \<BR> mciseq.drv.so \<BR>
mciwave.drv.so \<BR> midimap.dll.so \<BR>@@ -647,8 +647,8
@@<BR> mciavi.drv.so: winmm/mciavi/mciavi.drv.so<BR> $(RM) $@
&& $(LN_S) winmm/mciavi/mciavi.drv.so $@<BR> <BR>-mcicda.drv.so:
winmm/mcicda/mcicda.drv.so<BR>- $(RM) $@ && $(LN_S)
winmm/mcicda/mcicda.drv.so $@<BR>+mcicda.dll.so:
winmm/mcicda/mcicda.dll.so<BR>+ $(RM) $@ && $(LN_S)
winmm/mcicda/mcicda.dll.so $@<BR> <BR> mciseq.drv.so:
winmm/mciseq/mciseq.drv.so<BR> $(RM) $@ && $(LN_S)
winmm/mciseq/mciseq.drv.so $@<BR>@@ -1717,7 +1717,7
@@<BR> mapi32/mapi32.dll.so:
mapi32<BR> winmm/mcianim/mcianim.drv.so:
winmm/mcianim<BR> winmm/mciavi/mciavi.drv.so:
winmm/mciavi<BR>-winmm/mcicda/mcicda.drv.so:
winmm/mcicda<BR>+mcicda/mcicda.dll.so:
mcicda<BR> winmm/mciseq/mciseq.drv.so:
winmm/mciseq<BR> winmm/mciwave/mciwave.drv.so:
winmm/mciwave<BR> midimap/midimap.dll.so: midimap<BR>diff -Nru
wine/dlls/mcicda/.cvsignore winedev/dlls/mcicda/.cvsignore<BR>---
wine/dlls/mcicda/.cvsignore 1970-01-01 01:00:00.000000000 +0100<BR>+++
winedev/dlls/mcicda/.cvsignore 2005-07-22 14:41:22.000000000 +0200<BR>@@ -0,0
+1,2 @@<BR>+Makefile<BR>+mcicda.dll.dbg.c<BR>diff -Nru
wine/dlls/mcicda/Makefile.in winedev/dlls/mcicda/Makefile.in<BR>---
wine/dlls/mcicda/Makefile.in 1970-01-01 01:00:00.000000000 +0100<BR>+++
winedev/dlls/mcicda/Makefile.in 2005-07-22 14:41:07.000000000 +0200<BR>@@ -0,0
+1,14 @@<BR>+TOPSRCDIR = @top_srcdir@<BR>+TOPOBJDIR =
../..<BR>+SRCDIR =
@srcdir@<BR>+VPATH =
@srcdir@<BR>+MODULE = mcicda.dll<BR>+IMPORTS =
winmm user32 kernel32<BR>+EXTRALIBS = $(LIBUNICODE)<BR>+<BR>+C_SRCS = \<BR>+
mcicda.c<BR>+<BR>+@MAKE_DLL_RULES@<BR>+<BR>+### Dependencies:<BR>diff -Nru
wine/dlls/mcicda/mcicda.c winedev/dlls/mcicda/mcicda.c<BR>---
wine/dlls/mcicda/mcicda.c 1970-01-01 01:00:00.000000000 +0100<BR>+++
winedev/dlls/mcicda/mcicda.c 2005-02-09 23:26:26.000000000 +0100<BR>@@ -0,0
+1,1053 @@<BR>+/* -*- tab-width: 8; c-basic-offset: 4 -*- */<BR>+/*<BR>+ * MCI
driver for audio CD (MCICDA)<BR>+ *<BR>+ * Copyright 1994
Martin Ayotte<BR>+ * Copyright 1998-99 Eric Pouech<BR>+ * Copyright
2000 Andreas Mohr<BR>+ *<BR>+ * This library is free
software; you can redistribute it and/or<BR>+ * modify it under the terms of
the GNU Lesser General Public<BR>+ * License as published by the Free Software
Foundation; either<BR>+ * version 2.1 of the License, or (at your option) any
later version.<BR>+ *<BR>+ * This library is distributed in the hope that it
will be useful,<BR>+ * but WITHOUT ANY WARRANTY; without even the implied
warranty of<BR>+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU<BR>+ * Lesser General Public License for more details.<BR>+ *<BR>+
* You should have received a copy of the GNU Lesser General Public<BR>+ *
License along with this library; if not, write to the Free Software<BR>+ *
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA<BR>+ */<BR>+<BR>+#include "config.h"<BR>+#include
<stdarg.h><BR>+#include <stdio.h><BR>+#include
<string.h><BR>+<BR>+#include "windef.h"<BR>+#include
"winbase.h"<BR>+#include "wingdi.h"<BR>+#include "winuser.h"<BR>+#include
"ntstatus.h"<BR>+#include "wownt32.h"<BR>+#include "mmddk.h"<BR>+#include
"winioctl.h"<BR>+#include "ntddstor.h"<BR>+#include "ntddcdrm.h"<BR>+#include
"wine/debug.h"<BR>+#include
"wine/unicode.h"<BR>+<BR>+WINE_DEFAULT_DEBUG_CHANNEL(mcicda);<BR>+<BR>+#define
CDFRAMES_PERSEC
75<BR>+#define
CDFRAMES_PERMIN
(CDFRAMES_PERSEC * 60)<BR>+#define FRAME_OF_ADDR(a) ((a)[1] * CDFRAMES_PERMIN
+ (a)[2] * CDFRAMES_PERSEC + (a)[3])<BR>+#define FRAME_OF_TOC(toc, idx)
FRAME_OF_ADDR((toc).TrackData[idx -
(toc).FirstTrack].Address)<BR>+<BR>+typedef struct {<BR>+
UINT wDevID;<BR>+ int
nUseCount; /*
Incremented for each shared open */<BR>+ BOOL
fShareable; /* TRUE if first
open was shareable */<BR>+ WORD
wNotifyDeviceID; /* MCI device ID with a pending
notification */<BR>+ HANDLE
hCallback; /* Callback
handle for pending notification */<BR>+ DWORD
dwTimeFormat;<BR>+
HANDLE
handle;<BR>+}
WINE_MCICDAUDIO;<BR>+<BR>+/*-----------------------------------------------------------------------*/<BR>+<BR>+/**************************************************************************<BR>+
* MCICDA_drvOpen [internal]<BR>+ */<BR>+static DWORD MCICDA_drvOpen(LPCWSTR
str, LPMCI_OPEN_DRIVER_PARMSW modp)<BR>+{<BR>+
WINE_MCICDAUDIO* wmcda;<BR>+<BR>+ if (!modp) return
0xFFFFFFFF;<BR>+<BR>+ wmcda = HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY, sizeof(WINE_MCICDAUDIO));<BR>+<BR>+ if
(!wmcda)<BR>+ return 0;<BR>+<BR>+ wmcda->wDevID =
modp->wDeviceID;<BR>+ mciSetDriverData(wmcda->wDevID,
(DWORD)wmcda);<BR>+ modp->wCustomCommandTable =
MCI_NO_COMMAND_TABLE;<BR>+ modp->wType =
MCI_DEVTYPE_CD_AUDIO;<BR>+ return
modp->wDeviceID;<BR>+}<BR>+<BR>+/**************************************************************************<BR>+
* MCICDA_drvClose [internal]<BR>+ */<BR>+static DWORD MCICDA_drvClose(DWORD
dwDevID)<BR>+{<BR>+ WINE_MCICDAUDIO* wmcda =
(WINE_MCICDAUDIO*)mciGetDriverData(dwDevID);<BR>+<BR>+ if
(wmcda) {<BR>+ HeapFree(GetProcessHeap(), 0, wmcda);<BR>+
mciSetDriverData(dwDevID, 0);<BR>+ }<BR>+
return (dwDevID == 0xFFFFFFFF) ? 1 :
0;<BR>+}<BR>+<BR>+/**************************************************************************<BR>+
* MCICDA_GetOpenDrv [internal]<BR>+ */<BR>+static WINE_MCICDAUDIO*
MCICDA_GetOpenDrv(UINT wDevID)<BR>+{<BR>+ WINE_MCICDAUDIO*
wmcda =
(WINE_MCICDAUDIO*)mciGetDriverData(wDevID);<BR>+<BR>+ if
(wmcda == NULL || wmcda->nUseCount == 0) {<BR>+ WARN("Invalid wDevID=%u\n",
wDevID);<BR>+ return 0;<BR>+ }<BR>+ return
wmcda;<BR>+}<BR>+<BR>+/**************************************************************************<BR>+
* MCICDA_GetStatus [internal]<BR>+ */<BR>+static DWORD
MCICDA_GetStatus(WINE_MCICDAUDIO* wmcda)<BR>+{<BR>+
CDROM_SUB_Q_DATA_FORMAT fmt;<BR>+
SUB_Q_CHANNEL_DATA
data;<BR>+
DWORD
br;<BR>+
DWORD
mode = MCI_MODE_NOT_READY;<BR>+<BR>+ fmt.Format =
IOCTL_CDROM_CURRENT_POSITION;<BR>+ if
(!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_Q_CHANNEL, &fmt,
sizeof(fmt),<BR>+
&data, sizeof(data), &br, NULL))
{<BR>+ if (GetLastError() ==
STATUS_NO_MEDIA_IN_DEVICE) mode = MCI_MODE_OPEN;<BR>+ } else
{<BR>+ switch
(data.CurrentPosition.Header.AudioStatus)<BR>+
{<BR>+ case
AUDIO_STATUS_IN_PROGRESS:
mode = MCI_MODE_PLAY;
break;<BR>+ case
AUDIO_STATUS_PAUSED:
mode = MCI_MODE_PAUSE;
break;<BR>+ case
AUDIO_STATUS_NO_STATUS:<BR>+ case
AUDIO_STATUS_PLAY_COMPLETE: mode =
MCI_MODE_STOP;
break;<BR>+ case
AUDIO_STATUS_PLAY_ERROR:<BR>+ case
AUDIO_STATUS_NOT_SUPPORTED:<BR>+
default:<BR>+
break;<BR>+ }<BR>+
}<BR>+ return
mode;<BR>+}<BR>+<BR>+/**************************************************************************<BR>+
* MCICDA_GetError [internal]<BR>+ */<BR>+static int
MCICDA_GetError(WINE_MCICDAUDIO* wmcda)<BR>+{<BR>+ switch
(GetLastError())<BR>+ {<BR>+ case
STATUS_NO_MEDIA_IN_DEVICE: return
MCIERR_DEVICE_NOT_READY;<BR>+ case
STATUS_IO_DEVICE_ERROR: return
MCIERR_HARDWARE;<BR>+ default:<BR>+ FIXME("Unknown mode
%lx\n", GetLastError());<BR>+ }<BR>+
return
MCIERR_DRIVER_INTERNAL;<BR>+}<BR>+<BR>+/**************************************************************************<BR>+
* MCICDA_CalcFrame [internal]<BR>+ */<BR>+static DWORD
MCICDA_CalcFrame(WINE_MCICDAUDIO* wmcda, DWORD
dwTime)<BR>+{<BR>+ DWORD dwFrame = 0;<BR>+
UINT wTrack;<BR>+ CDROM_TOC
toc;<BR>+ DWORD
br;<BR>+ BYTE*
addr;<BR>+<BR>+ TRACE("(%p, %08lX, %lu);\n", wmcda,
wmcda->dwTimeFormat, dwTime);<BR>+<BR>+ switch
(wmcda->dwTimeFormat) {<BR>+ case
MCI_FORMAT_MILLISECONDS:<BR>+ dwFrame = ((dwTime - 1) * CDFRAMES_PERSEC + 500)
/ 1000;<BR>+ TRACE("MILLISECONDS %lu\n", dwFrame);<BR>+
break;<BR>+ case MCI_FORMAT_MSF:<BR>+ TRACE("MSF
%02u:%02u:%02u\n",<BR>+ MCI_MSF_MINUTE(dwTime),
MCI_MSF_SECOND(dwTime), MCI_MSF_FRAME(dwTime));<BR>+ dwFrame +=
CDFRAMES_PERMIN * MCI_MSF_MINUTE(dwTime);<BR>+ dwFrame += CDFRAMES_PERSEC *
MCI_MSF_SECOND(dwTime);<BR>+ dwFrame += MCI_MSF_FRAME(dwTime);<BR>+
break;<BR>+ case MCI_FORMAT_TMSF:<BR>+
default: /* unknown format ! force TMSF ! ... */<BR>+ wTrack =
MCI_TMSF_TRACK(dwTime);<BR>+ if
(!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL,
0,<BR>+
&toc, sizeof(toc), &br,
NULL))<BR>+
return 0;<BR>+ if (wTrack <
toc.FirstTrack || wTrack >
toc.LastTrack)<BR>+
return 0;<BR>+ TRACE("MSF
%02u-%02u:%02u:%02u\n",<BR>+
MCI_TMSF_TRACK(dwTime),
MCI_TMSF_MINUTE(dwTime),<BR>+
MCI_TMSF_SECOND(dwTime),
MCI_TMSF_FRAME(dwTime));<BR>+ addr =
toc.TrackData[wTrack -
toc.FirstTrack].Address;<BR>+
TRACE("TMSF
trackpos[%u]=%d:%d:%d\n",<BR>+
wTrack, addr[1], addr[2],
addr[3]);<BR>+ dwFrame =
CDFRAMES_PERMIN * (addr[1] + MCI_TMSF_MINUTE(dwTime))
+<BR>+
CDFRAMES_PERSEC * (addr[2] + MCI_TMSF_SECOND(dwTime))
+<BR>+
addr[3] + MCI_TMSF_FRAME(dwTime);<BR>+ break;<BR>+
}<BR>+ return
dwFrame;<BR>+}<BR>+<BR>+/**************************************************************************<BR>+
* MCICDA_CalcTime [internal]<BR>+ */<BR>+static DWORD
MCICDA_CalcTime(WINE_MCICDAUDIO* wmcda, DWORD tf, DWORD dwFrame, LPDWORD
lpRet)<BR>+{<BR>+ DWORD dwTime = 0;<BR>+
UINT wTrack;<BR>+ UINT wMinutes;<BR>+ UINT
wSeconds;<BR>+ UINT wFrames;<BR>+
CDROM_TOC toc;<BR>+
DWORD br;<BR>+<BR>+
TRACE("(%p, %08lX, %lu);\n", wmcda, tf, dwFrame);<BR>+<BR>+
switch (tf) {<BR>+ case MCI_FORMAT_MILLISECONDS:<BR>+ dwTime
= (dwFrame * 1000) / CDFRAMES_PERSEC + 1;<BR>+ TRACE("MILLISECONDS %lu\n",
dwTime);<BR>+ *lpRet = 0;<BR>+ break;<BR>+ case
MCI_FORMAT_MSF:<BR>+ wMinutes = dwFrame / CDFRAMES_PERMIN;<BR>+ wSeconds =
(dwFrame - CDFRAMES_PERMIN * wMinutes) / CDFRAMES_PERSEC;<BR>+ wFrames =
dwFrame - CDFRAMES_PERMIN * wMinutes - CDFRAMES_PERSEC * wSeconds;<BR>+ dwTime
= MCI_MAKE_MSF(wMinutes, wSeconds, wFrames);<BR>+ TRACE("MSF %02u:%02u:%02u
-> dwTime=%lu\n",<BR>+ wMinutes, wSeconds,
wFrames, dwTime);<BR>+ *lpRet = MCI_COLONIZED3_RETURN;<BR>+
break;<BR>+ case MCI_FORMAT_TMSF:<BR>+
default: /* unknown format ! force TMSF ! ...
*/<BR>+ if
(!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL,
0,<BR>+
&toc, sizeof(toc), &br,
NULL))<BR>+
return 0;<BR>+ if (dwFrame < FRAME_OF_TOC(toc, toc.FirstTrack)
||<BR>+
dwFrame > FRAME_OF_TOC(toc, toc.LastTrack + 1)) {<BR>+
ERR("Out of range value %lu [%u,%u]\n",<BR>+ dwFrame, FRAME_OF_TOC(toc,
toc.FirstTrack),<BR>+
FRAME_OF_TOC(toc, toc.LastTrack + 1));<BR>+ *lpRet =
0;<BR>+ return 0;<BR>+ }<BR>+ for (wTrack = toc.FirstTrack;
wTrack <= toc.LastTrack; wTrack++) {<BR>+ if
(FRAME_OF_TOC(toc, wTrack) > dwFrame)<BR>+ break;<BR>+
}<BR>+ wTrack--;<BR>+ dwFrame -=
FRAME_OF_TOC(toc, wTrack);<BR>+ wMinutes = dwFrame / CDFRAMES_PERMIN;<BR>+
wSeconds = (dwFrame - CDFRAMES_PERMIN * wMinutes) / CDFRAMES_PERSEC;<BR>+
wFrames = dwFrame - CDFRAMES_PERMIN * wMinutes - CDFRAMES_PERSEC *
wSeconds;<BR>+ dwTime = MCI_MAKE_TMSF(wTrack, wMinutes, wSeconds,
wFrames);<BR>+ TRACE("%02u-%02u:%02u:%02u\n", wTrack, wMinutes, wSeconds,
wFrames);<BR>+ *lpRet = MCI_COLONIZED4_RETURN;<BR>+
break;<BR>+ }<BR>+ return
dwTime;<BR>+}<BR>+<BR>+static DWORD MCICDA_Seek(UINT wDevID, DWORD dwFlags,
LPMCI_SEEK_PARMS lpParms);<BR>+static DWORD MCICDA_Stop(UINT wDevID, DWORD
dwFlags, LPMCI_GENERIC_PARMS
lpParms);<BR>+<BR>+/**************************************************************************<BR>+
* MCICDA_Open [internal]<BR>+ */<BR>+static DWORD MCICDA_Open(UINT wDevID,
DWORD dwFlags, LPMCI_OPEN_PARMSW lpOpenParms)<BR>+{<BR>+
DWORD dwDeviceID;<BR>+
DWORD
ret = MCIERR_HARDWARE;<BR>+ WINE_MCICDAUDIO* wmcda =
(WINE_MCICDAUDIO*)mciGetDriverData(wDevID);<BR>+
WCHAR
root[7], drive = 0;<BR>+
int
count;<BR>+<BR>+ TRACE("(%04X, %08lX, %p);\n", wDevID,
dwFlags, lpOpenParms);<BR>+<BR>+ if (lpOpenParms == NULL)
return MCIERR_NULL_PARAMETER_BLOCK;<BR>+ if (wmcda == NULL)
return MCIERR_INVALID_DEVICE_ID;<BR>+<BR>+ dwDeviceID =
lpOpenParms->wDeviceID;<BR>+<BR>+ if (wmcda->nUseCount
> 0) {<BR>+ /* The driver is already open on this channel */<BR>+ /* If the
driver was opened shareable before and this open specifies */<BR>+ /*
shareable then increment the use count */<BR>+ if (wmcda->fShareable
&& (dwFlags & MCI_OPEN_SHAREABLE))<BR>+
++wmcda->nUseCount;<BR>+ else<BR>+ return
MCIERR_MUST_USE_SHAREABLE;<BR>+ } else {<BR>+
wmcda->nUseCount = 1;<BR>+ wmcda->fShareable = dwFlags &
MCI_OPEN_SHAREABLE;<BR>+ }<BR>+ if
(dwFlags & MCI_OPEN_ELEMENT)
{<BR>+ if (dwFlags &
MCI_OPEN_ELEMENT_ID)
{<BR>+
WARN("MCI_OPEN_ELEMENT_ID %8lx ! Abort\n",
(DWORD)lpOpenParms->lpstrElementName);<BR>+
return
MCIERR_NO_ELEMENT_ALLOWED;<BR>+
}<BR>+ TRACE("MCI_OPEN_ELEMENT
element name: %s\n",
debugstr_w(lpOpenParms->lpstrElementName));<BR>+
if (!isalpha(lpOpenParms->lpstrElementName[0]) ||
lpOpenParms->lpstrElementName[1] != ':'
||<BR>+
(lpOpenParms->lpstrElementName[2] &&
lpOpenParms->lpstrElementName[2] !=
'\\'))<BR>+
{<BR>+
WARN("MCI_OPEN_ELEMENT unsupported format: %s\n",
<BR>+
debugstr_w(lpOpenParms->lpstrElementName));<BR>+
ret =
MCIERR_NO_ELEMENT_ALLOWED;<BR>+
goto the_error;<BR>+
}<BR>+ drive =
toupper(lpOpenParms->lpstrElementName[0]);<BR>+
root[0] = drive; root[1] = ':'; root[2] = '\\'; root[3] =
'\0';<BR>+ if (GetDriveTypeW(root)
!= DRIVE_CDROM)<BR>+
{<BR>+ ret =
MCIERR_INVALID_DEVICE_NAME;<BR>+
goto the_error;<BR>+
}<BR>+ }<BR>+ else<BR>+
{<BR>+ /* drive letter isn't
passed... get the dwDeviceID'th cdrom in the system
*/<BR>+ root[0] = 'A'; root[1] =
':'; root[2] = '\\'; root[3] =
'\0';<BR>+ for (count = 0; root[0]
<= 'Z'; root[0]++)<BR>+
{<BR>+ if
(GetDriveTypeW(root) == DRIVE_CDROM && ++count >=
dwDeviceID)<BR>+
{<BR>+
drive =
root[0];<BR>+
break;<BR>+
}<BR>+
}<BR>+ if
(!drive)<BR>+
{<BR>+ ret =
MCIERR_INVALID_DEVICE_ID;<BR>+
goto the_error;<BR>+
}<BR>+ }<BR>+<BR>+
wmcda->wNotifyDeviceID = dwDeviceID;<BR>+
wmcda->dwTimeFormat = MCI_FORMAT_MSF;<BR>+<BR>+ /* now,
open the handle */<BR>+ root[0] = root[1] = '\\'; root[2] =
'.'; root[3] = '\\'; root[4] = drive; root[5] = ':'; root[6] =
'\0';<BR>+ wmcda->handle = CreateFileW(root,
GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0,
0);<BR>+ if (wmcda->handle !=
INVALID_HANDLE_VALUE)<BR>+ return
0;<BR>+<BR>+ the_error:<BR>+
--wmcda->nUseCount;<BR>+ return
ret;<BR>+}<BR>+<BR>+/**************************************************************************<BR>+
* MCICDA_Close [internal]<BR>+ */<BR>+static DWORD MCICDA_Close(UINT wDevID,
DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)<BR>+{<BR>+
WINE_MCICDAUDIO* wmcda =
MCICDA_GetOpenDrv(wDevID);<BR>+<BR>+ TRACE("(%04X, %08lX,
%p);\n", wDevID, dwParam, lpParms);<BR>+<BR>+ if (wmcda ==
NULL) return MCIERR_INVALID_DEVICE_ID;<BR>+<BR>+ if
(--wmcda->nUseCount == 0) {<BR>+
CloseHandle(wmcda->handle);<BR>+ }<BR>+
return
0;<BR>+}<BR>+<BR>+/**************************************************************************<BR>+
* MCICDA_GetDevCaps [internal]<BR>+ */<BR>+static DWORD MCICDA_GetDevCaps(UINT
wDevID, DWORD dwFlags,<BR>+ LPMCI_GETDEVCAPS_PARMS
lpParms)<BR>+{<BR>+ DWORD ret =
0;<BR>+<BR>+ TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags,
lpParms);<BR>+<BR>+ if (lpParms == NULL) return
MCIERR_NULL_PARAMETER_BLOCK;<BR>+<BR>+ if (dwFlags &
MCI_GETDEVCAPS_ITEM) {<BR>+ TRACE("MCI_GETDEVCAPS_ITEM dwItem=%08lX;\n",
lpParms->dwItem);<BR>+<BR>+ switch (lpParms->dwItem) {<BR>+ case
MCI_GETDEVCAPS_CAN_RECORD:<BR>+ lpParms->dwReturn =
MAKEMCIRESOURCE(FALSE, MCI_FALSE);<BR>+ ret =
MCI_RESOURCE_RETURNED;<BR>+ break;<BR>+ case
MCI_GETDEVCAPS_HAS_AUDIO:<BR>+ lpParms->dwReturn =
MAKEMCIRESOURCE(TRUE, MCI_TRUE);<BR>+ ret =
MCI_RESOURCE_RETURNED;<BR>+ break;<BR>+ case
MCI_GETDEVCAPS_HAS_VIDEO:<BR>+ lpParms->dwReturn =
MAKEMCIRESOURCE(FALSE, MCI_FALSE);<BR>+ ret =
MCI_RESOURCE_RETURNED;<BR>+ break;<BR>+ case
MCI_GETDEVCAPS_DEVICE_TYPE:<BR>+ lpParms->dwReturn =
MAKEMCIRESOURCE(MCI_DEVTYPE_CD_AUDIO, MCI_DEVTYPE_CD_AUDIO);<BR>+
ret = MCI_RESOURCE_RETURNED;<BR>+
break;<BR>+ case MCI_GETDEVCAPS_USES_FILES:<BR>+
lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);<BR>+
ret = MCI_RESOURCE_RETURNED;<BR>+
break;<BR>+ case MCI_GETDEVCAPS_COMPOUND_DEVICE:<BR>+
lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);<BR>+
ret = MCI_RESOURCE_RETURNED;<BR>+
break;<BR>+ case MCI_GETDEVCAPS_CAN_EJECT:<BR>+
lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE);<BR>+
ret = MCI_RESOURCE_RETURNED;<BR>+
break;<BR>+ case MCI_GETDEVCAPS_CAN_PLAY:<BR>+
lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE);<BR>+
ret = MCI_RESOURCE_RETURNED;<BR>+
break;<BR>+ case MCI_GETDEVCAPS_CAN_SAVE:<BR>+
lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);<BR>+
ret = MCI_RESOURCE_RETURNED;<BR>+
break;<BR>+ default:<BR>+ ERR("Unsupported %lx devCaps
item\n", lpParms->dwItem);<BR>+ return
MCIERR_UNRECOGNIZED_COMMAND;<BR>+ }<BR>+ } else {<BR>+
TRACE("No GetDevCaps-Item !\n");<BR>+ return
MCIERR_UNRECOGNIZED_COMMAND;<BR>+ }<BR>+
TRACE("lpParms->dwReturn=%08lX;\n",
lpParms->dwReturn);<BR>+ return
ret;<BR>+}<BR>+<BR>+static DWORD CDROM_Audio_GetSerial(CDROM_TOC*
toc)<BR>+{<BR>+ unsigned long serial =
0;<BR>+ int i;<BR>+ WORD
wMagic;<BR>+ DWORD dwStart,
dwEnd;<BR>+<BR>+ /*<BR>+ * wMagic
collects the wFrames from track 1<BR>+ * dwStart,
dwEnd collect the beginning and end of the disc respectively,
in<BR>+ * frames.<BR>+ * There
it is collected for correcting the serial when there are less
than<BR>+ * 3 tracks.<BR>+
*/<BR>+ wMagic =
toc->TrackData[0].Address[3];<BR>+ dwStart =
FRAME_OF_TOC(*toc, toc->FirstTrack);<BR>+<BR>+ for (i =
0; i <= toc->LastTrack - toc->FirstTrack; i++)
{<BR>+ serial +=
(toc->TrackData[i].Address[1] << 16)
|<BR>+
(toc->TrackData[i].Address[2] << 8) |
toc->TrackData[i].Address[3];<BR>+
}<BR>+ dwEnd = FRAME_OF_TOC(*toc, toc->LastTrack +
1);<BR>+<BR>+ if (toc->LastTrack - toc->FirstTrack + 1
< 3)<BR>+ serial += wMagic +
(dwEnd - dwStart);<BR>+<BR>+ return
serial;<BR>+}<BR>+<BR>+<BR>+/**************************************************************************<BR>+
* MCICDA_Info [internal]<BR>+ */<BR>+static DWORD MCICDA_Info(UINT wDevID,
DWORD dwFlags, LPMCI_INFO_PARMSW lpParms)<BR>+{<BR>+ LPCWSTR
str = NULL;<BR>+ WINE_MCICDAUDIO* wmcda =
MCICDA_GetOpenDrv(wDevID);<BR>+ DWORD ret =
0;<BR>+ WCHAR buffer[16];<BR>+<BR>+
TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags,
lpParms);<BR>+<BR>+ if (lpParms == NULL ||
lpParms->lpstrReturn == NULL)<BR>+ return
MCIERR_NULL_PARAMETER_BLOCK;<BR>+ if (wmcda == NULL) return
MCIERR_INVALID_DEVICE_ID;<BR>+<BR>+ TRACE("buf=%p,
len=%lu\n", lpParms->lpstrReturn,
lpParms->dwRetSize);<BR>+<BR>+ if (dwFlags &
MCI_INFO_PRODUCT) {<BR>+ static
const WCHAR wszAudioCd[] = {'W','i','n','e','\'','s',' ','a','u','d','i','o','
','C','D',0};<BR>+ str =
wszAudioCd;<BR>+ } else if (dwFlags &
MCI_INFO_MEDIA_UPC) {<BR>+ ret = MCIERR_NO_IDENTITY;<BR>+ }
else if (dwFlags & MCI_INFO_MEDIA_IDENTITY) {<BR>+ DWORD
res = 0;<BR>+
CDROM_TOC toc;<BR>+
DWORD br;<BR>+ static const WCHAR wszLu[]
= {'%','l','u',0};<BR>+<BR>+ if
(!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL,
0,<BR>+
&toc, sizeof(toc), &br, NULL)) {<BR>+ return
MCICDA_GetError(wmcda);<BR>+ }<BR>+<BR>+ res =
CDROM_Audio_GetSerial(&toc);<BR>+ sprintfW(buffer, wszLu, res);<BR>+ str =
buffer;<BR>+ } else {<BR>+ WARN("Don't know this info
command (%lu)\n", dwFlags);<BR>+ ret =
MCIERR_UNRECOGNIZED_COMMAND;<BR>+ }<BR>+
if (str) {<BR>+ if (lpParms->dwRetSize <= strlenW(str)) {<BR>+
lstrcpynW(lpParms->lpstrReturn, str,
lpParms->dwRetSize - 1);<BR>+ ret =
MCIERR_PARAM_OVERFLOW;<BR>+ } else {<BR>+
strcpyW(lpParms->lpstrReturn, str);<BR>+ }<BR>+ } else
{<BR>+ *lpParms->lpstrReturn = 0;<BR>+
}<BR>+ TRACE("=> %s (%ld)\n",
debugstr_w(lpParms->lpstrReturn), ret);<BR>+ return
ret;<BR>+}<BR>+<BR>+/**************************************************************************<BR>+
* MCICDA_Status [internal]<BR>+ */<BR>+static DWORD MCICDA_Status(UINT wDevID,
DWORD dwFlags, LPMCI_STATUS_PARMS lpParms)<BR>+{<BR>+
WINE_MCICDAUDIO* wmcda =
MCICDA_GetOpenDrv(wDevID);<BR>+
DWORD
idx;<BR>+ DWORD
ret = 0;<BR>+
CDROM_SUB_Q_DATA_FORMAT fmt;<BR>+
SUB_Q_CHANNEL_DATA
data;<BR>+
CDROM_TOC
toc;<BR>+
DWORD
br;<BR>+<BR>+ TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags,
lpParms);<BR>+<BR>+ if (lpParms == NULL) return
MCIERR_NULL_PARAMETER_BLOCK;<BR>+ if (wmcda == NULL) return
MCIERR_INVALID_DEVICE_ID;<BR>+<BR>+ if (dwFlags &
MCI_NOTIFY) {<BR>+ TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n",
lpParms->dwCallback);<BR>+
mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)),<BR>+
wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);<BR>+
}<BR>+ if (dwFlags & MCI_STATUS_ITEM) {<BR>+
TRACE("dwItem = %lx\n", lpParms->dwItem);<BR>+ switch (lpParms->dwItem)
{<BR>+ case
MCI_STATUS_CURRENT_TRACK:<BR>+
fmt.Format =
IOCTL_CDROM_CURRENT_POSITION;<BR>+
if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_Q_CHANNEL, &fmt,
sizeof(fmt),<BR>+
&data, sizeof(data), &br,
NULL))<BR>+
{<BR>+ return MCICDA_GetError(wmcda);<BR>+ }<BR>+
lpParms->dwReturn =
data.CurrentPosition.TrackNumber;<BR>+
TRACE("CURRENT_TRACK=%lu!\n", lpParms->dwReturn);<BR>+
break;<BR>+ case
MCI_STATUS_LENGTH:<BR>+
if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL,
0,<BR>+
&toc, sizeof(toc), &br, NULL))
{<BR>+
WARN("error reading TOC
!\n");<BR>+
return MCICDA_GetError(wmcda);<BR>+ }<BR>+
if (dwFlags & MCI_TRACK) {<BR>+ TRACE("MCI_TRACK #%lu
LENGTH=??? !\n", lpParms->dwTrack);<BR>+ if (lpParms->dwTrack <
toc.FirstTrack || lpParms->dwTrack > toc.LastTrack)<BR>+
return
MCIERR_OUTOFRANGE;<BR>+
idx = lpParms->dwTrack - toc.FirstTrack;<BR>+ lpParms->dwReturn =
FRAME_OF_TOC(toc, lpParms->dwTrack + 1)
-<BR>+
FRAME_OF_TOC(toc, lpParms->dwTrack);<BR>+ /* Windows returns one frame less
than the total track length for the<BR>+ last track on the
CD. See CDDB HOWTO. Verified on Win95OSR2. */<BR>+ if
(lpParms->dwTrack == toc.LastTrack)<BR>+
lpParms->dwReturn--;<BR>+ } else {<BR>+ /* Sum of the
lengths of all of the tracks. Inherits the<BR>+ 'off by one
frame' behavior from the length of the last track.<BR>+ See above
comment. */<BR>+ lpParms->dwReturn = FRAME_OF_TOC(toc, toc.LastTrack + 1)
-<BR>+
FRAME_OF_TOC(toc, toc.FirstTrack) - 1;<BR>+ }<BR>+
lpParms->dwReturn = MCICDA_CalcTime(wmcda,<BR>+
(wmcda->dwTimeFormat == MCI_FORMAT_TMSF)<BR>+ ?
MCI_FORMAT_MSF : wmcda->dwTimeFormat,<BR>+ lpParms->dwReturn,<BR>+
&ret);<BR>+ TRACE("LENGTH=%lu !\n",
lpParms->dwReturn);<BR>+ break;<BR>+ case
MCI_STATUS_MODE:<BR>+
lpParms->dwReturn = MCICDA_GetStatus(wmcda);<BR>+
TRACE("MCI_STATUS_MODE=%08lX !\n", lpParms->dwReturn);<BR>+
lpParms->dwReturn =
MAKEMCIRESOURCE(lpParms->dwReturn, lpParms->dwReturn);<BR>+
ret = MCI_RESOURCE_RETURNED;<BR>+
break;<BR>+ case MCI_STATUS_MEDIA_PRESENT:<BR>+
lpParms->dwReturn = (MCICDA_GetStatus(wmcda) == MCI_MODE_OPEN) ?<BR>+
MAKEMCIRESOURCE(FALSE, MCI_FALSE) : MAKEMCIRESOURCE(TRUE, MCI_TRUE);<BR>+
TRACE("MCI_STATUS_MEDIA_PRESENT =%c!\n",
LOWORD(lpParms->dwReturn) ? 'Y' : 'N');<BR>+ ret =
MCI_RESOURCE_RETURNED;<BR>+ break;<BR>+ case
MCI_STATUS_NUMBER_OF_TRACKS:<BR>+
if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL,
0,<BR>+
&toc, sizeof(toc), &br, NULL))
{<BR>+
WARN("error reading TOC
!\n");<BR>+
return MCICDA_GetError(wmcda);<BR>+ }<BR>+
lpParms->dwReturn = toc.LastTrack - toc.FirstTrack +
1;<BR>+ TRACE("MCI_STATUS_NUMBER_OF_TRACKS = %lu !\n",
lpParms->dwReturn);<BR>+ if (lpParms->dwReturn ==
(WORD)-1)<BR>+ return MCICDA_GetError(wmcda);<BR>+
break;<BR>+ case MCI_STATUS_POSITION:<BR>+ if (dwFlags
& MCI_STATUS_START)
{<BR>+
if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL,
0,<BR>+
&toc, sizeof(toc), &br, NULL))
{<BR>+
WARN("error reading TOC
!\n");<BR>+
return
MCICDA_GetError(wmcda);<BR>+
}<BR>+ lpParms->dwReturn = FRAME_OF_TOC(toc, toc.FirstTrack);<BR>+
TRACE("get MCI_STATUS_START !\n");<BR>+ } else if (dwFlags
& MCI_TRACK)
{<BR>+
if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL,
0,<BR>+
&toc, sizeof(toc), &br, NULL))
{<BR>+
WARN("error reading TOC
!\n");<BR>+
return
MCICDA_GetError(wmcda);<BR>+
}<BR>+ if (lpParms->dwTrack < toc.FirstTrack || lpParms->dwTrack >
toc.LastTrack)<BR>+ return MCIERR_OUTOFRANGE;<BR>+
lpParms->dwReturn = FRAME_OF_TOC(toc, lpParms->dwTrack);<BR>+ TRACE("get
MCI_TRACK #%lu !\n",
lpParms->dwTrack);<BR>+
} else
{<BR>+
fmt.Format =
IOCTL_CDROM_CURRENT_POSITION;<BR>+
if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_Q_CHANNEL, &fmt,
sizeof(fmt),<BR>+
&data, sizeof(data), &br, NULL))
{<BR>+
return
MCICDA_GetError(wmcda);<BR>+
}<BR>+
lpParms->dwReturn =
FRAME_OF_ADDR(data.CurrentPosition.AbsoluteAddress);<BR>+
}<BR>+ lpParms->dwReturn = MCICDA_CalcTime(wmcda,
wmcda->dwTimeFormat, lpParms->dwReturn, &ret);<BR>+
TRACE("MCI_STATUS_POSITION=%08lX !\n",
lpParms->dwReturn);<BR>+ break;<BR>+ case
MCI_STATUS_READY:<BR>+ TRACE("MCI_STATUS_READY
!\n");<BR>+
switch
(MCICDA_GetStatus(wmcda))<BR>+
{<BR>+ case
MCI_MODE_NOT_READY:<BR>+
case
MCI_MODE_OPEN:<BR>+
lpParms->dwReturn = MAKEMCIRESOURCE(FALSE,
MCI_FALSE);<BR>+
break;<BR>+
default:<BR>+
lpParms->dwReturn = MAKEMCIRESOURCE(TRUE,
MCI_TRUE);<BR>+
break;<BR>+
}<BR>+ TRACE("MCI_STATUS_READY=%u!\n",
LOWORD(lpParms->dwReturn));<BR>+ ret =
MCI_RESOURCE_RETURNED;<BR>+ break;<BR>+ case
MCI_STATUS_TIME_FORMAT:<BR>+ lpParms->dwReturn =
MAKEMCIRESOURCE(wmcda->dwTimeFormat, MCI_FORMAT_RETURN_BASE +
wmcda->dwTimeFormat);<BR>+
TRACE("MCI_STATUS_TIME_FORMAT=%08x!\n", LOWORD(lpParms->dwReturn));<BR>+
ret = MCI_RESOURCE_RETURNED;<BR>+
break;<BR>+ case 4001: /* FIXME: for bogus FullCD */<BR>+ case
MCI_CDA_STATUS_TYPE_TRACK:<BR>+ if (!(dwFlags &
MCI_TRACK))<BR>+ ret = MCIERR_MISSING_PARAMETER;<BR>+ else
{<BR>+
if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL,
0,<BR>+
&toc, sizeof(toc), &br, NULL))
{<BR>+
WARN("error reading TOC
!\n");<BR>+
return
MCICDA_GetError(wmcda);<BR>+
}<BR>+ if (lpParms->dwTrack < toc.FirstTrack || lpParms->dwTrack >
toc.LastTrack)<BR>+ ret = MCIERR_OUTOFRANGE;<BR>+ else<BR>+
lpParms->dwReturn = (toc.TrackData[lpParms->dwTrack -
toc.FirstTrack].Control & 0x04)
?<BR>+
MCI_CDA_TRACK_OTHER : MCI_CDA_TRACK_AUDIO;<BR>+ }<BR>+
TRACE("MCI_CDA_STATUS_TYPE_TRACK[%ld]=%ld\n",
lpParms->dwTrack, lpParms->dwReturn);<BR>+
break;<BR>+ default:<BR>+ FIXME("unknown command %08lX
!\n", lpParms->dwItem);<BR>+ return
MCIERR_UNRECOGNIZED_COMMAND;<BR>+ }<BR>+ } else {<BR>+
WARN("not MCI_STATUS_ITEM !\n");<BR>+
}<BR>+ return
ret;<BR>+}<BR>+<BR>+/**************************************************************************<BR>+
* MCICDA_SkipDataTracks [internal]<BR>+ */<BR>+static DWORD
MCICDA_SkipDataTracks(WINE_MCICDAUDIO* wmcda,DWORD *frame)<BR>+{<BR>+
int i;<BR>+ DWORD br;<BR>+ CDROM_TOC toc;<BR>+ if
(!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL,
0,<BR>+
&toc, sizeof(toc), &br, NULL)) {<BR>+ WARN("error
reading TOC !\n");<BR>+ return
MCICDA_GetError(wmcda);<BR>+ }<BR>+ /* Locate first track whose
starting frame is bigger than frame */<BR>+
for(i=toc.FirstTrack;i<=toc.LastTrack+1;i++) <BR>+ if (
FRAME_OF_TOC(toc, i) > *frame ) break;<BR>+ if (i <=
toc.FirstTrack && i>toc.LastTrack+1) {<BR>+ i =
0; /* requested address is out of range: go back to start
*/<BR>+ *frame =
FRAME_OF_TOC(toc,toc.FirstTrack);<BR>+ }<BR>+
else<BR>+ i--;<BR>+ /* i points to last track whose
start address is not greater than frame.<BR>+ * Now skip non-audio
tracks */<BR>+ for(;i<=toc.LastTrack+1;i++)<BR>+ if
( ! (toc.TrackData[i-toc.FirstTrack].Control & 4)
)<BR>+ break;<BR>+ /* The frame will be an
address in the next audio track or<BR>+ * address of lead-out.
*/<BR>+ if ( FRAME_OF_TOC(toc, i) > *frame )<BR>+
*frame = FRAME_OF_TOC(toc, i);<BR>+ return
0;<BR>+}<BR>+<BR>+/**************************************************************************<BR>+
* MCICDA_Play [internal]<BR>+ */<BR>+static DWORD MCICDA_Play(UINT wDevID,
DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)<BR>+{<BR>+
WINE_MCICDAUDIO* wmcda =
MCICDA_GetOpenDrv(wDevID);<BR>+ DWORD
ret = 0, start,
end;<BR>+
DWORD
br;<BR>+
CDROM_PLAY_AUDIO_MSF
play;<BR>+ CDROM_SUB_Q_DATA_FORMAT
fmt;<BR>+
SUB_Q_CHANNEL_DATA
data;<BR>+ CDROM_TOC toc;<BR>+<BR>+
TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags,
lpParms);<BR>+<BR>+ if (lpParms == NULL)<BR>+ return
MCIERR_NULL_PARAMETER_BLOCK;<BR>+<BR>+ if (wmcda ==
NULL)<BR>+ return MCIERR_INVALID_DEVICE_ID;<BR>+<BR>+ if
(dwFlags & MCI_FROM) {<BR>+ start = MCICDA_CalcFrame(wmcda,
lpParms->dwFrom);<BR>+ if ( (ret=MCICDA_SkipDataTracks(wmcda, &start))
)<BR>+ return ret;<BR>+ TRACE("MCI_FROM=%08lX -> %lu \n",
lpParms->dwFrom, start);<BR>+ } else
{<BR>+ fmt.Format =
IOCTL_CDROM_CURRENT_POSITION;<BR>+
if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_Q_CHANNEL, &fmt,
sizeof(fmt),<BR>+
&data, sizeof(data), &br, NULL))
{<BR>+
return MCICDA_GetError(wmcda);<BR>+
}<BR>+ start =
FRAME_OF_ADDR(data.CurrentPosition.AbsoluteAddress);<BR>+ if (
(ret=MCICDA_SkipDataTracks(wmcda, &start)) )<BR>+ return
ret;<BR>+ }<BR>+ if (dwFlags & MCI_TO)
{<BR>+ end = MCICDA_CalcFrame(wmcda, lpParms->dwTo);<BR>+
TRACE("MCI_TO=%08lX -> %lu \n", lpParms->dwTo,
end);<BR>+ } else
{<BR>+ if
(!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL,
0,<BR>+
&toc, sizeof(toc), &br, NULL))
{<BR>+
WARN("error reading TOC
!\n");<BR>+
return MCICDA_GetError(wmcda);<BR>+
}<BR>+ end = FRAME_OF_TOC(toc, toc.LastTrack + 1) - 1;<BR>+
}<BR>+ TRACE("Playing from %lu to %lu\n", start,
end);<BR>+ play.StartingM = start /
CDFRAMES_PERMIN;<BR>+ play.StartingS = (start /
CDFRAMES_PERSEC) % 60;<BR>+ play.StartingF = start %
CDFRAMES_PERSEC;<BR>+ play.EndingM = end /
CDFRAMES_PERMIN;<BR>+ play.EndingS = (end /
CDFRAMES_PERSEC) % 60;<BR>+ play.EndingF = end %
CDFRAMES_PERSEC;<BR>+ if (!DeviceIoControl(wmcda->handle,
IOCTL_CDROM_PLAY_AUDIO_MSF, &play,
sizeof(play),<BR>+
NULL, 0, &br, NULL)) {<BR>+ ret = MCIERR_HARDWARE;<BR>+
} else if (dwFlags & MCI_NOTIFY) {<BR>+ TRACE("MCI_NOTIFY_SUCCESSFUL %08lX
!\n", lpParms->dwCallback);<BR>+ /*<BR>+
mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)),<BR>+
wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);<BR>+
*/<BR>+ }<BR>+ return
ret;<BR>+}<BR>+<BR>+/**************************************************************************<BR>+
* MCICDA_Stop [internal]<BR>+ */<BR>+static DWORD MCICDA_Stop(UINT wDevID,
DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)<BR>+{<BR>+
WINE_MCICDAUDIO* wmcda = MCICDA_GetOpenDrv(wDevID);<BR>+
DWORD
br;<BR>+<BR>+ TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags,
lpParms);<BR>+<BR>+ if (wmcda == NULL) return
MCIERR_INVALID_DEVICE_ID;<BR>+<BR>+ if
(!DeviceIoControl(wmcda->handle, IOCTL_CDROM_STOP_AUDIO, NULL, 0, NULL, 0,
&br, NULL))<BR>+ return MCIERR_HARDWARE;<BR>+<BR>+ if
(lpParms && (dwFlags & MCI_NOTIFY)) {<BR>+
TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);<BR>+
mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)),<BR>+
wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);<BR>+
}<BR>+ return
0;<BR>+}<BR>+<BR>+/**************************************************************************<BR>+
* MCICDA_Pause [internal]<BR>+ */<BR>+static DWORD MCICDA_Pause(UINT wDevID,
DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)<BR>+{<BR>+
WINE_MCICDAUDIO* wmcda = MCICDA_GetOpenDrv(wDevID);<BR>+
DWORD
br;<BR>+<BR>+ TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags,
lpParms);<BR>+<BR>+ if (wmcda == NULL) return
MCIERR_INVALID_DEVICE_ID;<BR>+<BR>+ if
(!DeviceIoControl(wmcda->handle, IOCTL_CDROM_PAUSE_AUDIO, NULL, 0, NULL, 0,
&br, NULL))<BR>+ return MCIERR_HARDWARE;<BR>+<BR>+ if
(lpParms && (dwFlags & MCI_NOTIFY))
{<BR>+ TRACE("MCI_NOTIFY_SUCCESSFUL
%08lX !\n", lpParms->dwCallback);<BR>+
mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)),<BR>+
wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);<BR>+
}<BR>+ return
0;<BR>+}<BR>+<BR>+/**************************************************************************<BR>+
* MCICDA_Resume [internal]<BR>+ */<BR>+static DWORD MCICDA_Resume(UINT wDevID,
DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)<BR>+{<BR>+
WINE_MCICDAUDIO* wmcda = MCICDA_GetOpenDrv(wDevID);<BR>+
DWORD
br;<BR>+<BR>+ TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags,
lpParms);<BR>+<BR>+ if (wmcda == NULL) return
MCIERR_INVALID_DEVICE_ID;<BR>+<BR>+ if
(!DeviceIoControl(wmcda->handle, IOCTL_CDROM_RESUME_AUDIO, NULL, 0, NULL,
0, &br, NULL))<BR>+ return MCIERR_HARDWARE;<BR>+<BR>+ if
(lpParms && (dwFlags & MCI_NOTIFY)) {<BR>+
TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);<BR>+
mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)),<BR>+
wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);<BR>+
}<BR>+ return
0;<BR>+}<BR>+<BR>+/**************************************************************************<BR>+
* MCICDA_Seek [internal]<BR>+ */<BR>+static DWORD MCICDA_Seek(UINT wDevID,
DWORD dwFlags, LPMCI_SEEK_PARMS lpParms)<BR>+{<BR>+ DWORD
at;<BR>+
WINE_MCICDAUDIO* wmcda =
MCICDA_GetOpenDrv(wDevID);<BR>+
CDROM_SEEK_AUDIO_MSF
seek;<BR>+
DWORD
br, ret;<BR>+ CDROM_TOC toc;<BR>+<BR>+
TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags,
lpParms);<BR>+<BR>+ if (wmcda == NULL) return
MCIERR_INVALID_DEVICE_ID;<BR>+ if (lpParms == NULL) return
MCIERR_NULL_PARAMETER_BLOCK;<BR>+<BR>+ if
(!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL,
0,<BR>+
&toc, sizeof(toc), &br, NULL))
{<BR>+ WARN("error reading TOC
!\n");<BR>+ return
MCICDA_GetError(wmcda);<BR>+ }<BR>+ switch
(dwFlags & ~(MCI_NOTIFY|MCI_WAIT)) {<BR>+ case
MCI_SEEK_TO_START:<BR>+ TRACE("Seeking to start\n");<BR>+ at =
FRAME_OF_TOC(toc,toc.FirstTrack);<BR>+ if ( (ret=MCICDA_SkipDataTracks(wmcda,
&at)) )<BR>+ return ret;<BR>+ break;<BR>+ case
MCI_SEEK_TO_END:<BR>+ TRACE("Seeking to end\n");<BR>+ at = FRAME_OF_TOC(toc,
toc.LastTrack + 1) - 1;<BR>+ if ( (ret=MCICDA_SkipDataTracks(wmcda, &at))
)<BR>+ return ret;<BR>+ break;<BR>+ case MCI_TO:<BR>+
TRACE("Seeking to %lu\n",
lpParms->dwTo);<BR>+ at =
MCICDA_CalcFrame(wmcda, lpParms->dwTo);<BR>+ if (
(ret=MCICDA_SkipDataTracks(wmcda, &at)) )<BR>+ return ret;<BR>+
break;<BR>+ default:<BR>+ TRACE("Unknown seek action
%08lX\n",<BR>+ (dwFlags &
~(MCI_NOTIFY|MCI_WAIT)));<BR>+ return
MCIERR_UNSUPPORTED_FUNCTION;<BR>+ }<BR>+
seek.M = at / CDFRAMES_PERMIN;<BR>+ seek.S = (at /
CDFRAMES_PERSEC) % 60;<BR>+ seek.F = at %
CDFRAMES_PERSEC;<BR>+ if (!DeviceIoControl(wmcda->handle,
IOCTL_CDROM_SEEK_AUDIO_MSF, &seek,
sizeof(seek),<BR>+
NULL, 0, &br, NULL))<BR>+ return
MCIERR_HARDWARE;<BR>+<BR>+ if (dwFlags & MCI_NOTIFY)
{<BR>+ TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);<BR>+
mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)),<BR>+
wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);<BR>+
}<BR>+ return
0;<BR>+}<BR>+<BR>+/**************************************************************************<BR>+
* MCICDA_SetDoor [internal]<BR>+ */<BR>+static DWORD MCICDA_SetDoor(UINT
wDevID, BOOL open)<BR>+{<BR>+ WINE_MCICDAUDIO* wmcda =
MCICDA_GetOpenDrv(wDevID);<BR>+
DWORD
br;<BR>+<BR>+ TRACE("(%04x, %s) !\n", wDevID, (open) ?
"OPEN" : "CLOSE");<BR>+<BR>+ if (wmcda == NULL) return
MCIERR_INVALID_DEVICE_ID;<BR>+<BR>+ if
(!DeviceIoControl(wmcda->handle,<BR>+
(open) ? IOCTL_STORAGE_EJECT_MEDIA :
IOCTL_STORAGE_LOAD_MEDIA,<BR>+
NULL, 0, NULL, 0, &br, NULL))<BR>+ return
MCIERR_HARDWARE;<BR>+<BR>+ return
0;<BR>+}<BR>+<BR>+/**************************************************************************<BR>+
* MCICDA_Set [internal]<BR>+ */<BR>+static DWORD MCICDA_Set(UINT wDevID, DWORD
dwFlags, LPMCI_SET_PARMS lpParms)<BR>+{<BR>+
WINE_MCICDAUDIO* wmcda =
MCICDA_GetOpenDrv(wDevID);<BR>+<BR>+ TRACE("(%04X, %08lX,
%p);\n", wDevID, dwFlags, lpParms);<BR>+<BR>+ if (wmcda ==
NULL) return MCIERR_INVALID_DEVICE_ID;<BR>+<BR>+ if (dwFlags
& MCI_SET_DOOR_OPEN) {<BR>+ MCICDA_SetDoor(wDevID,
TRUE);<BR>+ }<BR>+ if (dwFlags &
MCI_SET_DOOR_CLOSED) {<BR>+ MCICDA_SetDoor(wDevID,
FALSE);<BR>+ }<BR>+<BR>+ /* only functions
which require valid lpParms below this line ! */<BR>+ if
(lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;<BR>+
/*<BR>+ TRACE("dwTimeFormat=%08lX\n",
lpParms->dwTimeFormat);<BR>+
TRACE("dwAudio=%08lX\n", lpParms->dwAudio);<BR>+
*/<BR>+ if (dwFlags & MCI_SET_TIME_FORMAT) {<BR>+ switch
(lpParms->dwTimeFormat) {<BR>+ case MCI_FORMAT_MILLISECONDS:<BR>+
TRACE("MCI_FORMAT_MILLISECONDS !\n");<BR>+
break;<BR>+ case MCI_FORMAT_MSF:<BR>+
TRACE("MCI_FORMAT_MSF !\n");<BR>+ break;<BR>+ case
MCI_FORMAT_TMSF:<BR>+ TRACE("MCI_FORMAT_TMSF !\n");<BR>+
break;<BR>+ default:<BR>+ WARN("bad time
format !\n");<BR>+ return MCIERR_BAD_TIME_FORMAT;<BR>+
}<BR>+ wmcda->dwTimeFormat =
lpParms->dwTimeFormat;<BR>+ }<BR>+ if
(dwFlags & MCI_SET_VIDEO) return
MCIERR_UNSUPPORTED_FUNCTION;<BR>+ if (dwFlags &
MCI_SET_ON) return MCIERR_UNSUPPORTED_FUNCTION;<BR>+ if
(dwFlags & MCI_SET_OFF) return
MCIERR_UNSUPPORTED_FUNCTION;<BR>+ if (dwFlags &
MCI_NOTIFY) {<BR>+ TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n",<BR>+
lpParms->dwCallback);<BR>+
mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)),<BR>+
wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);<BR>+
}<BR>+ return
0;<BR>+}<BR>+<BR>+/**************************************************************************<BR>+
* DriverProc (MCICDA.@)<BR>+ */<BR>+LONG CALLBACK MCICDA_DriverProc(DWORD
dwDevID, HDRVR hDriv, DWORD wMsg,<BR>+ DWORD
dwParam1, DWORD dwParam2)<BR>+{<BR>+ switch(wMsg)
{<BR>+ case DRV_LOAD: return 1;<BR>+ case
DRV_FREE: return 1;<BR>+ case DRV_OPEN: return
MCICDA_drvOpen((LPCWSTR)dwParam1,
(LPMCI_OPEN_DRIVER_PARMSW)dwParam2);<BR>+ case DRV_CLOSE:
return MCICDA_drvClose(dwDevID);<BR>+ case DRV_ENABLE:
return 1;<BR>+ case DRV_DISABLE: return
1;<BR>+ case DRV_QUERYCONFIGURE: return
1;<BR>+ case DRV_CONFIGURE: MessageBoxA(0, "MCI audio CD
driver !", "Wine Driver", MB_OK); return 1;<BR>+ case
DRV_INSTALL: return DRVCNF_RESTART;<BR>+ case DRV_REMOVE:
return DRVCNF_RESTART;<BR>+ }<BR>+<BR>+ if
(dwDevID == 0xFFFFFFFF) return
MCIERR_UNSUPPORTED_FUNCTION;<BR>+<BR>+ switch (wMsg)
{<BR>+ case MCI_OPEN_DRIVER: return MCICDA_Open(dwDevID,
dwParam1, (LPMCI_OPEN_PARMSW)dwParam2);<BR>+ case
MCI_CLOSE_DRIVER: return MCICDA_Close(dwDevID, dwParam1,
(LPMCI_GENERIC_PARMS)dwParam2);<BR>+ case MCI_GETDEVCAPS:
return MCICDA_GetDevCaps(dwDevID, dwParam1,
(LPMCI_GETDEVCAPS_PARMS)dwParam2);<BR>+ case MCI_INFO:
return MCICDA_Info(dwDevID, dwParam1,
(LPMCI_INFO_PARMSW)dwParam2);<BR>+ case MCI_STATUS: return
MCICDA_Status(dwDevID, dwParam1,
(LPMCI_STATUS_PARMS)dwParam2);<BR>+ case MCI_SET: return
MCICDA_Set(dwDevID, dwParam1,
(LPMCI_SET_PARMS)dwParam2);<BR>+ case MCI_PLAY: return
MCICDA_Play(dwDevID, dwParam1,
(LPMCI_PLAY_PARMS)dwParam2);<BR>+ case MCI_STOP: return
MCICDA_Stop(dwDevID, dwParam1,
(LPMCI_GENERIC_PARMS)dwParam2);<BR>+ case MCI_PAUSE: return
MCICDA_Pause(dwDevID, dwParam1,
(LPMCI_GENERIC_PARMS)dwParam2);<BR>+ case MCI_RESUME: return
MCICDA_Resume(dwDevID, dwParam1,
(LPMCI_GENERIC_PARMS)dwParam2);<BR>+ case MCI_SEEK: return
MCICDA_Seek(dwDevID, dwParam1,
(LPMCI_SEEK_PARMS)dwParam2);<BR>+ /* commands that should
report an error as they are not supported in<BR>+ *
the native version */<BR>+ case
MCI_SET_DOOR_CLOSED:<BR>+ case
MCI_SET_DOOR_OPEN:<BR>+ case
MCI_LOAD:<BR>+ case MCI_SAVE:<BR>+ case
MCI_FREEZE:<BR>+ case MCI_PUT:<BR>+ case
MCI_REALIZE:<BR>+ case MCI_UNFREEZE:<BR>+
case MCI_UPDATE:<BR>+ case MCI_WHERE:<BR>+
case MCI_STEP:<BR>+ case MCI_SPIN:<BR>+
case MCI_ESCAPE:<BR>+ case MCI_COPY:<BR>+
case MCI_CUT:<BR>+ case MCI_DELETE:<BR>+
case MCI_PASTE:<BR>+ case MCI_WINDOW:<BR>+
TRACE("Unsupported command [0x%lx]\n", wMsg);<BR>+
break;<BR>+ case MCI_OPEN:<BR>+ case
MCI_CLOSE:<BR>+ ERR("Shouldn't receive a MCI_OPEN or CLOSE message\n");<BR>+
break;<BR>+ default:<BR>+ TRACE("Sending msg [0x%lx] to
default driver proc\n", wMsg);<BR>+ return DefDriverProc(dwDevID, hDriv, wMsg,
dwParam1, dwParam2);<BR>+ }<BR>+ return
MCIERR_UNRECOGNIZED_COMMAND;<BR>+}<BR>+<BR>+/*-----------------------------------------------------------------------*/<BR>diff
-Nru wine/dlls/mcicda/mcicda.spec winedev/dlls/mcicda/mcicda.spec<BR>---
wine/dlls/mcicda/mcicda.spec 1970-01-01 01:00:00.000000000 +0100<BR>+++
winedev/dlls/mcicda/mcicda.spec 2002-06-21 21:15:50.000000000 +0200<BR>@@ -0,0
+1 @@<BR>+@ stdcall DriverProc(long long long long long)
MCICDA_DriverProc<BR>diff -Nru wine/dlls/winmm/mcicda/.cvsignore
winedev/dlls/winmm/mcicda/.cvsignore<BR>--- wine/dlls/winmm/mcicda/.cvsignore
2004-03-24 04:36:45.000000000 +0100<BR>+++
winedev/dlls/winmm/mcicda/.cvsignore 1970-01-01 01:00:00.000000000 +0100<BR>@@
-1,2 +0,0 @@<BR>-Makefile<BR>-mcicda.drv.dbg.c<BR>diff -Nru
wine/dlls/winmm/mcicda/Makefile.in
winedev/dlls/winmm/mcicda/Makefile.in<BR>---
wine/dlls/winmm/mcicda/Makefile.in 2005-02-09 23:26:26.000000000 +0100<BR>+++
winedev/dlls/winmm/mcicda/Makefile.in 1970-01-01 01:00:00.000000000
+0100<BR>@@ -1,14 +0,0 @@<BR>-TOPSRCDIR = @top_srcdir@<BR>-TOPOBJDIR =
../../..<BR>-SRCDIR =
@srcdir@<BR>-VPATH =
@srcdir@<BR>-MODULE = mcicda.drv<BR>-IMPORTS =
winmm user32 kernel32<BR>-EXTRALIBS = $(LIBUNICODE)<BR>-<BR>-C_SRCS = \<BR>-
mcicda.c<BR>-<BR>-@MAKE_DLL_RULES@<BR>-<BR>-### Dependencies:<BR>diff -Nru
wine/dlls/winmm/mcicda/mcicda.c winedev/dlls/winmm/mcicda/mcicda.c<BR>---
wine/dlls/winmm/mcicda/mcicda.c 2005-02-09 23:26:26.000000000 +0100<BR>+++
winedev/dlls/winmm/mcicda/mcicda.c 1970-01-01 01:00:00.000000000 +0100<BR>@@
-1,1053 +0,0 @@<BR>-/* -*- tab-width: 8; c-basic-offset: 4 -*- */<BR>-/*<BR>-
* MCI driver for audio CD (MCICDA)<BR>- *<BR>- * Copyright
1994 Martin Ayotte<BR>- * Copyright 1998-99 Eric Pouech<BR>-
* Copyright 2000 Andreas Mohr<BR>- *<BR>- * This library is
free software; you can redistribute it and/or<BR>- * modify it under the terms
of the GNU Lesser General Public<BR>- * License as published by the Free
Software Foundation; either<BR>- * version 2.1 of the License, or (at your
option) any later version.<BR>- *<BR>- * This library is distributed in the
hope that it will be useful,<BR>- * but WITHOUT ANY WARRANTY; without even the
implied warranty of<BR>- * MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the GNU<BR>- * Lesser General Public License for more
details.<BR>- *<BR>- * You should have received a copy of the GNU Lesser
General Public<BR>- * License along with this library; if not, write to the
Free Software<BR>- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
MA 02111-1307 USA<BR>- */<BR>-<BR>-#include
"config.h"<BR>-#include <stdarg.h><BR>-#include
<stdio.h><BR>-#include <string.h><BR>-<BR>-#include
"windef.h"<BR>-#include "winbase.h"<BR>-#include "wingdi.h"<BR>-#include
"winuser.h"<BR>-#include "ntstatus.h"<BR>-#include "wownt32.h"<BR>-#include
"mmddk.h"<BR>-#include "winioctl.h"<BR>-#include "ntddstor.h"<BR>-#include
"ntddcdrm.h"<BR>-#include "wine/debug.h"<BR>-#include
"wine/unicode.h"<BR>-<BR>-WINE_DEFAULT_DEBUG_CHANNEL(mcicda);<BR>-<BR>-#define
CDFRAMES_PERSEC
75<BR>-#define
CDFRAMES_PERMIN
(CDFRAMES_PERSEC * 60)<BR>-#define FRAME_OF_ADDR(a) ((a)[1] * CDFRAMES_PERMIN
+ (a)[2] * CDFRAMES_PERSEC + (a)[3])<BR>-#define FRAME_OF_TOC(toc, idx)
FRAME_OF_ADDR((toc).TrackData[idx -
(toc).FirstTrack].Address)<BR>-<BR>-typedef struct {<BR>-
UINT wDevID;<BR>- int
nUseCount; /*
Incremented for each shared open */<BR>- BOOL
fShareable; /* TRUE if first
open was shareable */<BR>- WORD
wNotifyDeviceID; /* MCI device ID with a pending
notification */<BR>- HANDLE
hCallback; /* Callback
handle for pending notification */<BR>- DWORD
dwTimeFormat;<BR>-
HANDLE
handle;<BR>-}
WINE_MCICDAUDIO;<BR>-<BR>-/*-----------------------------------------------------------------------*/<BR>-<BR>-/**************************************************************************<BR>-
* MCICDA_drvOpen [internal]<BR>- */<BR>-static DWORD MCICDA_drvOpen(LPCWSTR
str, LPMCI_OPEN_DRIVER_PARMSW modp)<BR>-{<BR>-
WINE_MCICDAUDIO* wmcda;<BR>-<BR>- if (!modp) return
0xFFFFFFFF;<BR>-<BR>- wmcda = HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY, sizeof(WINE_MCICDAUDIO));<BR>-<BR>- if
(!wmcda)<BR>- return 0;<BR>-<BR>- wmcda->wDevID =
modp->wDeviceID;<BR>- mciSetDriverData(wmcda->wDevID,
(DWORD)wmcda);<BR>- modp->wCustomCommandTable =
MCI_NO_COMMAND_TABLE;<BR>- modp->wType =
MCI_DEVTYPE_CD_AUDIO;<BR>- return
modp->wDeviceID;<BR>-}<BR>-<BR>-/**************************************************************************<BR>-
* MCICDA_drvClose [internal]<BR>- */<BR>-static DWORD MCICDA_drvClose(DWORD
dwDevID)<BR>-{<BR>- WINE_MCICDAUDIO* wmcda =
(WINE_MCICDAUDIO*)mciGetDriverData(dwDevID);<BR>-<BR>- if
(wmcda) {<BR>- HeapFree(GetProcessHeap(), 0, wmcda);<BR>-
mciSetDriverData(dwDevID, 0);<BR>- }<BR>-
return (dwDevID == 0xFFFFFFFF) ? 1 :
0;<BR>-}<BR>-<BR>-/**************************************************************************<BR>-
* MCICDA_GetOpenDrv [internal]<BR>- */<BR>-static WINE_MCICDAUDIO*
MCICDA_GetOpenDrv(UINT wDevID)<BR>-{<BR>- WINE_MCICDAUDIO*
wmcda =
(WINE_MCICDAUDIO*)mciGetDriverData(wDevID);<BR>-<BR>- if
(wmcda == NULL || wmcda->nUseCount == 0) {<BR>- WARN("Invalid wDevID=%u\n",
wDevID);<BR>- return 0;<BR>- }<BR>- return
wmcda;<BR>-}<BR>-<BR>-/**************************************************************************<BR>-
* MCICDA_GetStatus [internal]<BR>- */<BR>-static DWORD
MCICDA_GetStatus(WINE_MCICDAUDIO* wmcda)<BR>-{<BR>-
CDROM_SUB_Q_DATA_FORMAT fmt;<BR>-
SUB_Q_CHANNEL_DATA
data;<BR>-
DWORD
br;<BR>-
DWORD
mode = MCI_MODE_NOT_READY;<BR>-<BR>- fmt.Format =
IOCTL_CDROM_CURRENT_POSITION;<BR>- if
(!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_Q_CHANNEL, &fmt,
sizeof(fmt),<BR>-
&data, sizeof(data), &br, NULL))
{<BR>- if (GetLastError() ==
STATUS_NO_MEDIA_IN_DEVICE) mode = MCI_MODE_OPEN;<BR>- } else
{<BR>- switch
(data.CurrentPosition.Header.AudioStatus)<BR>-
{<BR>- case
AUDIO_STATUS_IN_PROGRESS:
mode = MCI_MODE_PLAY;
break;<BR>- case
AUDIO_STATUS_PAUSED:
mode = MCI_MODE_PAUSE;
break;<BR>- case
AUDIO_STATUS_NO_STATUS:<BR>- case
AUDIO_STATUS_PLAY_COMPLETE: mode =
MCI_MODE_STOP;
break;<BR>- case
AUDIO_STATUS_PLAY_ERROR:<BR>- case
AUDIO_STATUS_NOT_SUPPORTED:<BR>-
default:<BR>-
break;<BR>- }<BR>-
}<BR>- return
mode;<BR>-}<BR>-<BR>-/**************************************************************************<BR>-
* MCICDA_GetError [internal]<BR>- */<BR>-static int
MCICDA_GetError(WINE_MCICDAUDIO* wmcda)<BR>-{<BR>- switch
(GetLastError())<BR>- {<BR>- case
STATUS_NO_MEDIA_IN_DEVICE: return
MCIERR_DEVICE_NOT_READY;<BR>- case
STATUS_IO_DEVICE_ERROR: return
MCIERR_HARDWARE;<BR>- default:<BR>- FIXME("Unknown mode
%lx\n", GetLastError());<BR>- }<BR>-
return
MCIERR_DRIVER_INTERNAL;<BR>-}<BR>-<BR>-/**************************************************************************<BR>-
* MCICDA_CalcFrame [internal]<BR>- */<BR>-static DWORD
MCICDA_CalcFrame(WINE_MCICDAUDIO* wmcda, DWORD
dwTime)<BR>-{<BR>- DWORD dwFrame = 0;<BR>-
UINT wTrack;<BR>- CDROM_TOC
toc;<BR>- DWORD
br;<BR>- BYTE*
addr;<BR>-<BR>- TRACE("(%p, %08lX, %lu);\n", wmcda,
wmcda->dwTimeFormat, dwTime);<BR>-<BR>- switch
(wmcda->dwTimeFormat) {<BR>- case
MCI_FORMAT_MILLISECONDS:<BR>- dwFrame = ((dwTime - 1) * CDFRAMES_PERSEC + 500)
/ 1000;<BR>- TRACE("MILLISECONDS %lu\n", dwFrame);<BR>-
break;<BR>- case MCI_FORMAT_MSF:<BR>- TRACE("MSF
%02u:%02u:%02u\n",<BR>- MCI_MSF_MINUTE(dwTime),
MCI_MSF_SECOND(dwTime), MCI_MSF_FRAME(dwTime));<BR>- dwFrame +=
CDFRAMES_PERMIN * MCI_MSF_MINUTE(dwTime);<BR>- dwFrame += CDFRAMES_PERSEC *
MCI_MSF_SECOND(dwTime);<BR>- dwFrame += MCI_MSF_FRAME(dwTime);<BR>-
break;<BR>- case MCI_FORMAT_TMSF:<BR>-
default: /* unknown format ! force TMSF ! ... */<BR>- wTrack =
MCI_TMSF_TRACK(dwTime);<BR>- if
(!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL,
0,<BR>-
&toc, sizeof(toc), &br,
NULL))<BR>-
return 0;<BR>- if (wTrack <
toc.FirstTrack || wTrack >
toc.LastTrack)<BR>-
return 0;<BR>- TRACE("MSF
%02u-%02u:%02u:%02u\n",<BR>-
MCI_TMSF_TRACK(dwTime),
MCI_TMSF_MINUTE(dwTime),<BR>-
MCI_TMSF_SECOND(dwTime),
MCI_TMSF_FRAME(dwTime));<BR>- addr =
toc.TrackData[wTrack -
toc.FirstTrack].Address;<BR>-
TRACE("TMSF
trackpos[%u]=%d:%d:%d\n",<BR>-
wTrack, addr[1], addr[2],
addr[3]);<BR>- dwFrame =
CDFRAMES_PERMIN * (addr[1] + MCI_TMSF_MINUTE(dwTime))
+<BR>-
CDFRAMES_PERSEC * (addr[2] + MCI_TMSF_SECOND(dwTime))
+<BR>-
addr[3] + MCI_TMSF_FRAME(dwTime);<BR>- break;<BR>-
}<BR>- return
dwFrame;<BR>-}<BR>-<BR>-/**************************************************************************<BR>-
* MCICDA_CalcTime [internal]<BR>- */<BR>-static DWORD
MCICDA_CalcTime(WINE_MCICDAUDIO* wmcda, DWORD tf, DWORD dwFrame, LPDWORD
lpRet)<BR>-{<BR>- DWORD dwTime = 0;<BR>-
UINT wTrack;<BR>- UINT wMinutes;<BR>- UINT
wSeconds;<BR>- UINT wFrames;<BR>-
CDROM_TOC toc;<BR>-
DWORD br;<BR>-<BR>-
TRACE("(%p, %08lX, %lu);\n", wmcda, tf, dwFrame);<BR>-<BR>-
switch (tf) {<BR>- case MCI_FORMAT_MILLISECONDS:<BR>- dwTime
= (dwFrame * 1000) / CDFRAMES_PERSEC + 1;<BR>- TRACE("MILLISECONDS %lu\n",
dwTime);<BR>- *lpRet = 0;<BR>- break;<BR>- case
MCI_FORMAT_MSF:<BR>- wMinutes = dwFrame / CDFRAMES_PERMIN;<BR>- wSeconds =
(dwFrame - CDFRAMES_PERMIN * wMinutes) / CDFRAMES_PERSEC;<BR>- wFrames =
dwFrame - CDFRAMES_PERMIN * wMinutes - CDFRAMES_PERSEC * wSeconds;<BR>- dwTime
= MCI_MAKE_MSF(wMinutes, wSeconds, wFrames);<BR>- TRACE("MSF %02u:%02u:%02u
-> dwTime=%lu\n",<BR>- wMinutes, wSeconds,
wFrames, dwTime);<BR>- *lpRet = MCI_COLONIZED3_RETURN;<BR>-
break;<BR>- case MCI_FORMAT_TMSF:<BR>-
default: /* unknown format ! force TMSF ! ...
*/<BR>- if
(!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL,
0,<BR>-
&toc, sizeof(toc), &br,
NULL))<BR>-
return 0;<BR>- if (dwFrame < FRAME_OF_TOC(toc, toc.FirstTrack)
||<BR>-
dwFrame > FRAME_OF_TOC(toc, toc.LastTrack + 1)) {<BR>-
ERR("Out of range value %lu [%u,%u]\n",<BR>- dwFrame, FRAME_OF_TOC(toc,
toc.FirstTrack),<BR>-
FRAME_OF_TOC(toc, toc.LastTrack + 1));<BR>- *lpRet =
0;<BR>- return 0;<BR>- }<BR>- for (wTrack = toc.FirstTrack;
wTrack <= toc.LastTrack; wTrack++) {<BR>- if
(FRAME_OF_TOC(toc, wTrack) > dwFrame)<BR>- break;<BR>-
}<BR>- wTrack--;<BR>- dwFrame -=
FRAME_OF_TOC(toc, wTrack);<BR>- wMinutes = dwFrame / CDFRAMES_PERMIN;<BR>-
wSeconds = (dwFrame - CDFRAMES_PERMIN * wMinutes) / CDFRAMES_PERSEC;<BR>-
wFrames = dwFrame - CDFRAMES_PERMIN * wMinutes - CDFRAMES_PERSEC *
wSeconds;<BR>- dwTime = MCI_MAKE_TMSF(wTrack, wMinutes, wSeconds,
wFrames);<BR>- TRACE("%02u-%02u:%02u:%02u\n", wTrack, wMinutes, wSeconds,
wFrames);<BR>- *lpRet = MCI_COLONIZED4_RETURN;<BR>-
break;<BR>- }<BR>- return
dwTime;<BR>-}<BR>-<BR>-static DWORD MCICDA_Seek(UINT wDevID, DWORD dwFlags,
LPMCI_SEEK_PARMS lpParms);<BR>-static DWORD MCICDA_Stop(UINT wDevID, DWORD
dwFlags, LPMCI_GENERIC_PARMS
lpParms);<BR>-<BR>-/**************************************************************************<BR>-
* MCICDA_Open [internal]<BR>- */<BR>-static DWORD MCICDA_Open(UINT wDevID,
DWORD dwFlags, LPMCI_OPEN_PARMSW lpOpenParms)<BR>-{<BR>-
DWORD dwDeviceID;<BR>-
DWORD
ret = MCIERR_HARDWARE;<BR>- WINE_MCICDAUDIO* wmcda =
(WINE_MCICDAUDIO*)mciGetDriverData(wDevID);<BR>-
WCHAR
root[7], drive = 0;<BR>-
int
count;<BR>-<BR>- TRACE("(%04X, %08lX, %p);\n", wDevID,
dwFlags, lpOpenParms);<BR>-<BR>- if (lpOpenParms == NULL)
return MCIERR_NULL_PARAMETER_BLOCK;<BR>- if (wmcda == NULL)
return MCIERR_INVALID_DEVICE_ID;<BR>-<BR>- dwDeviceID =
lpOpenParms->wDeviceID;<BR>-<BR>- if (wmcda->nUseCount
> 0) {<BR>- /* The driver is already open on this channel */<BR>- /* If the
driver was opened shareable before and this open specifies */<BR>- /*
shareable then increment the use count */<BR>- if (wmcda->fShareable
&& (dwFlags & MCI_OPEN_SHAREABLE))<BR>-
++wmcda->nUseCount;<BR>- else<BR>- return
MCIERR_MUST_USE_SHAREABLE;<BR>- } else {<BR>-
wmcda->nUseCount = 1;<BR>- wmcda->fShareable = dwFlags &
MCI_OPEN_SHAREABLE;<BR>- }<BR>- if
(dwFlags & MCI_OPEN_ELEMENT)
{<BR>- if (dwFlags &
MCI_OPEN_ELEMENT_ID)
{<BR>-
WARN("MCI_OPEN_ELEMENT_ID %8lx ! Abort\n",
(DWORD)lpOpenParms->lpstrElementName);<BR>-
return
MCIERR_NO_ELEMENT_ALLOWED;<BR>-
}<BR>- TRACE("MCI_OPEN_ELEMENT
element name: %s\n",
debugstr_w(lpOpenParms->lpstrElementName));<BR>-
if (!isalpha(lpOpenParms->lpstrElementName[0]) ||
lpOpenParms->lpstrElementName[1] != ':'
||<BR>-
(lpOpenParms->lpstrElementName[2] &&
lpOpenParms->lpstrElementName[2] !=
'\\'))<BR>-
{<BR>-
WARN("MCI_OPEN_ELEMENT unsupported format: %s\n",
<BR>-
debugstr_w(lpOpenParms->lpstrElementName));<BR>-
ret =
MCIERR_NO_ELEMENT_ALLOWED;<BR>-
goto the_error;<BR>-
}<BR>- drive =
toupper(lpOpenParms->lpstrElementName[0]);<BR>-
root[0] = drive; root[1] = ':'; root[2] = '\\'; root[3] =
'\0';<BR>- if (GetDriveTypeW(root)
!= DRIVE_CDROM)<BR>-
{<BR>- ret =
MCIERR_INVALID_DEVICE_NAME;<BR>-
goto the_error;<BR>-
}<BR>- }<BR>- else<BR>-
{<BR>- /* drive letter isn't
passed... get the dwDeviceID'th cdrom in the system
*/<BR>- root[0] = 'A'; root[1] =
':'; root[2] = '\\'; root[3] =
'\0';<BR>- for (count = 0; root[0]
<= 'Z'; root[0]++)<BR>-
{<BR>- if
(GetDriveTypeW(root) == DRIVE_CDROM && ++count >=
dwDeviceID)<BR>-
{<BR>-
drive =
root[0];<BR>-
break;<BR>-
}<BR>-
}<BR>- if
(!drive)<BR>-
{<BR>- ret =
MCIERR_INVALID_DEVICE_ID;<BR>-
goto the_error;<BR>-
}<BR>- }<BR>-<BR>-
wmcda->wNotifyDeviceID = dwDeviceID;<BR>-
wmcda->dwTimeFormat = MCI_FORMAT_MSF;<BR>-<BR>- /* now,
open the handle */<BR>- root[0] = root[1] = '\\'; root[2] =
'.'; root[3] = '\\'; root[4] = drive; root[5] = ':'; root[6] =
'\0';<BR>- wmcda->handle = CreateFileW(root,
GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0,
0);<BR>- if (wmcda->handle !=
INVALID_HANDLE_VALUE)<BR>- return
0;<BR>-<BR>- the_error:<BR>-
--wmcda->nUseCount;<BR>- return
ret;<BR>-}<BR>-<BR>-/**************************************************************************<BR>-
* MCICDA_Close [internal]<BR>- */<BR>-static DWORD MCICDA_Close(UINT wDevID,
DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)<BR>-{<BR>-
WINE_MCICDAUDIO* wmcda =
MCICDA_GetOpenDrv(wDevID);<BR>-<BR>- TRACE("(%04X, %08lX,
%p);\n", wDevID, dwParam, lpParms);<BR>-<BR>- if (wmcda ==
NULL) return MCIERR_INVALID_DEVICE_ID;<BR>-<BR>- if
(--wmcda->nUseCount == 0) {<BR>-
CloseHandle(wmcda->handle);<BR>- }<BR>-
return
0;<BR>-}<BR>-<BR>-/**************************************************************************<BR>-
* MCICDA_GetDevCaps [internal]<BR>- */<BR>-static DWORD MCICDA_GetDevCaps(UINT
wDevID, DWORD dwFlags,<BR>- LPMCI_GETDEVCAPS_PARMS
lpParms)<BR>-{<BR>- DWORD ret =
0;<BR>-<BR>- TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags,
lpParms);<BR>-<BR>- if (lpParms == NULL) return
MCIERR_NULL_PARAMETER_BLOCK;<BR>-<BR>- if (dwFlags &
MCI_GETDEVCAPS_ITEM) {<BR>- TRACE("MCI_GETDEVCAPS_ITEM dwItem=%08lX;\n",
lpParms->dwItem);<BR>-<BR>- switch (lpParms->dwItem) {<BR>- case
MCI_GETDEVCAPS_CAN_RECORD:<BR>- lpParms->dwReturn =
MAKEMCIRESOURCE(FALSE, MCI_FALSE);<BR>- ret =
MCI_RESOURCE_RETURNED;<BR>- break;<BR>- case
MCI_GETDEVCAPS_HAS_AUDIO:<BR>- lpParms->dwReturn =
MAKEMCIRESOURCE(TRUE, MCI_TRUE);<BR>- ret =
MCI_RESOURCE_RETURNED;<BR>- break;<BR>- case
MCI_GETDEVCAPS_HAS_VIDEO:<BR>- lpParms->dwReturn =
MAKEMCIRESOURCE(FALSE, MCI_FALSE);<BR>- ret =
MCI_RESOURCE_RETURNED;<BR>- break;<BR>- case
MCI_GETDEVCAPS_DEVICE_TYPE:<BR>- lpParms->dwReturn =
MAKEMCIRESOURCE(MCI_DEVTYPE_CD_AUDIO, MCI_DEVTYPE_CD_AUDIO);<BR>-
ret = MCI_RESOURCE_RETURNED;<BR>-
break;<BR>- case MCI_GETDEVCAPS_USES_FILES:<BR>-
lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);<BR>-
ret = MCI_RESOURCE_RETURNED;<BR>-
break;<BR>- case MCI_GETDEVCAPS_COMPOUND_DEVICE:<BR>-
lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);<BR>-
ret = MCI_RESOURCE_RETURNED;<BR>-
break;<BR>- case MCI_GETDEVCAPS_CAN_EJECT:<BR>-
lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE);<BR>-
ret = MCI_RESOURCE_RETURNED;<BR>-
break;<BR>- case MCI_GETDEVCAPS_CAN_PLAY:<BR>-
lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE);<BR>-
ret = MCI_RESOURCE_RETURNED;<BR>-
break;<BR>- case MCI_GETDEVCAPS_CAN_SAVE:<BR>-
lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);<BR>-
ret = MCI_RESOURCE_RETURNED;<BR>-
break;<BR>- default:<BR>- ERR("Unsupported %lx devCaps
item\n", lpParms->dwItem);<BR>- return
MCIERR_UNRECOGNIZED_COMMAND;<BR>- }<BR>- } else {<BR>-
TRACE("No GetDevCaps-Item !\n");<BR>- return
MCIERR_UNRECOGNIZED_COMMAND;<BR>- }<BR>-
TRACE("lpParms->dwReturn=%08lX;\n",
lpParms->dwReturn);<BR>- return
ret;<BR>-}<BR>-<BR>-static DWORD CDROM_Audio_GetSerial(CDROM_TOC*
toc)<BR>-{<BR>- unsigned long serial =
0;<BR>- int i;<BR>- WORD
wMagic;<BR>- DWORD dwStart,
dwEnd;<BR>-<BR>- /*<BR>- * wMagic
collects the wFrames from track 1<BR>- * dwStart,
dwEnd collect the beginning and end of the disc respectively,
in<BR>- * frames.<BR>- * There
it is collected for correcting the serial when there are less
than<BR>- * 3 tracks.<BR>-
*/<BR>- wMagic =
toc->TrackData[0].Address[3];<BR>- dwStart =
FRAME_OF_TOC(*toc, toc->FirstTrack);<BR>-<BR>- for (i =
0; i <= toc->LastTrack - toc->FirstTrack; i++)
{<BR>- serial +=
(toc->TrackData[i].Address[1] << 16)
|<BR>-
(toc->TrackData[i].Address[2] << 8) |
toc->TrackData[i].Address[3];<BR>-
}<BR>- dwEnd = FRAME_OF_TOC(*toc, toc->LastTrack +
1);<BR>-<BR>- if (toc->LastTrack - toc->FirstTrack + 1
< 3)<BR>- serial += wMagic +
(dwEnd - dwStart);<BR>-<BR>- return
serial;<BR>-}<BR>-<BR>-<BR>-/**************************************************************************<BR>-
* MCICDA_Info [internal]<BR>- */<BR>-static DWORD MCICDA_Info(UINT wDevID,
DWORD dwFlags, LPMCI_INFO_PARMSW lpParms)<BR>-{<BR>- LPCWSTR
str = NULL;<BR>- WINE_MCICDAUDIO* wmcda =
MCICDA_GetOpenDrv(wDevID);<BR>- DWORD ret =
0;<BR>- WCHAR buffer[16];<BR>-<BR>-
TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags,
lpParms);<BR>-<BR>- if (lpParms == NULL ||
lpParms->lpstrReturn == NULL)<BR>- return
MCIERR_NULL_PARAMETER_BLOCK;<BR>- if (wmcda == NULL) return
MCIERR_INVALID_DEVICE_ID;<BR>-<BR>- TRACE("buf=%p,
len=%lu\n", lpParms->lpstrReturn,
lpParms->dwRetSize);<BR>-<BR>- if (dwFlags &
MCI_INFO_PRODUCT) {<BR>- static
const WCHAR wszAudioCd[] = {'W','i','n','e','\'','s',' ','a','u','d','i','o','
','C','D',0};<BR>- str =
wszAudioCd;<BR>- } else if (dwFlags &
MCI_INFO_MEDIA_UPC) {<BR>- ret = MCIERR_NO_IDENTITY;<BR>- }
else if (dwFlags & MCI_INFO_MEDIA_IDENTITY) {<BR>- DWORD
res = 0;<BR>-
CDROM_TOC toc;<BR>-
DWORD br;<BR>- static const WCHAR wszLu[]
= {'%','l','u',0};<BR>-<BR>- if
(!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL,
0,<BR>-
&toc, sizeof(toc), &br, NULL)) {<BR>- return
MCICDA_GetError(wmcda);<BR>- }<BR>-<BR>- res =
CDROM_Audio_GetSerial(&toc);<BR>- sprintfW(buffer, wszLu, res);<BR>- str =
buffer;<BR>- } else {<BR>- WARN("Don't know this info
command (%lu)\n", dwFlags);<BR>- ret =
MCIERR_UNRECOGNIZED_COMMAND;<BR>- }<BR>-
if (str) {<BR>- if (lpParms->dwRetSize <= strlenW(str)) {<BR>-
lstrcpynW(lpParms->lpstrReturn, str,
lpParms->dwRetSize - 1);<BR>- ret =
MCIERR_PARAM_OVERFLOW;<BR>- } else {<BR>-
strcpyW(lpParms->lpstrReturn, str);<BR>- }<BR>- } else
{<BR>- *lpParms->lpstrReturn = 0;<BR>-
}<BR>- TRACE("=> %s (%ld)\n",
debugstr_w(lpParms->lpstrReturn), ret);<BR>- return
ret;<BR>-}<BR>-<BR>-/**************************************************************************<BR>-
* MCICDA_Status [internal]<BR>- */<BR>-static DWORD MCICDA_Status(UINT wDevID,
DWORD dwFlags, LPMCI_STATUS_PARMS lpParms)<BR>-{<BR>-
WINE_MCICDAUDIO* wmcda =
MCICDA_GetOpenDrv(wDevID);<BR>-
DWORD
idx;<BR>- DWORD
ret = 0;<BR>-
CDROM_SUB_Q_DATA_FORMAT fmt;<BR>-
SUB_Q_CHANNEL_DATA
data;<BR>-
CDROM_TOC
toc;<BR>-
DWORD
br;<BR>-<BR>- TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags,
lpParms);<BR>-<BR>- if (lpParms == NULL) return
MCIERR_NULL_PARAMETER_BLOCK;<BR>- if (wmcda == NULL) return
MCIERR_INVALID_DEVICE_ID;<BR>-<BR>- if (dwFlags &
MCI_NOTIFY) {<BR>- TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n",
lpParms->dwCallback);<BR>-
mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)),<BR>-
wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);<BR>-
}<BR>- if (dwFlags & MCI_STATUS_ITEM) {<BR>-
TRACE("dwItem = %lx\n", lpParms->dwItem);<BR>- switch (lpParms->dwItem)
{<BR>- case
MCI_STATUS_CURRENT_TRACK:<BR>-
fmt.Format =
IOCTL_CDROM_CURRENT_POSITION;<BR>-
if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_Q_CHANNEL, &fmt,
sizeof(fmt),<BR>-
&data, sizeof(data), &br,
NULL))<BR>-
{<BR>- return MCICDA_GetError(wmcda);<BR>- }<BR>-
lpParms->dwReturn =
data.CurrentPosition.TrackNumber;<BR>-
TRACE("CURRENT_TRACK=%lu!\n", lpParms->dwReturn);<BR>-
break;<BR>- case
MCI_STATUS_LENGTH:<BR>-
if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL,
0,<BR>-
&toc, sizeof(toc), &br, NULL))
{<BR>-
WARN("error reading TOC
!\n");<BR>-
return MCICDA_GetError(wmcda);<BR>- }<BR>-
if (dwFlags & MCI_TRACK) {<BR>- TRACE("MCI_TRACK #%lu
LENGTH=??? !\n", lpParms->dwTrack);<BR>- if (lpParms->dwTrack <
toc.FirstTrack || lpParms->dwTrack > toc.LastTrack)<BR>-
return
MCIERR_OUTOFRANGE;<BR>-
idx = lpParms->dwTrack - toc.FirstTrack;<BR>- lpParms->dwReturn =
FRAME_OF_TOC(toc, lpParms->dwTrack + 1)
-<BR>-
FRAME_OF_TOC(toc, lpParms->dwTrack);<BR>- /* Windows returns one frame less
than the total track length for the<BR>- last track on the
CD. See CDDB HOWTO. Verified on Win95OSR2. */<BR>- if
(lpParms->dwTrack == toc.LastTrack)<BR>-
lpParms->dwReturn--;<BR>- } else {<BR>- /* Sum of the
lengths of all of the tracks. Inherits the<BR>- 'off by one
frame' behavior from the length of the last track.<BR>- See above
comment. */<BR>- lpParms->dwReturn = FRAME_OF_TOC(toc, toc.LastTrack + 1)
-<BR>-
FRAME_OF_TOC(toc, toc.FirstTrack) - 1;<BR>- }<BR>-
lpParms->dwReturn = MCICDA_CalcTime(wmcda,<BR>-
(wmcda->dwTimeFormat == MCI_FORMAT_TMSF)<BR>- ?
MCI_FORMAT_MSF : wmcda->dwTimeFormat,<BR>- lpParms->dwReturn,<BR>-
&ret);<BR>- TRACE("LENGTH=%lu !\n",
lpParms->dwReturn);<BR>- break;<BR>- case
MCI_STATUS_MODE:<BR>-
lpParms->dwReturn = MCICDA_GetStatus(wmcda);<BR>-
TRACE("MCI_STATUS_MODE=%08lX !\n", lpParms->dwReturn);<BR>-
lpParms->dwReturn =
MAKEMCIRESOURCE(lpParms->dwReturn, lpParms->dwReturn);<BR>-
ret = MCI_RESOURCE_RETURNED;<BR>-
break;<BR>- case MCI_STATUS_MEDIA_PRESENT:<BR>-
lpParms->dwReturn = (MCICDA_GetStatus(wmcda) == MCI_MODE_OPEN) ?<BR>-
MAKEMCIRESOURCE(FALSE, MCI_FALSE) : MAKEMCIRESOURCE(TRUE, MCI_TRUE);<BR>-
TRACE("MCI_STATUS_MEDIA_PRESENT =%c!\n",
LOWORD(lpParms->dwReturn) ? 'Y' : 'N');<BR>- ret =
MCI_RESOURCE_RETURNED;<BR>- break;<BR>- case
MCI_STATUS_NUMBER_OF_TRACKS:<BR>-
if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL,
0,<BR>-
&toc, sizeof(toc), &br, NULL))
{<BR>-
WARN("error reading TOC
!\n");<BR>-
return MCICDA_GetError(wmcda);<BR>- }<BR>-
lpParms->dwReturn = toc.LastTrack - toc.FirstTrack +
1;<BR>- TRACE("MCI_STATUS_NUMBER_OF_TRACKS = %lu !\n",
lpParms->dwReturn);<BR>- if (lpParms->dwReturn ==
(WORD)-1)<BR>- return MCICDA_GetError(wmcda);<BR>-
break;<BR>- case MCI_STATUS_POSITION:<BR>- if (dwFlags
& MCI_STATUS_START)
{<BR>-
if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL,
0,<BR>-
&toc, sizeof(toc), &br, NULL))
{<BR>-
WARN("error reading TOC
!\n");<BR>-
return
MCICDA_GetError(wmcda);<BR>-
}<BR>- lpParms->dwReturn = FRAME_OF_TOC(toc, toc.FirstTrack);<BR>-
TRACE("get MCI_STATUS_START !\n");<BR>- } else if (dwFlags
& MCI_TRACK)
{<BR>-
if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL,
0,<BR>-
&toc, sizeof(toc), &br, NULL))
{<BR>-
WARN("error reading TOC
!\n");<BR>-
return
MCICDA_GetError(wmcda);<BR>-
}<BR>- if (lpParms->dwTrack < toc.FirstTrack || lpParms->dwTrack >
toc.LastTrack)<BR>- return MCIERR_OUTOFRANGE;<BR>-
lpParms->dwReturn = FRAME_OF_TOC(toc, lpParms->dwTrack);<BR>- TRACE("get
MCI_TRACK #%lu !\n",
lpParms->dwTrack);<BR>-
} else
{<BR>-
fmt.Format =
IOCTL_CDROM_CURRENT_POSITION;<BR>-
if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_Q_CHANNEL, &fmt,
sizeof(fmt),<BR>-
&data, sizeof(data), &br, NULL))
{<BR>-
return
MCICDA_GetError(wmcda);<BR>-
}<BR>-
lpParms->dwReturn =
FRAME_OF_ADDR(data.CurrentPosition.AbsoluteAddress);<BR>-
}<BR>- lpParms->dwReturn = MCICDA_CalcTime(wmcda,
wmcda->dwTimeFormat, lpParms->dwReturn, &ret);<BR>-
TRACE("MCI_STATUS_POSITION=%08lX !\n",
lpParms->dwReturn);<BR>- break;<BR>- case
MCI_STATUS_READY:<BR>- TRACE("MCI_STATUS_READY
!\n");<BR>-
switch
(MCICDA_GetStatus(wmcda))<BR>-
{<BR>- case
MCI_MODE_NOT_READY:<BR>-
case
MCI_MODE_OPEN:<BR>-
lpParms->dwReturn = MAKEMCIRESOURCE(FALSE,
MCI_FALSE);<BR>-
break;<BR>-
default:<BR>-
lpParms->dwReturn = MAKEMCIRESOURCE(TRUE,
MCI_TRUE);<BR>-
break;<BR>-
}<BR>- TRACE("MCI_STATUS_READY=%u!\n",
LOWORD(lpParms->dwReturn));<BR>- ret =
MCI_RESOURCE_RETURNED;<BR>- break;<BR>- case
MCI_STATUS_TIME_FORMAT:<BR>- lpParms->dwReturn =
MAKEMCIRESOURCE(wmcda->dwTimeFormat, MCI_FORMAT_RETURN_BASE +
wmcda->dwTimeFormat);<BR>-
TRACE("MCI_STATUS_TIME_FORMAT=%08x!\n", LOWORD(lpParms->dwReturn));<BR>-
ret = MCI_RESOURCE_RETURNED;<BR>-
break;<BR>- case 4001: /* FIXME: for bogus FullCD */<BR>- case
MCI_CDA_STATUS_TYPE_TRACK:<BR>- if (!(dwFlags &
MCI_TRACK))<BR>- ret = MCIERR_MISSING_PARAMETER;<BR>- else
{<BR>-
if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL,
0,<BR>-
&toc, sizeof(toc), &br, NULL))
{<BR>-
WARN("error reading TOC
!\n");<BR>-
return
MCICDA_GetError(wmcda);<BR>-
}<BR>- if (lpParms->dwTrack < toc.FirstTrack || lpParms->dwTrack >
toc.LastTrack)<BR>- ret = MCIERR_OUTOFRANGE;<BR>- else<BR>-
lpParms->dwReturn = (toc.TrackData[lpParms->dwTrack -
toc.FirstTrack].Control & 0x04)
?<BR>-
MCI_CDA_TRACK_OTHER : MCI_CDA_TRACK_AUDIO;<BR>- }<BR>-
TRACE("MCI_CDA_STATUS_TYPE_TRACK[%ld]=%ld\n",
lpParms->dwTrack, lpParms->dwReturn);<BR>-
break;<BR>- default:<BR>- FIXME("unknown command %08lX
!\n", lpParms->dwItem);<BR>- return
MCIERR_UNRECOGNIZED_COMMAND;<BR>- }<BR>- } else {<BR>-
WARN("not MCI_STATUS_ITEM !\n");<BR>-
}<BR>- return
ret;<BR>-}<BR>-<BR>-/**************************************************************************<BR>-
* MCICDA_SkipDataTracks [internal]<BR>- */<BR>-static DWORD
MCICDA_SkipDataTracks(WINE_MCICDAUDIO* wmcda,DWORD *frame)<BR>-{<BR>-
int i;<BR>- DWORD br;<BR>- CDROM_TOC toc;<BR>- if
(!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL,
0,<BR>-
&toc, sizeof(toc), &br, NULL)) {<BR>- WARN("error
reading TOC !\n");<BR>- return
MCICDA_GetError(wmcda);<BR>- }<BR>- /* Locate first track whose
starting frame is bigger than frame */<BR>-
for(i=toc.FirstTrack;i<=toc.LastTrack+1;i++) <BR>- if (
FRAME_OF_TOC(toc, i) > *frame ) break;<BR>- if (i <=
toc.FirstTrack && i>toc.LastTrack+1) {<BR>- i =
0; /* requested address is out of range: go back to start
*/<BR>- *frame =
FRAME_OF_TOC(toc,toc.FirstTrack);<BR>- }<BR>-
else<BR>- i--;<BR>- /* i points to last track whose
start address is not greater than frame.<BR>- * Now skip non-audio
tracks */<BR>- for(;i<=toc.LastTrack+1;i++)<BR>- if
( ! (toc.TrackData[i-toc.FirstTrack].Control & 4)
)<BR>- break;<BR>- /* The frame will be an
address in the next audio track or<BR>- * address of lead-out.
*/<BR>- if ( FRAME_OF_TOC(toc, i) > *frame )<BR>-
*frame = FRAME_OF_TOC(toc, i);<BR>- return
0;<BR>-}<BR>-<BR>-/**************************************************************************<BR>-
* MCICDA_Play [internal]<BR>- */<BR>-static DWORD MCICDA_Play(UINT wDevID,
DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)<BR>-{<BR>-
WINE_MCICDAUDIO* wmcda =
MCICDA_GetOpenDrv(wDevID);<BR>- DWORD
ret = 0, start,
end;<BR>-
DWORD
br;<BR>-
CDROM_PLAY_AUDIO_MSF
play;<BR>- CDROM_SUB_Q_DATA_FORMAT
fmt;<BR>-
SUB_Q_CHANNEL_DATA
data;<BR>- CDROM_TOC toc;<BR>-<BR>-
TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags,
lpParms);<BR>-<BR>- if (lpParms == NULL)<BR>- return
MCIERR_NULL_PARAMETER_BLOCK;<BR>-<BR>- if (wmcda ==
NULL)<BR>- return MCIERR_INVALID_DEVICE_ID;<BR>-<BR>- if
(dwFlags & MCI_FROM) {<BR>- start = MCICDA_CalcFrame(wmcda,
lpParms->dwFrom);<BR>- if ( (ret=MCICDA_SkipDataTracks(wmcda, &start))
)<BR>- return ret;<BR>- TRACE("MCI_FROM=%08lX -> %lu \n",
lpParms->dwFrom, start);<BR>- } else
{<BR>- fmt.Format =
IOCTL_CDROM_CURRENT_POSITION;<BR>-
if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_Q_CHANNEL, &fmt,
sizeof(fmt),<BR>-
&data, sizeof(data), &br, NULL))
{<BR>-
return MCICDA_GetError(wmcda);<BR>-
}<BR>- start =
FRAME_OF_ADDR(data.CurrentPosition.AbsoluteAddress);<BR>- if (
(ret=MCICDA_SkipDataTracks(wmcda, &start)) )<BR>- return
ret;<BR>- }<BR>- if (dwFlags & MCI_TO)
{<BR>- end = MCICDA_CalcFrame(wmcda, lpParms->dwTo);<BR>-
TRACE("MCI_TO=%08lX -> %lu \n", lpParms->dwTo,
end);<BR>- } else
{<BR>- if
(!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL,
0,<BR>-
&toc, sizeof(toc), &br, NULL))
{<BR>-
WARN("error reading TOC
!\n");<BR>-
return MCICDA_GetError(wmcda);<BR>-
}<BR>- end = FRAME_OF_TOC(toc, toc.LastTrack + 1) - 1;<BR>-
}<BR>- TRACE("Playing from %lu to %lu\n", start,
end);<BR>- play.StartingM = start /
CDFRAMES_PERMIN;<BR>- play.StartingS = (start /
CDFRAMES_PERSEC) % 60;<BR>- play.StartingF = start %
CDFRAMES_PERSEC;<BR>- play.EndingM = end /
CDFRAMES_PERMIN;<BR>- play.EndingS = (end /
CDFRAMES_PERSEC) % 60;<BR>- play.EndingF = end %
CDFRAMES_PERSEC;<BR>- if (!DeviceIoControl(wmcda->handle,
IOCTL_CDROM_PLAY_AUDIO_MSF, &play,
sizeof(play),<BR>-
NULL, 0, &br, NULL)) {<BR>- ret = MCIERR_HARDWARE;<BR>-
} else if (dwFlags & MCI_NOTIFY) {<BR>- TRACE("MCI_NOTIFY_SUCCESSFUL %08lX
!\n", lpParms->dwCallback);<BR>- /*<BR>-
mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)),<BR>-
wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);<BR>-
*/<BR>- }<BR>- return
ret;<BR>-}<BR>-<BR>-/**************************************************************************<BR>-
* MCICDA_Stop [internal]<BR>- */<BR>-static DWORD MCICDA_Stop(UINT wDevID,
DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)<BR>-{<BR>-
WINE_MCICDAUDIO* wmcda = MCICDA_GetOpenDrv(wDevID);<BR>-
DWORD
br;<BR>-<BR>- TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags,
lpParms);<BR>-<BR>- if (wmcda == NULL) return
MCIERR_INVALID_DEVICE_ID;<BR>-<BR>- if
(!DeviceIoControl(wmcda->handle, IOCTL_CDROM_STOP_AUDIO, NULL, 0, NULL, 0,
&br, NULL))<BR>- return MCIERR_HARDWARE;<BR>-<BR>- if
(lpParms && (dwFlags & MCI_NOTIFY)) {<BR>-
TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);<BR>-
mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)),<BR>-
wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);<BR>-
}<BR>- return
0;<BR>-}<BR>-<BR>-/**************************************************************************<BR>-
* MCICDA_Pause [internal]<BR>- */<BR>-static DWORD MCICDA_Pause(UINT wDevID,
DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)<BR>-{<BR>-
WINE_MCICDAUDIO* wmcda = MCICDA_GetOpenDrv(wDevID);<BR>-
DWORD
br;<BR>-<BR>- TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags,
lpParms);<BR>-<BR>- if (wmcda == NULL) return
MCIERR_INVALID_DEVICE_ID;<BR>-<BR>- if
(!DeviceIoControl(wmcda->handle, IOCTL_CDROM_PAUSE_AUDIO, NULL, 0, NULL, 0,
&br, NULL))<BR>- return MCIERR_HARDWARE;<BR>-<BR>- if
(lpParms && (dwFlags & MCI_NOTIFY))
{<BR>- TRACE("MCI_NOTIFY_SUCCESSFUL
%08lX !\n", lpParms->dwCallback);<BR>-
mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)),<BR>-
wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);<BR>-
}<BR>- return
0;<BR>-}<BR>-<BR>-/**************************************************************************<BR>-
* MCICDA_Resume [internal]<BR>- */<BR>-static DWORD MCICDA_Resume(UINT wDevID,
DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)<BR>-{<BR>-
WINE_MCICDAUDIO* wmcda = MCICDA_GetOpenDrv(wDevID);<BR>-
DWORD
br;<BR>-<BR>- TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags,
lpParms);<BR>-<BR>- if (wmcda == NULL) return
MCIERR_INVALID_DEVICE_ID;<BR>-<BR>- if
(!DeviceIoControl(wmcda->handle, IOCTL_CDROM_RESUME_AUDIO, NULL, 0, NULL,
0, &br, NULL))<BR>- return MCIERR_HARDWARE;<BR>-<BR>- if
(lpParms && (dwFlags & MCI_NOTIFY)) {<BR>-
TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);<BR>-
mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)),<BR>-
wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);<BR>-
}<BR>- return
0;<BR>-}<BR>-<BR>-/**************************************************************************<BR>-
* MCICDA_Seek [internal]<BR>- */<BR>-static DWORD MCICDA_Seek(UINT wDevID,
DWORD dwFlags, LPMCI_SEEK_PARMS lpParms)<BR>-{<BR>- DWORD
at;<BR>-
WINE_MCICDAUDIO* wmcda =
MCICDA_GetOpenDrv(wDevID);<BR>-
CDROM_SEEK_AUDIO_MSF
seek;<BR>-
DWORD
br, ret;<BR>- CDROM_TOC toc;<BR>-<BR>-
TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags,
lpParms);<BR>-<BR>- if (wmcda == NULL) return
MCIERR_INVALID_DEVICE_ID;<BR>- if (lpParms == NULL) return
MCIERR_NULL_PARAMETER_BLOCK;<BR>-<BR>- if
(!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL,
0,<BR>-
&toc, sizeof(toc), &br, NULL))
{<BR>- WARN("error reading TOC
!\n");<BR>- return
MCICDA_GetError(wmcda);<BR>- }<BR>- switch
(dwFlags & ~(MCI_NOTIFY|MCI_WAIT)) {<BR>- case
MCI_SEEK_TO_START:<BR>- TRACE("Seeking to start\n");<BR>- at =
FRAME_OF_TOC(toc,toc.FirstTrack);<BR>- if ( (ret=MCICDA_SkipDataTracks(wmcda,
&at)) )<BR>- return ret;<BR>- break;<BR>- case
MCI_SEEK_TO_END:<BR>- TRACE("Seeking to end\n");<BR>- at = FRAME_OF_TOC(toc,
toc.LastTrack + 1) - 1;<BR>- if ( (ret=MCICDA_SkipDataTracks(wmcda, &at))
)<BR>- return ret;<BR>- break;<BR>- case MCI_TO:<BR>-
TRACE("Seeking to %lu\n",
lpParms->dwTo);<BR>- at =
MCICDA_CalcFrame(wmcda, lpParms->dwTo);<BR>- if (
(ret=MCICDA_SkipDataTracks(wmcda, &at)) )<BR>- return ret;<BR>-
break;<BR>- default:<BR>- TRACE("Unknown seek action
%08lX\n",<BR>- (dwFlags &
~(MCI_NOTIFY|MCI_WAIT)));<BR>- return
MCIERR_UNSUPPORTED_FUNCTION;<BR>- }<BR>-
seek.M = at / CDFRAMES_PERMIN;<BR>- seek.S = (at /
CDFRAMES_PERSEC) % 60;<BR>- seek.F = at %
CDFRAMES_PERSEC;<BR>- if (!DeviceIoControl(wmcda->handle,
IOCTL_CDROM_SEEK_AUDIO_MSF, &seek,
sizeof(seek),<BR>-
NULL, 0, &br, NULL))<BR>- return
MCIERR_HARDWARE;<BR>-<BR>- if (dwFlags & MCI_NOTIFY)
{<BR>- TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);<BR>-
mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)),<BR>-
wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);<BR>-
}<BR>- return
0;<BR>-}<BR>-<BR>-/**************************************************************************<BR>-
* MCICDA_SetDoor [internal]<BR>- */<BR>-static DWORD MCICDA_SetDoor(UINT
wDevID, BOOL open)<BR>-{<BR>- WINE_MCICDAUDIO* wmcda =
MCICDA_GetOpenDrv(wDevID);<BR>-
DWORD
br;<BR>-<BR>- TRACE("(%04x, %s) !\n", wDevID, (open) ?
"OPEN" : "CLOSE");<BR>-<BR>- if (wmcda == NULL) return
MCIERR_INVALID_DEVICE_ID;<BR>-<BR>- if
(!DeviceIoControl(wmcda->handle,<BR>-
(open) ? IOCTL_STORAGE_EJECT_MEDIA :
IOCTL_STORAGE_LOAD_MEDIA,<BR>-
NULL, 0, NULL, 0, &br, NULL))<BR>- return
MCIERR_HARDWARE;<BR>-<BR>- return
0;<BR>-}<BR>-<BR>-/**************************************************************************<BR>-
* MCICDA_Set [internal]<BR>- */<BR>-static DWORD MCICDA_Set(UINT wDevID, DWORD
dwFlags, LPMCI_SET_PARMS lpParms)<BR>-{<BR>-
WINE_MCICDAUDIO* wmcda =
MCICDA_GetOpenDrv(wDevID);<BR>-<BR>- TRACE("(%04X, %08lX,
%p);\n", wDevID, dwFlags, lpParms);<BR>-<BR>- if (wmcda ==
NULL) return MCIERR_INVALID_DEVICE_ID;<BR>-<BR>- if (dwFlags
& MCI_SET_DOOR_OPEN) {<BR>- MCICDA_SetDoor(wDevID,
TRUE);<BR>- }<BR>- if (dwFlags &
MCI_SET_DOOR_CLOSED) {<BR>- MCICDA_SetDoor(wDevID,
FALSE);<BR>- }<BR>-<BR>- /* only functions
which require valid lpParms below this line ! */<BR>- if
(lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;<BR>-
/*<BR>- TRACE("dwTimeFormat=%08lX\n",
lpParms->dwTimeFormat);<BR>-
TRACE("dwAudio=%08lX\n", lpParms->dwAudio);<BR>-
*/<BR>- if (dwFlags & MCI_SET_TIME_FORMAT) {<BR>- switch
(lpParms->dwTimeFormat) {<BR>- case MCI_FORMAT_MILLISECONDS:<BR>-
TRACE("MCI_FORMAT_MILLISECONDS !\n");<BR>-
break;<BR>- case MCI_FORMAT_MSF:<BR>-
TRACE("MCI_FORMAT_MSF !\n");<BR>- break;<BR>- case
MCI_FORMAT_TMSF:<BR>- TRACE("MCI_FORMAT_TMSF !\n");<BR>-
break;<BR>- default:<BR>- WARN("bad time
format !\n");<BR>- return MCIERR_BAD_TIME_FORMAT;<BR>-
}<BR>- wmcda->dwTimeFormat =
lpParms->dwTimeFormat;<BR>- }<BR>- if
(dwFlags & MCI_SET_VIDEO) return
MCIERR_UNSUPPORTED_FUNCTION;<BR>- if (dwFlags &
MCI_SET_ON) return MCIERR_UNSUPPORTED_FUNCTION;<BR>- if
(dwFlags & MCI_SET_OFF) return
MCIERR_UNSUPPORTED_FUNCTION;<BR>- if (dwFlags &
MCI_NOTIFY) {<BR>- TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n",<BR>-
lpParms->dwCallback);<BR>-
mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)),<BR>-
wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);<BR>-
}<BR>- return
0;<BR>-}<BR>-<BR>-/**************************************************************************<BR>-
* DriverProc (MCICDA.@)<BR>- */<BR>-LONG CALLBACK MCICDA_DriverProc(DWORD
dwDevID, HDRVR hDriv, DWORD wMsg,<BR>- DWORD
dwParam1, DWORD dwParam2)<BR>-{<BR>- switch(wMsg)
{<BR>- case DRV_LOAD: return 1;<BR>- case
DRV_FREE: return 1;<BR>- case DRV_OPEN: return
MCICDA_drvOpen((LPCWSTR)dwParam1,
(LPMCI_OPEN_DRIVER_PARMSW)dwParam2);<BR>- case DRV_CLOSE:
return MCICDA_drvClose(dwDevID);<BR>- case DRV_ENABLE:
return 1;<BR>- case DRV_DISABLE: return
1;<BR>- case DRV_QUERYCONFIGURE: return
1;<BR>- case DRV_CONFIGURE: MessageBoxA(0, "MCI audio CD
driver !", "Wine Driver", MB_OK); return 1;<BR>- case
DRV_INSTALL: return DRVCNF_RESTART;<BR>- case DRV_REMOVE:
return DRVCNF_RESTART;<BR>- }<BR>-<BR>- if
(dwDevID == 0xFFFFFFFF) return
MCIERR_UNSUPPORTED_FUNCTION;<BR>-<BR>- switch (wMsg)
{<BR>- case MCI_OPEN_DRIVER: return MCICDA_Open(dwDevID,
dwParam1, (LPMCI_OPEN_PARMSW)dwParam2);<BR>- case
MCI_CLOSE_DRIVER: return MCICDA_Close(dwDevID, dwParam1,
(LPMCI_GENERIC_PARMS)dwParam2);<BR>- case MCI_GETDEVCAPS:
return MCICDA_GetDevCaps(dwDevID, dwParam1,
(LPMCI_GETDEVCAPS_PARMS)dwParam2);<BR>- case MCI_INFO:
return MCICDA_Info(dwDevID, dwParam1,
(LPMCI_INFO_PARMSW)dwParam2);<BR>- case MCI_STATUS: return
MCICDA_Status(dwDevID, dwParam1,
(LPMCI_STATUS_PARMS)dwParam2);<BR>- case MCI_SET: return
MCICDA_Set(dwDevID, dwParam1,
(LPMCI_SET_PARMS)dwParam2);<BR>- case MCI_PLAY: return
MCICDA_Play(dwDevID, dwParam1,
(LPMCI_PLAY_PARMS)dwParam2);<BR>- case MCI_STOP: return
MCICDA_Stop(dwDevID, dwParam1,
(LPMCI_GENERIC_PARMS)dwParam2);<BR>- case MCI_PAUSE: return
MCICDA_Pause(dwDevID, dwParam1,
(LPMCI_GENERIC_PARMS)dwParam2);<BR>- case MCI_RESUME: return
MCICDA_Resume(dwDevID, dwParam1,
(LPMCI_GENERIC_PARMS)dwParam2);<BR>- case MCI_SEEK: return
MCICDA_Seek(dwDevID, dwParam1,
(LPMCI_SEEK_PARMS)dwParam2);<BR>- /* commands that should
report an error as they are not supported in<BR>- *
the native version */<BR>- case
MCI_SET_DOOR_CLOSED:<BR>- case
MCI_SET_DOOR_OPEN:<BR>- case
MCI_LOAD:<BR>- case MCI_SAVE:<BR>- case
MCI_FREEZE:<BR>- case MCI_PUT:<BR>- case
MCI_REALIZE:<BR>- case MCI_UNFREEZE:<BR>-
case MCI_UPDATE:<BR>- case MCI_WHERE:<BR>-
case MCI_STEP:<BR>- case MCI_SPIN:<BR>-
case MCI_ESCAPE:<BR>- case MCI_COPY:<BR>-
case MCI_CUT:<BR>- case MCI_DELETE:<BR>-
case MCI_PASTE:<BR>- case MCI_WINDOW:<BR>-
TRACE("Unsupported command [0x%lx]\n", wMsg);<BR>-
break;<BR>- case MCI_OPEN:<BR>- case
MCI_CLOSE:<BR>- ERR("Shouldn't receive a MCI_OPEN or CLOSE message\n");<BR>-
break;<BR>- default:<BR>- TRACE("Sending msg [0x%lx] to
default driver proc\n", wMsg);<BR>- return DefDriverProc(dwDevID, hDriv, wMsg,
dwParam1, dwParam2);<BR>- }<BR>- return
MCIERR_UNRECOGNIZED_COMMAND;<BR>-}<BR>-<BR>-/*-----------------------------------------------------------------------*/<BR>diff
-Nru wine/dlls/winmm/mcicda/mcicda.drv.spec
winedev/dlls/winmm/mcicda/mcicda.drv.spec<BR>---
wine/dlls/winmm/mcicda/mcicda.drv.spec 2002-06-21 21:15:50.000000000
+0200<BR>+++ winedev/dlls/winmm/mcicda/mcicda.drv.spec 1970-01-01
01:00:00.000000000 +0100<BR>@@ -1 +0,0 @@<BR>-@ stdcall DriverProc(long long
long long long) MCICDA_DriverProc<BR>diff -Nru wine/tools/winapi/win32.api
winedev/tools/winapi/win32.api<BR>--- wine/tools/winapi/win32.api 2005-07-21
20:36:44.000000000 +0200<BR>+++ winedev/tools/winapi/win32.api 2005-07-22
14:47:09.000000000 +0200<BR>@@ -1806,7 +1806,7
@@<BR> HDRVR<BR> LONG<BR> <BR>-%%mcicda.drv<BR>+%%mcicda.dll<BR> <BR> %long<BR> <BR>diff
-Nru wine/tools/wine.inf winedev/tools/wine.inf<BR>--- wine/tools/wine.inf
2005-06-29 20:29:00.000000000 +0200<BR>+++ winedev/tools/wine.inf 2005-07-22
14:46:50.000000000 +0200<BR>@@ -208,7 +208,7
@@<BR> <BR> [MCI]<BR> HKLM,%Mci32Str%,"AVIVideo",,"mciavi.drv"<BR>-HKLM,%Mci32Str%,"CDAudio",,"mcicda.drv"<BR>+HKLM,%Mci32Str%,"CDAudio",,"mcicda.dll"<BR> HKLM,%Mci32Str%,"Sequencer",,"mciseq.drv"<BR> HKLM,%Mci32Str%,"WaveAudio",,"mciwave.drv"<BR> <BR>@@
-2065,7 +2065,7 @@<BR> system.ini, mci,,"MPEGVideo=mciqtz.drv"
<BR> system.ini, mci,,"MPEGVideo2=mciqtz.drv" <BR> system.ini,
mci,,"avivideo=mciavi.drv" <BR>-system.ini, mci,,"cdaudio=mcicda.drv"
<BR>+system.ini, mci,,"cdaudio=mcicda.dll" <BR> system.ini,
mci,,"sequencer=mciseq.drv" <BR> system.ini, mci,,"vcr=mcivisca.drv"
<BR> system.ini, mci,,"; videodisc=mcipionr.drv"
<BR></BLOCKQUOTE></BODY></HTML>