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, &param, &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, &param, &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, &param, &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