winealsa dsound capture message patch
Robert Reif
reif at earthlink.net
Tue Aug 17 22:27:27 CDT 2004
Try this one.
-------------- next part --------------
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);
}
More information about the wine-patches
mailing list