Try this one.
Index: dlls/winmm/winealsa/audio.c =================================================================== RCS file: /home/wine/wine/dlls/winmm/winealsa/audio.c,v retrieving revision 1.50 diff -u -r1.50 audio.c --- dlls/winmm/winealsa/audio.c 12 Aug 2004 23:00:52 -0000 1.50 +++ dlls/winmm/winealsa/audio.c 18 Aug 2004 03:23:23 -0000 @@ -244,19 +244,25 @@ static DWORD wodDsGuid(UINT wDevID, LPGUID pGuid);
/* These strings used only for tracing */ -#if 1 -static const char *wodPlayerCmdString[] = { - "WINE_WM_PAUSING", - "WINE_WM_RESTARTING", - "WINE_WM_RESETTING", - "WINE_WM_HEADER", - "WINE_WM_UPDATE", - "WINE_WM_BREAKLOOP", - "WINE_WM_CLOSING", - "WINE_WM_STARTING", - "WINE_WM_STOPPING", -}; -#endif +static const char * getCmdString(enum win_wm_message msg) +{ + static char unknown[32]; +#define MSG_TO_STR(x) case x: return #x + switch(msg) { + MSG_TO_STR(WINE_WM_PAUSING); + MSG_TO_STR(WINE_WM_RESTARTING); + MSG_TO_STR(WINE_WM_RESETTING); + MSG_TO_STR(WINE_WM_HEADER); + MSG_TO_STR(WINE_WM_UPDATE); + MSG_TO_STR(WINE_WM_BREAKLOOP); + MSG_TO_STR(WINE_WM_CLOSING); + MSG_TO_STR(WINE_WM_STARTING); + MSG_TO_STR(WINE_WM_STOPPING); + } +#undef MSG_TO_STR + sprintf(unknown, "UNKNOWN(0x%08x)", msg); + return unknown; +}
static DWORD bytes_to_mmtime(LPMMTIME lpTime, DWORD position, PCMWAVEFORMAT* format) @@ -839,8 +845,11 @@ snd_pcm_hw_params_get_access_mask(hw_params, acmask);
/* FIXME: NONITERLEAVED and COMPLEX are not supported right now */ - if ( snd_pcm_access_mask_test( acmask, SND_PCM_ACCESS_MMAP_INTERLEAVED ) ) + if ( snd_pcm_access_mask_test( acmask, SND_PCM_ACCESS_MMAP_INTERLEAVED ) ) { +#if 0 wwi->caps.dwSupport |= WAVECAPS_DIRECTSOUND; +#endif + } }
TRACE("Configured with dwFmts=%08lx dwSupport=%08lx\n", @@ -933,7 +942,9 @@ return 0; } if (omr->msg_toget != omr->msg_tosave && omr->messages[omr->msg_toget].msg != WINE_WM_HEADER) - FIXME("two fast messages in the queue!!!!\n"); + FIXME("two fast messages in the queue!!!! toget = %d(%s), tosave=%d(%s)\n", + omr->msg_toget,getCmdString(omr->messages[omr->msg_toget].msg), + omr->msg_tosave,getCmdString(omr->messages[omr->msg_tosave].msg));
/* fast messages have to be added at the start of the queue */ omr->msg_toget = (omr->msg_toget + omr->ring_buffer_size - 1) % omr->ring_buffer_size; @@ -1342,7 +1353,7 @@ int err;
while (ALSA_RetrieveRingMessage(&wwo->msgRing, &msg, ¶m, &ev)) { - TRACE("Received %s %lx\n", wodPlayerCmdString[msg - WM_USER - 1], param); + TRACE("Received %s %lx\n", getCmdString(msg), param);
switch (msg) { case WINE_WM_PAUSING: @@ -2803,6 +2814,10 @@ widNotifyClient(wwi, WIM_DATA, (DWORD)lpWaveHdr, 0); lpWaveHdr = lpNext; } + } else { + TRACE("read(%s, %p, %ld) failed (%s)\n", wwi->device, + lpWaveHdr->lpData + lpWaveHdr->dwBytesRecorded, + frames_per_period, strerror(errno)); } } else @@ -2814,6 +2829,12 @@
TRACE("bytesRead=%ld (local)\n", bytesRead);
+ if (bytesRead == (DWORD) -1) { + TRACE("read(%s, %p, %ld) failed (%s)\n", wwi->device, + buffer, frames_per_period, strerror(errno)); + continue; + } + /* copy data in client buffers */ while (bytesRead != (DWORD) -1 && bytesRead > 0) { @@ -2853,7 +2874,7 @@ LPWAVEHDR hdr; ALSA_RetrieveRingMessage(&wwi->msgRing, &msg, ¶m, &ev); hdr = ((LPWAVEHDR)param); - TRACE("msg = %s, hdr = %p, ev = %p\n", wodPlayerCmdString[msg - WM_USER - 1], hdr, ev); + TRACE("msg = %s, hdr = %p, ev = %p\n", getCmdString(msg), hdr, ev); hdr->lpNext = 0; if (lpWaveHdr == 0) { /* new head of queue */ @@ -2887,7 +2908,7 @@
while (ALSA_RetrieveRingMessage(&wwi->msgRing, &msg, ¶m, &ev)) { - TRACE("msg=%s param=0x%lx\n", wodPlayerCmdString[msg - WM_USER - 1], param); + TRACE("msg=%s param=0x%lx\n", getCmdString(msg), param); switch (msg) { case WINE_WM_PAUSING: wwi->state = WINE_WS_PAUSED; @@ -3399,6 +3420,40 @@ }
/************************************************************************** + * widDsCreate [internal] + */ +static DWORD widDsCreate(UINT wDevID, PIDSCDRIVER* drv) +{ + TRACE("(%d,%p)\n",wDevID,drv); + + /* the HAL isn't much better than the HEL if we can't do mmap() */ + FIXME("DirectSoundCapture not implemented\n"); + MESSAGE("The (slower) DirectSound HEL mode will be used instead.\n"); + return MMSYSERR_NOTSUPPORTED; +} + +/************************************************************************** + * widDsDesc [internal] + */ +static DWORD widDsDesc(UINT wDevID, PDSDRIVERDESC desc) +{ + memcpy(desc, &(WInDev[wDevID].ds_desc), sizeof(DSDRIVERDESC)); + return MMSYSERR_NOERROR; +} + +/************************************************************************** + * widDsGuid [internal] + */ +static DWORD widDsGuid(UINT wDevID, LPGUID pGuid) +{ + TRACE("(%d,%p)\n",wDevID,pGuid); + + memcpy(pGuid, &(WInDev[wDevID].ds_guid), sizeof(GUID)); + + return MMSYSERR_NOERROR; +} + +/************************************************************************** * widMessage (WINEALSA.@) */ DWORD WINAPI ALSA_widMessage(UINT wDevID, UINT wMsg, DWORD dwUser, @@ -3427,9 +3482,9 @@ case WIDM_STOP: return widStop (wDevID, (LPWAVEHDR)dwParam1, dwParam2); case DRV_QUERYDEVICEINTERFACESIZE: return widDevInterfaceSize (wDevID, (LPDWORD)dwParam1); case DRV_QUERYDEVICEINTERFACE: return widDevInterface (wDevID, (PWCHAR)dwParam1, dwParam2); - /*case DRV_QUERYDSOUNDIFACE: return widDsCreate (wDevID, (PIDSCDRIVER*)dwParam1); + case DRV_QUERYDSOUNDIFACE: return widDsCreate (wDevID, (PIDSCDRIVER*)dwParam1); case DRV_QUERYDSOUNDDESC: return widDsDesc (wDevID, (PDSDRIVERDESC)dwParam1); - case DRV_QUERYDSOUNDGUID: return widDsGuid (wDevID, (LPGUID)dwParam1);*/ + case DRV_QUERYDSOUNDGUID: return widDsGuid (wDevID, (LPGUID)dwParam1); default: FIXME("unknown message %d!\n", wMsg); }