Release 970525

Tue May 20 19:20:23 1997  Pablo Saratxaga <srtxg@linux.chanae.stben.be>

	* [resources/sysres_Es.rc]
	Updated CHOOSE_FONT, CHOOSE_COLOR, EDITMENU for Spanish.

Mon May 19 22:06:04 1997  Michiel van Loon <mfvl@xs4all.nl>

	* [multimedia/mcistring.c]
	Corrected bug for device!element command.

	* [multimedia/mmaux.c]
	Replaced printf and fprintf calls by dprintf_mmaux.

	* [multimedia/audio.c]
	Corrected debugmessage in wodGetVolume.
	Include code for MCI_CUE command.

	* [multimedia/mmsystem.c]
	Added the MCIERR_SEQ error messages.

	* [if1632/mmsystem.spec] [multimedia/audio.c] [multimedia/mmsystem.c]
	Changed call structure of waveInOpen and waveOutOpen.

	* [multimedia/mmsystem.c] [multimedia/audio.c] [multimedia/midi.c]
	  [multimedia/mmaux.c] [multimedia/mcicda.c] [multimedia/mcianim.c]
	  [multimedia/mcistring.c] [include/mmsystem.h]
	Changed the deviceID scheme.

	* [include/queue.h] [include/win16drv.h] [msdos/dpmi.c]
	  [windows/user.c] [windows/driver.c] [graphic/wing.c]
	  [graphics/x11drv/bitmap.c] [misc/wsprintf.c] [misc/crtdll.c]
	Removed compiler warnings.

Mon May 19 01:32:24 1997  Alex Korobka <alex@trantor.pharm.sunysb.edu>

	* [controls/menu.c] [windows/win.c] [windows/graphics.c]
	Popup menu shade, new system menu implementation, 
	ModifyMenu() fixes, better check mark painting.

	* [windows/mdi.c]
	MDI client fix for Win32.

Sat May 17 12:02:11 1997  Albrecht Kleine  <kleine@ak.sax.de>

	* [objects/metafile.c]
	Added handling of META_DIBBITBLT, META_SETTEXTJUSTIFICATION
	plus bugfix in META_EXTTEXTOUT (start_of_text etc.)

Thu May 15 22:52:00 1997  Jimen Ching  <jching@flex.com>

	* [loader/ne_image.c]
	Make sure dgroup is valid by checking pModule->flags consistently.
This commit is contained in:
Alexandre Julliard 1997-05-25 13:58:18 +00:00
parent 84c70f55b5
commit 7ff1c415b4
63 changed files with 2418 additions and 1815 deletions

View File

@ -1,13 +1,13 @@
This is release 970509 of Wine, the MS Windows emulator. This is still a
This is release 970525 of Wine, the MS Windows emulator. This is still a
developer's only release. There are many bugs and many unimplemented API
features. Most applications still do not work correctly.
Patches should be submitted to "julliard@lrc.epfl.ch". Please don't
forget to include a ChangeLog entry.
WHAT'S NEW with Wine-970509: (see ChangeLog for details)
- Better local heap implementation.
- Improvements to -managed mode.
WHAT'S NEW with Wine-970525: (see ChangeLog for details)
- Many fixes to multimedia code.
- Better menus.
- Lots of bug fixes.
See the README file in the distribution for installation instructions.
@ -16,11 +16,10 @@ Because of lags created by using mirror, this message may reach you before
the release is available at the ftp sites. The sources will be available
from the following locations:
ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-970509.tar.gz
ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-970509.tar.gz
ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-970509.tar.gz
ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-970509.tar.gz
ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-970509.tar.gz
ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-970525.tar.gz
ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-970525.tar.gz
ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-970525.tar.gz
ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-970525.tar.gz
It should also be available from any site that mirrors tsx-11 or sunsite.

2
BUGS
View File

@ -40,8 +40,6 @@ Miscellaneous:
* 32-bit Freecell segfaults when started from the Progman (looks like
a problem with cards.dll).
* Word 6.0 often segfaults when system menu is double-clicked.
* Edit controls are prone to show blank space when, in fact, there is a
text there.

View File

@ -1,3 +1,57 @@
----------------------------------------------------------------------
Tue May 20 19:20:23 1997 Pablo Saratxaga <srtxg@linux.chanae.stben.be>
* [resources/sysres_Es.rc]
Updated CHOOSE_FONT, CHOOSE_COLOR, EDITMENU for Spanish.
Mon May 19 22:06:04 1997 Michiel van Loon <mfvl@xs4all.nl>
* [multimedia/mcistring.c]
Corrected bug for device!element command.
* [multimedia/mmaux.c]
Replaced printf and fprintf calls by dprintf_mmaux.
* [multimedia/audio.c]
Corrected debugmessage in wodGetVolume.
Include code for MCI_CUE command.
* [multimedia/mmsystem.c]
Added the MCIERR_SEQ error messages.
* [if1632/mmsystem.spec] [multimedia/audio.c] [multimedia/mmsystem.c]
Changed call structure of waveInOpen and waveOutOpen.
* [multimedia/mmsystem.c] [multimedia/audio.c] [multimedia/midi.c]
[multimedia/mmaux.c] [multimedia/mcicda.c] [multimedia/mcianim.c]
[multimedia/mcistring.c] [include/mmsystem.h]
Changed the deviceID scheme.
* [include/queue.h] [include/win16drv.h] [msdos/dpmi.c]
[windows/user.c] [windows/driver.c] [graphic/wing.c]
[graphics/x11drv/bitmap.c] [misc/wsprintf.c] [misc/crtdll.c]
Removed compiler warnings.
Mon May 19 01:32:24 1997 Alex Korobka <alex@trantor.pharm.sunysb.edu>
* [controls/menu.c] [windows/win.c] [windows/graphics.c]
Popup menu shade, new system menu implementation,
ModifyMenu() fixes, better check mark painting.
* [windows/mdi.c]
MDI client fix for Win32.
Sat May 17 12:02:11 1997 Albrecht Kleine <kleine@ak.sax.de>
* [objects/metafile.c]
Added handling of META_DIBBITBLT, META_SETTEXTJUSTIFICATION
plus bugfix in META_EXTTEXTOUT (start_of_text etc.)
Thu May 15 22:52:00 1997 Jimen Ching <jching@flex.com>
* [loader/ne_image.c]
Make sure dgroup is valid by checking pModule->flags consistently.
----------------------------------------------------------------------
Tue May 6 19:12:20 1997 Alexandre Julliard <julliard@lrc.epfl.ch>

View File

@ -122,7 +122,7 @@ install_libwine.a: dummy
$(INSTALL_DATA) libwine.a $(libdir)
libwine.so.1.0: $(COMMONSUBDIRS) $(LIBSUBDIRS) dummy
$(CC) -shared -Wl,-soname,libwine.so.1 -o$@ $(COMMONOBJS) $(LIBOBJS) $(LDOPTIONS) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
$(CC) -shared -Wl,-soname,libwine.so -o$@ $(COMMONOBJS) $(LIBOBJS) $(LDOPTIONS) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
install_libwine.so.1.0: dummy
$(INSTALL_DATA) libwine.so.1.0 $(libdir)

View File

@ -413,7 +413,7 @@ static void CB_Paint( WND *wndPtr, HDC32 hDC, WORD action )
else if (infoPtr->state & BUTTON_3STATE) y += 2 * checkBoxHeight;
GRAPH_DrawBitmap( hDC, hbitmapCheckBoxes, rbox.left, rbox.top + delta,
x, y, checkBoxWidth, checkBoxHeight );
x, y, checkBoxWidth, checkBoxHeight, FALSE );
if( textlen && action != ODA_SELECT )
{
if (wndPtr->dwStyle & WS_DISABLED)

View File

@ -108,7 +108,7 @@ static LRESULT DESKTOP_DoEraseBkgnd( HWND32 hwnd, HDC32 hdc,
GRAPH_DrawBitmap( hdc, infoPtr->hbitmapWallPaper,
x, y, 0, 0,
infoPtr->bitmapSize.cx,
infoPtr->bitmapSize.cy );
infoPtr->bitmapSize.cy, FALSE );
}
else
{
@ -116,8 +116,9 @@ static LRESULT DESKTOP_DoEraseBkgnd( HWND32 hwnd, HDC32 hdc,
y = (rect.top + rect.bottom - infoPtr->bitmapSize.cy) / 2;
if (x < 0) x = 0;
if (y < 0) y = 0;
GRAPH_DrawBitmap( hdc, infoPtr->hbitmapWallPaper, x, y, 0, 0,
infoPtr->bitmapSize.cx, infoPtr->bitmapSize.cy );
GRAPH_DrawBitmap( hdc, infoPtr->hbitmapWallPaper,
x, y, 0, 0, infoPtr->bitmapSize.cx,
infoPtr->bitmapSize.cy, FALSE );
}
}

View File

@ -724,6 +724,7 @@ static INT32 LISTBOX_FindString( WND *wnd, LB_DESCR *descr, INT32 start,
item = descr->items + start + 1;
if (HAS_STRINGS(descr))
{
if (!str) return LB_ERR;
if (exact)
{
for (i = start + 1; i < descr->nb_items; i++, item++)
@ -1915,6 +1916,11 @@ static LRESULT LISTBOX_HandleKeyDown( WND *wnd, LB_DESCR *descr, WPARAM32 wParam
!descr->items[descr->focus_item].selected,
(descr->style & LBS_NOTIFY) != 0 );
}
else if (descr->selected_item == -1)
{
LISTBOX_SetSelection( wnd, descr, descr->focus_item, TRUE,
(descr->style & LBS_NOTIFY) != 0 );
}
break;
}
if (caret >= 0)

File diff suppressed because it is too large Load Diff

View File

@ -76,7 +76,7 @@ static WNDCLASS32A WIDGETS_BuiltinClasses32[BIC32_NB_CLASSES] =
ComboLBWndProc, 0, sizeof(void *), 0, 0, IDC_ARROW, 0, 0, "ComboLBox" },
/* BIC32_POPUPMENU */
{ CS_GLOBALCLASS | CS_SAVEBITS, PopupMenuWndProc,
0, sizeof(HMENU32), 0, 0, IDC_ARROW, 0, 0, POPUPMENU_CLASS_NAME },
0, sizeof(HMENU32), 0, 0, IDC_ARROW, NULL_BRUSH, 0, POPUPMENU_CLASS_NAME },
/* BIC32_SCROLL */
{ CS_GLOBALCLASS | CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC,
ScrollBarWndProc, 0, sizeof(SCROLLBAR_INFO), 0, 0, IDC_ARROW, 0, 0, "ScrollBar"},

View File

@ -1531,7 +1531,7 @@ void DEBUG_Disasm( DBG_ADDR *addr, int display )
}
if (seg)
fprintf(stderr,"%s:%d",seg, displ);
fprintf(stderr,"%s:0x%x",seg, displ);
else
db_task_printsym(displ, short_addr ? WORD : LONG);
break;

View File

@ -1,3 +1,5 @@
----- Information in this file is obsolete. -----
Winsock
Platform 1.

View File

@ -981,10 +981,17 @@ LONG _hwrite32( HFILE32 hFile, LPCSTR buffer, LONG count )
if (count == 0) /* Expand or truncate at current position */
result = ftruncate( file->unix_handle,
lseek( file->unix_handle, 0, SEEK_CUR ) );
else
else for (;;)
{
result = write( file->unix_handle, buffer, count );
if (result != -1) break;
if (errno != EINTR)
{
FILE_SetDosError();
break;
}
}
if (result == -1) FILE_SetDosError();
FILE_ReleaseFile( file );
return result;
}

View File

@ -20,6 +20,8 @@
#include "stddebug.h"
#include "debug.h"
extern void CLIPPING_UpdateGCRegion(DC* );
typedef enum WING_DITHER_TYPE
{
WING_DISPERSED_4x4, WING_DISPERSED_8x8, WING_CLUSTERED_4x4

View File

@ -16,6 +16,8 @@
#include "stddebug.h"
#include "debug.h"
extern void CLIPPING_UpdateGCRegion(DC* );
/***********************************************************************
* X11DRV_BITMAP_Init
*/

View File

@ -332,6 +332,9 @@ BOOL32 X11DRV_GetTextMetrics(DC *dc, TEXTMETRIC32A *metrics)
/***********************************************************************
* X11DRV_FONT_SelectObject
*
* FIXME: the fonts should not be cached by hfont only, because
* metrics may be different in an other DC.
*/
HFONT32 X11DRV_FONT_SelectObject( DC * dc, HFONT32 hfont, FONTOBJ * font )
{

View File

@ -55,7 +55,7 @@ type win16
401 pascal WAVEOUTGETNUMDEVS() waveOutGetNumDevs
402 pascal WAVEOUTGETDEVCAPS(word segptr word) waveOutGetDevCaps
403 pascal WAVEOUTGETERRORTEXT(word ptr word) waveOutGetErrorText
404 pascal WAVEOUTOPEN(ptr word ptr long long long) waveOutOpen
404 pascal WAVEOUTOPEN(ptr word segptr long long long) waveOutOpen
405 pascal WAVEOUTCLOSE(word) waveOutClose
406 pascal WAVEOUTPREPAREHEADER(word segptr word) waveOutPrepareHeader
407 pascal WAVEOUTUNPREPAREHEADER(word segptr word) waveOutUnprepareHeader
@ -76,7 +76,7 @@ type win16
501 pascal WAVEINGETNUMDEVS() waveInGetNumDevs
502 pascal WAVEINGETDEVCAPS(word segptr word) waveInGetDevCaps
503 pascal WAVEINGETERRORTEXT(word ptr word) waveInGetErrorText
504 pascal WAVEINOPEN(ptr word ptr long long long) waveInOpen
504 pascal WAVEINOPEN(ptr word segptr long long long) waveInOpen
505 pascal WAVEINCLOSE(word) waveInClose
506 pascal WAVEINPREPAREHEADER(word segptr word) waveInPrepareHeader
507 pascal WAVEINUNPREPAREHEADER(word segptr word) waveInUnprepareHeader

View File

@ -50,7 +50,7 @@ type win16
107 pascal16 WSAAsyncGetServByName(word word ptr ptr segptr word)
WSAAsyncGetServByName
108 pascal16 WSACancelAsyncRequest(word) WSACancelAsyncRequest
109 pascal16 WSASetBlockingHook() WSASetBlockingHook
109 pascal16 WSASetBlockingHook(segptr) WSASetBlockingHook16
110 pascal16 WSAUnhookBlockingHook() WSAUnhookBlockingHook
111 pascal16 WSAGetLastError() WSAGetLastError
112 pascal WSASetLastError(word) WSASetLastError

View File

@ -40,7 +40,7 @@ base 0
106 stub WSAAsyncGetServByPort
107 stub WSAAsyncGetServByName
108 stub WSACancelAsyncRequest
109 stub WSASetBlockingHook
109 stdcall WSASetBlockingHook(ptr) WSASetBlockingHook32
110 stub WSAUnhookBlockingHook
111 stub WSAGetLastError
112 stub WSASetLastError

View File

@ -42,7 +42,7 @@ extern GC BITMAP_monoGC, BITMAP_colorGC;
#define XCREATEIMAGE(image,width,height,bpp) \
{ \
int width_bytes = DIB_GetImageWidthBytesX11( (width), (bpp) ); \
int width_bytes = DIB_GetXImageWidthBytes( (width), (bpp) ); \
(image) = XCreateImage(display, DefaultVisualOfScreen(screen), \
(bpp), ZPixmap, 0, xmalloc( (height)*width_bytes ),\
(width), (height), 32, width_bytes ); \
@ -55,8 +55,8 @@ extern INT32 BITMAP_GetObject32( BITMAPOBJ * bmp, INT32 count, LPVOID buffer );
extern BOOL32 BITMAP_DeleteObject( HBITMAP16 hbitmap, BITMAPOBJ * bitmap );
/* objects/dib.c */
extern int DIB_GetImageWidthBytes( int width, int depth );
extern int DIB_GetImageWidthBytesX11( int width, int depth );
extern int DIB_GetDIBWidthBytes( int width, int depth );
extern int DIB_GetXImageWidthBytes( int width, int depth );
extern int DIB_BitmapInfoSize( BITMAPINFO * info, WORD coloruse );
/* objects/oembitmap.c */

View File

@ -8,6 +8,7 @@
#define COLOR_VIRTUAL 0x0002 /* no mapping needed - pixel == pixel color */
#define COLOR_PRIVATE 0x1000 /* private colormap, identity mapping */
#define COLOR_WHITESET 0x2000
#define PC_SYS_USED 0x80 /* palentry is used (both system and logical) */
#define PC_SYS_RESERVED 0x40 /* system palentry is not to be mapped to */
@ -22,6 +23,7 @@ extern BOOL32 COLOR_IsSolid( COLORREF color );
extern Colormap COLOR_GetColormap();
extern UINT16 COLOR_GetSystemPaletteSize();
extern UINT16 COLOR_GetSystemPaletteFlags();
extern BOOL32 COLOR_GetMonoPlane( int* );
extern COLORREF COLOR_LookupNearestColor( PALETTEENTRY*, int, COLORREF );
extern int COLOR_PaletteLookupPixel( PALETTEENTRY*, int, int* , COLORREF, BOOL32 );

View File

@ -53,6 +53,7 @@
#undef DEBUG_MESSAGE
#undef DEBUG_METAFILE
#undef DEBUG_MIDI
#undef DEBUG_MMAUX
#undef DEBUG_MMIO
#undef DEBUG_MMSYS
#undef DEBUG_MMTIME
@ -135,6 +136,7 @@
#define DEBUG_MESSAGE
#define DEBUG_METAFILE
#define DEBUG_MIDI
#define DEBUG_MMAUX
#define DEBUG_MMIO
#define DEBUG_MMSYS
#define DEBUG_MMTIME
@ -407,6 +409,11 @@ short debug_msg_enabled[]={
#else
0,
#endif
#ifdef DEBUG_MMAUX
1,
#else
0,
#endif
#ifdef DEBUG_MMIO
1,
#else
@ -1186,8 +1193,21 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_mmio if(!debug_msg_enabled[47]) ; else fprintf
#define debugging_mmio debug_msg_enabled[47]
#define dprintf_mmaux if(!debug_msg_enabled[47]) ; else fprintf
#define debugging_mmaux debug_msg_enabled[47]
#else
#ifdef DEBUG_MMAUX
#define dprintf_mmaux fprintf
#define debugging_mmaux 1
#else
#define dprintf_mmaux while(0) fprintf
#define debugging_mmaux 0
#endif
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_mmio if(!debug_msg_enabled[48]) ; else fprintf
#define debugging_mmio debug_msg_enabled[48]
#else
#ifdef DEBUG_MMIO
#define dprintf_mmio fprintf
@ -1199,8 +1219,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_mmsys if(!debug_msg_enabled[48]) ; else fprintf
#define debugging_mmsys debug_msg_enabled[48]
#define dprintf_mmsys if(!debug_msg_enabled[49]) ; else fprintf
#define debugging_mmsys debug_msg_enabled[49]
#else
#ifdef DEBUG_MMSYS
#define dprintf_mmsys fprintf
@ -1212,8 +1232,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_mmtime if(!debug_msg_enabled[49]) ; else fprintf
#define debugging_mmtime debug_msg_enabled[49]
#define dprintf_mmtime if(!debug_msg_enabled[50]) ; else fprintf
#define debugging_mmtime debug_msg_enabled[50]
#else
#ifdef DEBUG_MMTIME
#define dprintf_mmtime fprintf
@ -1225,8 +1245,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_module if(!debug_msg_enabled[50]) ; else fprintf
#define debugging_module debug_msg_enabled[50]
#define dprintf_module if(!debug_msg_enabled[51]) ; else fprintf
#define debugging_module debug_msg_enabled[51]
#else
#ifdef DEBUG_MODULE
#define dprintf_module fprintf
@ -1238,8 +1258,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_msg if(!debug_msg_enabled[51]) ; else fprintf
#define debugging_msg debug_msg_enabled[51]
#define dprintf_msg if(!debug_msg_enabled[52]) ; else fprintf
#define debugging_msg debug_msg_enabled[52]
#else
#ifdef DEBUG_MSG
#define dprintf_msg fprintf
@ -1251,8 +1271,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_nonclient if(!debug_msg_enabled[52]) ; else fprintf
#define debugging_nonclient debug_msg_enabled[52]
#define dprintf_nonclient if(!debug_msg_enabled[53]) ; else fprintf
#define debugging_nonclient debug_msg_enabled[53]
#else
#ifdef DEBUG_NONCLIENT
#define dprintf_nonclient fprintf
@ -1264,8 +1284,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_ole if(!debug_msg_enabled[53]) ; else fprintf
#define debugging_ole debug_msg_enabled[53]
#define dprintf_ole if(!debug_msg_enabled[54]) ; else fprintf
#define debugging_ole debug_msg_enabled[54]
#else
#ifdef DEBUG_OLE
#define dprintf_ole fprintf
@ -1277,8 +1297,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_palette if(!debug_msg_enabled[54]) ; else fprintf
#define debugging_palette debug_msg_enabled[54]
#define dprintf_palette if(!debug_msg_enabled[55]) ; else fprintf
#define debugging_palette debug_msg_enabled[55]
#else
#ifdef DEBUG_PALETTE
#define dprintf_palette fprintf
@ -1290,8 +1310,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_profile if(!debug_msg_enabled[55]) ; else fprintf
#define debugging_profile debug_msg_enabled[55]
#define dprintf_profile if(!debug_msg_enabled[56]) ; else fprintf
#define debugging_profile debug_msg_enabled[56]
#else
#ifdef DEBUG_PROFILE
#define dprintf_profile fprintf
@ -1303,8 +1323,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_prop if(!debug_msg_enabled[56]) ; else fprintf
#define debugging_prop debug_msg_enabled[56]
#define dprintf_prop if(!debug_msg_enabled[57]) ; else fprintf
#define debugging_prop debug_msg_enabled[57]
#else
#ifdef DEBUG_PROP
#define dprintf_prop fprintf
@ -1316,8 +1336,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_reg if(!debug_msg_enabled[57]) ; else fprintf
#define debugging_reg debug_msg_enabled[57]
#define dprintf_reg if(!debug_msg_enabled[58]) ; else fprintf
#define debugging_reg debug_msg_enabled[58]
#else
#ifdef DEBUG_REG
#define dprintf_reg fprintf
@ -1329,8 +1349,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_region if(!debug_msg_enabled[58]) ; else fprintf
#define debugging_region debug_msg_enabled[58]
#define dprintf_region if(!debug_msg_enabled[59]) ; else fprintf
#define debugging_region debug_msg_enabled[59]
#else
#ifdef DEBUG_REGION
#define dprintf_region fprintf
@ -1342,8 +1362,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_relay if(!debug_msg_enabled[59]) ; else fprintf
#define debugging_relay debug_msg_enabled[59]
#define dprintf_relay if(!debug_msg_enabled[60]) ; else fprintf
#define debugging_relay debug_msg_enabled[60]
#else
#ifdef DEBUG_RELAY
#define dprintf_relay fprintf
@ -1355,8 +1375,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_resource if(!debug_msg_enabled[60]) ; else fprintf
#define debugging_resource debug_msg_enabled[60]
#define dprintf_resource if(!debug_msg_enabled[61]) ; else fprintf
#define debugging_resource debug_msg_enabled[61]
#else
#ifdef DEBUG_RESOURCE
#define dprintf_resource fprintf
@ -1368,8 +1388,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_scroll if(!debug_msg_enabled[61]) ; else fprintf
#define debugging_scroll debug_msg_enabled[61]
#define dprintf_scroll if(!debug_msg_enabled[62]) ; else fprintf
#define debugging_scroll debug_msg_enabled[62]
#else
#ifdef DEBUG_SCROLL
#define dprintf_scroll fprintf
@ -1381,8 +1401,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_selector if(!debug_msg_enabled[62]) ; else fprintf
#define debugging_selector debug_msg_enabled[62]
#define dprintf_selector if(!debug_msg_enabled[63]) ; else fprintf
#define debugging_selector debug_msg_enabled[63]
#else
#ifdef DEBUG_SELECTOR
#define dprintf_selector fprintf
@ -1394,8 +1414,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_sem if(!debug_msg_enabled[63]) ; else fprintf
#define debugging_sem debug_msg_enabled[63]
#define dprintf_sem if(!debug_msg_enabled[64]) ; else fprintf
#define debugging_sem debug_msg_enabled[64]
#else
#ifdef DEBUG_SEM
#define dprintf_sem fprintf
@ -1407,8 +1427,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_sendmsg if(!debug_msg_enabled[64]) ; else fprintf
#define debugging_sendmsg debug_msg_enabled[64]
#define dprintf_sendmsg if(!debug_msg_enabled[65]) ; else fprintf
#define debugging_sendmsg debug_msg_enabled[65]
#else
#ifdef DEBUG_SENDMSG
#define dprintf_sendmsg fprintf
@ -1420,8 +1440,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_shm if(!debug_msg_enabled[65]) ; else fprintf
#define debugging_shm debug_msg_enabled[65]
#define dprintf_shm if(!debug_msg_enabled[66]) ; else fprintf
#define debugging_shm debug_msg_enabled[66]
#else
#ifdef DEBUG_SHM
#define dprintf_shm fprintf
@ -1433,8 +1453,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_stress if(!debug_msg_enabled[66]) ; else fprintf
#define debugging_stress debug_msg_enabled[66]
#define dprintf_stress if(!debug_msg_enabled[67]) ; else fprintf
#define debugging_stress debug_msg_enabled[67]
#else
#ifdef DEBUG_STRESS
#define dprintf_stress fprintf
@ -1446,8 +1466,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_string if(!debug_msg_enabled[67]) ; else fprintf
#define debugging_string debug_msg_enabled[67]
#define dprintf_string if(!debug_msg_enabled[68]) ; else fprintf
#define debugging_string debug_msg_enabled[68]
#else
#ifdef DEBUG_STRING
#define dprintf_string fprintf
@ -1459,8 +1479,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_task if(!debug_msg_enabled[68]) ; else fprintf
#define debugging_task debug_msg_enabled[68]
#define dprintf_task if(!debug_msg_enabled[69]) ; else fprintf
#define debugging_task debug_msg_enabled[69]
#else
#ifdef DEBUG_TASK
#define dprintf_task fprintf
@ -1472,8 +1492,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_text if(!debug_msg_enabled[69]) ; else fprintf
#define debugging_text debug_msg_enabled[69]
#define dprintf_text if(!debug_msg_enabled[70]) ; else fprintf
#define debugging_text debug_msg_enabled[70]
#else
#ifdef DEBUG_TEXT
#define dprintf_text fprintf
@ -1485,8 +1505,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_timer if(!debug_msg_enabled[70]) ; else fprintf
#define debugging_timer debug_msg_enabled[70]
#define dprintf_timer if(!debug_msg_enabled[71]) ; else fprintf
#define debugging_timer debug_msg_enabled[71]
#else
#ifdef DEBUG_TIMER
#define dprintf_timer fprintf
@ -1498,8 +1518,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_toolhelp if(!debug_msg_enabled[71]) ; else fprintf
#define debugging_toolhelp debug_msg_enabled[71]
#define dprintf_toolhelp if(!debug_msg_enabled[72]) ; else fprintf
#define debugging_toolhelp debug_msg_enabled[72]
#else
#ifdef DEBUG_TOOLHELP
#define dprintf_toolhelp fprintf
@ -1511,8 +1531,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_ver if(!debug_msg_enabled[72]) ; else fprintf
#define debugging_ver debug_msg_enabled[72]
#define dprintf_ver if(!debug_msg_enabled[73]) ; else fprintf
#define debugging_ver debug_msg_enabled[73]
#else
#ifdef DEBUG_VER
#define dprintf_ver fprintf
@ -1524,8 +1544,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_virtual if(!debug_msg_enabled[73]) ; else fprintf
#define debugging_virtual debug_msg_enabled[73]
#define dprintf_virtual if(!debug_msg_enabled[74]) ; else fprintf
#define debugging_virtual debug_msg_enabled[74]
#else
#ifdef DEBUG_VIRTUAL
#define dprintf_virtual fprintf
@ -1537,8 +1557,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_vxd if(!debug_msg_enabled[74]) ; else fprintf
#define debugging_vxd debug_msg_enabled[74]
#define dprintf_vxd if(!debug_msg_enabled[75]) ; else fprintf
#define debugging_vxd debug_msg_enabled[75]
#else
#ifdef DEBUG_VXD
#define dprintf_vxd fprintf
@ -1550,8 +1570,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_win if(!debug_msg_enabled[75]) ; else fprintf
#define debugging_win debug_msg_enabled[75]
#define dprintf_win if(!debug_msg_enabled[76]) ; else fprintf
#define debugging_win debug_msg_enabled[76]
#else
#ifdef DEBUG_WIN
#define dprintf_win fprintf
@ -1563,8 +1583,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_win16drv if(!debug_msg_enabled[76]) ; else fprintf
#define debugging_win16drv debug_msg_enabled[76]
#define dprintf_win16drv if(!debug_msg_enabled[77]) ; else fprintf
#define debugging_win16drv debug_msg_enabled[77]
#else
#ifdef DEBUG_WIN16DRV
#define dprintf_win16drv fprintf
@ -1576,8 +1596,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_win32 if(!debug_msg_enabled[77]) ; else fprintf
#define debugging_win32 debug_msg_enabled[77]
#define dprintf_win32 if(!debug_msg_enabled[78]) ; else fprintf
#define debugging_win32 debug_msg_enabled[78]
#else
#ifdef DEBUG_WIN32
#define dprintf_win32 fprintf
@ -1589,8 +1609,8 @@ extern short debug_msg_enabled[];
#endif
#ifdef DEBUG_RUNTIME
#define dprintf_winsock if(!debug_msg_enabled[78]) ; else fprintf
#define debugging_winsock debug_msg_enabled[78]
#define dprintf_winsock if(!debug_msg_enabled[79]) ; else fprintf
#define debugging_winsock debug_msg_enabled[79]
#else
#ifdef DEBUG_WINSOCK
#define dprintf_winsock fprintf
@ -1652,6 +1672,7 @@ static char *debug_msg_name[] = {
"message",
"metafile",
"midi",
"mmaux",
"mmio",
"mmsys",
"mmtime",

View File

@ -18,7 +18,7 @@ extern void GRAPH_DrawRectangle( HDC32 hdc, INT32 x, INT32 y,
INT32 width, INT32 height, HPEN32 hPen);
extern BOOL32 GRAPH_DrawBitmap( HDC32 hdc, HBITMAP32 hbitmap,
INT32 xdest, INT32 ydest, INT32 xsrc,
INT32 ysrc, INT32 width, INT32 height );
INT32 ysrc, INT32 width, INT32 height, BOOL32 bMono );
extern BOOL32 GRAPH_SelectClipMask( HDC32 hdc, HBITMAP32 hMono,
INT32 x, INT32 y );

View File

@ -31,15 +31,15 @@ typedef struct tagMDIWCL
typedef struct
{
WORD nActiveChildren;
UINT16 nActiveChildren;
HWND16 hwndChildMaximized;
HWND16 hwndActiveChild;
HMENU16 hWindowMenu;
WORD idFirstChild;
WORD nTotalCreated;
UINT32 idFirstChild;
LPSTR frameTitle;
WORD sbNeedUpdate;
WORD sbRecalc;
UINT16 nTotalCreated;
UINT16 mdiFlags;
UINT16 sbRecalc; /* SB_xxx flags for scrollbar fixup */
HWND16 self;
} MDICLIENTINFO;

View File

@ -6,7 +6,7 @@
#define __WINE_MENU_H
extern BOOL32 MENU_Init(void);
extern HMENU32 MENU_GetDefSysMenu(void);
extern HMENU32 MENU_GetSysMenu(HWND32 hWndOwner, HMENU32 hSysPopup);
extern void MENU_InitSysMenuPopup(HMENU32 hmenu, DWORD style, DWORD clsStyle);
extern UINT32 MENU_GetMenuBarHeight( HWND32 hwnd, UINT32 menubarWidth,
INT32 orgX, INT32 orgY );

View File

@ -1485,6 +1485,7 @@ typedef struct {
LPWAVEFORMAT lpFormat;
DWORD dwCallBack;
DWORD dwInstance;
UINT16 uDeviceID;
} WAVEOPENDESC, *LPWAVEOPENDESC;
typedef struct {

View File

@ -75,8 +75,8 @@ typedef struct tagMESSAGEQUEUE
extern void QUEUE_DumpQueue( HQUEUE16 hQueue );
extern void QUEUE_WalkQueues(void);
extern BOOL32 QUEUE_IsDoomedQueue( HQUEUE16 hQueue );
extern void QUEUE_SetDoomedQueue( HQUEUE16 hQueue );
extern BOOL32 QUEUE_IsExitingQueue( HQUEUE16 hQueue );
extern void QUEUE_SetExitingQueue( HQUEUE16 hQueue );
extern MESSAGEQUEUE *QUEUE_GetSysQueue(void);
extern void QUEUE_SetWakeBit( MESSAGEQUEUE *queue, WORD bit );
extern void QUEUE_ClearWakeBit( MESSAGEQUEUE *queue, WORD bit );
@ -95,5 +95,6 @@ extern int QUEUE_FindMsg( MESSAGEQUEUE * msgQueue, HWND32 hwnd,
extern void QUEUE_RemoveMsg( MESSAGEQUEUE * msgQueue, int pos );
extern void hardware_event( WORD message, WORD wParam, LONG lParam,
int xPos, int yPos, DWORD time, DWORD extraInfo );
extern void QUEUE_FlushMessages( HQUEUE16 hQueue );
#endif /* __WINE_QUEUE_H */

View File

@ -123,6 +123,7 @@
#undef DEBUG_MESSAGE
#undef DEBUG_METAFILE
#undef DEBUG_MIDI
#undef DEBUG_MMAUX
#undef DEBUG_MMIO
#undef DEBUG_MMSYS
#undef DEBUG_MMTIME
@ -205,6 +206,7 @@
#define DEBUG_MESSAGE
#define DEBUG_METAFILE
#define DEBUG_MIDI
#define DEBUG_MMAUX
#define DEBUG_MMIO
#define DEBUG_MMSYS
#define DEBUG_MMTIME

View File

@ -281,7 +281,13 @@ BOOL32 NE_LoadSegment( HMODULE16 hModule, WORD segnum )
offset = rep->offset;
switch (rep->address_type)
/* Apparently, high bit of address_type is sometimes set; */
/* we ignore it for now */
if (rep->address_type & 0x80)
fprintf( stderr, "Warning: reloc addr type = 0x%02x\n",
rep->address_type );
switch (rep->address_type & 0x7f)
{
case NE_RADDR_LOWBYTE:
do {
@ -415,13 +421,17 @@ void NE_FixupPrologs( NE_MODULE *pModule )
{
if (*p & 0x0002)
{
if (pModule->flags & NE_FFLAGS_MULTIPLEDATA) {
if (pModule->flags & NE_FFLAGS_MULTIPLEDATA)
{
/* can this happen? */
fprintf( stderr, "FixupPrologs got confused\n" );
}
else if (pModule->flags & NE_FFLAGS_SINGLEDATA)
{
*fixup_ptr = 0xb8; /* MOV AX, */
*(WORD *)(fixup_ptr+1) = dgroup;
}
}
else
{
if (pModule->flags & NE_FFLAGS_MULTIPLEDATA) {

View File

@ -872,7 +872,7 @@ HGLOBAL32 GlobalAlloc32(UINT32 flags, DWORD size)
pintern=HeapAlloc(GetProcessHeap(), 0, sizeof(GLOBAL32_INTERN));
if(size)
{
palloc=HeapAlloc(GetProcessHeap(), 0, size+sizeof(HGLOBAL32));
palloc=HeapAlloc(GetProcessHeap(), hpflags, size+sizeof(HGLOBAL32));
*(HGLOBAL32 *)palloc=INTERN_TO_HANDLE(pintern);
pintern->Pointer=palloc+sizeof(HGLOBAL32);
}

View File

@ -202,7 +202,8 @@ static BOOL32 FILEDLG_ScanDir(HWND16 hWnd, LPSTR newPath)
len = strlen(str);
GetDlgItemText32A( hWnd, edt1, str + len, sizeof(str) - len );
if (!DlgDirList32A( hWnd, str, lst1, 0, 0x0000 )) return FALSE;
return DlgDirList32A( hWnd, "*.*", lst2, stc1, 0x8010 );
strcpy( str, "*.*" );
return DlgDirList32A( hWnd, str, lst2, stc1, 0x8010 );
}
/***********************************************************************
@ -409,7 +410,8 @@ static LONG FILEDLG_WMInitDialog(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam)
lpofn->nFilterIndex, tmpstr);
SetDlgItemText32A( hWnd, edt1, tmpstr );
/* get drive list */
DlgDirListComboBox32A(hWnd, "", cmb2, 0, 0xC000);
*tmpstr = 0;
DlgDirListComboBox32A(hWnd, tmpstr, cmb2, 0, 0xC000);
/* read initial directory */
if (PTR_SEG_TO_LIN(lpofn->lpstrInitialDir) != NULL)
{

View File

@ -25,6 +25,8 @@
#include "crtdll.h"
#include "drive.h"
extern INT32 WIN32_wsprintf32W( DWORD *args );
UINT32 CRTDLL_argc_dll; /* CRTDLL.23 */
LPSTR *CRTDLL_argv_dll; /* CRTDLL.24 */
LPSTR CRTDLL_acmdln_dll; /* CRTDLL.38 */

View File

@ -628,19 +628,31 @@ INT16 WINSOCK_ioctlsocket(SOCKET16 s, UINT32 cmd, UINT32 *argp)
switch( cmd )
{
case WS_FIONREAD: newcmd=FIONREAD; break;
case WS_FIONBIO: newcmd=FIONBIO;
case WS_FIONREAD:
newcmd=FIONREAD;
break;
case WS_FIONBIO:
newcmd=FIONBIO;
if( pws->p_aop && *argp == 0 )
{
pwsi->err = WSAEINVAL;
return SOCKET_ERROR;
}
break;
case WS_SIOCATMARK: newcmd=SIOCATMARK; break;
case WS_SIOCATMARK:
newcmd=SIOCATMARK;
break;
case WS_IOW('f',125,u_long):
fprintf(stderr,"Warning: WS1.1 shouldn't be using async I/O\n");
pwsi->err = WSAEINVAL; return SOCKET_ERROR;
default: fprintf(stderr,"Warning: Unknown WS_IOCTL cmd (%08x)\n", cmd);
pwsi->err = WSAEINVAL;
return SOCKET_ERROR;
default:
/* Netscape tries hard to use bogus ioctl 0x667e */
dprintf_winsock(stddeb,"\tunknown WS_IOCTL cmd (%08x)\n", cmd);
}
if( ioctl(pws->fd, newcmd, (char*)argp ) == 0 ) return 0;
pwsi->err = (errno == EBADF) ? WSAENOTSOCK : wsaErrno();
@ -1429,7 +1441,7 @@ INT16 WSACancelBlockingCall(void)
return SOCKET_ERROR;
}
FARPROC16 WSASetBlockingHook(FARPROC16 lpBlockFunc)
FARPROC16 WSASetBlockingHook16(FARPROC16 lpBlockFunc)
{
FARPROC16 prev;
LPWSINFO pwsi = wsi_find(GetCurrentTask());
@ -1445,6 +1457,12 @@ FARPROC16 WSASetBlockingHook(FARPROC16 lpBlockFunc)
return 0;
}
FARPROC32 WSASetBlockingHook32(FARPROC32 lpBlockFunc)
{
fprintf( stderr, "Empty stub WSASetBlockingHook32(%p)\n", lpBlockFunc );
return NULL;
}
INT16 WSAUnhookBlockingHook(void)
{
LPWSINFO pwsi = wsi_find(GetCurrentTask());

View File

@ -524,7 +524,7 @@ INT32 wsprintf32A( LPSTR buffer, LPCSTR spec, ... )
}
/* Emulator version */
INT32 WIN32_wsprintf32A( int *args )
INT32 WIN32_wsprintf32A( DWORD *args )
{
return wvsprintf32A( (LPSTR)args[0], (LPCSTR)args[1], (LPCVOID)&args[2] );
}
@ -546,7 +546,7 @@ INT32 wsprintf32W( LPWSTR buffer, LPCWSTR spec, ... )
}
/* Emulator version */
INT32 WIN32_wsprintf32W( int *args )
INT32 WIN32_wsprintf32W( DWORD *args )
{
return wvsprintf32W( (LPWSTR)args[0], (LPCWSTR)args[1], (LPCVOID)&args[2]);
}

View File

@ -20,6 +20,8 @@
#define DOS_GET_DRIVE(reg) ((reg) ? (reg) - 1 : DRIVE_GetCurrentDrive())
void CreateBPB(int drive, BYTE *data); /* defined in int21.c */
/* Structure for real-mode callbacks */
typedef struct

View File

@ -26,10 +26,9 @@
#include "stddebug.h"
#include "debug.h"
int MMSYSTEM_DevIDToIndex(UINT16);
#if defined(linux) || defined(__FreeBSD__)
#define SOUND_DEV "/dev/dsp"
#define MIXER_DEV "/dev/mixer"
#ifdef SOUND_VERSION
#define IOCTL(a,b,c) ((-1==ioctl(a,b,&c))&&(perror("ioctl:"#b":"#c),0))
@ -37,9 +36,9 @@ int MMSYSTEM_DevIDToIndex(UINT16);
#define IOCTL(a,b,c) (c = ioctl(a,b,c) )
#endif
#define MAX_WAVOUTDRV 2
#define MAX_WAVINDRV 2
#define MAX_MCIWAVDRV 2
#define MAX_WAVOUTDRV (1)
#define MAX_WAVINDRV (1)
#define MAX_MCIWAVDRV (1)
typedef struct {
int unixdev;
@ -72,7 +71,8 @@ typedef struct {
MCI_WAVE_OPEN_PARMS openParms;
PCMWAVEFORMAT WaveFormat;
WAVEHDR WaveHdr;
} LINUX_MCIWAVE;
BOOL16 fInput; /* FALSE = Output, TRUE = Input */
} LINUX_MCIWAVE;
static LINUX_WAVEOUT WOutDev[MAX_WAVOUTDRV];
static LINUX_WAVEIN WInDev[MAX_WAVOUTDRV];
@ -85,12 +85,14 @@ static LINUX_MCIWAVE MCIWavDev[MAX_MCIWAVDRV];
static DWORD WAVE_NotifyClient(UINT16 wDevID, WORD wMsg,
DWORD dwParam1, DWORD dwParam2)
{
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_mciwave(stddeb,"WAVE_NotifyClient // wDevID = %04X wMsg = %d dwParm1 = %04lX dwParam2 = %04lX\n",wDevID, wMsg, dwParam1, dwParam2);
if (WInDev[index].wFlags != DCB_NULL && !DriverCallback(
WInDev[index].waveDesc.dwCallBack, WInDev[index].wFlags,
WInDev[index].waveDesc.hWave, wMsg,
WInDev[index].waveDesc.dwInstance, dwParam1, dwParam2)) {
if (wDevID > MAX_WAVOUTDRV) return MCIERR_INTERNAL;
if (WInDev[wDevID].wFlags != DCB_NULL && !DriverCallback(
WInDev[wDevID].waveDesc.dwCallBack, WInDev[wDevID].wFlags,
WInDev[wDevID].waveDesc.hWave, wMsg,
WInDev[wDevID].waveDesc.dwInstance, dwParam1, dwParam2)) {
dprintf_mciwave(stddeb,"WAVE_NotifyClient // can't notify client !\n");
return MMSYSERR_NOERROR;
}
@ -99,11 +101,11 @@ static DWORD WAVE_NotifyClient(UINT16 wDevID, WORD wMsg,
/**************************************************************************
* WAVE_mciOpen */
* WAVE_mciOpen [internal]*/
static DWORD WAVE_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_WAVE_OPEN_PARMS lpParms)
{
int index = MMSYSTEM_DevIDToIndex(wDevID);
HLOCAL16 hFormat;
LPWAVEFORMAT lpFormat;
LPPCMWAVEFORMAT lpWaveFormat;
HLOCAL16 hDesc;
LPWAVEOPENDESC lpDesc;
@ -115,23 +117,22 @@ static DWORD WAVE_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_WAVE_OPEN_PARMS lp
wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
wDevID = lpParms->wDeviceID;
index = MMSYSTEM_DevIDToIndex(wDevID);
if (MCIWavDev[index].nUseCount > 0) {
if (MCIWavDev[wDevID].nUseCount > 0) {
/* The driver already open on this channel */
/* If the driver was opened shareable before and this open specifies */
/* shareable then increment the use count */
if (MCIWavDev[index].fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
++MCIWavDev[index].nUseCount;
if (MCIWavDev[wDevID].fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
++MCIWavDev[wDevID].nUseCount;
else
return MCIERR_MUST_USE_SHAREABLE;
}
else {
MCIWavDev[index].nUseCount = 1;
MCIWavDev[index].fShareable = dwFlags & MCI_OPEN_SHAREABLE;
MCIWavDev[wDevID].nUseCount = 1;
MCIWavDev[wDevID].fShareable = dwFlags & MCI_OPEN_SHAREABLE;
}
lpParms->wDeviceID = wDevID;
MCIWavDev[wDevID].fInput = FALSE;
dprintf_mciwave(stddeb,"WAVE_mciOpen // wDevID=%04X\n", wDevID);
dprintf_mciwave(stddeb,"WAVE_mciOpen // before OPEN_ELEMENT\n");
if (dwFlags & MCI_OPEN_ELEMENT) {
@ -141,20 +142,20 @@ static DWORD WAVE_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_WAVE_OPEN_PARMS lp
if (strlen(lpstrElementName) > 0) {
strcpy(str, lpstrElementName);
CharUpper32A(str);
MCIWavDev[index].hFile = mmioOpen(str, NULL,
MCIWavDev[wDevID].hFile = mmioOpen(str, NULL,
MMIO_ALLOCBUF | MMIO_READWRITE | MMIO_EXCLUSIVE);
if (MCIWavDev[index].hFile == 0) {
if (MCIWavDev[wDevID].hFile == 0) {
dprintf_mciwave(stddeb,"WAVE_mciOpen // can't find file='%s' !\n", str);
return MCIERR_FILE_NOT_FOUND;
}
}
else
MCIWavDev[index].hFile = 0;
MCIWavDev[wDevID].hFile = 0;
}
dprintf_mciwave(stddeb,"WAVE_mciOpen // hFile=%u\n", MCIWavDev[index].hFile);
memcpy(&MCIWavDev[index].openParms, lpParms, sizeof(MCI_WAVE_OPEN_PARMS));
MCIWavDev[index].wNotifyDeviceID = lpParms->wDeviceID;
lpWaveFormat = &MCIWavDev[index].WaveFormat;
dprintf_mciwave(stddeb,"WAVE_mciOpen // hFile=%u\n", MCIWavDev[wDevID].hFile);
memcpy(&MCIWavDev[wDevID].openParms, lpParms, sizeof(MCI_WAVE_OPEN_PARMS));
MCIWavDev[wDevID].wNotifyDeviceID = lpParms->wDeviceID;
lpWaveFormat = &MCIWavDev[wDevID].WaveFormat;
hDesc = USER_HEAP_ALLOC(sizeof(WAVEOPENDESC));
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hDesc);
lpDesc->hWave = 0;
@ -166,10 +167,10 @@ static DWORD WAVE_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_WAVE_OPEN_PARMS lp
lpWaveFormat->wf.nAvgBytesPerSec = 11025;
lpWaveFormat->wf.nBlockAlign = 1;
*/
if (MCIWavDev[index].hFile != 0) {
if (MCIWavDev[wDevID].hFile != 0) {
MMCKINFO mmckInfo;
MMCKINFO ckMainRIFF;
if (mmioDescend(MCIWavDev[index].hFile, &ckMainRIFF, NULL, 0) != 0) {
if (mmioDescend(MCIWavDev[wDevID].hFile, &ckMainRIFF, NULL, 0) != 0) {
return MCIERR_INTERNAL;
}
dprintf_mciwave(stddeb,
@ -181,19 +182,19 @@ static DWORD WAVE_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_WAVE_OPEN_PARMS lp
return MCIERR_INTERNAL;
}
mmckInfo.ckid = mmioFOURCC('f', 'm', 't', ' ');
if (mmioDescend(MCIWavDev[index].hFile, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) != 0) {
if (mmioDescend(MCIWavDev[wDevID].hFile, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) != 0) {
return MCIERR_INTERNAL;
}
dprintf_mciwave(stddeb,
"WAVE_mciOpen // Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
(LPSTR)&mmckInfo.ckid, (LPSTR)&mmckInfo.fccType,
mmckInfo.cksize);
if (mmioRead(MCIWavDev[index].hFile, (HPSTR) lpWaveFormat,
if (mmioRead(MCIWavDev[wDevID].hFile, (HPSTR) lpWaveFormat,
(long) sizeof(PCMWAVEFORMAT)) != (long) sizeof(PCMWAVEFORMAT)) {
return MCIERR_INTERNAL;
}
mmckInfo.ckid = mmioFOURCC('d', 'a', 't', 'a');
if (mmioDescend(MCIWavDev[index].hFile, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) != 0) {
if (mmioDescend(MCIWavDev[wDevID].hFile, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK) != 0) {
return MCIERR_INTERNAL;
}
dprintf_mciwave(stddeb,
@ -205,37 +206,105 @@ static DWORD WAVE_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_WAVE_OPEN_PARMS lp
lpWaveFormat->wf.nChannels, lpWaveFormat->wf.nSamplesPerSec);
lpWaveFormat->wBitsPerSample = 0;
}
lpWaveFormat->wf.nAvgBytesPerSec =
lpWaveFormat->wf.nSamplesPerSec * lpWaveFormat->wf.nBlockAlign;
hFormat = USER_HEAP_ALLOC(sizeof(PCMWAVEFORMAT));
lpDesc->lpFormat = (LPWAVEFORMAT) USER_HEAP_LIN_ADDR(hFormat);
memcpy(lpDesc->lpFormat, lpWaveFormat, sizeof(PCMWAVEFORMAT));
lpFormat = (LPWAVEFORMAT) USER_HEAP_LIN_ADDR(hFormat);
memcpy(lpFormat, lpWaveFormat, sizeof(PCMWAVEFORMAT));
lpDesc->lpFormat = (LPWAVEFORMAT)USER_HEAP_SEG_ADDR(hFormat);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_SEG_ADDR(hDesc);
dwRet = wodMessage(index, WODM_OPEN, 0, (DWORD)lpDesc, CALLBACK_NULL);
dwRet = widMessage(index, WIDM_OPEN, 0, (DWORD)lpDesc, CALLBACK_NULL);
/*
By default the device will be opened for output, the MCI_CUE function is there to
change from output to input and back
*/
dwRet = wodMessage(wDevID, WODM_OPEN, 0, (DWORD)lpDesc, CALLBACK_NULL);
USER_HEAP_FREE(hFormat);
USER_HEAP_FREE(hDesc);
return 0;
}
/**************************************************************************
* WAVE_mciCue [internal]
*/
static DWORD WAVE_mciCue(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
{
/*
FIXME
This routine is far from complete. At the moment only a check is done on the
MCI_WAVE_INPUT flag. No explicit check on MCI_WAVE_OUTPUT is done since that
is the default.
The flags MCI_NOTIFY (and the callback parameter in lpParms) and MCI_WAIT are
ignored
*/
DWORD dwRet;
HLOCAL16 hDesc;
LPWAVEOPENDESC lpDesc;
dprintf_mciwave(stddeb,"WAVE_mciCue(%u, %08lX, %p);\n", wDevID, dwParam, lpParms);
/* always close elements ? */
if (MCIWavDev[wDevID].hFile != 0) {
mmioClose(MCIWavDev[wDevID].hFile, 0);
MCIWavDev[wDevID].hFile = 0;
}
hDesc = USER_HEAP_ALLOC(sizeof(WAVEOPENDESC));
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hDesc);
dwRet = MMSYSERR_NOERROR; /* assume success */
if ((dwParam & MCI_WAVE_INPUT) && !MCIWavDev[wDevID].fInput) {
/* FIXME this is just a hack WOutDev should be hidden here */
memcpy(lpDesc,&WOutDev[wDevID].waveDesc,sizeof(WAVEOPENDESC));
dwRet = wodMessage(wDevID, WODM_CLOSE, 0, 0L, 0L);
if (dwRet != MMSYSERR_NOERROR) return MCIERR_INTERNAL;
dwRet = widMessage(wDevID, WIDM_OPEN, 0, (DWORD)lpDesc, CALLBACK_NULL);
}
else if (MCIWavDev[wDevID].fInput) {
/* FIXME this is just a hack WInDev should be hidden here */
memcpy(lpDesc,&WInDev[wDevID].waveDesc,sizeof(WAVEOPENDESC));
dwRet = widMessage(wDevID, WIDM_CLOSE, 0, 0L, 0L);
if (dwRet != MMSYSERR_NOERROR) return MCIERR_INTERNAL;
dwRet = wodMessage(wDevID, WODM_OPEN, 0, (DWORD)lpDesc, CALLBACK_NULL);
}
USER_HEAP_FREE(hDesc);
return dwRet;
}
/**************************************************************************
* WAVE_mciClose [internal]
*/
static DWORD WAVE_mciClose(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
{
int index = MMSYSTEM_DevIDToIndex(wDevID);
DWORD dwRet;
dprintf_mciwave(stddeb,
"WAVE_mciClose(%u, %08lX, %p);\n", wDevID, dwParam, lpParms);
MCIWavDev[index].nUseCount--;
if (MCIWavDev[index].nUseCount == 0) {
if (MCIWavDev[index].hFile != 0) {
mmioClose(MCIWavDev[index].hFile, 0);
MCIWavDev[index].hFile = 0;
MCIWavDev[wDevID].nUseCount--;
if (MCIWavDev[wDevID].nUseCount == 0) {
if (MCIWavDev[wDevID].hFile != 0) {
mmioClose(MCIWavDev[wDevID].hFile, 0);
MCIWavDev[wDevID].hFile = 0;
}
dwRet = wodMessage(index, WODM_CLOSE, 0, 0L, 0L);
if (dwRet != MMSYSERR_NOERROR) return MCIERR_INTERNAL;
dwRet = widMessage(index, WIDM_CLOSE, 0, 0L, 0L);
if (MCIWavDev[wDevID].fInput)
dwRet = widMessage(wDevID, WIDM_CLOSE, 0, 0L, 0L);
else
dwRet = wodMessage(wDevID, WODM_CLOSE, 0, 0L, 0L);
if (dwRet != MMSYSERR_NOERROR) return MCIERR_INTERNAL;
}
return 0;
@ -247,7 +316,6 @@ static DWORD WAVE_mciClose(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpP
*/
static DWORD WAVE_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
{
int index = MMSYSTEM_DevIDToIndex(wDevID);
int start, end;
LONG bufsize, count;
HGLOBAL16 hData;
@ -255,11 +323,18 @@ static DWORD WAVE_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms
LPWAVEHDR lpWaveHdr;
LPWAVEHDR lp16WaveHdr;
DWORD dwRet;
dprintf_mciwave(stddeb,
"WAVE_mciPlay(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
if (MCIWavDev[index].hFile == 0) {
if (MCIWavDev[wDevID].fInput) {
dprintf_mciwave(stddeb,"WAVE_mciPlay // cannot play on input device\n");
return MCIERR_NONAPPLICABLE_FUNCTION;
}
if (MCIWavDev[wDevID].hFile == 0) {
dprintf_mciwave(stddeb,"WAVE_mciPlay // can't find file='%08lx' !\n",
MCIWavDev[index].openParms.lpstrElementName);
MCIWavDev[wDevID].openParms.lpstrElementName);
return MCIERR_FILE_NOT_FOUND;
}
start = 1; end = 99999;
@ -290,7 +365,7 @@ static DWORD WAVE_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms
}
#endif
bufsize = 64000;
lpWaveHdr = &MCIWavDev[index].WaveHdr;
lpWaveHdr = &MCIWavDev[wDevID].WaveHdr;
hData = GlobalAlloc16(GMEM_MOVEABLE, bufsize);
lpWaveHdr->lpData = (LPSTR) WIN16_GlobalLock16(hData);
lpWaveHdr->dwUser = 0L;
@ -300,9 +375,9 @@ static DWORD WAVE_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms
lp16WaveHdr = (LPWAVEHDR) USER_HEAP_SEG_ADDR(hWaveHdr);
memcpy(PTR_SEG_TO_LIN(lp16WaveHdr), lpWaveHdr, sizeof(WAVEHDR));
lpWaveHdr = PTR_SEG_TO_LIN(lp16WaveHdr);
dwRet = wodMessage(index, WODM_PREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
dwRet = wodMessage(wDevID, WODM_PREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
while(TRUE) {
count = mmioRead(MCIWavDev[index].hFile,
count = mmioRead(MCIWavDev[wDevID].hFile,
PTR_SEG_TO_LIN(lpWaveHdr->lpData), bufsize);
dprintf_mciwave(stddeb,"WAVE_mciPlay // mmioRead bufsize=%ld count=%ld\n", bufsize, count);
if (count < 1) break;
@ -310,9 +385,9 @@ static DWORD WAVE_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms
/* lpWaveHdr->dwBytesRecorded = count; */
dprintf_mciwave(stddeb,"WAVE_mciPlay // before WODM_WRITE lpWaveHdr=%p dwBufferLength=%lu dwBytesRecorded=%lu\n",
lpWaveHdr, lpWaveHdr->dwBufferLength, lpWaveHdr->dwBytesRecorded);
dwRet = wodMessage(index, WODM_WRITE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
dwRet = wodMessage(wDevID, WODM_WRITE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
}
dwRet = wodMessage(index, WODM_UNPREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
dwRet = wodMessage(wDevID, WODM_UNPREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
if (lpWaveHdr->lpData != NULL) {
GlobalUnlock16(hData);
GlobalFree16(hData);
@ -322,7 +397,7 @@ static DWORD WAVE_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms
if (dwFlags & MCI_NOTIFY) {
dprintf_mciwave(stddeb,"WAVE_mciPlay // MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
MCIWavDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
MCIWavDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
}
return 0;
}
@ -333,7 +408,6 @@ static DWORD WAVE_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms
*/
static DWORD WAVE_mciRecord(UINT16 wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpParms)
{
int index = MMSYSTEM_DevIDToIndex(wDevID);
int start, end;
LONG bufsize;
HGLOBAL16 hData;
@ -344,9 +418,15 @@ static DWORD WAVE_mciRecord(UINT16 wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpP
dprintf_mciwave(stddeb,
"WAVE_mciRecord(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
if (MCIWavDev[index].hFile == 0) {
if (!MCIWavDev[wDevID].fInput) {
dprintf_mciwave(stddeb,"WAVE_mciPlay // cannot record on output device\n");
return MCIERR_NONAPPLICABLE_FUNCTION;
}
if (MCIWavDev[wDevID].hFile == 0) {
dprintf_mciwave(stddeb,"WAVE_mciRecord // can't find file='%08lx' !\n",
MCIWavDev[index].openParms.lpstrElementName);
MCIWavDev[wDevID].openParms.lpstrElementName);
return MCIERR_FILE_NOT_FOUND;
}
start = 1; end = 99999;
@ -360,7 +440,7 @@ static DWORD WAVE_mciRecord(UINT16 wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpP
dprintf_mciwave(stddeb,"WAVE_mciRecord // MCI_TO=%d \n", end);
}
bufsize = 64000;
lpWaveHdr = &MCIWavDev[index].WaveHdr;
lpWaveHdr = &MCIWavDev[wDevID].WaveHdr;
hData = GlobalAlloc16(GMEM_MOVEABLE, bufsize);
lpWaveHdr->lpData = (LPSTR) WIN16_GlobalLock16(hData);
lpWaveHdr->dwBufferLength = bufsize;
@ -371,18 +451,18 @@ static DWORD WAVE_mciRecord(UINT16 wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpP
lp16WaveHdr = (LPWAVEHDR) USER_HEAP_SEG_ADDR(hWaveHdr);
memcpy(PTR_SEG_TO_LIN(lp16WaveHdr), lpWaveHdr, sizeof(WAVEHDR));
lpWaveHdr = PTR_SEG_TO_LIN(lp16WaveHdr);
dwRet = widMessage(index, WIDM_PREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
dwRet = widMessage(wDevID, WIDM_PREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
dprintf_mciwave(stddeb,"WAVE_mciRecord // after WIDM_PREPARE \n");
while(TRUE) {
lpWaveHdr->dwBytesRecorded = 0;
dwRet = widMessage(index, WIDM_START, 0, 0L, 0L);
dwRet = widMessage(wDevID, WIDM_START, 0, 0L, 0L);
dprintf_mciwave(stddeb,
"WAVE_mciRecord // after WIDM_START lpWaveHdr=%p dwBytesRecorded=%lu\n",
lpWaveHdr, lpWaveHdr->dwBytesRecorded);
if (lpWaveHdr->dwBytesRecorded == 0) break;
}
dprintf_mciwave(stddeb,"WAVE_mciRecord // before WIDM_UNPREPARE \n");
dwRet = widMessage(index, WIDM_UNPREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
dwRet = widMessage(wDevID, WIDM_UNPREPARE, 0, (DWORD)lp16WaveHdr, sizeof(WAVEHDR));
dprintf_mciwave(stddeb,"WAVE_mciRecord // after WIDM_UNPREPARE \n");
if (lpWaveHdr->lpData != NULL) {
GlobalUnlock16(hData);
@ -393,7 +473,7 @@ static DWORD WAVE_mciRecord(UINT16 wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpP
if (dwFlags & MCI_NOTIFY) {
dprintf_mciwave(stddeb,"WAVE_mciRecord // MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
MCIWavDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
MCIWavDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
}
return 0;
}
@ -509,7 +589,6 @@ static DWORD WAVE_mciSet(UINT16 wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
*/
static DWORD WAVE_mciStatus(UINT16 wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms)
{
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_mciwave(stddeb,
"WAVE_mciStatus(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
@ -597,7 +676,7 @@ static DWORD WAVE_mciStatus(UINT16 wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpP
if (dwFlags & MCI_NOTIFY) {
dprintf_mciwave(stddeb,"WAVE_mciStatus // MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
MCIWavDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
MCIWavDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
}
return 0;
}
@ -658,7 +737,6 @@ static DWORD WAVE_mciGetDevCaps(UINT16 wDevID, DWORD dwFlags,
*/
static DWORD WAVE_mciInfo(UINT16 wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms)
{
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_mciwave(stddeb,
"WAVE_mciInfo(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
@ -669,7 +747,7 @@ static DWORD WAVE_mciInfo(UINT16 wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms
break;
case MCI_INFO_FILE:
lpParms->lpstrReturn =
(LPSTR)MCIWavDev[index].openParms.lpstrElementName;
(LPSTR)MCIWavDev[wDevID].openParms.lpstrElementName;
break;
case MCI_WAVE_INPUT:
lpParms->lpstrReturn = "Linux Sound System 0.5";
@ -704,8 +782,9 @@ static DWORD wodGetDevCaps(WORD wDevID, LPWAVEOUTCAPS lpCaps, DWORD dwSize)
dprintf_mciwave(stddeb,
"wodGetDevCaps(%u, %p, %lu);\n", wDevID, lpCaps, dwSize);
if (lpCaps == NULL) return MMSYSERR_NOTENABLED;
if (access(SOUND_DEV,0) != 0) return MMSYSERR_NOTENABLED;
audio = open (SOUND_DEV, O_WRONLY, 0);
if (audio == -1) return MMSYSERR_NOTENABLED;
if (audio == -1) return MMSYSERR_ALLOCATED ;
#ifdef EMULATE_SB16
lpCaps->wMid = 0x0002;
lpCaps->wPid = 0x0104;
@ -777,10 +856,11 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
return MMSYSERR_ALLOCATED;
}
WOutDev[wDevID].unixdev = 0;
if (access(SOUND_DEV,0) != 0) return MMSYSERR_NOTENABLED;
audio = open (SOUND_DEV, O_WRONLY, 0);
if (audio == -1) {
dprintf_mciwave(stddeb,"Linux 'wodOpen' // can't open !\n");
return MMSYSERR_NOTENABLED;
return MMSYSERR_ALLOCATED ;
}
IOCTL(audio, SNDCTL_DSP_GETBLKSIZE, abuf_size);
if (abuf_size < 1024 || abuf_size > 65536) {
@ -810,7 +890,10 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
WOutDev[wDevID].dwTotalPlayed = 0;
WOutDev[wDevID].bufsize = abuf_size;
memcpy(&WOutDev[wDevID].waveDesc, lpDesc, sizeof(WAVEOPENDESC));
dprintf_mciwave(stddeb,"Linux 'wodOpen' // lpDesc->lpFormat = %p\n",lpDesc->lpFormat);
lpFormat = (LPWAVEFORMAT) PTR_SEG_TO_LIN(lpDesc->lpFormat);
/* lpFormat = lpDesc->lpFormat; */
dprintf_mciwave(stddeb,"Linux 'wodOpen' // lpFormat = %p\n",lpFormat);
if (lpFormat->wFormatTag != WAVE_FORMAT_PCM) {
dprintf_mciwave(stddeb,"Linux 'wodOpen' // Bad format %04X !\n",
lpFormat->wFormatTag);
@ -1042,7 +1125,7 @@ static DWORD wodGetVolume(WORD wDevID, LPDWORD lpdwVol)
int volume, left, right;
dprintf_mciwave(stddeb,"wodGetVolume(%u, %p);\n", wDevID, lpdwVol);
if (lpdwVol == NULL) return MMSYSERR_NOTENABLED;
if ((mixer = open("/dev/mixer", O_RDONLY)) < 0) {
if ((mixer = open(MIXER_DEV, O_RDONLY)) < 0) {
dprintf_mciwave(stddeb, "Linux 'wodGetVolume' // mixer device not available !\n");
return MMSYSERR_NOTENABLED;
}
@ -1053,7 +1136,7 @@ static DWORD wodGetVolume(WORD wDevID, LPDWORD lpdwVol)
close(mixer);
left = volume & 0x7F;
right = (volume >> 8) & 0x7F;
printf("Linux 'AUX_GetVolume' // left=%d right=%d !\n", left, right);
dprintf_mciwave(stddeb,"Linux 'wodGetVolume' // left=%d right=%d !\n", left, right);
*lpdwVol = MAKELONG(left << 9, right << 9);
return MMSYSERR_NOERROR;
}
@ -1069,7 +1152,7 @@ static DWORD wodSetVolume(WORD wDevID, DWORD dwParam)
dprintf_mciwave(stddeb,"wodSetVolume(%u, %08lX);\n", wDevID, dwParam);
volume = (LOWORD(dwParam) >> 9 & 0x7F) +
((HIWORD(dwParam) >> 9 & 0x7F) << 8);
if ((mixer = open("/dev/mixer", O_WRONLY)) < 0) {
if ((mixer = open(MIXER_DEV, O_WRONLY)) < 0) {
dprintf_mciwave(stddeb, "Linux 'wodSetVolume' // mixer device not available !\n");
return MMSYSERR_NOTENABLED;
}
@ -1114,13 +1197,13 @@ DWORD wodMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
case WODM_GETNUMDEVS:
return 1L;
case WODM_GETPITCH:
return 0L;
return MMSYSERR_NOTSUPPORTED;
case WODM_SETPITCH:
return 0L;
return MMSYSERR_NOTSUPPORTED;
case WODM_GETPLAYBACKRATE:
return 0L;
return MMSYSERR_NOTSUPPORTED;
case WODM_SETPLAYBACKRATE:
return 0L;
return MMSYSERR_NOTSUPPORTED;
case WODM_GETVOLUME:
return wodGetVolume(wDevID, (LPDWORD)PTR_SEG_TO_LIN(dwParam1));
case WODM_SETVOLUME:
@ -1156,12 +1239,13 @@ static DWORD widGetDevCaps(WORD wDevID, LPWAVEINCAPS lpCaps, DWORD dwSize)
dprintf_mciwave(stddeb,
"widGetDevCaps(%u, %p, %lu);\n", wDevID, lpCaps, dwSize);
if (lpCaps == NULL) return MMSYSERR_NOTENABLED;
if (access(SOUND_DEV,0) != 0) return MMSYSERR_NOTENABLED;
audio = open (SOUND_DEV, O_RDONLY, 0);
if (audio == -1) return MMSYSERR_NOTENABLED;
if (audio == -1) return MMSYSERR_ALLOCATED ;
#ifdef EMULATE_SB16
lpCaps->wMid = 0x0002;
lpCaps->wPid = 0x0004;
strcpy(lpCaps->szPname, "SB16 Wave Out");
strcpy(lpCaps->szPname, "SB16 Wave In");
#else
lpCaps->wMid = 0x00FF; /* Manufac ID */
lpCaps->wPid = 0x0001; /* Product ID */
@ -1225,10 +1309,11 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
return MMSYSERR_ALLOCATED;
}
WInDev[wDevID].unixdev = 0;
if (access(SOUND_DEV,0) != 0) return MMSYSERR_NOTENABLED;
audio = open (SOUND_DEV, O_RDONLY, 0);
if (audio == -1) {
dprintf_mciwave(stddeb,"Linux 'widOpen' // can't open !\n");
return MMSYSERR_NOTENABLED;
return MMSYSERR_ALLOCATED;
}
IOCTL(audio, SNDCTL_DSP_GETBLKSIZE, abuf_size);
if (abuf_size < 1024 || abuf_size > 65536) {
@ -1258,7 +1343,8 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
WInDev[wDevID].bufsize = abuf_size;
WInDev[wDevID].dwTotalRecorded = 0;
memcpy(&WInDev[wDevID].waveDesc, lpDesc, sizeof(WAVEOPENDESC));
lpFormat = lpDesc->lpFormat;
lpFormat = (LPWAVEFORMAT) PTR_SEG_TO_LIN(lpDesc->lpFormat);
/* lpFormat = lpDesc->lpFormat; */
if (lpFormat->wFormatTag != WAVE_FORMAT_PCM) {
dprintf_mciwave(stddeb,"Linux 'widOpen' // Bad format %04X !\n",
lpFormat->wFormatTag);
@ -1619,6 +1705,8 @@ LONG WAVE_DriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg,
case MCI_OPEN_DRIVER:
case MCI_OPEN:
return WAVE_mciOpen(dwDevID, dwParam1, (LPMCI_WAVE_OPEN_PARMS)PTR_SEG_TO_LIN(dwParam2));
case MCI_CUE:
return WAVE_mciCue(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)PTR_SEG_TO_LIN(dwParam2));
case MCI_CLOSE_DRIVER:
case MCI_CLOSE:
return WAVE_mciClose(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)PTR_SEG_TO_LIN(dwParam2));

View File

@ -17,8 +17,6 @@
#include "stddebug.h"
#include "debug.h"
int MMSYSTEM_DevIDToIndex(UINT16);
#define MAX_ANIMDRV 2
#define ANIMFRAMES_PERSEC 30
@ -54,24 +52,24 @@ static LINUX_ANIM AnimDev[MAX_ANIMDRV];
static DWORD ANIM_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
LPSTR lpstrElementName;
char str[128];
dprintf_mcianim(stddeb,"ANIM_mciOpen(%04X, %08lX, %p);\n",
wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
if (AnimDev[index].nUseCount > 0) {
if (AnimDev[wDevID].nUseCount > 0) {
/* The driver already open on this channel */
/* If the driver was opened shareable before and this open specifies */
/* shareable then increment the use count */
if (AnimDev[index].fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
++AnimDev[index].nUseCount;
if (AnimDev[wDevID].fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
++AnimDev[wDevID].nUseCount;
else
return MCIERR_MUST_USE_SHAREABLE;
}
else {
AnimDev[index].nUseCount = 1;
AnimDev[index].fShareable = dwFlags & MCI_OPEN_SHAREABLE;
AnimDev[wDevID].nUseCount = 1;
AnimDev[wDevID].fShareable = dwFlags & MCI_OPEN_SHAREABLE;
}
dprintf_mcianim(stddeb,"ANIM_mciOpen // wDevID=%04X\n", wDevID);
lpParms->wDeviceID = wDevID;
@ -85,21 +83,21 @@ static DWORD ANIM_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParms
CharUpper32A(str);
}
}
memcpy(&AnimDev[index].openParms, lpParms, sizeof(MCI_OPEN_PARMS));
AnimDev[index].wNotifyDeviceID = lpParms->wDeviceID;
AnimDev[index].mode = 0;
AnimDev[index].dwTimeFormat = MCI_FORMAT_TMSF;
AnimDev[index].nCurTrack = 0;
AnimDev[index].nTracks = 0;
AnimDev[index].dwTotalLen = 0;
AnimDev[index].lpdwTrackLen = NULL;
AnimDev[index].lpdwTrackPos = NULL;
memcpy(&AnimDev[wDevID].openParms, lpParms, sizeof(MCI_OPEN_PARMS));
AnimDev[wDevID].wNotifyDeviceID = lpParms->wDeviceID;
AnimDev[wDevID].mode = 0;
AnimDev[wDevID].dwTimeFormat = MCI_FORMAT_TMSF;
AnimDev[wDevID].nCurTrack = 0;
AnimDev[wDevID].nTracks = 0;
AnimDev[wDevID].dwTotalLen = 0;
AnimDev[wDevID].lpdwTrackLen = NULL;
AnimDev[wDevID].lpdwTrackPos = NULL;
if (dwFlags & MCI_NOTIFY) {
dprintf_mcianim(stddeb,
"ANIM_mciOpen // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
lpParms->dwCallback);
mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
AnimDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
}
return 0;
#else
@ -113,11 +111,10 @@ static DWORD ANIM_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParms
static DWORD ANIM_mciClose(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_mcianim(stddeb,"ANIM_mciClose(%u, %08lX, %p);\n",
wDevID, dwParam, lpParms);
if (AnimDev[index].lpdwTrackLen != NULL) free(AnimDev[index].lpdwTrackLen);
if (AnimDev[index].lpdwTrackPos != NULL) free(AnimDev[index].lpdwTrackPos);
if (AnimDev[wDevID].lpdwTrackLen != NULL) free(AnimDev[wDevID].lpdwTrackLen);
if (AnimDev[wDevID].lpdwTrackPos != NULL) free(AnimDev[wDevID].lpdwTrackPos);
#endif
return 0;
}
@ -185,7 +182,6 @@ static DWORD ANIM_CalcTime(UINT16 wDevID, DWORD dwFormatType, DWORD dwFrame)
{
DWORD dwTime = 0;
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
UINT16 wTrack;
UINT16 wMinutes;
UINT16 wSeconds;
@ -212,11 +208,11 @@ static DWORD ANIM_CalcTime(UINT16 wDevID, DWORD dwFormatType, DWORD dwFrame)
/* unknown format ! force TMSF ! ... */
dwFormatType = MCI_FORMAT_TMSF;
case MCI_FORMAT_TMSF:
for (wTrack = 0; wTrack < AnimDev[index].nTracks; wTrack++) {
/* dwTime += AnimDev[index].lpdwTrackLen[wTrack - 1];
for (wTrack = 0; wTrack < AnimDev[wDevID].nTracks; wTrack++) {
/* dwTime += AnimDev[wDevID].lpdwTrackLen[wTrack - 1];
printf("Adding trk#%u curpos=%u \n", dwTime);
if (dwTime >= dwFrame) break; */
if (AnimDev[index].lpdwTrackPos[wTrack - 1] >= dwFrame) break;
if (AnimDev[wDevID].lpdwTrackPos[wTrack - 1] >= dwFrame) break;
}
wMinutes = dwFrame / ANIMFRAMES_PERMIN;
wSeconds = (dwFrame - ANIMFRAMES_PERMIN * wMinutes) / ANIMFRAMES_PERSEC;
@ -240,7 +236,6 @@ static DWORD ANIM_CalcFrame(UINT16 wDevID, DWORD dwFormatType, DWORD dwTime)
{
DWORD dwFrame = 0;
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
UINT16 wTrack;
dprintf_mcianim(stddeb,"ANIM_CalcFrame(%u, %08lX, %lu);\n",
wDevID, dwFormatType, dwTime);
@ -271,8 +266,8 @@ static DWORD ANIM_CalcFrame(UINT16 wDevID, DWORD dwFormatType, DWORD dwTime)
MCI_TMSF_SECOND(dwTime), MCI_TMSF_FRAME(dwTime));
dprintf_mcianim(stddeb,
"ANIM_CalcFrame // TMSF trackpos[%u]=%lu\n",
wTrack, AnimDev[index].lpdwTrackPos[wTrack - 1]);
dwFrame = AnimDev[index].lpdwTrackPos[wTrack - 1];
wTrack, AnimDev[wDevID].lpdwTrackPos[wTrack - 1]);
dwFrame = AnimDev[wDevID].lpdwTrackPos[wTrack - 1];
dwFrame += ANIMFRAMES_PERMIN * MCI_TMSF_MINUTE(dwTime);
dwFrame += ANIMFRAMES_PERSEC * MCI_TMSF_SECOND(dwTime);
dwFrame += MCI_TMSF_FRAME(dwTime);
@ -289,7 +284,6 @@ static DWORD ANIM_CalcFrame(UINT16 wDevID, DWORD dwFormatType, DWORD dwTime)
static DWORD ANIM_mciInfo(UINT16 wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_mcianim(stddeb,"ANIM_mciInfo(%u, %08lX, %p);\n",
wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
@ -300,7 +294,7 @@ static DWORD ANIM_mciInfo(UINT16 wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms
break;
case MCI_INFO_FILE:
lpParms->lpstrReturn =
(LPSTR)AnimDev[index].openParms.lpstrElementName;
(LPSTR)AnimDev[wDevID].openParms.lpstrElementName;
break;
case MCI_ANIM_INFO_TEXT:
lpParms->lpstrReturn = "Animation Window";
@ -324,7 +318,6 @@ static DWORD ANIM_mciInfo(UINT16 wDevID, DWORD dwFlags, LPMCI_INFO_PARMS lpParms
static DWORD ANIM_mciStatus(UINT16 wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_mcianim(stddeb,"ANIM_mciStatus(%u, %08lX, %p);\n",
wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
@ -333,30 +326,30 @@ static DWORD ANIM_mciStatus(UINT16 wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpP
"ANIM_mciStatus // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
lpParms->dwCallback);
mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
AnimDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
}
if (dwFlags & MCI_STATUS_ITEM) {
switch(lpParms->dwItem) {
case MCI_STATUS_CURRENT_TRACK:
lpParms->dwReturn = AnimDev[index].nCurTrack;
lpParms->dwReturn = AnimDev[wDevID].nCurTrack;
dprintf_mcianim(stddeb,"ANIM_mciStatus // CURRENT_TRACK=%lu!\n", lpParms->dwReturn);
return 0;
case MCI_STATUS_LENGTH:
if (dwFlags & MCI_TRACK) {
dprintf_mcianim(stddeb,"ANIM_mciStatus // MCI_TRACK #%lu LENGTH=??? !\n",
lpParms->dwTrack);
if (lpParms->dwTrack > AnimDev[index].nTracks)
if (lpParms->dwTrack > AnimDev[wDevID].nTracks)
return MCIERR_OUTOFRANGE;
lpParms->dwReturn = AnimDev[index].lpdwTrackLen[lpParms->dwTrack];
lpParms->dwReturn = AnimDev[wDevID].lpdwTrackLen[lpParms->dwTrack];
}
else
lpParms->dwReturn = AnimDev[index].dwTotalLen;
lpParms->dwReturn = AnimDev[wDevID].dwTotalLen;
lpParms->dwReturn = ANIM_CalcTime(wDevID,
AnimDev[index].dwTimeFormat, lpParms->dwReturn);
AnimDev[wDevID].dwTimeFormat, lpParms->dwReturn);
dprintf_mcianim(stddeb,"ANIM_mciStatus // LENGTH=%lu !\n", lpParms->dwReturn);
return 0;
case MCI_STATUS_MODE:
lpParms->dwReturn = AnimDev[index].mode;
lpParms->dwReturn = AnimDev[wDevID].mode;
dprintf_mcianim(stddeb,"ANIM_mciStatus // MCI_STATUS_MODE=%08lX !\n",
lpParms->dwReturn);
return 0;
@ -371,19 +364,19 @@ static DWORD ANIM_mciStatus(UINT16 wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpP
if (lpParms->dwReturn == (WORD)-1) return MCIERR_INTERNAL;
return 0;
case MCI_STATUS_POSITION:
lpParms->dwReturn = AnimDev[index].dwCurFrame;
lpParms->dwReturn = AnimDev[wDevID].dwCurFrame;
if (dwFlags & MCI_STATUS_START) {
lpParms->dwReturn = 0;
dprintf_mcianim(stddeb,"CDAUDIO_mciStatus // get MCI_STATUS_START !\n");
}
if (dwFlags & MCI_TRACK) {
if (lpParms->dwTrack > AnimDev[index].nTracks)
if (lpParms->dwTrack > AnimDev[wDevID].nTracks)
return MCIERR_OUTOFRANGE;
lpParms->dwReturn = AnimDev[index].lpdwTrackPos[lpParms->dwTrack - 1];
lpParms->dwReturn = AnimDev[wDevID].lpdwTrackPos[lpParms->dwTrack - 1];
dprintf_mcianim(stddeb,"ANIM_mciStatus // get MCI_TRACK #%lu !\n", lpParms->dwTrack);
}
lpParms->dwReturn = ANIM_CalcTime(wDevID,
AnimDev[index].dwTimeFormat, lpParms->dwReturn);
AnimDev[wDevID].dwTimeFormat, lpParms->dwReturn);
dprintf_mcianim(stddeb,"ANIM_mciStatus // MCI_STATUS_POSITION=%08lX !\n",
lpParms->dwReturn);
return 0;
@ -414,33 +407,32 @@ static DWORD ANIM_mciStatus(UINT16 wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpP
static DWORD ANIM_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
int start, end;
dprintf_mcianim(stddeb,"ANIM_mciPlay(%u, %08lX, %p);\n",
wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
start = 0; end = AnimDev[index].dwTotalLen;
AnimDev[index].nCurTrack = 1;
start = 0; end = AnimDev[wDevID].dwTotalLen;
AnimDev[wDevID].nCurTrack = 1;
if (dwFlags & MCI_FROM) {
start = ANIM_CalcFrame(wDevID,
AnimDev[index].dwTimeFormat, lpParms->dwFrom);
AnimDev[wDevID].dwTimeFormat, lpParms->dwFrom);
dprintf_mcianim(stddeb,"ANIM_mciPlay // MCI_FROM=%08lX -> %u \n",
lpParms->dwFrom, start);
}
if (dwFlags & MCI_TO) {
end = ANIM_CalcFrame(wDevID,
AnimDev[index].dwTimeFormat, lpParms->dwTo);
AnimDev[wDevID].dwTimeFormat, lpParms->dwTo);
dprintf_mcianim(stddeb,
"ANIM_mciPlay // MCI_TO=%08lX -> %u \n",
lpParms->dwTo, end);
}
AnimDev[index].mode = MCI_MODE_PLAY;
AnimDev[wDevID].mode = MCI_MODE_PLAY;
if (dwFlags & MCI_NOTIFY) {
dprintf_mcianim(stddeb,
"ANIM_mciPlay // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
lpParms->dwCallback);
mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
AnimDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
}
return 0;
#else
@ -454,17 +446,16 @@ static DWORD ANIM_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms
static DWORD ANIM_mciStop(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_mcianim(stddeb,"ANIM_mciStop(%u, %08lX, %p);\n",
wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
AnimDev[index].mode = MCI_MODE_STOP;
AnimDev[wDevID].mode = MCI_MODE_STOP;
if (dwFlags & MCI_NOTIFY) {
dprintf_mcianim(stddeb,
"ANIM_mciStop // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
lpParms->dwCallback);
mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
AnimDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
}
return 0;
#else
@ -478,17 +469,16 @@ static DWORD ANIM_mciStop(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpPa
static DWORD ANIM_mciPause(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_mcianim(stddeb,"ANIM_mciPause(%u, %08lX, %p);\n",
wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
AnimDev[index].mode = MCI_MODE_PAUSE;
AnimDev[wDevID].mode = MCI_MODE_PAUSE;
if (dwFlags & MCI_NOTIFY) {
dprintf_mcianim(stddeb,
"ANIM_mciPause // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
lpParms->dwCallback);
mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
AnimDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
}
return 0;
#else
@ -502,17 +492,16 @@ static DWORD ANIM_mciPause(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpP
static DWORD ANIM_mciResume(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_mcianim(stddeb,"ANIM_mciResume(%u, %08lX, %p);\n",
wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
AnimDev[index].mode = MCI_MODE_STOP;
AnimDev[wDevID].mode = MCI_MODE_STOP;
if (dwFlags & MCI_NOTIFY) {
dprintf_mcianim(stddeb,
"ANIM_mciResume // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
lpParms->dwCallback);
mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
AnimDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
}
return 0;
#else
@ -526,19 +515,18 @@ static DWORD ANIM_mciResume(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lp
static DWORD ANIM_mciSeek(UINT16 wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
DWORD dwRet;
MCI_PLAY_PARMS PlayParms;
dprintf_mcianim(stddeb,"ANIM_mciSeek(%u, %08lX, %p);\n",
wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
AnimDev[index].mode = MCI_MODE_SEEK;
AnimDev[wDevID].mode = MCI_MODE_SEEK;
switch(dwFlags) {
case MCI_SEEK_TO_START:
PlayParms.dwFrom = 0;
break;
case MCI_SEEK_TO_END:
PlayParms.dwFrom = AnimDev[index].dwTotalLen;
PlayParms.dwFrom = AnimDev[wDevID].dwTotalLen;
break;
case MCI_TO:
PlayParms.dwFrom = lpParms->dwTo;
@ -552,7 +540,7 @@ static DWORD ANIM_mciSeek(UINT16 wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms
"ANIM_mciSeek // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
lpParms->dwCallback);
mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
AnimDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
}
return dwRet;
#else
@ -567,7 +555,6 @@ static DWORD ANIM_mciSeek(UINT16 wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms
static DWORD ANIM_mciSet(UINT16 wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_mcianim(stddeb,"ANIM_mciSet(%u, %08lX, %p);\n",
wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
@ -591,7 +578,7 @@ static DWORD ANIM_mciSet(UINT16 wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
fprintf(stderr,"ANIM_mciSet // bad time format !\n");
return MCIERR_BAD_TIME_FORMAT;
}
AnimDev[index].dwTimeFormat = lpParms->dwTimeFormat;
AnimDev[wDevID].dwTimeFormat = lpParms->dwTimeFormat;
}
if (dwFlags & MCI_SET_VIDEO) return MCIERR_UNSUPPORTED_FUNCTION;
if (dwFlags & MCI_SET_ON) return MCIERR_UNSUPPORTED_FUNCTION;
@ -601,7 +588,7 @@ static DWORD ANIM_mciSet(UINT16 wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
"ANIM_mciSet // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
lpParms->dwCallback);
mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
AnimDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
}
return 0;
#else

View File

@ -25,8 +25,6 @@
#include <sys/cdio.h>
#endif
int MMSYSTEM_DevIDToIndex(UINT16);
#define SOUND_DEV "/dev/dsp"
#ifdef __FreeBSD__
#define CDAUDIO_DEV "/dev/rcd0c"
@ -40,7 +38,7 @@ int MMSYSTEM_DevIDToIndex(UINT16);
#define IOCTL(a,b,c) (c = ioctl(a,b,c) )
#endif
#define MAX_CDAUDIODRV 2
#define MAX_CDAUDIODRV (1)
#define MAX_CDAUDIO_TRACKS 256
#define CDFRAMES_PERSEC 75
@ -84,14 +82,14 @@ static LINUX_CDAUDIO CDADev[MAX_CDAUDIODRV];
static UINT16 CDAUDIO_GetNumberOfTracks(UINT16 wDevID)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
#ifdef linux
struct cdrom_tochdr hdr;
#elif __FreeBSD__
struct ioc_toc_header hdr;
#endif
if (CDADev[index].nTracks == 0) {
if (ioctl(CDADev[index].unixdev,
if (CDADev[wDevID].nTracks == 0) {
if (ioctl(CDADev[wDevID].unixdev,
#ifdef linux
CDROMREADTOCHDR
#elif __FreeBSD__
@ -104,12 +102,12 @@ static UINT16 CDAUDIO_GetNumberOfTracks(UINT16 wDevID)
return (WORD)-1;
}
#ifdef linux
CDADev[index].nTracks = hdr.cdth_trk1;
CDADev[wDevID].nTracks = hdr.cdth_trk1;
#elif __FreeBSD__
CDADev[index].nTracks = hdr.ending_track - hdr.starting_track + 1;
CDADev[wDevID].nTracks = hdr.ending_track - hdr.starting_track + 1;
#endif
}
return CDADev[index].nTracks;
return CDADev[wDevID].nTracks;
#else
return (WORD)-1;
#endif
@ -122,7 +120,6 @@ static UINT16 CDAUDIO_GetNumberOfTracks(UINT16 wDevID)
static BOOL32 CDAUDIO_GetTracksInfo(UINT16 wDevID)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
int i, length;
int start, last_start = 0;
int total_length = 0;
@ -132,31 +129,32 @@ static BOOL32 CDAUDIO_GetTracksInfo(UINT16 wDevID)
struct ioc_read_toc_entry entry;
struct cd_toc_entry toc_buffer;
#endif
if (CDADev[index].nTracks == 0) {
if (CDADev[wDevID].nTracks == 0) {
if (CDAUDIO_GetNumberOfTracks(wDevID) == (WORD)-1) return FALSE;
}
dprintf_cdaudio(stddeb,"CDAUDIO_GetTracksInfo // nTracks=%u\n",
CDADev[index].nTracks);
if (CDADev[index].lpdwTrackLen != NULL)
free(CDADev[index].lpdwTrackLen);
CDADev[index].lpdwTrackLen = (LPDWORD)malloc(
(CDADev[index].nTracks + 1) * sizeof(DWORD));
if (CDADev[index].lpdwTrackPos != NULL)
free(CDADev[index].lpdwTrackPos);
CDADev[index].lpdwTrackPos = (LPDWORD)malloc(
(CDADev[index].nTracks + 1) * sizeof(DWORD));
if (CDADev[index].lpdwTrackLen == NULL ||
CDADev[index].lpdwTrackPos == NULL) {
CDADev[wDevID].nTracks);
if (CDADev[wDevID].lpdwTrackLen != NULL)
free(CDADev[wDevID].lpdwTrackLen);
CDADev[wDevID].lpdwTrackLen = (LPDWORD)malloc(
(CDADev[wDevID].nTracks + 1) * sizeof(DWORD));
if (CDADev[wDevID].lpdwTrackPos != NULL)
free(CDADev[wDevID].lpdwTrackPos);
CDADev[wDevID].lpdwTrackPos = (LPDWORD)malloc(
(CDADev[wDevID].nTracks + 1) * sizeof(DWORD));
if (CDADev[wDevID].lpdwTrackLen == NULL ||
CDADev[wDevID].lpdwTrackPos == NULL) {
dprintf_cdaudio(stddeb,
"CDAUDIO_GetTracksInfo // error allocating track table !\n");
return FALSE;
}
memset(CDADev[index].lpdwTrackLen, 0,
(CDADev[index].nTracks + 1) * sizeof(DWORD));
memset(CDADev[index].lpdwTrackPos, 0,
(CDADev[index].nTracks + 1) * sizeof(DWORD));
for (i = 0; i <= CDADev[index].nTracks; i++) {
if (i == CDADev[index].nTracks)
memset(CDADev[wDevID].lpdwTrackLen, 0,
(CDADev[wDevID].nTracks + 1) * sizeof(DWORD));
memset(CDADev[wDevID].lpdwTrackPos, 0,
(CDADev[wDevID].nTracks + 1) * sizeof(DWORD));
for (i = 0; i <= CDADev[wDevID].nTracks; i++) {
if (i == CDADev[wDevID].nTracks)
#ifdef linux
entry.cdte_track = CDROM_LEADOUT;
#elif __FreeBSD__
@ -177,7 +175,7 @@ static BOOL32 CDAUDIO_GetTracksInfo(UINT16 wDevID)
entry.data_len = sizeof(toc_buffer);
entry.data = &toc_buffer;
#endif
if (ioctl(CDADev[index].unixdev,
if (ioctl(CDADev[wDevID].unixdev,
#ifdef linux
CDROMREADTOCENTRY
#elif __FreeBSD__
@ -199,7 +197,7 @@ static BOOL32 CDAUDIO_GetTracksInfo(UINT16 wDevID)
#endif
if (i == 0) {
last_start = start;
CDADev[index].dwFirstOffset = start;
CDADev[wDevID].dwFirstOffset = start;
dprintf_cdaudio(stddeb,
"CDAUDIO_GetTracksInfo // dwFirstOffset=%u\n",
start);
@ -209,17 +207,16 @@ static BOOL32 CDAUDIO_GetTracksInfo(UINT16 wDevID)
last_start = start;
start = last_start - length;
total_length += length;
CDADev[index].lpdwTrackLen[i - 1] = length;
CDADev[index].lpdwTrackPos[i - 1] = start;
CDADev[wDevID].lpdwTrackLen[i - 1] = length;
CDADev[wDevID].lpdwTrackPos[i - 1] = start;
dprintf_cdaudio(stddeb,
"CDAUDIO_GetTracksInfo // track #%u start=%u len=%u\n",
i, start, length);
}
}
CDADev[index].dwTotalLen = total_length;
CDADev[wDevID].dwTotalLen = total_length;
dprintf_cdaudio(stddeb,"CDAUDIO_GetTracksInfo // total_len=%u\n",
total_length);
fflush(stdout);
return TRUE;
#else
return FALSE;
@ -233,46 +230,42 @@ static BOOL32 CDAUDIO_GetTracksInfo(UINT16 wDevID)
static DWORD CDAUDIO_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
int index;
dprintf_cdaudio(stddeb,"CDAUDIO_mciOpen(%04X, %08lX, %p);\n",
wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
wDevID = lpParms->wDeviceID;
index = MMSYSTEM_DevIDToIndex(wDevID);
if (CDADev[index].nUseCount > 0) {
if (CDADev[wDevID].nUseCount > 0) {
/* The driver already open on this channel */
/* If the driver was opened shareable before and this open specifies */
/* shareable then increment the use count */
if (CDADev[index].fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
++CDADev[index].nUseCount;
if (CDADev[wDevID].fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
++CDADev[wDevID].nUseCount;
else
return MCIERR_MUST_USE_SHAREABLE;
}
else {
CDADev[index].nUseCount = 1;
CDADev[index].fShareable = dwFlags & MCI_OPEN_SHAREABLE;
CDADev[wDevID].nUseCount = 1;
CDADev[wDevID].fShareable = dwFlags & MCI_OPEN_SHAREABLE;
}
if (dwFlags & MCI_OPEN_ELEMENT) {
dprintf_cdaudio(stddeb,"CDAUDIO_mciOpen // MCI_OPEN_ELEMENT !\n");
/* return MCIERR_NO_ELEMENT_ALLOWED; */
}
memcpy(&CDADev[index].openParms, lpParms, sizeof(MCI_OPEN_PARMS));
CDADev[index].wNotifyDeviceID = lpParms->wDeviceID;
CDADev[index].unixdev = open (CDAUDIO_DEV, O_RDONLY, 0);
if (CDADev[index].unixdev == -1) {
memcpy(&CDADev[wDevID].openParms, lpParms, sizeof(MCI_OPEN_PARMS));
CDADev[wDevID].wNotifyDeviceID = lpParms->wDeviceID;
CDADev[wDevID].unixdev = open (CDAUDIO_DEV, O_RDONLY, 0);
if (CDADev[wDevID].unixdev == -1) {
dprintf_cdaudio(stddeb,"CDAUDIO_mciOpen // can't open '%s' !\n", CDAUDIO_DEV);
return MCIERR_HARDWARE;
}
CDADev[index].mode = 0;
CDADev[index].dwTimeFormat = MCI_FORMAT_TMSF;
CDADev[index].nCurTrack = 0;
CDADev[index].nTracks = 0;
CDADev[index].dwTotalLen = 0;
CDADev[index].dwFirstOffset = 0;
CDADev[index].lpdwTrackLen = NULL;
CDADev[index].lpdwTrackPos = NULL;
CDADev[wDevID].mode = 0;
CDADev[wDevID].dwTimeFormat = MCI_FORMAT_TMSF;
CDADev[wDevID].nCurTrack = 0;
CDADev[wDevID].nTracks = 0;
CDADev[wDevID].dwTotalLen = 0;
CDADev[wDevID].dwFirstOffset = 0;
CDADev[wDevID].lpdwTrackLen = NULL;
CDADev[wDevID].lpdwTrackPos = NULL;
if (!CDAUDIO_GetTracksInfo(wDevID)) {
dprintf_cdaudio(stddeb,"CDAUDIO_mciOpen // error reading TracksInfo !\n");
/* return MCIERR_INTERNAL; */
@ -282,7 +275,7 @@ static DWORD CDAUDIO_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpPa
"CDAUDIO_mciOpen // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
lpParms->dwCallback);
mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
CDADev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
CDADev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
}
return 0;
#else
@ -296,12 +289,11 @@ static DWORD CDAUDIO_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpPa
static DWORD CDAUDIO_mciClose(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_cdaudio(stddeb,"CDAUDIO_mciClose(%04X, %08lX, %p);\n",
wDevID, dwParam, lpParms);
if (CDADev[index].lpdwTrackLen != NULL) free(CDADev[index].lpdwTrackLen);
if (CDADev[index].lpdwTrackPos != NULL) free(CDADev[index].lpdwTrackPos);
close(CDADev[index].unixdev);
if (CDADev[wDevID].lpdwTrackLen != NULL) free(CDADev[wDevID].lpdwTrackLen);
if (CDADev[wDevID].lpdwTrackPos != NULL) free(CDADev[wDevID].lpdwTrackPos);
close(CDADev[wDevID].unixdev);
#endif
return 0;
}
@ -396,7 +388,6 @@ static DWORD CDAUDIO_CalcFrame(UINT16 wDevID, DWORD dwFormatType, DWORD dwTime)
{
DWORD dwFrame = 0;
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
UINT16 wTrack;
dprintf_cdaudio(stddeb,"CDAUDIO_CalcFrame(%04X, %08lX, %lu);\n",
@ -429,8 +420,8 @@ static DWORD CDAUDIO_CalcFrame(UINT16 wDevID, DWORD dwFormatType, DWORD dwTime)
MCI_TMSF_SECOND(dwTime), MCI_TMSF_FRAME(dwTime));
dprintf_cdaudio(stddeb,
"CDAUDIO_CalcFrame // TMSF trackpos[%u]=%lu\n",
wTrack, CDADev[index].lpdwTrackPos[wTrack - 1]);
dwFrame = CDADev[index].lpdwTrackPos[wTrack - 1];
wTrack, CDADev[wDevID].lpdwTrackPos[wTrack - 1]);
dwFrame = CDADev[wDevID].lpdwTrackPos[wTrack - 1];
dwFrame += CDFRAMES_PERMIN * MCI_TMSF_MINUTE(dwTime);
dwFrame += CDFRAMES_PERSEC * MCI_TMSF_SECOND(dwTime);
dwFrame += MCI_TMSF_FRAME(dwTime);
@ -447,35 +438,34 @@ static DWORD CDAUDIO_CalcFrame(UINT16 wDevID, DWORD dwFormatType, DWORD dwTime)
static BOOL32 CDAUDIO_GetCDStatus(UINT16 wDevID)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
int oldmode = CDADev[index].mode;
int oldmode = CDADev[wDevID].mode;
#ifdef __FreeBSD__
struct ioc_read_subchannel read_sc;
read_sc.address_format = CD_MSF_FORMAT;
read_sc.data_format = CD_CURRENT_POSITION;
read_sc.track = 0;
read_sc.data_len = sizeof(CDADev[index].sc);
read_sc.data = (struct cd_sub_channel_info *)&CDADev[index].sc;
read_sc.data_len = sizeof(CDADev[wDevID].sc);
read_sc.data = (struct cd_sub_channel_info *)&CDADev[wDevID].sc;
#elif linux
CDADev[index].sc.cdsc_format = CDROM_MSF;
CDADev[wDevID].sc.cdsc_format = CDROM_MSF;
#endif
if (ioctl(CDADev[index].unixdev,
if (ioctl(CDADev[wDevID].unixdev,
#ifdef linux
CDROMSUBCHNL, &CDADev[index].sc
CDROMSUBCHNL, &CDADev[wDevID].sc
#elif __FreeBSD__
CDIOCREADSUBCHANNEL, &read_sc
#endif
)) {
dprintf_cdaudio(stddeb,"CDAUDIO_GetCDStatus // opened or no_media !\n");
CDADev[index].mode = MCI_MODE_NOT_READY;
CDADev[wDevID].mode = MCI_MODE_NOT_READY;
return TRUE;
}
switch (
#ifdef linux
CDADev[index].sc.cdsc_audiostatus
CDADev[wDevID].sc.cdsc_audiostatus
#elif __FreeBSD__
CDADev[index].sc.header.audio_status
CDADev[wDevID].sc.header.audio_status
#endif
) {
#ifdef linux
@ -485,9 +475,9 @@ static BOOL32 CDAUDIO_GetCDStatus(UINT16 wDevID)
#endif
dprintf_cdaudio(stddeb,"CDAUDIO_GetCDStatus // device doesn't support status, returning NOT_READY.\n");
#ifdef linux
CDADev[index].mode = MCI_MODE_NOT_READY;
CDADev[wDevID].mode = MCI_MODE_NOT_READY;
#elif __FreeBSD__
CDADev[index].mode = MCI_MODE_STOP;
CDADev[wDevID].mode = MCI_MODE_STOP;
#endif
break;
#ifdef linux
@ -495,7 +485,7 @@ static BOOL32 CDAUDIO_GetCDStatus(UINT16 wDevID)
#elif __FreeBSD__
case CD_AS_NO_STATUS:
#endif
CDADev[index].mode = MCI_MODE_STOP;
CDADev[wDevID].mode = MCI_MODE_STOP;
dprintf_cdaudio(stddeb,"CDAUDIO_GetCDStatus // MCI_MODE_STOP !\n");
break;
#ifdef linux
@ -503,7 +493,7 @@ static BOOL32 CDAUDIO_GetCDStatus(UINT16 wDevID)
#elif __FreeBSD__
case CD_AS_PLAY_IN_PROGRESS:
#endif
CDADev[index].mode = MCI_MODE_PLAY;
CDADev[wDevID].mode = MCI_MODE_PLAY;
dprintf_cdaudio(stddeb,"CDAUDIO_GetCDStatus // MCI_MODE_PLAY !\n");
break;
#ifdef linux
@ -511,45 +501,45 @@ static BOOL32 CDAUDIO_GetCDStatus(UINT16 wDevID)
#elif __FreeBSD__
case CD_AS_PLAY_PAUSED:
#endif
CDADev[index].mode = MCI_MODE_PAUSE;
CDADev[wDevID].mode = MCI_MODE_PAUSE;
dprintf_cdaudio(stddeb,"CDAUDIO_GetCDStatus // MCI_MODE_PAUSE !\n");
break;
default:
dprintf_cdaudio(stddeb,"CDAUDIO_GetCDStatus // status=%02X !\n",
#ifdef linux
CDADev[index].sc.cdsc_audiostatus
CDADev[wDevID].sc.cdsc_audiostatus
#elif __FreeBSD__
CDADev[index].sc.header.audio_status
CDADev[wDevID].sc.header.audio_status
#endif
);
}
#ifdef linux
CDADev[index].nCurTrack = CDADev[index].sc.cdsc_trk;
CDADev[index].dwCurFrame =
CDFRAMES_PERMIN * CDADev[index].sc.cdsc_absaddr.msf.minute +
CDFRAMES_PERSEC * CDADev[index].sc.cdsc_absaddr.msf.second +
CDADev[index].sc.cdsc_absaddr.msf.frame;
CDADev[wDevID].nCurTrack = CDADev[wDevID].sc.cdsc_trk;
CDADev[wDevID].dwCurFrame =
CDFRAMES_PERMIN * CDADev[wDevID].sc.cdsc_absaddr.msf.minute +
CDFRAMES_PERSEC * CDADev[wDevID].sc.cdsc_absaddr.msf.second +
CDADev[wDevID].sc.cdsc_absaddr.msf.frame;
#elif __FreeBSD__
CDADev[index].nCurTrack = CDADev[index].sc.what.position.track_number;
CDADev[index].dwCurFrame =
CDFRAMES_PERMIN * CDADev[index].sc.what.position.absaddr.msf.minute +
CDFRAMES_PERSEC * CDADev[index].sc.what.position.absaddr.msf.second +
CDADev[index].sc.what.position.absaddr.msf.frame;
CDADev[wDevID].nCurTrack = CDADev[wDevID].sc.what.position.track_number;
CDADev[wDevID].dwCurFrame =
CDFRAMES_PERMIN * CDADev[wDevID].sc.what.position.absaddr.msf.minute +
CDFRAMES_PERSEC * CDADev[wDevID].sc.what.position.absaddr.msf.second +
CDADev[wDevID].sc.what.position.absaddr.msf.frame;
#endif
dprintf_cdaudio(stddeb,"CDAUDIO_GetCDStatus // %02u-%02u:%02u:%02u \n",
#ifdef linux
CDADev[index].sc.cdsc_trk,
CDADev[index].sc.cdsc_absaddr.msf.minute,
CDADev[index].sc.cdsc_absaddr.msf.second,
CDADev[index].sc.cdsc_absaddr.msf.frame
CDADev[wDevID].sc.cdsc_trk,
CDADev[wDevID].sc.cdsc_absaddr.msf.minute,
CDADev[wDevID].sc.cdsc_absaddr.msf.second,
CDADev[wDevID].sc.cdsc_absaddr.msf.frame
#elif __FreeBSD__
CDADev[index].sc.what.position.track_number,
CDADev[index].sc.what.position.absaddr.msf.minute,
CDADev[index].sc.what.position.absaddr.msf.second,
CDADev[index].sc.what.position.absaddr.msf.frame
CDADev[wDevID].sc.what.position.track_number,
CDADev[wDevID].sc.what.position.absaddr.msf.minute,
CDADev[wDevID].sc.what.position.absaddr.msf.second,
CDADev[wDevID].sc.what.position.absaddr.msf.frame
#endif
);
if (oldmode != CDADev[index].mode && oldmode == MCI_MODE_OPEN) {
if (oldmode != CDADev[wDevID].mode && oldmode == MCI_MODE_OPEN) {
if (!CDAUDIO_GetTracksInfo(wDevID)) {
dprintf_cdaudio(stddeb,"CDAUDIO_GetCDStatus // error updating TracksInfo !\n");
return MCIERR_INTERNAL;
@ -569,11 +559,11 @@ static DWORD CDAUDIO_CalcTime(UINT16 wDevID, DWORD dwFormatType, DWORD dwFrame)
{
DWORD dwTime = 0;
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
UINT16 wTrack;
UINT16 wMinutes;
UINT16 wSeconds;
UINT16 wFrames;
dprintf_cdaudio(stddeb,"CDAUDIO_CalcTime(%04X, %08lX, %lu);\n",
wDevID, dwFormatType, dwFrame);
@ -597,11 +587,11 @@ static DWORD CDAUDIO_CalcTime(UINT16 wDevID, DWORD dwFormatType, DWORD dwFrame)
/* unknown format ! force TMSF ! ... */
dwFormatType = MCI_FORMAT_TMSF;
case MCI_FORMAT_TMSF:
for (wTrack = 0; wTrack < CDADev[index].nTracks; wTrack++) {
/* dwTime += CDADev[index].lpdwTrackLen[wTrack - 1];
for (wTrack = 0; wTrack < CDADev[wDevID].nTracks; wTrack++) {
/* dwTime += CDADev[wDevID].lpdwTrackLen[wTrack - 1];
printf("Adding trk#%u curpos=%u \n", dwTime);
if (dwTime >= dwFrame) break; */
if (CDADev[index].lpdwTrackPos[wTrack - 1] >= dwFrame) break;
if (CDADev[wDevID].lpdwTrackPos[wTrack - 1] >= dwFrame) break;
}
wMinutes = dwFrame / CDFRAMES_PERMIN;
wSeconds = (dwFrame - CDFRAMES_PERMIN * wMinutes) / CDFRAMES_PERSEC;
@ -624,27 +614,26 @@ static DWORD CDAUDIO_CalcTime(UINT16 wDevID, DWORD dwFormatType, DWORD dwFrame)
static DWORD CDAUDIO_mciStatus(UINT16 wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_cdaudio(stddeb,"CDAUDIO_mciStatus(%04X, %08lX, %p);\n",
wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
if (CDADev[index].unixdev == 0) return MMSYSERR_NOTENABLED;
if (CDADev[wDevID].unixdev == 0) return MMSYSERR_NOTENABLED;
if (dwFlags & MCI_NOTIFY) {
dprintf_cdaudio(stddeb,
"CDAUDIO_mciStatus // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
lpParms->dwCallback);
mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
CDADev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
CDADev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
}
if (dwFlags & MCI_STATUS_ITEM) {
switch(lpParms->dwItem) {
case MCI_STATUS_CURRENT_TRACK:
if (!CDAUDIO_GetCDStatus(wDevID)) return MCIERR_INTERNAL;
lpParms->dwReturn = CDADev[index].nCurTrack;
lpParms->dwReturn = CDADev[wDevID].nCurTrack;
dprintf_cdaudio(stddeb,"CDAUDIO_mciStatus // CURRENT_TRACK=%lu!\n", lpParms->dwReturn);
return 0;
case MCI_STATUS_LENGTH:
if (CDADev[index].nTracks == 0) {
if (CDADev[wDevID].nTracks == 0) {
if (!CDAUDIO_GetTracksInfo(wDevID)) {
dprintf_cdaudio(stddeb,"CDAUDIO_mciStatus // error reading TracksInfo !\n");
return MCIERR_INTERNAL;
@ -653,24 +642,24 @@ static DWORD CDAUDIO_mciStatus(UINT16 wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS
if (dwFlags & MCI_TRACK) {
dprintf_cdaudio(stddeb,"CDAUDIO_mciStatus // MCI_TRACK #%lu LENGTH=??? !\n",
lpParms->dwTrack);
if (lpParms->dwTrack > CDADev[index].nTracks)
if (lpParms->dwTrack > CDADev[wDevID].nTracks)
return MCIERR_OUTOFRANGE;
lpParms->dwReturn = CDADev[index].lpdwTrackLen[lpParms->dwTrack];
lpParms->dwReturn = CDADev[wDevID].lpdwTrackLen[lpParms->dwTrack];
}
else
lpParms->dwReturn = CDADev[index].dwTotalLen;
lpParms->dwReturn = CDADev[wDevID].dwTotalLen;
lpParms->dwReturn = CDAUDIO_CalcTime(wDevID,
CDADev[index].dwTimeFormat, lpParms->dwReturn);
CDADev[wDevID].dwTimeFormat, lpParms->dwReturn);
dprintf_cdaudio(stddeb,"CDAUDIO_mciStatus // LENGTH=%lu !\n", lpParms->dwReturn);
return 0;
case MCI_STATUS_MODE:
if (!CDAUDIO_GetCDStatus(wDevID)) return MCIERR_INTERNAL;
lpParms->dwReturn = CDADev[index].mode;
lpParms->dwReturn = CDADev[wDevID].mode;
dprintf_cdaudio(stddeb,"CDAUDIO_mciStatus // MCI_STATUS_MODE=%08lX !\n",
lpParms->dwReturn);
return 0;
case MCI_STATUS_MEDIA_PRESENT:
lpParms->dwReturn = (CDADev[index].nTracks > 0) ? TRUE : FALSE;
lpParms->dwReturn = (CDADev[wDevID].nTracks > 0) ? TRUE : FALSE;
if (lpParms->dwReturn == FALSE)
dprintf_cdaudio(stddeb,"CDAUDIO_mciStatus // MEDIA_NOT_PRESENT !\n");
else
@ -684,19 +673,19 @@ static DWORD CDAUDIO_mciStatus(UINT16 wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS
return 0;
case MCI_STATUS_POSITION:
if (!CDAUDIO_GetCDStatus(wDevID)) return MCIERR_INTERNAL;
lpParms->dwReturn = CDADev[index].dwCurFrame;
lpParms->dwReturn = CDADev[wDevID].dwCurFrame;
if (dwFlags & MCI_STATUS_START) {
lpParms->dwReturn = CDADev[index].dwFirstOffset;
lpParms->dwReturn = CDADev[wDevID].dwFirstOffset;
dprintf_cdaudio(stddeb,"CDAUDIO_mciStatus // get MCI_STATUS_START !\n");
}
if (dwFlags & MCI_TRACK) {
if (lpParms->dwTrack > CDADev[index].nTracks)
if (lpParms->dwTrack > CDADev[wDevID].nTracks)
return MCIERR_OUTOFRANGE;
lpParms->dwReturn = CDADev[index].lpdwTrackPos[lpParms->dwTrack - 1];
lpParms->dwReturn = CDADev[wDevID].lpdwTrackPos[lpParms->dwTrack - 1];
dprintf_cdaudio(stddeb,"CDAUDIO_mciStatus // get MCI_TRACK #%lu !\n", lpParms->dwTrack);
}
lpParms->dwReturn = CDAUDIO_CalcTime(wDevID,
CDADev[index].dwTimeFormat, lpParms->dwReturn);
CDADev[wDevID].dwTimeFormat, lpParms->dwReturn);
dprintf_cdaudio(stddeb,"CDAUDIO_mciStatus // MCI_STATUS_POSITION=%08lX !\n",
lpParms->dwReturn);
return 0;
@ -706,7 +695,7 @@ static DWORD CDAUDIO_mciStatus(UINT16 wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS
return 0;
case MCI_STATUS_TIME_FORMAT:
dprintf_cdaudio(stddeb,"CDAUDIO_mciStatus // MCI_STATUS_TIME_FORMAT !\n");
lpParms->dwReturn = CDADev[index].dwTimeFormat;
lpParms->dwReturn = CDADev[wDevID].dwTimeFormat;
return 0;
default:
dprintf_cdaudio(stddeb,"CDAUDIO_mciStatus // unknown command %08lX !\n", lpParms->dwItem);
@ -727,34 +716,34 @@ static DWORD CDAUDIO_mciStatus(UINT16 wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS
static DWORD CDAUDIO_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
int start, end;
#ifdef linux
struct cdrom_msf msf;
#elif __FreeBSD__
struct ioc_play_msf msf;
#endif
dprintf_cdaudio(stddeb,"CDAUDIO_mciPlay(%04X, %08lX, %p);\n",
wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
if (CDADev[index].unixdev == 0) return MMSYSERR_NOTENABLED;
start = 0; end = CDADev[index].dwTotalLen;
CDADev[index].nCurTrack = 1;
if (CDADev[wDevID].unixdev == 0) return MMSYSERR_NOTENABLED;
start = 0; end = CDADev[wDevID].dwTotalLen;
CDADev[wDevID].nCurTrack = 1;
if (dwFlags & MCI_FROM) {
start = CDAUDIO_CalcFrame(wDevID,
CDADev[index].dwTimeFormat, lpParms->dwFrom);
CDADev[wDevID].dwTimeFormat, lpParms->dwFrom);
dprintf_cdaudio(stddeb,"CDAUDIO_mciPlay // MCI_FROM=%08lX -> %u \n",
lpParms->dwFrom, start);
}
if (dwFlags & MCI_TO) {
end = CDAUDIO_CalcFrame(wDevID,
CDADev[index].dwTimeFormat, lpParms->dwTo);
CDADev[wDevID].dwTimeFormat, lpParms->dwTo);
dprintf_cdaudio(stddeb,
"CDAUDIO_mciPlay // MCI_TO=%08lX -> %u \n",
lpParms->dwTo, end);
}
start += CDADev[index].dwFirstOffset;
end += CDADev[index].dwFirstOffset;
start += CDADev[wDevID].dwFirstOffset;
end += CDADev[wDevID].dwFirstOffset;
#ifdef linux
msf.cdmsf_min0 = start / CDFRAMES_PERMIN;
msf.cdmsf_sec0 = (start % CDFRAMES_PERMIN) / CDFRAMES_PERSEC;
@ -770,7 +759,7 @@ static DWORD CDAUDIO_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpPa
msf.end_s = (end % CDFRAMES_PERMIN) / CDFRAMES_PERSEC;
msf.end_f = end % CDFRAMES_PERSEC;
#endif
if (ioctl(CDADev[index].unixdev,
if (ioctl(CDADev[wDevID].unixdev,
#ifdef linux
CDROMSTART
#elif __FreeBSD__
@ -780,7 +769,7 @@ static DWORD CDAUDIO_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpPa
dprintf_cdaudio(stddeb,"CDAUDIO_mciPlay // motor doesn't start !\n");
return MCIERR_HARDWARE;
}
if (ioctl(CDADev[index].unixdev,
if (ioctl(CDADev[wDevID].unixdev,
#ifdef linux
CDROMPLAYMSF
#elif __FreeBSD__
@ -799,14 +788,14 @@ static DWORD CDAUDIO_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpPa
msf.end_m, msf.end_s, msf.end_f
#endif
);
CDADev[index].mode = MCI_MODE_PLAY;
CDADev[wDevID].mode = MCI_MODE_PLAY;
if (dwFlags & MCI_NOTIFY) {
dprintf_cdaudio(stddeb,
"CDAUDIO_mciPlay // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
lpParms->dwCallback);
/*
mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
CDADev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
CDADev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
*/
}
return 0;
@ -821,24 +810,23 @@ static DWORD CDAUDIO_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpPa
static DWORD CDAUDIO_mciStop(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_cdaudio(stddeb,"CDAUDIO_mciStop(%04X, %08lX, %p);\n",
wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
if (ioctl(CDADev[index].unixdev,
if (ioctl(CDADev[wDevID].unixdev,
#ifdef linux
CDROMSTOP
#elif __FreeBSD__
CDIOCSTOP
#endif
)) return MCIERR_HARDWARE;
CDADev[index].mode = MCI_MODE_STOP;
CDADev[wDevID].mode = MCI_MODE_STOP;
if (dwFlags & MCI_NOTIFY) {
dprintf_cdaudio(stddeb,
"CDAUDIO_mciStop // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
lpParms->dwCallback);
mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
CDADev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
CDADev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
}
return 0;
#else
@ -852,24 +840,23 @@ static DWORD CDAUDIO_mciStop(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS l
static DWORD CDAUDIO_mciPause(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_cdaudio(stddeb,"CDAUDIO_mciPause(%04X, %08lX, %p);\n",
wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
if (ioctl(CDADev[index].unixdev,
if (ioctl(CDADev[wDevID].unixdev,
#ifdef linux
CDROMPAUSE
#elif __FreeBSD__
CDIOCPAUSE
#endif
)) return MCIERR_HARDWARE;
CDADev[index].mode = MCI_MODE_PAUSE;
CDADev[wDevID].mode = MCI_MODE_PAUSE;
if (dwFlags & MCI_NOTIFY) {
dprintf_cdaudio(stddeb,
"CDAUDIO_mciPause // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
lpParms->dwCallback);
mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
CDADev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
CDADev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
}
return 0;
#else
@ -883,24 +870,23 @@ static DWORD CDAUDIO_mciPause(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS
static DWORD CDAUDIO_mciResume(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_cdaudio(stddeb,"CDAUDIO_mciResume(%04X, %08lX, %p);\n",
wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
if (ioctl(CDADev[index].unixdev,
if (ioctl(CDADev[wDevID].unixdev,
#ifdef linux
CDROMRESUME
#elif __FreeBSD__
CDIOCRESUME
#endif
)) return MCIERR_HARDWARE;
CDADev[index].mode = MCI_MODE_STOP;
CDADev[wDevID].mode = MCI_MODE_STOP;
if (dwFlags & MCI_NOTIFY) {
dprintf_cdaudio(stddeb,
"CDAUDIO_mciResume // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
lpParms->dwCallback);
mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
CDADev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
CDADev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
}
return 0;
#else
@ -914,13 +900,12 @@ static DWORD CDAUDIO_mciResume(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS
static DWORD CDAUDIO_mciSeek(UINT16 wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
DWORD dwRet;
MCI_PLAY_PARMS PlayParms;
dprintf_cdaudio(stddeb,"CDAUDIO_mciSeek(%04X, %08lX, %p);\n",
wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
if (ioctl(CDADev[index].unixdev,
if (ioctl(CDADev[wDevID].unixdev,
#ifdef linux
CDROMRESUME
#elif __FreeBSD__
@ -930,13 +915,13 @@ static DWORD CDAUDIO_mciSeek(UINT16 wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpPa
perror("ioctl CDROMRESUME");
return MCIERR_HARDWARE;
}
CDADev[index].mode = MCI_MODE_SEEK;
CDADev[wDevID].mode = MCI_MODE_SEEK;
switch(dwFlags) {
case MCI_SEEK_TO_START:
PlayParms.dwFrom = 0;
break;
case MCI_SEEK_TO_END:
PlayParms.dwFrom = CDADev[index].dwTotalLen;
PlayParms.dwFrom = CDADev[wDevID].dwTotalLen;
break;
case MCI_TO:
PlayParms.dwFrom = lpParms->dwTo;
@ -950,7 +935,7 @@ static DWORD CDAUDIO_mciSeek(UINT16 wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpPa
"CDAUDIO_mciSeek // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
lpParms->dwCallback);
mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
CDADev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
CDADev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
}
return dwRet;
#else
@ -965,7 +950,6 @@ static DWORD CDAUDIO_mciSeek(UINT16 wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpPa
static DWORD CDAUDIO_mciSet(UINT16 wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_cdaudio(stddeb,"CDAUDIO_mciSet(%04X, %08lX, %p);\n",
wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
@ -989,32 +973,32 @@ static DWORD CDAUDIO_mciSet(UINT16 wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParm
dprintf_cdaudio(stddeb,"CDAUDIO_mciSet // bad time format !\n");
return MCIERR_BAD_TIME_FORMAT;
}
CDADev[index].dwTimeFormat = lpParms->dwTimeFormat;
CDADev[wDevID].dwTimeFormat = lpParms->dwTimeFormat;
}
if (dwFlags & MCI_SET_DOOR_OPEN) {
dprintf_cdaudio(stddeb,
"CDAUDIO_mciSet // MCI_SET_DOOR_OPEN !\n");
#ifdef __FreeBSD__
if (ioctl(CDADev[index].unixdev, CDIOCALLOW)) return MCIERR_HARDWARE;
if (ioctl(CDADev[index].unixdev, CDIOCEJECT)) return MCIERR_HARDWARE;
if (ioctl(CDADev[index].unixdev, CDIOCPREVENT)) return MCIERR_HARDWARE;
if (ioctl(CDADev[wDevID].unixdev, CDIOCALLOW)) return MCIERR_HARDWARE;
if (ioctl(CDADev[wDevID].unixdev, CDIOCEJECT)) return MCIERR_HARDWARE;
if (ioctl(CDADev[wDevID].unixdev, CDIOCPREVENT)) return MCIERR_HARDWARE;
#elif linux
if (ioctl(CDADev[index].unixdev, CDROMEJECT)) return MCIERR_HARDWARE;
if (ioctl(CDADev[wDevID].unixdev, CDROMEJECT)) return MCIERR_HARDWARE;
#endif
CDADev[index].nTracks = 0;
CDADev[wDevID].nTracks = 0;
}
if (dwFlags & MCI_SET_DOOR_CLOSED) {
dprintf_cdaudio(stddeb,
"CDAUDIO_mciSet // MCI_SET_DOOR_CLOSED !\n");
#ifdef __FreeBSD__
if (ioctl(CDADev[index].unixdev, CDIOCALLOW)) return MCIERR_HARDWARE;
if (ioctl(CDADev[index].unixdev, CDIOCCLOSE)) return MCIERR_HARDWARE;
if (ioctl(CDADev[index].unixdev, CDIOCPREVENT)) return MCIERR_HARDWARE;
if (ioctl(CDADev[wDevID].unixdev, CDIOCALLOW)) return MCIERR_HARDWARE;
if (ioctl(CDADev[wDevID].unixdev, CDIOCCLOSE)) return MCIERR_HARDWARE;
if (ioctl(CDADev[wDevID].unixdev, CDIOCPREVENT)) return MCIERR_HARDWARE;
#elif linux
if (ioctl(CDADev[index].unixdev, CDROMEJECT)) return MCIERR_HARDWARE;
if (ioctl(CDADev[wDevID].unixdev, CDROMEJECT)) return MCIERR_HARDWARE;
/* XXX should it be ",1" ??? */
#endif
CDADev[index].nTracks = 0;
CDADev[wDevID].nTracks = 0;
}
if (dwFlags & MCI_SET_VIDEO) return MCIERR_UNSUPPORTED_FUNCTION;
if (dwFlags & MCI_SET_ON) return MCIERR_UNSUPPORTED_FUNCTION;
@ -1024,7 +1008,7 @@ static DWORD CDAUDIO_mciSet(UINT16 wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParm
"CDAUDIO_mciSet // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
lpParms->dwCallback);
mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
CDADev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
CDADev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
}
return 0;
#else

View File

@ -311,6 +311,7 @@ MCISTR_Open(_MCISTR_PROTO_) {
if (s!=NULL) {
*s++='\0';
pU->openParams.lpstrElementName=SEGPTR_GET(SEGPTR_STRDUP(s));
dwFlags |= MCI_OPEN_ELEMENT;
}
if (!STRCMP(dev,"cdaudio")) {
uDevTyp=MCI_DEVTYPE_CD_AUDIO;
@ -338,7 +339,7 @@ MCISTR_Open(_MCISTR_PROTO_) {
}
}
GetDrv(wDevID)->wType = uDevTyp;
GetDrv(wDevID)->wDeviceID = wDevID;
GetDrv(wDevID)->wDeviceID = 0; /* FIXME? for multiple devices */
pU->openParams.dwCallback = 0;
pU->openParams.wDeviceID = wDevID;
pU->ovlyopenParams.dwStyle = 0;

View File

@ -11,6 +11,7 @@
#include <sys/ioctl.h>
#include "windows.h"
#include "ldt.h"
#include "user.h"
#include "driver.h"
#include "mmsystem.h"
#include "xmalloc.h"
@ -24,8 +25,6 @@
#include <machine/soundcard.h>
#endif
int MMSYSTEM_DevIDToIndex(UINT16);
#if defined(linux) || defined(__FreeBSD__)
#define MIDI_DEV "/dev/sequencer"
@ -35,9 +34,9 @@ int MMSYSTEM_DevIDToIndex(UINT16);
#define IOCTL(a,b,c) (c = ioctl(a,b,c) )
#endif
#define MAX_MIDIINDRV 2
#define MAX_MIDIOUTDRV 2
#define MAX_MCIMIDIDRV 2
#define MAX_MIDIINDRV (1)
#define MAX_MIDIOUTDRV (1)
#define MAX_MCIMIDIDRV (1)
typedef struct {
int unixdev;
@ -71,7 +70,8 @@ typedef struct {
WORD nTracks;
WORD nTempo;
MCI_OPEN_PARMS openParms;
MIDIHDR MidiHdr;
/* MIDIHDR MidiHdr; */
HLOCAL16 hMidiHdr;
WORD dwStatus;
} LINUX_MCIMIDI;
@ -88,11 +88,10 @@ static DWORD MIDI_NotifyClient(UINT16 wDevID, WORD wMsg,
DWORD dwParam1, DWORD dwParam2)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
if (MidiInDev[index].wFlags != DCB_NULL && !DriverCallback(
MidiInDev[index].midiDesc.dwCallback, MidiInDev[index].wFlags,
MidiInDev[index].midiDesc.hMidi, wMsg,
MidiInDev[index].midiDesc.dwInstance, dwParam1, dwParam2)) {
if (MidiInDev[wDevID].wFlags != DCB_NULL && !DriverCallback(
MidiInDev[wDevID].midiDesc.dwCallback, MidiInDev[wDevID].wFlags,
MidiInDev[wDevID].midiDesc.hMidi, wMsg,
MidiInDev[wDevID].midiDesc.dwInstance, dwParam1, dwParam2)) {
dprintf_midi(stddeb, "MIDI_NotifyClient // can't notify client !\n");
return MMSYSERR_NOERROR;
}
@ -108,10 +107,9 @@ static DWORD MIDI_NotifyClient(UINT16 wDevID, WORD wMsg,
*/
static DWORD MIDI_ReadByte(UINT16 wDevID, BYTE *lpbyt)
{
int index = MMSYSTEM_DevIDToIndex(wDevID);
#if defined(linux) || defined(__FreeBSD__)
if (lpbyt != NULL) {
if (mmioRead(MCIMidiDev[index].hFile, (HPSTR)lpbyt,
if (mmioRead(MCIMidiDev[wDevID].hFile, (HPSTR)lpbyt,
(long) sizeof(BYTE)) == (long) sizeof(BYTE)) {
return 0;
}
@ -197,34 +195,33 @@ static DWORD MIDI_ReadVaryLen(UINT16 wDevID, LPDWORD lpdw)
static DWORD MIDI_ReadMThd(UINT16 wDevID, DWORD dwOffset)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
DWORD toberead;
FOURCC fourcc;
dprintf_midi(stddeb, "MIDI_ReadMThd(%04X, %08lX);\n", wDevID, dwOffset);
if (mmioSeek(MCIMidiDev[index].hFile, dwOffset, SEEK_SET) != dwOffset) {
if (mmioSeek(MCIMidiDev[wDevID].hFile, dwOffset, SEEK_SET) != dwOffset) {
dprintf_midi(stddeb, "MIDI_ReadMThd // can't seek at %08lX begin of 'MThd' \n", dwOffset);
return MCIERR_INTERNAL;
}
if (mmioRead(MCIMidiDev[index].hFile, (HPSTR)&fourcc,
if (mmioRead(MCIMidiDev[wDevID].hFile, (HPSTR)&fourcc,
(long) sizeof(FOURCC)) != (long) sizeof(FOURCC)) {
return MCIERR_INTERNAL;
}
if (MIDI_ReadLong(wDevID, &toberead) != 0) {
return MCIERR_INTERNAL;
}
if (MIDI_ReadWord(wDevID, &MCIMidiDev[index].wFormat) != 0) {
if (MIDI_ReadWord(wDevID, &MCIMidiDev[wDevID].wFormat) != 0) {
return MCIERR_INTERNAL;
}
if (MIDI_ReadWord(wDevID, &MCIMidiDev[index].nTracks) != 0) {
if (MIDI_ReadWord(wDevID, &MCIMidiDev[wDevID].nTracks) != 0) {
return MCIERR_INTERNAL;
}
if (MIDI_ReadWord(wDevID, &MCIMidiDev[index].nTempo) != 0) {
if (MIDI_ReadWord(wDevID, &MCIMidiDev[wDevID].nTempo) != 0) {
return MCIERR_INTERNAL;
}
dprintf_midi(stddeb, "MIDI_ReadMThd // toberead=%08lX, wFormat=%04X nTracks=%04X nTempo=%04X\n",
toberead, MCIMidiDev[index].wFormat,
MCIMidiDev[index].nTracks,
MCIMidiDev[index].nTempo);
toberead, MCIMidiDev[wDevID].wFormat,
MCIMidiDev[wDevID].nTracks,
MCIMidiDev[wDevID].nTempo);
toberead -= 3 * sizeof(WORD);
/*
ntrks = read16bit ();
@ -241,13 +238,12 @@ static DWORD MIDI_ReadMThd(UINT16 wDevID, DWORD dwOffset)
static DWORD MIDI_ReadMTrk(UINT16 wDevID, DWORD dwOffset)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
DWORD toberead;
FOURCC fourcc;
if (mmioSeek(MCIMidiDev[index].hFile, dwOffset, SEEK_SET) != dwOffset) {
if (mmioSeek(MCIMidiDev[wDevID].hFile, dwOffset, SEEK_SET) != dwOffset) {
dprintf_midi(stddeb, "MIDI_ReadMTrk // can't seek at %08lX begin of 'MThd' \n", dwOffset);
}
if (mmioRead(MCIMidiDev[index].hFile, (HPSTR)&fourcc,
if (mmioRead(MCIMidiDev[wDevID].hFile, (HPSTR)&fourcc,
(long) sizeof(FOURCC)) != (long) sizeof(FOURCC)) {
return MCIERR_INTERNAL;
}
@ -256,7 +252,7 @@ static DWORD MIDI_ReadMTrk(UINT16 wDevID, DWORD dwOffset)
}
dprintf_midi(stddeb, "MIDI_ReadMTrk // toberead=%08lX\n", toberead);
toberead -= 3 * sizeof(WORD);
MCIMidiDev[index].dwTotalLen = toberead;
MCIMidiDev[wDevID].dwTotalLen = toberead;
return 0;
#else
return MMSYSERR_NOTENABLED;
@ -270,7 +266,6 @@ static DWORD MIDI_ReadMTrk(UINT16 wDevID, DWORD dwOffset)
static DWORD MIDI_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
int index;
MIDIOPENDESC MidiDesc;
DWORD dwRet;
DWORD dwOffset;
@ -280,24 +275,22 @@ static DWORD MIDI_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParms
dprintf_midi(stddeb, "MIDI_mciOpen(%08lX, %p)\n", dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
wDevID = lpParms->wDeviceID;
index = MMSYSTEM_DevIDToIndex(wDevID);
if (MCIMidiDev[index].nUseCount > 0) {
if (MCIMidiDev[wDevID].nUseCount > 0) {
/* The driver already open on this channel */
/* If the driver was opened shareable before and this open specifies */
/* shareable then increment the use count */
if (MCIMidiDev[index].fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
++MCIMidiDev[index].nUseCount;
if (MCIMidiDev[wDevID].fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
++MCIMidiDev[wDevID].nUseCount;
else
return MCIERR_MUST_USE_SHAREABLE;
}
else {
MCIMidiDev[index].nUseCount = 1;
MCIMidiDev[index].fShareable = dwFlags & MCI_OPEN_SHAREABLE;
MCIMidiDev[wDevID].nUseCount = 1;
MCIMidiDev[wDevID].fShareable = dwFlags & MCI_OPEN_SHAREABLE;
MCIMidiDev[wDevID].hMidiHdr = USER_HEAP_ALLOC(sizeof(MIDIHDR));
}
dprintf_midi(stddeb, "MIDI_mciOpen // wDevID=%04X\n", wDevID);
lpParms->wDeviceID = wDevID;
/* lpParms->wDeviceID = wDevID;*/
dprintf_midi(stddeb, "MIDI_mciOpen // lpParms->wDevID=%04X\n", lpParms->wDeviceID);
dprintf_midi(stddeb, "MIDI_mciOpen // before OPEN_ELEMENT\n");
if (dwFlags & MCI_OPEN_ELEMENT) {
@ -306,26 +299,26 @@ static DWORD MIDI_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParms
if (strlen(lpstrElementName) > 0) {
strcpy(str, lpstrElementName);
CharUpper32A(str);
MCIMidiDev[index].hFile = mmioOpen(str, NULL,
MCIMidiDev[wDevID].hFile = mmioOpen(str, NULL,
MMIO_ALLOCBUF | MMIO_READWRITE | MMIO_EXCLUSIVE);
if (MCIMidiDev[index].hFile == 0) {
if (MCIMidiDev[wDevID].hFile == 0) {
dprintf_midi(stddeb, "MIDI_mciOpen // can't find file='%s' !\n", str);
return MCIERR_FILE_NOT_FOUND;
}
}
else
MCIMidiDev[index].hFile = 0;
MCIMidiDev[wDevID].hFile = 0;
}
dprintf_midi(stddeb, "MIDI_mciOpen // hFile=%u\n", MCIMidiDev[index].hFile);
memcpy(&MCIMidiDev[index].openParms, lpParms, sizeof(MCI_OPEN_PARMS));
MCIMidiDev[index].wNotifyDeviceID = lpParms->wDeviceID;
MCIMidiDev[index].dwStatus = MCI_MODE_STOP;
MCIMidiDev[index].dwBeginData = 0;
MCIMidiDev[index].dwTotalLen = 0;
dprintf_midi(stddeb, "MIDI_mciOpen // hFile=%u\n", MCIMidiDev[wDevID].hFile);
memcpy(&MCIMidiDev[wDevID].openParms, lpParms, sizeof(MCI_OPEN_PARMS));
MCIMidiDev[wDevID].wNotifyDeviceID = lpParms->wDeviceID;
MCIMidiDev[wDevID].dwStatus = MCI_MODE_STOP;
MCIMidiDev[wDevID].dwBeginData = 0;
MCIMidiDev[wDevID].dwTotalLen = 0;
MidiDesc.hMidi = 0;
if (MCIMidiDev[index].hFile != 0) {
if (MCIMidiDev[wDevID].hFile != 0) {
MMCKINFO ckMainRIFF;
if (mmioDescend(MCIMidiDev[index].hFile, &ckMainRIFF, NULL, 0) != 0) {
if (mmioDescend(MCIMidiDev[wDevID].hFile, &ckMainRIFF, NULL, 0) != 0) {
return MCIERR_INTERNAL;
}
dprintf_midi(stddeb,"MIDI_mciOpen // ParentChunk ckid=%.4s fccType=%.4s cksize=%08lX \n",
@ -344,19 +337,19 @@ static DWORD MIDI_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParms
dprintf_midi(stddeb, "MIDI_mciOpen // can't read 'MThd' header \n");
return MCIERR_INTERNAL;
}
dwOffset = mmioSeek(MCIMidiDev[index].hFile, 0, SEEK_CUR);
dwOffset = mmioSeek(MCIMidiDev[wDevID].hFile, 0, SEEK_CUR);
if (MIDI_ReadMTrk(wDevID, dwOffset) != 0) {
dprintf_midi(stddeb, "MIDI_mciOpen // can't read 'MTrk' header \n");
return MCIERR_INTERNAL;
}
dwOffset = mmioSeek(MCIMidiDev[index].hFile, 0, SEEK_CUR);
MCIMidiDev[index].dwBeginData = dwOffset;
dwOffset = mmioSeek(MCIMidiDev[wDevID].hFile, 0, SEEK_CUR);
MCIMidiDev[wDevID].dwBeginData = dwOffset;
dprintf_midi(stddeb, "MIDI_mciOpen // Chunk Found ckid=%.4s fccType=%.4s cksize=%08lX \n",
(LPSTR)&ckMainRIFF.ckid, (LPSTR)&ckMainRIFF.fccType,
ckMainRIFF.cksize);
}
dwRet = modMessage(wDevID, MODM_OPEN, 0, (DWORD)&MidiDesc, CALLBACK_NULL);
dwRet = midMessage(wDevID, MIDM_OPEN, 0, (DWORD)&MidiDesc, CALLBACK_NULL);
/* dwRet = midMessage(wDevID, MIDM_OPEN, 0, (DWORD)&MidiDesc, CALLBACK_NULL); */
return 0;
#else
return MMSYSERR_NOTENABLED;
@ -370,12 +363,11 @@ static DWORD MIDI_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS lpParms
static DWORD MIDI_mciStop(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_midi(stddeb, "MIDI_mciStop(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
MCIMidiDev[index].dwStatus = MCI_MODE_STOP;
dprintf_midi(stddeb, "MIDI_mciStop // MCIMidiDev[index].dwStatus=%p %d\n",
&MCIMidiDev[index].dwStatus, MCIMidiDev[index].dwStatus);
MCIMidiDev[wDevID].dwStatus = MCI_MODE_STOP;
dprintf_midi(stddeb, "MIDI_mciStop // MCIMidiDev[wDevID].dwStatus=%p %d\n",
&MCIMidiDev[wDevID].dwStatus, MCIMidiDev[wDevID].dwStatus);
return 0;
#else
return MCIERR_INTERNAL;
@ -389,24 +381,27 @@ static DWORD MIDI_mciStop(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpPa
static DWORD MIDI_mciClose(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
DWORD dwRet;
dprintf_midi(stddeb, "MIDI_mciClose(%04X, %08lX, %p);\n", wDevID, dwParam, lpParms);
if (MCIMidiDev[index].dwStatus != MCI_MODE_STOP) {
if (MCIMidiDev[wDevID].dwStatus != MCI_MODE_STOP) {
MIDI_mciStop(wDevID, MCI_WAIT, lpParms);
}
MCIMidiDev[index].dwStatus = MCI_MODE_STOP;
MCIMidiDev[index].nUseCount--;
if (MCIMidiDev[index].nUseCount == 0) {
if (MCIMidiDev[index].hFile != 0) {
mmioClose(MCIMidiDev[index].hFile, 0);
MCIMidiDev[index].hFile = 0;
MCIMidiDev[wDevID].dwStatus = MCI_MODE_STOP;
MCIMidiDev[wDevID].nUseCount--;
if (MCIMidiDev[wDevID].nUseCount == 0) {
if (MCIMidiDev[wDevID].hFile != 0) {
mmioClose(MCIMidiDev[wDevID].hFile, 0);
MCIMidiDev[wDevID].hFile = 0;
dprintf_midi(stddeb, "MIDI_mciClose // hFile closed !\n");
}
USER_HEAP_FREE(MCIMidiDev[wDevID].hMidiHdr);
dwRet = modMessage(wDevID, MODM_CLOSE, 0, 0L, 0L);
if (dwRet != MMSYSERR_NOERROR) return MCIERR_INTERNAL;
/*
dwRet = midMessage(wDevID, MIDM_CLOSE, 0, 0L, 0L);
if (dwRet != MMSYSERR_NOERROR) return MCIERR_INTERNAL;
*/
}
return 0;
#else
@ -421,17 +416,18 @@ static DWORD MIDI_mciClose(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpP
static DWORD MIDI_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
int count;
int start, end;
LPMIDIHDR lpMidiHdr;
DWORD lp16MidiHdr;
DWORD dwData;
LPWORD ptr;
DWORD dwRet;
dprintf_midi(stddeb, "MIDI_mciPlay(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);
if (MCIMidiDev[index].hFile == 0) {
if (MCIMidiDev[wDevID].hFile == 0) {
dprintf_midi(stddeb, "MIDI_mciPlay // can't find file='%08lx' !\n",
MCIMidiDev[index].openParms.lpstrElementName);
MCIMidiDev[wDevID].openParms.lpstrElementName);
return MCIERR_FILE_NOT_FOUND;
}
start = 1; end = 99999;
@ -459,42 +455,71 @@ static DWORD MIDI_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms
}
}
#endif
lpMidiHdr = &MCIMidiDev[index].MidiHdr;
lpMidiHdr = USER_HEAP_LIN_ADDR(MCIMidiDev[wDevID].hMidiHdr);
lp16MidiHdr = USER_HEAP_SEG_ADDR(MCIMidiDev[wDevID].hMidiHdr);
lpMidiHdr->lpData = (LPSTR) malloc(1200);
if (lpMidiHdr->lpData == NULL) return MCIERR_INTERNAL;
lpMidiHdr->dwBufferLength = 1024;
lpMidiHdr->dwUser = 0L;
lpMidiHdr->dwFlags = 0L;
dwRet = modMessage(wDevID, MODM_PREPARE, 0, (DWORD)lpMidiHdr, sizeof(MIDIHDR));
dwRet = modMessage(wDevID, MODM_PREPARE, 0, (DWORD)lp16MidiHdr, sizeof(MIDIHDR));
/* dprintf_midi(stddeb, "MIDI_mciPlay // after MODM_PREPARE \n"); */
MCIMidiDev[index].dwStatus = MCI_MODE_PLAY;
while(MCIMidiDev[index].dwStatus != MCI_MODE_STOP) {
dprintf_midi(stddeb, "MIDI_mciPlay // MCIMidiDev[index].dwStatus=%p %d\n",
&MCIMidiDev[index].dwStatus, MCIMidiDev[index].dwStatus);
MCIMidiDev[wDevID].dwStatus = MCI_MODE_PLAY;
while(MCIMidiDev[wDevID].dwStatus != MCI_MODE_STOP) {
dprintf_midi(stddeb, "MIDI_mciPlay // MCIMidiDev[wDevID].dwStatus=%p %d\n",
&MCIMidiDev[wDevID].dwStatus, MCIMidiDev[wDevID].dwStatus);
ptr = (LPWORD)lpMidiHdr->lpData;
for (count = 0; count < lpMidiHdr->dwBufferLength; count++) {
if (MIDI_ReadVaryLen(wDevID, &dwData) != 0) break;
*ptr = LOWORD(dwData);
}
/*
count = mmioRead(MCIMidiDev[index].hFile, lpMidiHdr->lpData, lpMidiHdr->dwBufferLength);
count = mmioRead(MCIMidiDev[wDevID].hFile, lpMidiHdr->lpData, lpMidiHdr->dwBufferLength);
*/
dprintf_midi(stddeb, "MIDI_mciPlay // after read count = %d\n",count);
if (count < 1) break;
lpMidiHdr->dwBytesRecorded = count;
dprintf_midi(stddeb, "MIDI_mciPlay // before MODM_LONGDATA lpMidiHdr=%p dwBytesRecorded=%lu\n",
lpMidiHdr, lpMidiHdr->dwBytesRecorded);
dwRet = modMessage(wDevID, MODM_LONGDATA, 0, (DWORD)lpMidiHdr, sizeof(MIDIHDR));
dwRet = modMessage(wDevID, MODM_LONGDATA, 0, (DWORD)lp16MidiHdr, sizeof(MIDIHDR));
if (dwRet != MMSYSERR_NOERROR) {
switch (dwRet) {
case MMSYSERR_NOTENABLED:
return MCIERR_DEVICE_NOT_READY;
case MIDIERR_NODEVICE:
return MCIERR_INVALID_DEVICE_ID;
case MIDIERR_UNPREPARED:
return MCIERR_DRIVER_INTERNAL;
case MIDIERR_STILLPLAYING:
return MCIERR_SEQ_PORT_INUSE;
case MMSYSERR_INVALPARAM:
return MCIERR_CANNOT_LOAD_DRIVER;
default:
return MCIERR_DRIVER;
}
dwRet = modMessage(wDevID, MODM_UNPREPARE, 0, (DWORD)lpMidiHdr, sizeof(MIDIHDR));
}
}
dwRet = modMessage(wDevID, MODM_UNPREPARE, 0, (DWORD)lp16MidiHdr, sizeof(MIDIHDR));
if (lpMidiHdr->lpData != NULL) {
free(lpMidiHdr->lpData);
lpMidiHdr->lpData = NULL;
}
MCIMidiDev[index].dwStatus = MCI_MODE_STOP;
MCIMidiDev[wDevID].dwStatus = MCI_MODE_STOP;
if (dwFlags & MCI_NOTIFY) {
dprintf_midi(stddeb, "MIDI_mciPlay // MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
MCIMidiDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
MCIMidiDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
#if 0
exit(1);
#endif
@ -503,7 +528,7 @@ static DWORD MIDI_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms
#else
return MMSYSERR_NOTENABLED;
#endif
}
}
/**************************************************************************
@ -512,15 +537,14 @@ static DWORD MIDI_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms
static DWORD MIDI_mciRecord(UINT16 wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
int start, end;
LPMIDIHDR lpMidiHdr;
DWORD dwRet;
dprintf_midi(stddeb, "MIDI_mciRecord(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);
if (MCIMidiDev[index].hFile == 0) {
if (MCIMidiDev[wDevID].hFile == 0) {
dprintf_midi(stddeb, "MIDI_mciRecord // can't find file='%08lx' !\n",
MCIMidiDev[index].openParms.lpstrElementName);
MCIMidiDev[wDevID].openParms.lpstrElementName);
return MCIERR_FILE_NOT_FOUND;
}
start = 1; end = 99999;
@ -532,17 +556,17 @@ static DWORD MIDI_mciRecord(UINT16 wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpP
end = lpParms->dwTo;
dprintf_midi(stddeb, "MIDI_mciRecord // MCI_TO=%d \n", end);
}
lpMidiHdr = &MCIMidiDev[index].MidiHdr;
lpMidiHdr = USER_HEAP_LIN_ADDR(MCIMidiDev[wDevID].hMidiHdr);
lpMidiHdr->lpData = (LPSTR) xmalloc(1200);
lpMidiHdr->dwBufferLength = 1024;
lpMidiHdr->dwUser = 0L;
lpMidiHdr->dwFlags = 0L;
dwRet = midMessage(wDevID, MIDM_PREPARE, 0, (DWORD)lpMidiHdr, sizeof(MIDIHDR));
dprintf_midi(stddeb, "MIDI_mciRecord // after MIDM_PREPARE \n");
MCIMidiDev[index].dwStatus = MCI_MODE_RECORD;
while(MCIMidiDev[index].dwStatus != MCI_MODE_STOP) {
dprintf_midi(stddeb, "MIDI_mciRecord // MCIMidiDev[index].dwStatus=%p %d\n",
&MCIMidiDev[index].dwStatus, MCIMidiDev[index].dwStatus);
MCIMidiDev[wDevID].dwStatus = MCI_MODE_RECORD;
while(MCIMidiDev[wDevID].dwStatus != MCI_MODE_STOP) {
dprintf_midi(stddeb, "MIDI_mciRecord // MCIMidiDev[wDevID].dwStatus=%p %d\n",
&MCIMidiDev[wDevID].dwStatus, MCIMidiDev[wDevID].dwStatus);
lpMidiHdr->dwBytesRecorded = 0;
dwRet = midMessage(wDevID, MIDM_START, 0, 0L, 0L);
dprintf_midi(stddeb, "MIDI_mciRecord // after MIDM_START lpMidiHdr=%p dwBytesRecorded=%lu\n",
@ -556,11 +580,11 @@ static DWORD MIDI_mciRecord(UINT16 wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpP
free(lpMidiHdr->lpData);
lpMidiHdr->lpData = NULL;
}
MCIMidiDev[index].dwStatus = MCI_MODE_STOP;
MCIMidiDev[wDevID].dwStatus = MCI_MODE_STOP;
if (dwFlags & MCI_NOTIFY) {
dprintf_midi(stddeb, "MIDI_mciRecord // MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
MCIMidiDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
MCIMidiDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
}
return 0;
#else
@ -671,7 +695,6 @@ static DWORD MIDI_mciSet(UINT16 wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
static DWORD MIDI_mciStatus(UINT16 wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_midi(stddeb, "MIDI_mciStatus(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
if (dwFlags & MCI_STATUS_ITEM) {
@ -746,7 +769,7 @@ static DWORD MIDI_mciStatus(UINT16 wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpP
if (dwFlags & MCI_NOTIFY) {
dprintf_midi(stddeb, "MIDI_mciStatus // MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
MCIMidiDev[index].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
MCIMidiDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
}
return 0;
#else
@ -850,7 +873,6 @@ static DWORD midGetDevCaps(WORD wDevID, LPMIDIINCAPS lpCaps, DWORD dwSize)
static DWORD midOpen(WORD wDevID, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
int midi;
dprintf_midi(stddeb,
"midOpen(%04X, %p, %08lX);\n", wDevID, lpDesc, dwFlags);
@ -858,18 +880,18 @@ static DWORD midOpen(WORD wDevID, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
dprintf_midi(stddeb,"Linux 'midOpen' // Invalid Parameter !\n");
return MMSYSERR_INVALPARAM;
}
if (index >= MAX_MIDIINDRV) {
if (wDevID >= MAX_MIDIINDRV) {
dprintf_midi(stddeb,"Linux 'midOpen' // MAX_MIDIINDRV reached !\n");
return MMSYSERR_ALLOCATED;
}
MidiInDev[index].unixdev = 0;
MidiInDev[wDevID].unixdev = 0;
midi = open (MIDI_DEV, O_RDONLY, 0);
if (midi == -1) {
dprintf_midi(stddeb,"Linux 'midOpen' // can't open !\n");
return MMSYSERR_NOTENABLED;
}
MidiInDev[index].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
switch(MidiInDev[index].wFlags) {
MidiInDev[wDevID].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
switch(MidiInDev[wDevID].wFlags) {
case DCB_NULL:
dprintf_midi(stddeb,"Linux 'midOpen' // CALLBACK_NULL !\n");
break;
@ -886,10 +908,10 @@ static DWORD midOpen(WORD wDevID, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
"Linux 'midOpen' // CALLBACK_FUNCTION !\n");
break;
}
MidiInDev[index].lpQueueHdr = NULL;
MidiInDev[index].unixdev = midi;
MidiInDev[index].dwTotalPlayed = 0;
MidiInDev[index].bufsize = 0x3FFF;
MidiInDev[wDevID].lpQueueHdr = NULL;
MidiInDev[wDevID].unixdev = midi;
MidiInDev[wDevID].dwTotalPlayed = 0;
MidiInDev[wDevID].bufsize = 0x3FFF;
if (MIDI_NotifyClient(wDevID, MIM_OPEN, 0L, 0L) != MMSYSERR_NOERROR) {
dprintf_midi(stddeb,"Linux 'midOpen' // can't notify client !\n");
return MMSYSERR_INVALPARAM;
@ -906,15 +928,14 @@ static DWORD midOpen(WORD wDevID, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
static DWORD midClose(WORD wDevID)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_midi(stddeb, "midClose(%04X);\n", wDevID);
if (MidiInDev[index].unixdev == 0) {
if (MidiInDev[wDevID].unixdev == 0) {
dprintf_midi(stddeb,"Linux 'midClose' // can't close !\n");
return MMSYSERR_NOTENABLED;
}
close(MidiInDev[index].unixdev);
MidiInDev[index].unixdev = 0;
MidiInDev[index].bufsize = 0;
close(MidiInDev[wDevID].unixdev);
MidiInDev[wDevID].unixdev = 0;
MidiInDev[wDevID].bufsize = 0;
if (MIDI_NotifyClient(wDevID, MIM_CLOSE, 0L, 0L) != MMSYSERR_NOERROR) {
dprintf_midi(stddeb,"Linux 'midClose' // can't notify client !\n");
return MMSYSERR_INVALPARAM;
@ -1036,26 +1057,26 @@ static DWORD modGetDevCaps(WORD wDevID, LPMIDIOUTCAPS lpCaps, DWORD dwSize)
static DWORD modOpen(WORD wDevID, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
int midi;
dprintf_midi(stddeb,
"modOpen(%04X, %p, %08lX);\n", wDevID, lpDesc, dwFlags);
if (lpDesc == NULL) {
dprintf_midi(stddeb,"Linux 'modOpen' // Invalid Parameter !\n");
return MMSYSERR_INVALPARAM;
}
if (index >= MAX_MIDIOUTDRV) {
if (wDevID>= MAX_MIDIOUTDRV) {
dprintf_midi(stddeb,"Linux 'modOpen' // MAX_MIDIOUTDRV reached !\n");
return MMSYSERR_ALLOCATED;
}
MidiOutDev[index].unixdev = 0;
MidiOutDev[wDevID].unixdev = 0;
midi = open (MIDI_DEV, O_WRONLY, 0);
if (midi == -1) {
dprintf_midi(stddeb,"Linux 'modOpen' // can't open !\n");
return MMSYSERR_NOTENABLED;
}
MidiOutDev[index].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
switch(MidiOutDev[index].wFlags) {
MidiOutDev[wDevID].wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
switch(MidiOutDev[wDevID].wFlags) {
case DCB_NULL:
dprintf_midi(stddeb,"Linux 'modOpen' // CALLBACK_NULL !\n");
break;
@ -1072,10 +1093,10 @@ static DWORD modOpen(WORD wDevID, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
"Linux 'modOpen' // CALLBACK_FUNCTION !\n");
break;
}
MidiOutDev[index].lpQueueHdr = NULL;
MidiOutDev[index].unixdev = midi;
MidiOutDev[index].dwTotalPlayed = 0;
MidiOutDev[index].bufsize = 0x3FFF;
MidiOutDev[wDevID].lpQueueHdr = NULL;
MidiOutDev[wDevID].unixdev = midi;
MidiOutDev[wDevID].dwTotalPlayed = 0;
MidiOutDev[wDevID].bufsize = 0x3FFF;
if (MIDI_NotifyClient(wDevID, MOM_OPEN, 0L, 0L) != MMSYSERR_NOERROR) {
dprintf_midi(stddeb,"Linux 'modOpen' // can't notify client !\n");
return MMSYSERR_INVALPARAM;
@ -1095,15 +1116,14 @@ static DWORD modOpen(WORD wDevID, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
static DWORD modClose(WORD wDevID)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_midi(stddeb, "modClose(%04X);\n", wDevID);
if (MidiOutDev[index].unixdev == 0) {
if (MidiOutDev[wDevID].unixdev == 0) {
dprintf_midi(stddeb,"Linux 'modClose' // can't close !\n");
return MMSYSERR_NOTENABLED;
}
close(MidiOutDev[index].unixdev);
MidiOutDev[index].unixdev = 0;
MidiOutDev[index].bufsize = 0;
close(MidiOutDev[wDevID].unixdev);
MidiOutDev[wDevID].unixdev = 0;
MidiOutDev[wDevID].bufsize = 0;
if (MIDI_NotifyClient(wDevID, MOM_CLOSE, 0L, 0L) != MMSYSERR_NOERROR) {
dprintf_midi(stddeb,"Linux 'modClose' // can't notify client !\n");
return MMSYSERR_INVALPARAM;
@ -1120,16 +1140,16 @@ static DWORD modClose(WORD wDevID)
static DWORD modData(WORD wDevID, DWORD dwParam)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
WORD event;
dprintf_midi(stddeb,
"modData(%04X, %08lX);\n", wDevID, dwParam);
if (MidiOutDev[index].unixdev == 0) {
if (MidiOutDev[wDevID].unixdev == 0) {
dprintf_midi(stddeb,"Linux 'modData' // can't play !\n");
return MIDIERR_NODEVICE;
}
event = LOWORD(dwParam);
if (write (MidiOutDev[index].unixdev,
if (write (MidiOutDev[wDevID].unixdev,
&event, sizeof(WORD)) != sizeof(WORD)) {
dprintf_midi(stddeb,
"modData() // error writting unixdev !\n");
@ -1146,12 +1166,13 @@ static DWORD modData(WORD wDevID, DWORD dwParam)
static DWORD modLongData(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
int count;
LPWORD ptr;
int en;
dprintf_midi(stddeb,
"modLongData(%04X, %p, %08lX);\n", wDevID, lpMidiHdr, dwSize);
if (MidiOutDev[index].unixdev == 0) {
if (MidiOutDev[wDevID].unixdev == 0) {
dprintf_midi(stddeb,"Linux 'modLongData' // can't play !\n");
return MIDIERR_NODEVICE;
}
@ -1162,20 +1183,30 @@ static DWORD modLongData(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
lpMidiHdr->dwFlags |= MHDR_INQUEUE;
dprintf_midi(stddeb,
"modLongData() // dwBytesRecorded %lu !\n", lpMidiHdr->dwBytesRecorded);
dprintf_midi(stddeb,
" %02X %02X %02X %02X\n",lpMidiHdr->lpData[0],
lpMidiHdr->lpData[1],
lpMidiHdr->lpData[2],
lpMidiHdr->lpData[3]);
/*
count = write (MidiOutDev[index].unixdev,
count = write (MidiOutDev[wDevID].unixdev,
lpMidiHdr->lpData, lpMidiHdr->dwBytesRecorded);
*/
ptr = (LPWORD)lpMidiHdr->lpData;
for (count = 0; count < lpMidiHdr->dwBytesRecorded; count++) {
if (write (MidiOutDev[index].unixdev, ptr,
if (write (MidiOutDev[wDevID].unixdev, ptr,
sizeof(WORD)) != sizeof(WORD)) break;
ptr++;
}
en = errno;
dprintf_midi(stddeb, "Linux 'modLongData' // after write count = %d\n",count);
if (count != lpMidiHdr->dwBytesRecorded) {
dprintf_midi(stddeb,
"modLongData() // error writting unixdev #%d ! (%d != %ld)\n",
MidiOutDev[index].unixdev, count, lpMidiHdr->dwBytesRecorded);
MidiOutDev[wDevID].unixdev, count, lpMidiHdr->dwBytesRecorded);
dprintf_midi(stddeb,
" errno = %d error = %s\n",en,strerror(en));
return MMSYSERR_NOTENABLED;
}
lpMidiHdr->dwFlags &= ~MHDR_INQUEUE;
@ -1196,19 +1227,18 @@ static DWORD modLongData(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
static DWORD modPrepare(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_midi(stddeb,
"modPrepare(%04X, %p, %08lX);\n", wDevID, lpMidiHdr, dwSize);
if (MidiOutDev[index].unixdev == 0) {
if (MidiOutDev[wDevID].unixdev == 0) {
dprintf_midi(stddeb,"Linux 'modPrepare' // can't prepare !\n");
return MMSYSERR_NOTENABLED;
}
if (MidiOutDev[index].lpQueueHdr != NULL) {
if (MidiOutDev[wDevID].lpQueueHdr != NULL) {
dprintf_midi(stddeb,"Linux 'modPrepare' // already prepare !\n");
return MMSYSERR_NOTENABLED;
}
MidiOutDev[index].dwTotalPlayed = 0;
MidiOutDev[index].lpQueueHdr = lpMidiHdr;
MidiOutDev[wDevID].dwTotalPlayed = 0;
MidiOutDev[wDevID].lpQueueHdr = PTR_SEG_TO_LIN(lpMidiHdr);
if (lpMidiHdr->dwFlags & MHDR_INQUEUE) return MIDIERR_STILLPLAYING;
lpMidiHdr->dwFlags |= MHDR_PREPARED;
lpMidiHdr->dwFlags &= ~MHDR_DONE;
@ -1224,10 +1254,9 @@ static DWORD modPrepare(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
static DWORD modUnprepare(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
{
#if defined(linux) || defined(__FreeBSD__)
int index = MMSYSTEM_DevIDToIndex(wDevID);
dprintf_midi(stddeb,
"modUnprepare(%04X, %p, %08lX);\n", wDevID, lpMidiHdr, dwSize);
if (MidiOutDev[index].unixdev == 0) {
if (MidiOutDev[wDevID].unixdev == 0) {
dprintf_midi(stddeb,"Linux 'modUnprepare' // can't unprepare !\n");
return MMSYSERR_NOTENABLED;
}

View File

@ -18,9 +18,12 @@
#ifdef linux
#include <linux/soundcard.h>
#elif __FreeBSD__
#include <machine/soundcard.h>
#endif
int MMSYSTEM_DevIDToIndex(UINT16);
#include "stddebug.h"
#include "debug.h"
#define SOUND_DEV "/dev/dsp"
#define MIXER_DEV "/dev/mixer"
@ -45,15 +48,15 @@ static DWORD AUX_GetDevCaps(WORD wDevID, LPAUXCAPS lpCaps, DWORD dwSize)
#ifdef linux
int mixer;
int volume;
printf("AUX_GetDevCaps(%04X, %p, %lu);\n", wDevID, lpCaps, dwSize);
dprintf_mmaux(stddeb,"AUX_GetDevCaps(%04X, %p, %lu);\n", wDevID, lpCaps, dwSize);
if (lpCaps == NULL) return MMSYSERR_NOTENABLED;
if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
printf("AUX_GetDevCaps // mixer device not available !\n");
dprintf_mmaux(stddeb,"AUX_GetDevCaps // mixer device not available !\n");
return MMSYSERR_NOTENABLED;
}
if (ioctl(mixer, SOUND_MIXER_READ_LINE, &volume) == -1) {
close(mixer);
printf("AUX_GetDevCaps // unable read mixer !\n");
dprintf_mmaux(stddeb,"AUX_GetDevCaps // unable read mixer !\n");
return MMSYSERR_NOTENABLED;
}
close(mixer);
@ -61,7 +64,7 @@ static DWORD AUX_GetDevCaps(WORD wDevID, LPAUXCAPS lpCaps, DWORD dwSize)
lpCaps->wMid = 0x0002;
lpCaps->vDriverVersion = 0x0200;
lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
switch (MMSYSTEM_DevIDToIndex(wDevID)) {
switch (wDevID) {
case 0:
lpCaps->wPid = 0x0196;
strcpy(lpCaps->szPname, "SB16 Aux: Wave");
@ -117,49 +120,50 @@ static DWORD AUX_GetVolume(WORD wDevID, LPDWORD lpdwVol)
int mixer;
int volume, left, right;
int cmd;
printf("AUX_GetVolume(%04X, %p);\n", wDevID, lpdwVol);
dprintf_mmaux(stddeb,"AUX_GetVolume(%04X, %p);\n", wDevID, lpdwVol);
if (lpdwVol == NULL) return MMSYSERR_NOTENABLED;
if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
printf("Linux 'AUX_GetVolume' // mixer device not available !\n");
dprintf_mmaux(stddeb,"Linux 'AUX_GetVolume' // mixer device not available !\n");
return MMSYSERR_NOTENABLED;
}
switch(MMSYSTEM_DevIDToIndex(wDevID)) {
switch(wDevID) {
case 0:
printf("Linux 'AUX_GetVolume' // SOUND_MIXER_READ_PCM !\n");
dprintf_mmaux(stddeb,"Linux 'AUX_GetVolume' // SOUND_MIXER_READ_PCM !\n");
cmd = SOUND_MIXER_READ_PCM;
break;
case 1:
printf("Linux 'AUX_GetVolume' // SOUND_MIXER_READ_SYNTH !\n");
dprintf_mmaux(stddeb,"Linux 'AUX_GetVolume' // SOUND_MIXER_READ_SYNTH !\n");
cmd = SOUND_MIXER_READ_SYNTH;
break;
case 2:
printf("Linux 'AUX_GetVolume' // SOUND_MIXER_READ_CD !\n");
dprintf_mmaux(stddeb,"Linux 'AUX_GetVolume' // SOUND_MIXER_READ_CD !\n");
cmd = SOUND_MIXER_READ_CD;
break;
case 3:
printf("Linux 'AUX_GetVolume' // SOUND_MIXER_READ_LINE !\n");
dprintf_mmaux(stddeb,"Linux 'AUX_GetVolume' // SOUND_MIXER_READ_LINE !\n");
cmd = SOUND_MIXER_READ_LINE;
break;
case 4:
printf("Linux 'AUX_GetVolume' // SOUND_MIXER_READ_MIC !\n");
dprintf_mmaux(stddeb,"Linux 'AUX_GetVolume' // SOUND_MIXER_READ_MIC !\n");
cmd = SOUND_MIXER_READ_MIC;
break;
case 5:
printf("Linux 'AUX_GetVolume' // SOUND_MIXER_READ_VOLUME !\n");
dprintf_mmaux(stddeb,"Linux 'AUX_GetVolume' // SOUND_MIXER_READ_VOLUME !\n");
cmd = SOUND_MIXER_READ_VOLUME;
break;
default:
fprintf(stderr, "Linux 'AUX_GetVolume' // invalid device id=%04X !\n", wDevID);
dprintf_mmaux(stddeb, "Linux 'AUX_GetVolume' // invalid device id=%04X !\n", wDevID);
return MMSYSERR_NOTENABLED;
}
if (ioctl(mixer, cmd, &volume) == -1) {
printf("Linux 'AUX_GetVolume' // unable read mixer !\n");
dprintf_mmaux(stddeb,"Linux 'AUX_GetVolume' // unable read mixer !\n");
return MMSYSERR_NOTENABLED;
}
close(mixer);
left = volume & 0x7F;
right = (volume >> 8) & 0x7F;
printf("Linux 'AUX_GetVolume' // left=%d right=%d !\n", left, right);
dprintf_mmaux(stddeb,"Linux 'AUX_GetVolume' // left=%d right=%d !\n", left, right);
*lpdwVol = MAKELONG(left << 9, right << 9);
return MMSYSERR_NOERROR;
#else
@ -176,44 +180,44 @@ static DWORD AUX_SetVolume(WORD wDevID, DWORD dwParam)
int mixer;
int volume;
int cmd;
printf("AUX_SetVolume(%04X, %08lX);\n", wDevID, dwParam);
dprintf_mmaux(stddeb,"AUX_SetVolume(%04X, %08lX);\n", wDevID, dwParam);
volume = (LOWORD(dwParam) >> 9 & 0x7F) +
((HIWORD(dwParam) >> 9 & 0x7F) << 8);
if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
printf("Linux 'AUX_SetVolume' // mixer device not available !\n");
dprintf_mmaux(stddeb,"Linux 'AUX_SetVolume' // mixer device not available !\n");
return MMSYSERR_NOTENABLED;
}
switch(MMSYSTEM_DevIDToIndex(wDevID)) {
switch(wDevID) {
case 0:
printf("Linux 'AUX_SetVolume' // SOUND_MIXER_WRITE_PCM !\n");
dprintf_mmaux(stddeb,"Linux 'AUX_SetVolume' // SOUND_MIXER_WRITE_PCM !\n");
cmd = SOUND_MIXER_WRITE_PCM;
break;
case 1:
printf("Linux 'AUX_SetVolume' // SOUND_MIXER_WRITE_SYNTH !\n");
dprintf_mmaux(stddeb,"Linux 'AUX_SetVolume' // SOUND_MIXER_WRITE_SYNTH !\n");
cmd = SOUND_MIXER_WRITE_SYNTH;
break;
case 2:
printf("Linux 'AUX_SetVolume' // SOUND_MIXER_WRITE_CD !\n");
dprintf_mmaux(stddeb,"Linux 'AUX_SetVolume' // SOUND_MIXER_WRITE_CD !\n");
cmd = SOUND_MIXER_WRITE_CD;
break;
case 3:
printf("Linux 'AUX_SetVolume' // SOUND_MIXER_WRITE_LINE !\n");
dprintf_mmaux(stddeb,"Linux 'AUX_SetVolume' // SOUND_MIXER_WRITE_LINE !\n");
cmd = SOUND_MIXER_WRITE_LINE;
break;
case 4:
printf("Linux 'AUX_SetVolume' // SOUND_MIXER_WRITE_MIC !\n");
dprintf_mmaux(stddeb,"Linux 'AUX_SetVolume' // SOUND_MIXER_WRITE_MIC !\n");
cmd = SOUND_MIXER_WRITE_MIC;
break;
case 5:
printf("Linux 'AUX_SetVolume' // SOUND_MIXER_WRITE_VOLUME !\n");
dprintf_mmaux(stddeb,"Linux 'AUX_SetVolume' // SOUND_MIXER_WRITE_VOLUME !\n");
cmd = SOUND_MIXER_WRITE_VOLUME;
break;
default:
fprintf(stderr, "Linux 'AUX_SetVolume' // invalid device id=%04X !\n", wDevID);
dprintf_mmaux(stddeb, "Linux 'AUX_SetVolume' // invalid device id=%04X !\n", wDevID);
return MMSYSERR_NOTENABLED;
}
if (ioctl(mixer, cmd, &volume) == -1) {
printf("Linux 'AUX_SetVolume' // unable set mixer !\n");
dprintf_mmaux(stddeb,"Linux 'AUX_SetVolume' // unable set mixer !\n");
return MMSYSERR_NOTENABLED;
}
close(mixer);
@ -230,21 +234,21 @@ static DWORD AUX_SetVolume(WORD wDevID, DWORD dwParam)
DWORD auxMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
DWORD dwParam1, DWORD dwParam2)
{
printf("auxMessage(%04X, %04X, %08lX, %08lX, %08lX);\n",
dprintf_mmaux(stddeb,"auxMessage(%04X, %04X, %08lX, %08lX, %08lX);\n",
wDevID, wMsg, dwUser, dwParam1, dwParam2);
switch(wMsg) {
case AUXDM_GETDEVCAPS:
return AUX_GetDevCaps(wDevID,
(LPAUXCAPS)PTR_SEG_TO_LIN(dwParam1), dwParam2);
case AUXDM_GETNUMDEVS:
printf("AUX_GetNumDevs() return %d;\n", NumDev);
dprintf_mmaux(stddeb,"AUX_GetNumDevs() return %d;\n", NumDev);
return NumDev;
case AUXDM_GETVOLUME:
return AUX_GetVolume(wDevID, (LPDWORD)PTR_SEG_TO_LIN(dwParam1));
case AUXDM_SETVOLUME:
return AUX_SetVolume(wDevID, dwParam1);
default:
fprintf(stderr,"auxMessage // unknown message !\n");
dprintf_mmaux(stddeb,"auxMessage // unknown message !\n");
}
return MMSYSERR_NOTSUPPORTED;
}

View File

@ -188,7 +188,7 @@ BOOL16 sndPlaySound(LPCSTR lpszSoundName, UINT16 uFlags)
lpWaveDesc->hWave = 0;
lpWaveDesc->lpFormat = (LPWAVEFORMAT) SEGPTR_GET(lpFormat);
dwRet = wodMessage( MMSYSTEM_FirstDevID(),
dwRet = wodMessage( 0,
WODM_OPEN, 0, (DWORD)SEGPTR_GET(lpWaveDesc), CALLBACK_NULL);
SEGPTR_FREE(lpFormat);
SEGPTR_FREE(lpWaveDesc);
@ -208,7 +208,7 @@ BOOL16 sndPlaySound(LPCSTR lpszSoundName, UINT16 uFlags)
lpWaveHdr->dwFlags = 0L;
lpWaveHdr->dwLoops = 0L;
dwRet = wodMessage( MMSYSTEM_FirstDevID(),
dwRet = wodMessage( 0,
WODM_PREPARE, 0, (DWORD)spWaveHdr, sizeof(WAVEHDR));
if (dwRet == MMSYSERR_NOERROR)
{
@ -218,12 +218,12 @@ BOOL16 sndPlaySound(LPCSTR lpszSoundName, UINT16 uFlags)
if (count < 1) break;
lpWaveHdr->dwBufferLength = count;
/* lpWaveHdr->dwBytesRecorded = count; */
wodMessage( MMSYSTEM_FirstDevID(), WODM_WRITE,
wodMessage( 0, WODM_WRITE,
0, (DWORD)spWaveHdr, sizeof(WAVEHDR));
}
wodMessage( MMSYSTEM_FirstDevID(),
wodMessage( 0,
WODM_UNPREPARE, 0, (DWORD)spWaveHdr, sizeof(WAVEHDR));
wodMessage( MMSYSTEM_FirstDevID(),
wodMessage( 0,
WODM_CLOSE, 0, 0L, 0L);
bRet = TRUE;
@ -547,17 +547,32 @@ BOOL16 mciGetErrorString (DWORD wError, LPSTR lpstrBuffer, UINT16 uLength)
case MCIERR_FILE_WRITE:
msgptr = "Cannot write to the specified file. Make sure you have enough disk space or are still connected to the network.";
break;
case MCIERR_SEQ_DIV_INCOMPATIBLE:
msgptr = "The time formats of the \"song pointer\" and SMPTE are mutually exclusive. You can't use them together.";
break;
case MCIERR_SEQ_NOMIDIPRESENT:
msgptr = "The system has no installed MIDI devices. Use the Drivers option from the Control Panel to install a MIDI driver.";
break;
case MCIERR_SEQ_PORT_INUSE:
msgptr = "The specified MIDI port is already in use. Wait until it is free; the try again.";
break;
case MCIERR_SEQ_PORT_MAPNODEVICE:
msgptr = "The current MIDI Mapper setup refers to a MIDI device that is not installed on the system. Use the MIDI Mapper option from the Control Panel to edit the setup.";
break;
case MCIERR_SEQ_PORT_MISCERROR:
msgptr = "An error occurred with the specified port.";
break;
case MCIERR_SEQ_PORT_NONEXISTENT:
msgptr = "The specified MIDI device is not installed on the system. Use the Drivers option from the Control Panel to install a MIDI device.";
break;
case MCIERR_SEQ_PORTUNSPECIFIED:
msgptr = "The system doesnot have a current MIDI port specified.";
break;
case MCIERR_SEQ_TIMER:
msgptr = "All multimedia timers are being used by other applications. Quit one of these applications; then, try again.";
break;
/*
#define MCIERR_SEQ_DIV_INCOMPATIBLE (MCIERR_BASE + 80)
#define MCIERR_SEQ_PORT_INUSE (MCIERR_BASE + 81)
#define MCIERR_SEQ_PORT_NONEXISTENT (MCIERR_BASE + 82)
#define MCIERR_SEQ_PORT_MAPNODEVICE (MCIERR_BASE + 83)
#define MCIERR_SEQ_PORT_MISCERROR (MCIERR_BASE + 84)
#define MCIERR_SEQ_TIMER (MCIERR_BASE + 85)
#define MCIERR_SEQ_PORTUNSPECIFIED (MCIERR_BASE + 86)
#define MCIERR_SEQ_NOMIDIPRESENT (MCIERR_BASE + 87)
msg# 513 : vcr
msg# 514 : videodisc
msg# 515 : overlay
@ -595,6 +610,7 @@ msg# 543 : tmsf
break;
}
lstrcpyn32A(lpstrBuffer, msgptr, uLength);
dprintf_mmsys(stddeb, "mciGetErrorString // msg = %s;\n", msgptr);
return TRUE;
}
@ -608,7 +624,7 @@ BOOL16 mciDriverNotify(HWND16 hWndCallBack, UINT16 wDevID, UINT16 wStatus)
if (!IsWindow32(hWndCallBack)) return FALSE;
dprintf_mmsys(stddeb, "mciDriverNotify // before PostMessage\n");
PostMessage16( hWndCallBack, MM_MCINOTIFY, wStatus,
MAKELONG(GetDrv(wDevID)->wDeviceID, 0));
MAKELONG(wDevID, 0));
return TRUE;
}
@ -622,10 +638,12 @@ DWORD mciOpen(DWORD dwParam, LPMCI_OPEN_PARMS lp16Parms)
LPMCI_OPEN_PARMS lpParms;
UINT16 uDevTyp = 0;
UINT16 wDevID = MMSYSTEM_FirstDevID();
DWORD dwret;
lpParms = PTR_SEG_TO_LIN(lp16Parms);
dprintf_mmsys(stddeb, "mciOpen(%08lX, %p (%p))\n", dwParam, lp16Parms, lpParms);
if (lp16Parms == NULL) return MCIERR_INTERNAL;
while(GetDrv(wDevID)->wType != 0) {
wDevID = MMSYSTEM_NextDevID(wDevID);
if (!MMSYSTEM_DevIDValid(wDevID)) {
@ -647,6 +665,7 @@ DWORD mciOpen(DWORD dwParam, LPMCI_OPEN_PARMS lp16Parms)
if (t) {
GetProfileString32A("mci extensions",t+1,"*",str,sizeof(str));
CharUpper32A(str);
dprintf_mmsys(stddeb, "mciOpen // str = %s \n", str);
if (strcmp(str, "CDAUDIO") == 0) {
uDevTyp = MCI_DEVTYPE_CD_AUDIO;
} else
@ -710,24 +729,28 @@ DWORD mciOpen(DWORD dwParam, LPMCI_OPEN_PARMS lp16Parms)
}
}
GetDrv(wDevID)->wType = uDevTyp;
GetDrv(wDevID)->wDeviceID = wDevID;
GetDrv(wDevID)->wDeviceID = 0; /* FIXME? for multiple devices */
lpParms->wDeviceID = wDevID;
dprintf_mmsys(stddeb, "MCI_OPEN // mcidev=%d, uDevTyp=%04X wDeviceID=%04X !\n",
wDevID, uDevTyp, lpParms->wDeviceID);
switch(uDevTyp)
{
case MCI_DEVTYPE_CD_AUDIO:
return CDAUDIO_DriverProc( 0, 0, MCI_OPEN_DRIVER,
dwret = CDAUDIO_DriverProc( 0, 0, MCI_OPEN_DRIVER,
dwParam, (DWORD)lp16Parms);
break;
case MCI_DEVTYPE_WAVEFORM_AUDIO:
return WAVE_DriverProc( 0, 0, MCI_OPEN_DRIVER,
dwret = WAVE_DriverProc( 0, 0, MCI_OPEN_DRIVER,
dwParam, (DWORD)lp16Parms);
break;
case MCI_DEVTYPE_SEQUENCER:
return MIDI_DriverProc( 0, 0, MCI_OPEN_DRIVER,
dwret = MIDI_DriverProc( 0, 0, MCI_OPEN_DRIVER,
dwParam, (DWORD)lp16Parms);
break;
case MCI_DEVTYPE_ANIMATION:
return ANIM_DriverProc( 0, 0, MCI_OPEN_DRIVER,
dwret = ANIM_DriverProc( 0, 0, MCI_OPEN_DRIVER,
dwParam, (DWORD)lp16Parms);
break;
case MCI_DEVTYPE_DIGITAL_VIDEO:
dprintf_mmsys(stddeb, "MCI_OPEN // No DIGITAL_VIDEO yet !\n");
return MCIERR_DEVICE_NOT_INSTALLED;
@ -735,7 +758,12 @@ DWORD mciOpen(DWORD dwParam, LPMCI_OPEN_PARMS lp16Parms)
dprintf_mmsys(stddeb, "MCI_OPEN // Invalid Device Name '%08lx' !\n", lpParms->lpstrDeviceType);
return MCIERR_INVALID_DEVICE_NAME;
}
return MCIERR_INTERNAL;
/* only handled devices fall through */
dprintf_mmsys(stddeb, "MCI_OPEN // wDevID = %04X wDeviceID = %d dwret = %ld\n",wDevID, lpParms->wDeviceID, dwret);
return dwret;
/* return MCIERR_INTERNAL; */
}
@ -745,7 +773,8 @@ DWORD mciOpen(DWORD dwParam, LPMCI_OPEN_PARMS lp16Parms)
DWORD mciClose(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
{
DWORD dwRet = MCIERR_INTERNAL;
dprintf_mmsys(stddeb, "mciClose(%u, %08lX, %p)\n", wDevID, dwParam, lpParms);
dprintf_mmsys(stddeb, "mciClose(%04x, %08lX, %p)\n", wDevID, dwParam, lpParms);
switch(GetDrv(wDevID)->wType) {
case MCI_DEVTYPE_CD_AUDIO:
dwRet = CDAUDIO_DriverProc(GetDrv(wDevID)->wDeviceID,0,
@ -768,14 +797,16 @@ DWORD mciClose(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
break;
default:
dprintf_mmsys(stddeb, "mciClose() // unknown device type=%04X !\n", GetDrv(wDevID)->wType);
dwRet = MCIERR_DEVICE_NOT_INSTALLED;
}
GetDrv(wDevID)->wType = 0;
dprintf_mmsys(stddeb, "mciClose() // returns %ld\n",dwRet);
return dwRet;
}
/**************************************************************************
* mciSound [internal]
* mciSysinfo [internal]
*/
DWORD mciSysInfo(DWORD dwFlags, LPMCI_SYSINFO_PARMS lpParms)
{
@ -936,7 +967,7 @@ UINT16 mciGetDeviceID (LPCSTR lpstrName)
return 0;
wDevID = MMSYSTEM_FirstDevID();
while(GetDrv(wDevID)->wType) {
while(MMSYSTEM_DevIDValid(wDevID) && GetDrv(wDevID)->wType) {
if (GetOpenDrv(wDevID)->lpstrDeviceType &&
strcmp(PTR_SEG_TO_LIN(GetOpenDrv(wDevID)->lpstrDeviceType), lpstrName) == 0)
return wDevID;
@ -1524,6 +1555,7 @@ UINT16 waveOutOpen(HWAVEOUT16 * lphWaveOut, UINT16 uDeviceID,
LPWAVEOPENDESC lp16Desc;
DWORD dwRet = 0;
BOOL32 bMapperFlg = FALSE;
dprintf_mmsys(stddeb, "waveOutOpen(%p, %d, %p, %08lX, %08lX, %08lX);\n",
lphWaveOut, uDeviceID, lpFormat, dwCallback, dwInstance, dwFlags);
if (dwFlags & WAVE_FORMAT_QUERY) {
@ -1535,13 +1567,14 @@ UINT16 waveOutOpen(HWAVEOUT16 * lphWaveOut, UINT16 uDeviceID,
uDeviceID = 0;
}
if (lpFormat == NULL) return WAVERR_BADFORMAT;
hWaveOut = USER_HEAP_ALLOC(sizeof(WAVEOPENDESC));
if (lphWaveOut != NULL) *lphWaveOut = hWaveOut;
lp16Desc = (LPWAVEOPENDESC) USER_HEAP_SEG_ADDR(hWaveOut);
lpDesc = (LPWAVEOPENDESC) PTR_SEG_TO_LIN(lp16Desc);
if (lpDesc == NULL) return MMSYSERR_NOMEM;
lpDesc->hWave = hWaveOut;
lpDesc->lpFormat = lpFormat;
lpDesc->lpFormat = lpFormat; /* should the struct be copied iso pointer? */
lpDesc->dwCallBack = dwCallback;
lpDesc->dwInstance = dwInstance;
while(uDeviceID < MAXWAVEDRIVERS) {
@ -1556,6 +1589,7 @@ UINT16 waveOutOpen(HWAVEOUT16 * lphWaveOut, UINT16 uDeviceID,
dprintf_mmsys(stddeb, "waveOutOpen // End of WAVE_FORMAT_QUERY !\n");
waveOutClose(hWaveOut);
}
lpDesc->uDeviceID = uDeviceID; /* save physical Device ID */
return dwRet;
}
@ -1565,10 +1599,11 @@ UINT16 waveOutOpen(HWAVEOUT16 * lphWaveOut, UINT16 uDeviceID,
UINT16 waveOutClose(HWAVEOUT16 hWaveOut)
{
LPWAVEOPENDESC lpDesc;
dprintf_mmsys(stddeb, "waveOutClose(%04X)\n", hWaveOut);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage( MMSYSTEM_FirstDevID(), WODM_CLOSE, lpDesc->dwInstance, 0L, 0L);
return wodMessage( lpDesc->uDeviceID, WODM_CLOSE, lpDesc->dwInstance, 0L, 0L);
}
/**************************************************************************
@ -1578,11 +1613,12 @@ UINT16 waveOutPrepareHeader(HWAVEOUT16 hWaveOut,
WAVEHDR * lpWaveOutHdr, UINT16 uSize)
{
LPWAVEOPENDESC lpDesc;
dprintf_mmsys(stddeb, "waveOutPrepareHeader(%04X, %p, %u);\n",
hWaveOut, lpWaveOutHdr, uSize);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage( MMSYSTEM_FirstDevID(), WODM_PREPARE, lpDesc->dwInstance,
return wodMessage( lpDesc->uDeviceID, WODM_PREPARE, lpDesc->dwInstance,
(DWORD)lpWaveOutHdr, uSize);
}
@ -1593,11 +1629,12 @@ UINT16 waveOutUnprepareHeader(HWAVEOUT16 hWaveOut,
WAVEHDR * lpWaveOutHdr, UINT16 uSize)
{
LPWAVEOPENDESC lpDesc;
dprintf_mmsys(stddeb, "waveOutUnprepareHeader(%04X, %p, %u);\n",
hWaveOut, lpWaveOutHdr, uSize);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage( MMSYSTEM_FirstDevID(), WODM_UNPREPARE, lpDesc->dwInstance,
return wodMessage( lpDesc->uDeviceID, WODM_UNPREPARE, lpDesc->dwInstance,
(DWORD)lpWaveOutHdr, uSize);
}
@ -1607,10 +1644,11 @@ UINT16 waveOutUnprepareHeader(HWAVEOUT16 hWaveOut,
UINT16 waveOutWrite(HWAVEOUT16 hWaveOut, WAVEHDR * lpWaveOutHdr, UINT16 uSize)
{
LPWAVEOPENDESC lpDesc;
dprintf_mmsys(stddeb, "waveOutWrite(%04X, %p, %u);\n", hWaveOut, lpWaveOutHdr, uSize);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage( MMSYSTEM_FirstDevID(), WODM_WRITE, lpDesc->dwInstance,
return wodMessage( lpDesc->uDeviceID, WODM_WRITE, lpDesc->dwInstance,
(DWORD)lpWaveOutHdr, uSize);
}
@ -1620,10 +1658,11 @@ UINT16 waveOutWrite(HWAVEOUT16 hWaveOut, WAVEHDR * lpWaveOutHdr, UINT16 uSize)
UINT16 waveOutPause(HWAVEOUT16 hWaveOut)
{
LPWAVEOPENDESC lpDesc;
dprintf_mmsys(stddeb, "waveOutPause(%04X)\n", hWaveOut);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage( MMSYSTEM_FirstDevID(), WODM_PAUSE, lpDesc->dwInstance, 0L, 0L);
return wodMessage( lpDesc->uDeviceID, WODM_PAUSE, lpDesc->dwInstance, 0L, 0L);
}
/**************************************************************************
@ -1632,10 +1671,11 @@ UINT16 waveOutPause(HWAVEOUT16 hWaveOut)
UINT16 waveOutRestart(HWAVEOUT16 hWaveOut)
{
LPWAVEOPENDESC lpDesc;
dprintf_mmsys(stddeb, "waveOutRestart(%04X)\n", hWaveOut);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage( MMSYSTEM_FirstDevID(), WODM_RESTART, lpDesc->dwInstance, 0L, 0L);
return wodMessage( lpDesc->uDeviceID, WODM_RESTART, lpDesc->dwInstance, 0L, 0L);
}
/**************************************************************************
@ -1647,7 +1687,7 @@ UINT16 waveOutReset(HWAVEOUT16 hWaveOut)
dprintf_mmsys(stddeb, "waveOutReset(%04X)\n", hWaveOut);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage( MMSYSTEM_FirstDevID(), WODM_RESET, lpDesc->dwInstance, 0L, 0L);
return wodMessage( lpDesc->uDeviceID, WODM_RESET, lpDesc->dwInstance, 0L, 0L);
}
/**************************************************************************
@ -1659,7 +1699,7 @@ UINT16 waveOutGetPosition(HWAVEOUT16 hWaveOut, MMTIME * lpTime, UINT16 uSize)
dprintf_mmsys(stddeb, "waveOutGetPosition(%04X, %p, %u);\n", hWaveOut, lpTime, uSize);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage( MMSYSTEM_FirstDevID(), WODM_GETPOS, lpDesc->dwInstance,
return wodMessage( lpDesc->uDeviceID, WODM_GETPOS, lpDesc->dwInstance,
(DWORD)lpTime, (DWORD)uSize);
}
@ -1672,7 +1712,7 @@ UINT16 waveOutGetPitch(HWAVEOUT16 hWaveOut, DWORD * lpdwPitch)
dprintf_mmsys(stddeb, "waveOutGetPitch(%04X, %p);\n", hWaveOut, lpdwPitch);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage( MMSYSTEM_FirstDevID(), WODM_GETPITCH, lpDesc->dwInstance,
return wodMessage( lpDesc->uDeviceID, WODM_GETPITCH, lpDesc->dwInstance,
(DWORD)lpdwPitch, 0L);
}
@ -1685,7 +1725,7 @@ UINT16 waveOutSetPitch(HWAVEOUT16 hWaveOut, DWORD dwPitch)
dprintf_mmsys(stddeb, "waveOutSetPitch(%04X, %08lX);\n", hWaveOut, dwPitch);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage( MMSYSTEM_FirstDevID(), WODM_SETPITCH, lpDesc->dwInstance, (DWORD)dwPitch, 0L);
return wodMessage( lpDesc->uDeviceID, WODM_SETPITCH, lpDesc->dwInstance, (DWORD)dwPitch, 0L);
}
/**************************************************************************
@ -1715,7 +1755,7 @@ UINT16 waveOutGetPlaybackRate(HWAVEOUT16 hWaveOut, DWORD * lpdwRate)
dprintf_mmsys(stddeb, "waveOutGetPlaybackRate(%04X, %p);\n", hWaveOut, lpdwRate);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage( MMSYSTEM_FirstDevID(), WODM_GETPLAYBACKRATE, lpDesc->dwInstance,
return wodMessage( lpDesc->uDeviceID, WODM_GETPLAYBACKRATE, lpDesc->dwInstance,
(DWORD)lpdwRate, 0L);
}
@ -1728,7 +1768,7 @@ UINT16 waveOutSetPlaybackRate(HWAVEOUT16 hWaveOut, DWORD dwRate)
dprintf_mmsys(stddeb, "waveOutSetPlaybackRate(%04X, %08lX);\n", hWaveOut, dwRate);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage( MMSYSTEM_FirstDevID(), WODM_SETPLAYBACKRATE,
return wodMessage( lpDesc->uDeviceID, WODM_SETPLAYBACKRATE,
lpDesc->dwInstance, (DWORD)dwRate, 0L);
}
@ -1754,6 +1794,7 @@ UINT16 waveOutGetID(HWAVEOUT16 hWaveOut, UINT16 * lpuDeviceID)
/*
*lpuDeviceID = lpParms->wDeviceID;
*/
*lpuDeviceID = lpDesc->uDeviceID;
return 0;
}
@ -1768,7 +1809,7 @@ DWORD waveOutMessage(HWAVEOUT16 hWaveOut, UINT16 uMessage,
hWaveOut, uMessage, dwParam1, dwParam2);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return wodMessage( MMSYSTEM_FirstDevID(), uMessage, lpDesc->dwInstance, dwParam1, dwParam2);
return wodMessage( lpDesc->uDeviceID, uMessage, lpDesc->dwInstance, dwParam1, dwParam2);
}
/**************************************************************************
@ -1857,10 +1898,11 @@ UINT16 waveInOpen(HWAVEIN16 * lphWaveIn, UINT16 uDeviceID,
UINT16 waveInClose(HWAVEIN16 hWaveIn)
{
LPWAVEOPENDESC lpDesc;
dprintf_mmsys(stddeb, "waveInClose(%04X)\n", hWaveIn);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveIn);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return widMessage(0, WIDM_CLOSE, lpDesc->dwInstance, 0L, 0L);
return widMessage(lpDesc->uDeviceID, WIDM_CLOSE, lpDesc->dwInstance, 0L, 0L);
}
@ -1872,6 +1914,7 @@ UINT16 waveInPrepareHeader(HWAVEIN16 hWaveIn,
{
LPWAVEOPENDESC lpDesc;
LPWAVEHDR lp32WaveInHdr;
dprintf_mmsys(stddeb, "waveInPrepareHeader(%04X, %p, %u);\n",
hWaveIn, lpWaveInHdr, uSize);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveIn);
@ -1882,7 +1925,7 @@ UINT16 waveInPrepareHeader(HWAVEIN16 hWaveIn,
lp32WaveInHdr->dwBytesRecorded = 0;
dprintf_mmsys(stddeb, "waveInPrepareHeader // lpData=%p size=%lu \n",
lp32WaveInHdr->lpData, lp32WaveInHdr->dwBufferLength);
return widMessage(0, WIDM_PREPARE, lpDesc->dwInstance,
return widMessage(lpDesc->uDeviceID, WIDM_PREPARE, lpDesc->dwInstance,
(DWORD)lpWaveInHdr, uSize);
}
@ -1895,6 +1938,7 @@ UINT16 waveInUnprepareHeader(HWAVEIN16 hWaveIn,
{
LPWAVEOPENDESC lpDesc;
LPWAVEHDR lp32WaveInHdr;
dprintf_mmsys(stddeb, "waveInUnprepareHeader(%04X, %p, %u);\n",
hWaveIn, lpWaveInHdr, uSize);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveIn);
@ -1904,7 +1948,7 @@ UINT16 waveInUnprepareHeader(HWAVEIN16 hWaveIn,
USER_HEAP_FREE(HIWORD((DWORD)lp32WaveInHdr->lpData));
lp32WaveInHdr->lpData = NULL;
lp32WaveInHdr->lpNext = NULL;
return widMessage(0, WIDM_UNPREPARE, lpDesc->dwInstance,
return widMessage(lpDesc->uDeviceID, WIDM_UNPREPARE, lpDesc->dwInstance,
(DWORD)lpWaveInHdr, uSize);
}
@ -1917,6 +1961,7 @@ UINT16 waveInAddBuffer(HWAVEIN16 hWaveIn,
{
LPWAVEOPENDESC lpDesc;
LPWAVEHDR lp32WaveInHdr;
dprintf_mmsys(stddeb, "waveInAddBuffer(%04X, %p, %u);\n", hWaveIn, lpWaveInHdr, uSize);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveIn);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
@ -1926,7 +1971,7 @@ UINT16 waveInAddBuffer(HWAVEIN16 hWaveIn,
lp32WaveInHdr->dwBytesRecorded = 0;
dprintf_mmsys(stddeb, "waveInAddBuffer // lpData=%p size=%lu \n",
lp32WaveInHdr->lpData, lp32WaveInHdr->dwBufferLength);
return widMessage(0, WIDM_ADDBUFFER, lpDesc->dwInstance,
return widMessage(lpDesc->uDeviceID, WIDM_ADDBUFFER, lpDesc->dwInstance,
(DWORD)lpWaveInHdr, uSize);
}
@ -1937,10 +1982,11 @@ UINT16 waveInAddBuffer(HWAVEIN16 hWaveIn,
UINT16 waveInStart(HWAVEIN16 hWaveIn)
{
LPWAVEOPENDESC lpDesc;
dprintf_mmsys(stddeb, "waveInStart(%04X)\n", hWaveIn);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveIn);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return widMessage(0, WIDM_START, lpDesc->dwInstance, 0L, 0L);
return widMessage(lpDesc->uDeviceID, WIDM_START, lpDesc->dwInstance, 0L, 0L);
}
@ -1950,10 +1996,11 @@ UINT16 waveInStart(HWAVEIN16 hWaveIn)
UINT16 waveInStop(HWAVEIN16 hWaveIn)
{
LPWAVEOPENDESC lpDesc;
dprintf_mmsys(stddeb, "waveInStop(%04X)\n", hWaveIn);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveIn);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return widMessage(0, WIDM_STOP, lpDesc->dwInstance, 0L, 0L);
return widMessage(lpDesc->uDeviceID, WIDM_STOP, lpDesc->dwInstance, 0L, 0L);
}
@ -1963,10 +2010,11 @@ UINT16 waveInStop(HWAVEIN16 hWaveIn)
UINT16 waveInReset(HWAVEIN16 hWaveIn)
{
LPWAVEOPENDESC lpDesc;
dprintf_mmsys(stddeb, "waveInReset(%04X)\n", hWaveIn);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveIn);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return widMessage(0, WIDM_RESET, lpDesc->dwInstance, 0L, 0L);
return widMessage(lpDesc->uDeviceID, WIDM_RESET, lpDesc->dwInstance, 0L, 0L);
}
@ -1976,10 +2024,11 @@ UINT16 waveInReset(HWAVEIN16 hWaveIn)
UINT16 waveInGetPosition(HWAVEIN16 hWaveIn, MMTIME * lpTime, UINT16 uSize)
{
LPWAVEOPENDESC lpDesc;
dprintf_mmsys(stddeb, "waveInGetPosition(%04X, %p, %u);\n", hWaveIn, lpTime, uSize);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveIn);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return widMessage(0, WIDM_GETPOS, lpDesc->dwInstance,
return widMessage(lpDesc->uDeviceID, WIDM_GETPOS, lpDesc->dwInstance,
(DWORD)lpTime, (DWORD)uSize);
}
@ -1989,8 +2038,13 @@ UINT16 waveInGetPosition(HWAVEIN16 hWaveIn, MMTIME * lpTime, UINT16 uSize)
*/
UINT16 waveInGetID(HWAVEIN16 hWaveIn, UINT16 * lpuDeviceID)
{
LPWAVEOPENDESC lpDesc;
dprintf_mmsys(stddeb, "waveInGetID\n");
if (lpuDeviceID == NULL) return MMSYSERR_INVALPARAM;
if (lpuDeviceID == NULL) return MMSYSERR_INVALHANDLE;
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveIn);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
*lpuDeviceID = lpDesc->uDeviceID;
return 0;
}
@ -2002,11 +2056,12 @@ DWORD waveInMessage(HWAVEIN16 hWaveIn, UINT16 uMessage,
DWORD dwParam1, DWORD dwParam2)
{
LPWAVEOPENDESC lpDesc;
dprintf_mmsys(stddeb, "waveInMessage(%04X, %04X, %08lX, %08lX)\n",
hWaveIn, uMessage, dwParam1, dwParam2);
lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveIn);
if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
return widMessage(0, uMessage, lpDesc->dwInstance, dwParam1, dwParam2);
return widMessage(lpDesc->uDeviceID, uMessage, lpDesc->dwInstance, dwParam1, dwParam2);
}

View File

@ -86,7 +86,7 @@ static VOID TIME_MMSysTimeCallback( HWND32 hwnd, UINT32 msg,
/**************************************************************************
* StartMMTime [internal]
*/
void StartMMTime()
static void StartMMTime()
{
if (!mmTimeStarted) {
mmTimeStarted = TRUE;

View File

@ -201,7 +201,7 @@ LONG GetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPVOID buffer )
return 0;
}
widthbytes = DIB_GetImageWidthBytesX11(bmp->bitmap.bmWidth,bmp->bitmap.bmBitsPixel);
widthbytes = DIB_GetXImageWidthBytes(bmp->bitmap.bmWidth,bmp->bitmap.bmBitsPixel);
tmpbuffer = (LPBYTE)xmalloc(widthbytes*height);
image = XCreateImage( display, DefaultVisualOfScreen(screen),
bmp->bitmap.bmBitsPixel, ZPixmap, 0, tmpbuffer,
@ -223,8 +223,10 @@ LONG GetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPVOID buffer )
*tbuf = 0;
for (w=0;w<bmp->bitmap.bmWidth;w++)
{
if ((w%8) == 0)
*tbuf = 0;
*tbuf |= XGetPixel(image,w,h)<<(7-(w&7));
if ((w&7) == 7) *(++tbuf) = 0;
if ((w&7) == 7) ++tbuf;
}
tbuf += pad;
}
@ -348,7 +350,7 @@ LONG SetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPCVOID buffer )
}
sbuf = (LPBYTE)buffer;
widthbytes = DIB_GetImageWidthBytesX11(bmp->bitmap.bmWidth,bmp->bitmap.bmBitsPixel);
widthbytes = DIB_GetXImageWidthBytes(bmp->bitmap.bmWidth,bmp->bitmap.bmBitsPixel);
tmpbuffer = (LPBYTE)xmalloc(widthbytes*height);
image = XCreateImage( display, DefaultVisualOfScreen(screen),
bmp->bitmap.bmBitsPixel, ZPixmap, 0, tmpbuffer,

View File

@ -40,6 +40,8 @@ typedef struct
Colormap colorMap;
UINT16 size;
UINT16 flags;
INT32 monoPlane; /* bit plane different for white and black pixels */
BOOL32 bWhiteOn; /* monoPlane bit is 1 for the white pixel */
} CSPACE;
static CSPACE cSpace = {0, 0, 0};
@ -125,6 +127,12 @@ Colormap COLOR_GetColormap(void)
return cSpace.colorMap;
}
BOOL32 COLOR_GetMonoPlane(INT32* plane)
{
*plane = cSpace.monoPlane;
return (cSpace.flags & COLOR_WHITESET) ? TRUE : FALSE;
}
UINT16 COLOR_GetSystemPaletteSize(void)
{
return (cSpace.flags & COLOR_PRIVATE) ? cSpace.size : 256;
@ -537,10 +545,6 @@ static HPALETTE16 COLOR_InitPalette(void)
memset(COLOR_freeList, 0, 256*sizeof(unsigned char));
/* calculate max palette size */
cSpace.size = visual->map_entries;
if (cSpace.flags & COLOR_PRIVATE)
COLOR_BuildPrivateMap( &cSpace );
else
@ -610,10 +614,20 @@ static void COLOR_Computeshifts(unsigned long maskbits, int *shift, int *max)
*/
HPALETTE16 COLOR_Init(void)
{
int mask, white, black;
visual = DefaultVisual( display, DefaultScreen(display) );
dprintf_palette(stddeb,"COLOR_Init: initializing palette manager...");
white = WhitePixelOfScreen( screen );
black = BlackPixelOfScreen( screen );
cSpace.monoPlane = 1;
for( mask = 1; !((white & mask)^(black & mask)); mask <<= 1 )
cSpace.monoPlane++;
cSpace.flags = (white & mask) ? COLOR_WHITESET : 0;
cSpace.size = visual->map_entries;
switch(visual->class)
{
case DirectColor:
@ -624,11 +638,16 @@ HPALETTE16 COLOR_Init(void)
{
XSetWindowAttributes win_attr;
cSpace.flags |= COLOR_PRIVATE;
cSpace.colorMap = XCreateColormap( display, rootWindow,
visual, AllocAll );
if (cSpace.colorMap)
{
cSpace.flags |= (COLOR_PRIVATE | COLOR_WHITESET);
cSpace.monoPlane = 1;
for( white = cSpace.size - 1; !(white & 1); white >>= 1 )
cSpace.monoPlane++;
if( rootWindow != DefaultRootWindow(display) )
{
win_attr.colormap = cSpace.colorMap;
@ -658,7 +677,8 @@ HPALETTE16 COLOR_Init(void)
break;
}
dprintf_palette(stddeb," visual class %i\n", visual->class);
dprintf_palette(stddeb," visual class %i (%i)\n",
visual->class, cSpace.monoPlane);
return COLOR_InitPalette();
}

View File

@ -7,6 +7,8 @@
/*
* Theory:
*
* http://www.microsoft.com/win32dev/ui/icons.htm
*
* Cursors and icons are stored in a global heap block, with the
* following layout:
*
@ -33,7 +35,6 @@
#include "win.h"
#include "stddebug.h"
#include "debug.h"
#include "xmalloc.h"
#include "task.h"
extern UINT16 COLOR_GetSystemPaletteSize();
@ -237,14 +238,15 @@ static BOOL32 CURSORICON_LoadDirEntry( HINSTANCE32 hInstance, SEGPTR name,
HGLOBAL16 CURSORICON_LoadHandler( HGLOBAL16 handle, HINSTANCE16 hInstance,
BOOL32 fCursor )
{
HBITMAP32 hAndBits, hXorBits;
HDC32 hdc;
int size, sizeAnd, sizeXor;
POINT16 hotspot = { 0 ,0 };
static char* __loadhandlerStr = "CURSORICON_LoadHandler";
int sizeAnd, sizeXor;
HBITMAP32 hAndBits = 0, hXorBits = 0; /* error condition for later */
BITMAPOBJ *bmpXor, *bmpAnd;
BITMAPINFO *bmi, *pInfo;
POINT16 hotspot = { 0 ,0 };
CURSORICONINFO *info;
char *bits;
BITMAPINFO *bmi;
HDC32 hdc;
if (fCursor) /* If cursor, get the hotspot */
{
@ -254,74 +256,62 @@ HGLOBAL16 CURSORICON_LoadHandler( HGLOBAL16 handle, HINSTANCE16 hInstance,
}
else bmi = (BITMAPINFO *)LockResource16( handle );
/* Create a copy of the bitmap header */
/* Check bitmap header */
size = DIB_BitmapInfoSize( bmi, DIB_RGB_COLORS );
/* Make sure we have room for the monochrome bitmap later on */
size = MAX( size, sizeof(BITMAPINFOHEADER) + 2*sizeof(RGBQUAD) );
pInfo = (BITMAPINFO *)xmalloc( size );
if ( (bmi->bmiHeader.biSize != sizeof(BITMAPCOREHEADER)) &&
(bmi->bmiHeader.biSize != sizeof(BITMAPINFOHEADER) ||
bmi->bmiHeader.biCompression != BI_RGB) )
{
fprintf(stderr,"%s: invalid bitmap header.\n", __loadhandlerStr);
return 0;
}
if( (hdc = GetDC32( 0 )) )
{
BITMAPINFO* pInfo;
INT32 size = DIB_BitmapInfoSize( bmi, DIB_RGB_COLORS );
/* Make sure we have room for the monochrome bitmap later on.
* Note that BITMAPINFOINFO and BITMAPCOREHEADER are the same
* up to and including the biBitCount. In-memory icon resource
* format is as follows:
*
* BITMAPINFOHEADER icHeader // DIB header
* RGBQUAD icColors[] // Color table
* BYTE icXOR[] // DIB bits for XOR mask
* BYTE icAND[] // DIB bits for AND mask
*/
if( (pInfo = (BITMAPINFO *)HeapAlloc( GetProcessHeap(), 0,
MAX(size, sizeof(BITMAPINFOHEADER) + 2*sizeof(RGBQUAD)))) )
{
memcpy( pInfo, bmi, size );
if (pInfo->bmiHeader.biSize == sizeof(BITMAPINFOHEADER))
{
if (pInfo->bmiHeader.biCompression != BI_RGB)
{
fprintf(stderr,"Unknown size for compressed icon bitmap.\n");
free( pInfo );
return 0;
}
pInfo->bmiHeader.biHeight /= 2;
}
else if (pInfo->bmiHeader.biSize == sizeof(BITMAPCOREHEADER))
{
BITMAPCOREHEADER *core = (BITMAPCOREHEADER *)pInfo;
core->bcHeight /= 2;
}
else
{
fprintf( stderr, "CURSORICON_Load: Unknown bitmap length %ld!\n",
pInfo->bmiHeader.biSize );
free( pInfo );
return 0;
}
/* Create the XOR bitmap */
if (!(hdc = GetDC32( 0 )))
{
free( pInfo );
return 0;
}
hXorBits = CreateDIBitmap32( hdc, &pInfo->bmiHeader, CBM_INIT,
(char*)bmi + size, pInfo, DIB_RGB_COLORS );
if (!hXorBits) {
free( pInfo );
ReleaseDC32( 0, hdc );
return 0;
}
/* Fix the bitmap header to load the monochrome mask */
if( hXorBits )
{
char* bits = (char *)bmi + size + bmi->bmiHeader.biHeight *
DIB_GetDIBWidthBytes(bmi->bmiHeader.biWidth,
bmi->bmiHeader.biBitCount) / 2;
pInfo->bmiHeader.biBitCount = 1;
if (pInfo->bmiHeader.biSize == sizeof(BITMAPINFOHEADER))
{
BITMAPINFOHEADER *bih = &pInfo->bmiHeader;
RGBQUAD *rgb = pInfo->bmiColors;
bits = (char *)bmi + size +
DIB_GetImageWidthBytes(bih->biWidth,bih->biBitCount)*bih->biHeight;
bih->biBitCount = 1;
bih->biClrUsed = bih->biClrImportant = 2;
pInfo->bmiHeader.biClrUsed = pInfo->bmiHeader.biClrImportant = 2;
rgb[0].rgbBlue = rgb[0].rgbGreen = rgb[0].rgbRed = 0x00;
rgb[1].rgbBlue = rgb[1].rgbGreen = rgb[1].rgbRed = 0xff;
rgb[0].rgbReserved = rgb[1].rgbReserved = 0;
}
else
{
BITMAPCOREHEADER *bch = (BITMAPCOREHEADER *)pInfo;
RGBTRIPLE *rgb = (RGBTRIPLE *)(bch + 1);
bits = (char *)bmi + size +
DIB_GetImageWidthBytes(bch->bcWidth,bch->bcBitCount)*bch->bcHeight;
bch->bcBitCount = 1;
RGBTRIPLE *rgb = (RGBTRIPLE *)(((BITMAPCOREHEADER *)pInfo) + 1);
rgb[0].rgbtBlue = rgb[0].rgbtGreen = rgb[0].rgbtRed = 0x00;
rgb[1].rgbtBlue = rgb[1].rgbtGreen = rgb[1].rgbtRed = 0xff;
}
@ -330,10 +320,16 @@ HGLOBAL16 CURSORICON_LoadHandler( HGLOBAL16 handle, HINSTANCE16 hInstance,
hAndBits = CreateDIBitmap32( hdc, &pInfo->bmiHeader, CBM_INIT,
bits, pInfo, DIB_RGB_COLORS );
if( !hAndBits ) DeleteObject32( hXorBits );
}
HeapFree( GetProcessHeap(), 0, pInfo );
}
ReleaseDC32( 0, hdc );
if (!hAndBits) {
DeleteObject32( hXorBits );
free( pInfo );
}
if( !hXorBits || !hAndBits )
{
fprintf(stderr,"%s: unable to create a bitmap.\n", __loadhandlerStr );
return 0;
}
@ -451,7 +447,7 @@ HCURSOR16 CURSORICON_IconToCursor(HICON16 hIcon, BOOL32 bSemiTransparent)
HTASK16 hTask = GetCurrentTask();
TDB* pTask = (TDB *)GlobalLock16(hTask);
if(hIcon)
if(hIcon && pTask)
if (!(ptr = (CURSORICONINFO*)GlobalLock16( hIcon ))) return FALSE;
if (ptr->bPlanes * ptr->bBitsPerPixel == 1)
hRet = CURSORICON_Copy( pTask->hInstance, hIcon );
@ -471,8 +467,6 @@ HCURSOR16 CURSORICON_IconToCursor(HICON16 hIcon, BOOL32 bSemiTransparent)
COLORREF col;
CURSORICONINFO cI;
if(!pTask) return 0;
memset(pXorBits, 0, 128);
cI.bBitsPerPixel = 1; cI.bPlanes = 1;
cI.ptHotSpot.x = cI.ptHotSpot.y = 15;
@ -1149,3 +1143,8 @@ HICON16 LoadIconHandler( HGLOBAL16 hResource, BOOL16 bNew )
}
return CURSORICON_LoadHandler( hResource, 0, FALSE);
}
/**********************************************************************
* GetIconInfo (USER32.241)
*/

View File

@ -18,53 +18,51 @@
extern void CLIPPING_UpdateGCRegion(DC* );
static int bitmapDepthTable[] = { 8, 1, 32, 16, 24, 15, 4, 0 };
static int ximageDepthTable[] = { 0, 0, 0, 0, 0, 0, 0 };
/***********************************************************************
* DIB_GetImageWidthBytesX11
*
* Return the width of an X image in bytes
* DIB_Init
*/
int DIB_GetImageWidthBytesX11( int width, int depth )
BOOL32 DIB_Init()
{
int wbits;
XImage *testimage;
int i;
XImage* testimage;
#define DEPTHCASE(depth) \
case depth: { \
static int w##depth = 0; \
if (! w##depth ) { \
testimage=XCreateImage(display,DefaultVisualOfScreen(screen),\
depth,ZPixmap,0,NULL,1,1,32,20); \
w##depth = testimage->bits_per_pixel; \
XDestroyImage(testimage); \
} \
wbits = width*w##depth; \
break; \
}
switch(depth)
for( i = 0; bitmapDepthTable[i]; i++ )
{
DEPTHCASE(1);
DEPTHCASE(4);
DEPTHCASE(8);
DEPTHCASE(15);
DEPTHCASE(16);
DEPTHCASE(24);
DEPTHCASE(32);
default:
fprintf(stderr, "DIB: unsupported depth %d.\n", depth );
/* assume 32 bits/pixel */
wbits = width*32;
break;
testimage = XCreateImage(display, DefaultVisualOfScreen(screen),
bitmapDepthTable[i], ZPixmap, 0, NULL, 1, 1, 32, 20 );
if( testimage ) ximageDepthTable[i] = testimage->bits_per_pixel;
else return FALSE;
XDestroyImage(testimage);
}
return 4 * ((wbits+31)/32);
return TRUE;
}
/***********************************************************************
* DIB_GetImageWidthBytes
* DIB_GetXImageWidthBytes
*
* Return the width of an X image in bytes
*/
int DIB_GetImageWidthBytes( int width, int depth )
int DIB_GetXImageWidthBytes( int width, int depth )
{
int i;
for( i = 0; bitmapDepthTable[i] ; i++ )
if( bitmapDepthTable[i] == depth )
return (4 * ((width * ximageDepthTable[i] + 31)/32));
fprintf(stderr, "DIB: unsupported depth %d.\n", depth );
return (4 * width);
}
/***********************************************************************
* DIB_GetDIBWidthBytes
*
* Return the width of a DIB bitmap in bytes. DIB bitmap data is 32-bit aligned.
* http://www.microsoft.com/msdn/sdk/platforms/doc/sdk/win32/struc/src/str01.htm
*/
int DIB_GetDIBWidthBytes( int width, int depth )
{
int words;
@ -90,7 +88,7 @@ int DIB_GetImageWidthBytes( int width, int depth )
/***********************************************************************
* DIB_BitmapInfoSize
*
* Return the size of the bitmap info structure.
* Return the size of the bitmap info structure including color table.
*/
int DIB_BitmapInfoSize( BITMAPINFO * info, WORD coloruse )
{
@ -791,6 +789,8 @@ INT16 GetDIBits16( HDC16 hdc, HBITMAP16 hbitmap, UINT16 startscan,
/***********************************************************************
* GetDIBits32 (GDI32.170)
*
* http://www.microsoft.com/msdn/sdk/platforms/doc/sdk/win32/func/src/f30_14.htm
*/
INT32 GetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
UINT32 lines, LPSTR bits, BITMAPINFO * info,
@ -864,7 +864,7 @@ INT32 GetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
switch( info->bmiHeader.biBitCount )
{
case 8:
/* pad up to 32 bit (FIXME: not 16? ) */
/* pad up to 32 bit */
pad += (4 - (info->bmiHeader.biWidth & 3)) & 3;
for( y = yend - 1; (int)y >= (int)startscan; y-- )
{
@ -953,7 +953,7 @@ INT32 GetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
info->bmiHeader.biPlanes = 1;
info->bmiHeader.biBitCount = bmp->bitmap.bmBitsPixel;
info->bmiHeader.biSizeImage = bmp->bitmap.bmHeight *
DIB_GetImageWidthBytes( bmp->bitmap.bmWidth,
DIB_GetDIBWidthBytes( bmp->bitmap.bmWidth,
bmp->bitmap.bmBitsPixel );
info->bmiHeader.biCompression = 0;
}

View File

@ -156,10 +156,12 @@ BOOL32 GDI_Init(void)
{
HPALETTE16 hpalette;
extern BOOL32 X11DRV_Init(void);
extern BOOL32 DIB_Init(void);
/* Initialize drivers */
if (!X11DRV_Init()) return FALSE;
if (!DIB_Init()) return FALSE;
/* Create default palette */

View File

@ -607,30 +607,38 @@ void PlayMetaFileRecord16( HDC16 hdc, HANDLETABLE16 *ht, METARECORD *mr,
case META_EXTTEXTOUT:
{
LPINT16 dxx;
LPSTR sot;
DWORD len;
s1 = mr->rdParam[2]; /* String length */
len = sizeof(METARECORD) + (((s1 + 1) >> 1) * 2) + 2 * sizeof(short)
+ sizeof(UINT16) + sizeof(RECT16);
+ sizeof(UINT16) + (mr->rdParam[3] ? sizeof(RECT16) : 0); /* rec len without dx array */
sot= (LPSTR)&mr->rdParam[4]; /* start_of_text */
if (mr->rdParam[3])
sot+=sizeof(RECT16); /* there is a rectangle, so add offset */
if (mr->rdSize == len / 2)
dxx = NULL; /* No array present */
else if (mr->rdSize == (len + s1 * sizeof(INT16)) / 2)
dxx = &mr->rdParam[8+(s1+1)/2]; /* start of array */
else {
dxx = NULL; /* determine if array present */
else
if (mr->rdSize == (len + s1 * sizeof(INT16)) / 2)
dxx = (LPINT16)(sot+(((s1+1)>>1)*2));
else
{
fprintf(stderr,
"PlayMetaFileRecord ExtTextOut mr->rdSize = %08lx, count = %x\n",
mr->rdSize, s1);
dxx = NULL;
"Please report: PlayMetaFile/ExtTextOut len=%ld slen=%d rdSize=%ld opt=%04x\n",
len,s1,mr->rdSize,mr->rdParam[3]);
dxx = NULL; /* should't happen -- but if, we continue with NULL [for workaround] */
}
ExtTextOut16( hdc, mr->rdParam[1], /* X position */
mr->rdParam[0], /* Y position */
mr->rdParam[3], /* options */
(LPRECT16) &mr->rdParam[4], /* rectangle */
(char *)(mr->rdParam + 8), /* string */
mr->rdParam[3] ? (LPRECT16) &mr->rdParam[4]:NULL, /* rectangle */
sot, /* string */
s1, dxx); /* length, dx array */
if (dxx)
dprintf_metafile(stddeb,"EXTTEXTOUT len: %ld (%hd %hd) [%s].\n",
mr->rdSize,dxx[0],dxx[1],(char*) &(mr->rdParam[8]) );
dprintf_metafile(stddeb,"EXTTEXTOUT: %s len: %ld dx0: %d\n",
sot,mr->rdSize,dxx[0]);
}
break;
@ -740,16 +748,29 @@ void PlayMetaFileRecord16( HDC16 hdc, HANDLETABLE16 *ht, METARECORD *mr,
GlobalFree16(hndl);
break;
case META_DIBBITBLT:
{
LPBITMAPINFO info = (LPBITMAPINFO) &(mr->rdParam[8]);
LPSTR bits = (LPSTR)info + DIB_BitmapInfoSize( info, mr->rdParam[0] );
StretchDIBits16(hdc,mr->rdParam[7],mr->rdParam[6],mr->rdParam[5],
mr->rdParam[4],mr->rdParam[3],mr->rdParam[2],
mr->rdParam[5],mr->rdParam[4],bits,info,
DIB_RGB_COLORS,MAKELONG(mr->rdParam[0],mr->rdParam[1]));
}
break;
case META_SETTEXTJUSTIFICATION:
SetTextJustification32(hdc, *(mr->rdParam + 1), *(mr->rdParam));
break;
#define META_UNIMP(x) case x: fprintf(stderr,"PlayMetaFileRecord:record type "#x" not implemented.\n");break;
META_UNIMP(META_SETTEXTCHAREXTRA)
META_UNIMP(META_SETTEXTJUSTIFICATION)
META_UNIMP(META_FRAMEREGION)
META_UNIMP(META_DRAWTEXT)
META_UNIMP(META_SETDIBTODEV)
META_UNIMP(META_ANIMATEPALETTE)
META_UNIMP(META_SETPALENTRIES)
META_UNIMP(META_RESIZEPALETTE)
META_UNIMP(META_DIBBITBLT)
META_UNIMP(META_EXTFLOODFILL)
META_UNIMP(META_RESETDC)
META_UNIMP(META_STARTDOC)

View File

@ -1,7 +1,7 @@
SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE
{
MENUITEM "&Restaurer", 61728
MENUITEM "&Restaurar", 61728
MENUITEM "&Mover", 61456
MENUITEM "&Tamaño", 61440
MENUITEM "Mi&nimizar", 61472
@ -20,12 +20,12 @@ EDITMENU MENU LOADONCALL MOVEABLE DISCARDABLE
BEGIN
MENUITEM "&Undo", EM_UNDO32
MENUITEM SEPARATOR
MENUITEM "Cu&t", WM_CUT
MENUITEM "&Copy", WM_COPY
MENUITEM "&Paste", WM_PASTE
MENUITEM "&Delete", WM_CLEAR
MENUITEM "Co&rtar", WM_CUT
MENUITEM "&Copiar", WM_COPY
MENUITEM "&Pegar", WM_PASTE
MENUITEM "&Borrar", WM_CLEAR
MENUITEM SEPARATOR
MENUITEM "Select &All", EM_SETSEL32
MENUITEM "Seleccionar &todo", EM_SETSEL32
END
}
@ -148,36 +148,66 @@ FONT 8, "Helv"
}
CHOOSE_FONT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134
CHOOSE_FONT DIALOG DISCARDABLE 13, 54, 264, 147
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Fuente"
FONT 8, "Helv"
{
LTEXT "Fuente:", 1088, 6, 6, 40, 9
LTEXT "", 1089, 60, 6, 150, 9
DEFPUSHBUTTON "Aceptar", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
PUSHBUTTON "Cancelar", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP
LTEXT "&Fuente:",1088 ,6,3,40,9
COMBOBOX 1136 ,6,13,94,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL |
CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE
LTEXT "Est&ilo de fuente:",1089 ,108,3,44,9
COMBOBOX 1137,108,13,64,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL |
WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE
LTEXT "&Tamaño:",1090,179,3,30,9
COMBOBOX 1138,179,13,32,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL |
WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE | CBS_SORT
DEFPUSHBUTTON "Aceptar",IDOK,218,6,40,14,WS_GROUP
PUSHBUTTON "Cancelar",IDCANCEL,218,23,40,14,WS_GROUP
PUSHBUTTON "A&plicar", 1026,218,40,40,14,WS_GROUP
PUSHBUTTON "A&yuda" , 1038,218,57,40,14,WS_GROUP
GROUPBOX "&Efectos",1072,6,72,84,34,WS_GROUP
CHECKBOX "&Rayado", 1040, 10,82,50,10, BS_AUTOCHECKBOX | WS_TABSTOP
CHECKBOX "&Subrayado", 1041, 10,94,50,10, BS_AUTOCHECKBOX
LTEXT "&Color:", 1091 ,6,110,30,9
COMBOBOX 1139,6,120,84,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS |
CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP
GROUPBOX "Ejemplo",1073,98,72,160,49,WS_GROUP
CTEXT "AaBbYyZzÑñ",1093,104,81,149,37,SS_NOPREFIX | WS_VISIBLE
}
CHOOSE_COLOR DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 200
CHOOSE_COLOR DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 300, 200
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Color"
FONT 8, "Helv"
{
LTEXT "Colores &basicos:", 1088, 6, 6, 40, 9
LTEXT "Colores person&alizados:", 1089, 6, 126, 40, 9
LTEXT "Color|Sól&ido", 1090, 100, 146, 40, 9
LTEXT "&Hue:", 1091, 150, 126, 40, 9
LTEXT "&Sat:", 1092, 150, 146, 40, 9
LTEXT "&Lum:", 1093, 150, 166, 40, 9
LTEXT "&Rojo:", 1094, 150, 126, 40, 9
LTEXT "&Verde:", 1095, 150, 146, 40, 9
LTEXT "A&zul:", 1096, 150, 166, 40, 9
DEFPUSHBUTTON "Aceptar", 1, 6, 182, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
PUSHBUTTON "Agregar a los &colores personalizados", 1024, 120, 182, 100, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON "Borrar colores personalizados", 1025, 6, 164, 56, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON "Cancelar", 2, 76, 182, 56, 14, WS_GROUP | WS_TABSTOP
LTEXT "Colores &básicos:", 1088, 4, 4, 140, 10
LTEXT "Colores person&alizados:", 1089, 4, 106, 140, 10
LTEXT "Color|Só3l&ido", 1090, 150, 151, 48, 10
LTEXT "&Rojo:", 726 /*1094*/,249,126,24,10
EDITTEXT 706, 275,124,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP
LTEXT "&Verde:",727/*1095*/,249,140,24,10
EDITTEXT 707, 275,138,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP
LTEXT "A&zul:",728 /*1096*/,249,154,24,10
EDITTEXT 708, 275,152,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP
LTEXT "&Tinte:" ,723 /*1091*/,202,126,22,10
EDITTEXT 703, 226,124,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP
LTEXT "&Sat.:" ,724 /*1092*/,202,140,22,10
EDITTEXT 704, 226,138,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP
LTEXT "&Lum.:" ,725 /*1093*/,202,154,22,10
EDITTEXT 705, 226,152,18,12, WS_BORDER | WS_GROUP | WS_TABSTOP
CONTROL "" ,720,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP,4,14,140,86
CONTROL "" ,721,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP,4,116,140,28
CONTROL "" ,710,"STATIC",WS_BORDER|SS_SIMPLE|WS_TABSTOP|WS_GROUP, 152,4,118,116 CONTROL "" ,702,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP, 278,4,8,116
CONTROL "" ,702,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP, 278,4,8,116
CONTROL "" ,709,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP, 152,124,40,26
DEFPUSHBUTTON "Aceptar", 1, 4, 166, 44, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
PUSHBUTTON "Cancelar", 2, 52, 166, 44, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON "A&yuda", 1038,100,166, 44, 14
PUSHBUTTON "Agregar a los &colores personalizados", 712/*1024*/, 152, 166, 142, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON "&Definir colores personalizados >>", 719/*1025*/, 4, 150, 142, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON "&i",713,300,200,4,14 /* just a dummy: 'i' is like &i in "sol&id" */
}

View File

@ -339,7 +339,7 @@ static HGLOBAL32 CURSORICON32_LoadHandler( HANDLE32 handle,
BITMAPINFOHEADER *bih = &pInfo->bmiHeader;
RGBQUAD *rgb = pInfo->bmiColors;
bits = (char *)bmi + size +
DIB_GetImageWidthBytes(bih->biWidth,bih->biBitCount)*bih->biHeight;
DIB_GetDIBWidthBytes(bih->biWidth,bih->biBitCount)*bih->biHeight;
bih->biBitCount = 1;
bih->biClrUsed = bih->biClrImportant = 2;
rgb[0].rgbBlue = rgb[0].rgbGreen = rgb[0].rgbRed = 0x00;
@ -351,7 +351,7 @@ static HGLOBAL32 CURSORICON32_LoadHandler( HANDLE32 handle,
BITMAPCOREHEADER *bch = (BITMAPCOREHEADER *)pInfo;
RGBTRIPLE *rgb = (RGBTRIPLE *)(bch + 1);
bits = (char *)bmi + size +
DIB_GetImageWidthBytes(bch->bcWidth,bch->bcBitCount)*bch->bcHeight;
DIB_GetDIBWidthBytes(bch->bcWidth,bch->bcBitCount)*bch->bcHeight;
bch->bcBitCount = 1;
rgb[0].rgbtBlue = rgb[0].rgbtGreen = rgb[0].rgbtRed = 0x00;
rgb[1].rgbtBlue = rgb[1].rgbtGreen = rgb[1].rgbtRed = 0xff;

View File

@ -25,6 +25,7 @@
#define DEBUG_WIN32
#include "debug.h"
DWORD ErrnoToLastError(int errno_num);
static int TranslateCreationFlags(DWORD create_flags);
static int TranslateAccessFlags(DWORD access_flags);

View File

@ -325,7 +325,7 @@ DWORD WaitForSingleObject(HANDLE32 h, DWORD timeout)
}
/***********************************************************************
* WaitForSingleObject (USER32.399)
* WaitForMultipleObjects (USER32.399)
*/
DWORD MsgWaitForMultipleObjects(
DWORD nCount,HANDLE32 *pHandles,BOOL32 fWaitAll,DWORD dwMilliseconds,

View File

@ -28,6 +28,8 @@
static short iF10Key = 0;
static short iMenuSysKey = 0;
extern void EndMenu(void);
/***********************************************************************
* DEFWND_HandleWindowPosChanged
*
@ -328,8 +330,7 @@ static LRESULT DEFWND_DefWinProc( WND *wndPtr, UINT32 msg, WPARAM32 wParam,
break;
case WM_CANCELMODE:
/* EndMenu() should be called if in menu state but currently it's
impossible to detect - menu code should be updated*/
if (wndPtr->parent == WIN_GetDesktop()) EndMenu();
if (GetCapture32() == wndPtr->hwndSelf) ReleaseCapture();
break;

View File

@ -61,8 +61,8 @@ LRESULT SendDriverMessage(HDRVR16 hDriver, UINT16 msg, LPARAM lParam1,
return 0;
}
retval = CallDriverProc( lpdrv->lpDrvProc, 0L /* FIXME */, hDriver, msg,
lParam1, lParam2 );
retval = CallDriverProc( (FARPROC16)lpdrv->lpDrvProc, 0L /* FIXME */,
hDriver, msg, lParam1, lParam2 );
dprintf_driver( stddeb, "SendDriverMessage // retval = %ld\n", retval );

View File

@ -11,6 +11,7 @@
#include <X11/Xutil.h>
#include <X11/Intrinsic.h>
#include "graphics.h"
#include "color.h"
#include "bitmap.h"
#include "gdi.h"
#include "dc.h"
@ -65,7 +66,7 @@ BOOL32 GRAPH_DrawLines( HDC32 hdc, LPPOINT32 pXY, INT32 N, HPEN32 hPen )
*/
BOOL32 GRAPH_DrawBitmap( HDC32 hdc, HBITMAP32 hbitmap,
INT32 xdest, INT32 ydest, INT32 xsrc, INT32 ysrc,
INT32 width, INT32 height )
INT32 width, INT32 height, BOOL32 bMono )
{
BITMAPOBJ *bmp;
DC *dc;
@ -73,24 +74,43 @@ BOOL32 GRAPH_DrawBitmap( HDC32 hdc, HBITMAP32 hbitmap,
if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return FALSE;
if (!(bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC )))
return FALSE;
xdest += dc->w.DCOrgX; ydest += dc->w.DCOrgY;
XSetFunction( display, dc->u.x.gc, GXcopy );
if (bmp->bitmap.bmBitsPixel == 1)
{
XSetForeground( display, dc->u.x.gc, dc->w.backgroundPixel );
XSetBackground( display, dc->u.x.gc, dc->w.textPixel );
XCopyPlane( display, bmp->pixmap, dc->u.x.drawable, dc->u.x.gc,
xsrc, ysrc, width, height,
dc->w.DCOrgX + xdest, dc->w.DCOrgY + ydest, 1 );
return TRUE;
xsrc, ysrc, width, height, xdest, ydest, 1 );
}
else if (bmp->bitmap.bmBitsPixel == dc->w.bitsPerPixel)
{
XCopyArea( display, bmp->pixmap, dc->u.x.drawable, dc->u.x.gc,
xsrc, ysrc, width, height,
dc->w.DCOrgX + xdest, dc->w.DCOrgY + ydest );
return TRUE;
if( bMono )
{
INT32 plane;
if( COLOR_GetMonoPlane(&plane) )
{
XSetForeground( display, dc->u.x.gc, dc->w.backgroundPixel );
XSetBackground( display, dc->u.x.gc, dc->w.textPixel );
}
else
{
XSetForeground( display, dc->u.x.gc, dc->w.textPixel );
XSetBackground( display, dc->u.x.gc, dc->w.backgroundPixel );
}
XCopyPlane( display, bmp->pixmap, dc->u.x.drawable, dc->u.x.gc,
xsrc, ysrc, width, height, xdest, ydest, plane );
}
else
XCopyArea( display, bmp->pixmap, dc->u.x.drawable,
dc->u.x.gc, xsrc, ysrc, width, height, xdest, ydest );
}
else return FALSE;
return TRUE;
}

View File

@ -639,7 +639,7 @@ msg->hwnd=%04x, msg->message=%04x\n", hAccel,hWnd,msg->hwnd,msg->message);
if (sendmsg) /* found an accelerator, but send a message... ? */
{
INT16 iSysStat,iStat,mesg=0;
HMENU16 hSysMenu,hMenu;
HMENU16 hMenu;
if (msg->message == WM_KEYUP || msg->message == WM_SYSKEYUP)
mesg=1;
@ -651,16 +651,14 @@ msg->hwnd=%04x, msg->message=%04x\n", hAccel,hWnd,msg->hwnd,msg->message);
mesg=3;
else
{
hMenu=GetMenu32(hWnd);
hSysMenu=GetSystemMenu32(hWnd,FALSE);
if (hSysMenu)
iSysStat=GetMenuState32(hSysMenu,lpAccelTbl->tbl[i].wIDval,MF_BYCOMMAND);
else
iSysStat=-1;
if (hMenu)
iStat=GetMenuState32(hMenu,lpAccelTbl->tbl[i].wIDval,MF_BYCOMMAND);
else
iStat=-1;
WND* wndPtr = WIN_FindWndPtr(hWnd);
hMenu = (wndPtr->dwStyle & WS_CHILD) ? 0 : (HMENU32)wndPtr->wIDmenu;
iSysStat = (wndPtr->hSysMenu) ? GetMenuState32(GetSubMenu16(wndPtr->hSysMenu, 0),
lpAccelTbl->tbl[i].wIDval, MF_BYCOMMAND) : -1 ;
iStat = (hMenu) ? GetMenuState32(hMenu,
lpAccelTbl->tbl[i].wIDval, MF_BYCOMMAND) : -1 ;
if (iSysStat!=-1)
{
if (iSysStat & (MF_DISABLED|MF_GRAYED))

View File

@ -30,6 +30,8 @@
#include "stddebug.h"
#include "debug.h"
#define MDIF_NEEDUPDATE 0x0001
static HBITMAP16 hBmpClose = 0;
static HBITMAP16 hBmpRestore = 0;
@ -57,9 +59,9 @@ static HWND16 MDI_GetChildByID(WND* wndPtr,int id)
static void MDI_PostUpdate(HWND16 hwnd, MDICLIENTINFO* ci, WORD recalc)
{
if( !ci->sbNeedUpdate )
if( !(ci->mdiFlags & MDIF_NEEDUPDATE) )
{
ci->sbNeedUpdate = TRUE;
ci->mdiFlags |= MDIF_NEEDUPDATE;
PostMessage16( hwnd, WM_MDICALCCHILDSCROLL, 0, 0);
}
ci->sbRecalc = recalc;
@ -980,7 +982,6 @@ static void MDI_UpdateFrameText( WND *frameWnd, HWND16 hClient,
LRESULT MDIClientWndProc(HWND16 hwnd, UINT16 message, WPARAM16 wParam, LPARAM lParam)
{
LPCREATESTRUCT16 cs;
LPCLIENTCREATESTRUCT16 ccs;
MDICLIENTINFO *ci;
RECT16 rect;
WND *w = WIN_FindWndPtr(hwnd);
@ -999,17 +1000,25 @@ LRESULT MDIClientWndProc(HWND16 hwnd, UINT16 message, WPARAM16 wParam, LPARAM lP
* so we have to keep track of what environment we're in. */
if( w->flags & WIN_ISWIN32 )
ccs = (LPCLIENTCREATESTRUCT16) cs->lpCreateParams;
else
ccs = (LPCLIENTCREATESTRUCT16) PTR_SEG_TO_LIN(cs->lpCreateParams);
{
#define ccs ((LPCLIENTCREATESTRUCT32)cs->lpCreateParams)
ci->hWindowMenu = ccs->hWindowMenu;
ci->idFirstChild = ccs->idFirstChild;
#undef ccs
}
else
{
LPCLIENTCREATESTRUCT16 ccs = (LPCLIENTCREATESTRUCT16)
PTR_SEG_TO_LIN(cs->lpCreateParams);
ci->hWindowMenu = ccs->hWindowMenu;
ci->idFirstChild = ccs->idFirstChild;
}
ci->hwndChildMaximized = 0;
ci->nActiveChildren = 0;
ci->nTotalCreated = 0;
ci->frameTitle = NULL;
ci->sbNeedUpdate = 0;
ci->mdiFlags = 0;
ci->self = hwnd;
w->dwStyle |= WS_CLIPCHILDREN;
@ -1020,7 +1029,7 @@ LRESULT MDIClientWndProc(HWND16 hwnd, UINT16 message, WPARAM16 wParam, LPARAM lP
}
MDI_UpdateFrameText(frameWnd, hwnd, MDI_NOFRAMEREPAINT,frameWnd->text);
AppendMenu32A( ccs->hWindowMenu, MF_SEPARATOR, 0, NULL );
AppendMenu32A( ci->hWindowMenu, MF_SEPARATOR, 0, NULL );
GetClientRect16(frameWnd->hwndSelf, &rect);
NC_HandleNCCalcSize( w, &rect );
@ -1064,7 +1073,7 @@ LRESULT MDIClientWndProc(HWND16 hwnd, UINT16 message, WPARAM16 wParam, LPARAM lP
((LONG) (ci->hwndChildMaximized>0) << 16));
case WM_MDIICONARRANGE:
ci->sbNeedUpdate = TRUE;
ci->mdiFlags |= MDIF_NEEDUPDATE;
MDIIconArrange(hwnd);
ci->sbRecalc = SB_BOTH+1;
SendMessage16(hwnd,WM_MDICALCCHILDSCROLL,0,0L);
@ -1090,17 +1099,17 @@ LRESULT MDIClientWndProc(HWND16 hwnd, UINT16 message, WPARAM16 wParam, LPARAM lP
#endif
case WM_MDITILE:
ci->sbNeedUpdate = TRUE;
ci->mdiFlags |= MDIF_NEEDUPDATE;
ShowScrollBar32(hwnd,SB_BOTH,FALSE);
MDITile(w, ci,wParam);
ci->sbNeedUpdate = FALSE;
ci->mdiFlags &= ~MDIF_NEEDUPDATE;
return 0;
case WM_VSCROLL:
case WM_HSCROLL:
ci->sbNeedUpdate = TRUE;
ci->mdiFlags |= MDIF_NEEDUPDATE;
ScrollChildren32(hwnd,message,wParam,lParam);
ci->sbNeedUpdate = FALSE;
ci->mdiFlags &= ~MDIF_NEEDUPDATE;
return 0;
case WM_SETFOCUS:
@ -1147,11 +1156,11 @@ LRESULT MDIClientWndProc(HWND16 hwnd, UINT16 message, WPARAM16 wParam, LPARAM lP
break;
case WM_MDICALCCHILDSCROLL:
if( ci->sbNeedUpdate )
if( ci->sbRecalc )
if( (ci->mdiFlags & MDIF_NEEDUPDATE) && ci->sbRecalc )
{
CalcChildScroll(hwnd, ci->sbRecalc-1);
ci->sbRecalc = ci->sbNeedUpdate = 0;
ci->sbRecalc = 0;
ci->mdiFlags &= ~MDIF_NEEDUPDATE;
}
return 0;
}
@ -1240,15 +1249,15 @@ LRESULT DefFrameProc16( HWND16 hwnd, HWND16 hwndMDIClient, UINT16 message,
/* control menu is between the frame system menu and
* the first entry of menu bar */
if( wParam == VK_LEFT )
{ if( wndPtr->parent->wIDmenu != LOWORD(lParam) ) break; }
else if( wParam == VK_RIGHT )
{ if( GetSystemMenu16( wndPtr->parent->hwndSelf, 0)
!= LOWORD(lParam) ) break; }
else break;
return MAKELONG( GetSystemMenu16(ci->hwndActiveChild, 0),
ci->hwndActiveChild );
if( (wParam == VK_LEFT &&
wndPtr->parent->wIDmenu == LOWORD(lParam)) ||
(wParam == VK_RIGHT &&
GetSubMenu16(wndPtr->parent->hSysMenu, 0) == LOWORD(lParam)) )
{
wndPtr = WIN_FindWndPtr(ci->hwndActiveChild);
return MAKELONG( GetSubMenu16(wndPtr->hSysMenu, 0),
ci->hwndActiveChild);
}
}
break;
}
@ -1405,8 +1414,7 @@ LRESULT DefMDIChildProc16( HWND16 hwnd, UINT16 message,
return 0;
case WM_SETVISIBLE:
if( ci->hwndChildMaximized)
ci->sbNeedUpdate = 0;
if( ci->hwndChildMaximized) ci->mdiFlags &= ~MDIF_NEEDUPDATE;
else
MDI_PostUpdate(clientWnd->hwndSelf, ci, SB_BOTH+1);
break;
@ -1469,7 +1477,7 @@ LRESULT DefMDIChildProc16( HWND16 hwnd, UINT16 message,
case WM_NEXTMENU:
if( wParam == VK_LEFT ) /* switch to frame system menu */
return MAKELONG( GetSystemMenu16(clientWnd->parent->hwndSelf, 0),
return MAKELONG( GetSubMenu16(clientWnd->parent->hSysMenu, 0),
clientWnd->parent->hwndSelf );
if( wParam == VK_RIGHT ) /* to frame menu bar */
return MAKELONG( clientWnd->parent->wIDmenu,
@ -1603,22 +1611,28 @@ BOOL16 TranslateMDISysAccel16( HWND16 hwndClient, LPMSG16 msg )
MDICLIENTINFO *ci = NULL;
WPARAM16 wParam = 0;
if( (msg->message != WM_KEYDOWN && msg->message != WM_SYSKEYDOWN) || !clientWnd )
return 0;
if( clientWnd && (msg->message == WM_KEYDOWN || msg->message == WM_SYSKEYDOWN))
{
MDICLIENTINFO *ci = NULL;
WND* wnd;
ci = (MDICLIENTINFO*) clientWnd->wExtra;
wnd = WIN_FindWndPtr(ci->hwndActiveChild);
if( wnd && !(wnd->dwStyle & WS_DISABLED) )
{
WPARAM16 wParam = 0;
if( !wnd ) return 0;
/* translate if the Ctrl key is down and Alt not. */
if( wnd->dwStyle & WS_DISABLED ) return 0;
if ((GetKeyState32(VK_CONTROL) & 0x8000) && !(GetKeyState32(VK_MENU) & 0x8000))
if( (GetKeyState32(VK_CONTROL) & 0x8000) &&
!(GetKeyState32(VK_MENU) & 0x8000))
{
switch( msg->wParam )
{
case VK_F6:
case VK_SEPARATOR:
wParam = ( GetKeyState32(VK_SHIFT) & 0x8000 )? SC_NEXTWINDOW: SC_PREVWINDOW;
wParam = ( GetKeyState32(VK_SHIFT) & 0x8000 )
? SC_NEXTWINDOW : SC_PREVWINDOW;
break;
case VK_F4:
case VK_RBUTTON:
@ -1627,13 +1641,14 @@ BOOL16 TranslateMDISysAccel16( HWND16 hwndClient, LPMSG16 msg )
default:
return 0;
}
else
return 0;
dprintf_mdi(stddeb,"TranslateMDISysAccel: wParam = %04x\n", wParam);
SendMessage16(ci->hwndActiveChild,WM_SYSCOMMAND, wParam, (LPARAM)msg->wParam);
SendMessage16( ci->hwndActiveChild, WM_SYSCOMMAND,
wParam, (LPARAM)msg->wParam);
return 1;
}
}
}
return 0; /* failure */
}

View File

@ -1055,7 +1055,7 @@ LRESULT SendMessage16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, LPARAM lParam)
fprintf( stderr, "SendMessage16: invalid hwnd %04x\n", hwnd );
return 0;
}
if (QUEUE_IsDoomedQueue(wndPtr->hmemTaskQ))
if (QUEUE_IsExitingQueue(wndPtr->hmemTaskQ))
return 0; /* Don't send anything if the task is dying */
if (wndPtr->hmemTaskQ != GetTaskQueue(0))
return MSG_SendMessage( wndPtr->hmemTaskQ, hwnd, msg, wParam, lParam );
@ -1120,7 +1120,7 @@ LRESULT SendMessage32A(HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
return 0;
}
if (QUEUE_IsDoomedQueue(wndPtr->hmemTaskQ))
if (QUEUE_IsExitingQueue(wndPtr->hmemTaskQ))
return 0; /* Don't send anything if the task is dying */
if (wndPtr->hmemTaskQ != GetTaskQueue(0))
@ -1168,7 +1168,7 @@ LRESULT SendMessage32W(HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
fprintf( stderr, "SendMessage32W: invalid hwnd %08x\n", hwnd );
return 0;
}
if (QUEUE_IsDoomedQueue(wndPtr->hmemTaskQ))
if (QUEUE_IsExitingQueue(wndPtr->hmemTaskQ))
return 0; /* Don't send anything if the task is dying */
if (wndPtr->hmemTaskQ != GetTaskQueue(0))
{

View File

@ -465,11 +465,11 @@ static void NC_DrawMaxButton( HWND32 hwnd, HDC16 hdc, BOOL32 down )
if( !(wndPtr->flags & WIN_MANAGED) )
{
NC_GetInsideRect( hwnd, &rect );
GRAPH_DrawBitmap( hdc, (IsZoomed32(hwnd) ?
(down ? hbitmapRestoreD : hbitmapRestore) :
(down ? hbitmapMaximizeD : hbitmapMaximize)),
GRAPH_DrawBitmap( hdc, (IsZoomed32(hwnd)
? (down ? hbitmapRestoreD : hbitmapRestore)
: (down ? hbitmapMaximizeD : hbitmapMaximize)),
rect.right - SYSMETRICS_CXSIZE - 1, rect.top,
0, 0, SYSMETRICS_CXSIZE+1, SYSMETRICS_CYSIZE );
0, 0, SYSMETRICS_CXSIZE+1, SYSMETRICS_CYSIZE, FALSE );
}
}
@ -488,7 +488,7 @@ static void NC_DrawMinButton( HWND32 hwnd, HDC16 hdc, BOOL32 down )
if (wndPtr->dwStyle & WS_MAXIMIZEBOX) rect.right -= SYSMETRICS_CXSIZE+1;
GRAPH_DrawBitmap( hdc, (down ? hbitmapMinimizeD : hbitmapMinimize),
rect.right - SYSMETRICS_CXSIZE - 1, rect.top,
0, 0, SYSMETRICS_CXSIZE+1, SYSMETRICS_CYSIZE );
0, 0, SYSMETRICS_CXSIZE+1, SYSMETRICS_CYSIZE, FALSE );
}
}
@ -927,19 +927,18 @@ static void NC_TrackSysMenu( HWND32 hwnd, POINT16 pt )
* Initialisation of a move or resize, when initiatied from a menu choice.
* Return hit test code for caption or sizing border.
*/
static LONG NC_StartSizeMove( HWND32 hwnd, WPARAM16 wParam,
static LONG NC_StartSizeMove( WND* wndPtr, WPARAM16 wParam,
POINT16 *capturePoint )
{
LONG hittest = 0;
POINT16 pt;
MSG16 msg;
WND * wndPtr = WIN_FindWndPtr( hwnd );
if ((wParam & 0xfff0) == SC_MOVE)
{
/* Move pointer at the center of the caption */
RECT32 rect;
NC_GetInsideRect( hwnd, &rect );
NC_GetInsideRect( wndPtr->hwndSelf, &rect );
if (wndPtr->dwStyle & WS_SYSMENU)
rect.left += SYSMETRICS_CXSIZE + 1;
if (wndPtr->dwStyle & WS_MINIMIZEBOX)
@ -948,20 +947,21 @@ static LONG NC_StartSizeMove( HWND32 hwnd, WPARAM16 wParam,
rect.right -= SYSMETRICS_CXSIZE + 1;
pt.x = wndPtr->rectWindow.left + (rect.right - rect.left) / 2;
pt.y = wndPtr->rectWindow.top + rect.top + SYSMETRICS_CYSIZE/2;
hittest = HTCAPTION;
*capturePoint = pt;
if (wndPtr->dwStyle & WS_CHILD)
ClientToScreen16( wndPtr->parent->hwndSelf, &pt );
hittest = HTCAPTION;
}
else /* SC_SIZE */
{
SetCapture32(hwnd);
while(!hittest)
{
MSG_InternalGetMessage( &msg, 0, 0, MSGF_SIZE, PM_REMOVE, FALSE );
switch(msg.message)
{
case WM_MOUSEMOVE:
hittest = NC_HandleNCHitTest( hwnd, msg.pt );
hittest = NC_HandleNCHitTest( wndPtr->hwndSelf, msg.pt );
pt = msg.pt;
if ((hittest < HTLEFT) || (hittest > HTBOTTOMRIGHT))
hittest = 0;
@ -998,10 +998,11 @@ static LONG NC_StartSizeMove( HWND32 hwnd, WPARAM16 wParam,
}
}
}
}
*capturePoint = pt;
SetCursorPos32( capturePoint->x, capturePoint->y );
NC_HandleSetCursor( hwnd, (WPARAM16)hwnd, MAKELONG( hittest, WM_MOUSEMOVE ));
}
SetCursorPos32( pt.x, pt.y );
NC_HandleSetCursor( wndPtr->hwndSelf,
wndPtr->hwndSelf, MAKELONG( hittest, WM_MOUSEMOVE ));
return hittest;
}
@ -1030,17 +1031,18 @@ static void NC_DoSizeMove( HWND32 hwnd, WORD wParam, POINT16 pt )
if ((wParam & 0xfff0) == SC_MOVE)
{
if (!(wndPtr->dwStyle & WS_CAPTION)) return;
if (!hittest) hittest = NC_StartSizeMove( hwnd, wParam, &capturePoint );
if (!hittest)
hittest = NC_StartSizeMove( wndPtr, wParam, &capturePoint );
if (!hittest) return;
}
else /* SC_SIZE */
{
if (!thickframe) return;
if (hittest) hittest += HTLEFT-1;
if ( hittest && hittest != HTSYSMENU ) hittest += 2;
else
{
SetCapture32(hwnd);
hittest = NC_StartSizeMove( hwnd, wParam, &capturePoint );
hittest = NC_StartSizeMove( wndPtr, wParam, &capturePoint );
if (!hittest)
{
ReleaseCapture();
@ -1055,7 +1057,8 @@ static void NC_DoSizeMove( HWND32 hwnd, WORD wParam, POINT16 pt )
sizingRect = wndPtr->rectWindow;
if (wndPtr->dwStyle & WS_CHILD)
GetClientRect16( wndPtr->parent->hwndSelf, &mouseRect );
else SetRect16(&mouseRect, 0, 0, SYSMETRICS_CXSCREEN, SYSMETRICS_CYSCREEN);
else
SetRect16(&mouseRect, 0, 0, SYSMETRICS_CXSCREEN, SYSMETRICS_CYSCREEN);
if (ON_LEFT_BORDER(hittest))
{
mouseRect.left = MAX( mouseRect.left, sizingRect.right-maxTrack.x );
@ -1361,7 +1364,8 @@ LONG NC_HandleNCLButtonDown( HWND32 hwnd, WPARAM16 wParam, LPARAM lParam )
case HTBOTTOM:
case HTBOTTOMLEFT:
case HTBOTTOMRIGHT:
SendMessage16( hwnd, WM_SYSCOMMAND, SC_SIZE + wParam - HTLEFT+1, lParam);
/* make sure hittest fits into 0xf and doesn't overlap with HTSYSMENU */
SendMessage16( hwnd, WM_SYSCOMMAND, SC_SIZE + wParam - 2, lParam);
break;
case HTBORDER:
@ -1416,14 +1420,15 @@ LONG NC_HandleSysCommand( HWND32 hwnd, WPARAM16 wParam, POINT16 pt )
{
WND *wndPtr = WIN_FindWndPtr( hwnd );
POINT32 pt32;
UINT16 uCommand = wParam & 0xFFF0;
dprintf_nonclient(stddeb, "Handling WM_SYSCOMMAND %x %d,%d\n",
wParam, pt.x, pt.y );
if (wndPtr->dwStyle & WS_CHILD && wParam != SC_KEYMENU )
if (wndPtr->dwStyle & WS_CHILD && uCommand != SC_KEYMENU )
ScreenToClient16( wndPtr->parent->hwndSelf, &pt );
switch (wParam & 0xfff0)
switch (uCommand)
{
case SC_SIZE:
case SC_MOVE:

View File

@ -19,7 +19,7 @@
#define MAX_QUEUE_SIZE 120 /* Max. size of a message queue */
static HQUEUE16 hFirstQueue = 0;
static HQUEUE16 hDoomedQueue = 0;
static HQUEUE16 hExitingQueue = 0;
static HQUEUE16 hmemSysMsgQueue = 0;
static MESSAGEQUEUE *sysMsgQueue = NULL;
@ -94,20 +94,20 @@ void QUEUE_WalkQueues(void)
/***********************************************************************
* QUEUE_IsDoomedQueue
* QUEUE_IsExitingQueue
*/
BOOL32 QUEUE_IsDoomedQueue( HQUEUE16 hQueue )
BOOL32 QUEUE_IsExitingQueue( HQUEUE16 hQueue )
{
return (hDoomedQueue && (hQueue == hDoomedQueue));
return (hExitingQueue && (hQueue == hExitingQueue));
}
/***********************************************************************
* QUEUE_SetDoomedQueue
* QUEUE_SetExitingQueue
*/
void QUEUE_SetDoomedQueue( HQUEUE16 hQueue )
void QUEUE_SetExitingQueue( HQUEUE16 hQueue )
{
hDoomedQueue = hQueue;
hExitingQueue = hQueue;
}

View File

@ -21,7 +21,7 @@
WORD USER_HeapSel = 0;
extern BOOL32 MENU_SwitchTPWndTo(HTASK16);
extern BOOL32 MENU_PatchResidentPopup( HQUEUE16, WND* );
extern void QUEUE_FlushMessages(HQUEUE16);
/***********************************************************************
@ -123,16 +123,16 @@ void USER_AppExit( HTASK16 hTask, HINSTANCE16 hInstance, HQUEUE16 hQueue )
desktop->hmemTaskQ = GetTaskQueue(TASK_GetNextTask(hTask));
/* Patch resident popup menu window */
MENU_SwitchTPWndTo(0);
MENU_PatchResidentPopup( hQueue, NULL );
TIMER_RemoveQueueTimers( hQueue );
QUEUE_FlushMessages( hQueue );
HOOK_FreeQueueHooks( hQueue );
QUEUE_SetDoomedQueue( hQueue );
QUEUE_SetExitingQueue( hQueue );
WIN_ResetQueueWindows( desktop->child, hQueue, (HQUEUE16)0);
QUEUE_SetDoomedQueue( 0 );
QUEUE_SetExitingQueue( 0 );
/* Free the message queue */

View File

@ -43,6 +43,7 @@ static HWND32 hwndSysModal = 0;
static WORD wDragWidth = 4;
static WORD wDragHeight= 3;
extern BOOL32 MENU_PatchResidentPopup( HQUEUE16, WND* );
extern HCURSOR16 CURSORICON_IconToCursor(HICON16, BOOL32);
extern HWND32 CARET_GetHwnd(void);
extern BOOL32 WINPOS_ActivateOtherWindow(WND* pWnd);
@ -569,8 +570,9 @@ static HWND32 WIN_CreateWindowEx( CREATESTRUCT32A *cs, ATOM classAtom,
wndPtr->pVScroll = NULL;
wndPtr->pHScroll = NULL;
wndPtr->pProp = NULL;
wndPtr->hSysMenu = MENU_GetDefSysMenu();
wndPtr->userdata = 0;
wndPtr->hSysMenu = (wndPtr->dwStyle & WS_SYSMENU)
? MENU_GetSysMenu( hwnd, 0 ) : 0;
if (classPtr->cbWndExtra) memset( wndPtr->wExtra, 0, classPtr->cbWndExtra);
@ -1000,7 +1002,7 @@ BOOL32 DestroyWindow32( HWND32 hwnd )
/* FIXME: clean up palette - see "Internals" p.352 */
}
if( !QUEUE_IsDoomedQueue(wndPtr->hmemTaskQ) )
if( !QUEUE_IsExitingQueue(wndPtr->hmemTaskQ) )
WIN_SendParentNotify( hwnd, WM_DESTROY, wndPtr->wIDmenu, (LPARAM)hwnd );
if (!IsWindow32(hwnd)) return TRUE;
@ -1012,7 +1014,7 @@ BOOL32 DestroyWindow32( HWND32 hwnd )
{
SetWindowPos32( hwnd, 0, 0, 0, 0, 0, SWP_HIDEWINDOW |
SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|
((QUEUE_IsDoomedQueue(wndPtr->hmemTaskQ))?SWP_DEFERERASE:0) );
((QUEUE_IsExitingQueue(wndPtr->hmemTaskQ))?SWP_DEFERERASE:0) );
if (!IsWindow32(hwnd)) return TRUE;
}
@ -1020,6 +1022,9 @@ BOOL32 DestroyWindow32( HWND32 hwnd )
if( !(wndPtr->dwStyle & WS_CHILD) )
{
/* make sure top menu popup doesn't get destroyed */
MENU_PatchResidentPopup( TRUE, wndPtr );
for (;;)
{
WND *siblingPtr = wndPtr->parent->child; /* First sibling */

View File

@ -1181,7 +1181,7 @@ BOOL32 WINPOS_ActivateOtherWindow(WND* pWnd)
hwndPrevActive = 0;
if( hwndActive != pWnd->hwndSelf &&
( hwndActive || QUEUE_IsDoomedQueue(pWnd->hmemTaskQ)) )
( hwndActive || QUEUE_IsExitingQueue(pWnd->hmemTaskQ)) )
return 0;
if( pWnd->dwStyle & WS_POPUP &&