audio driver interface name patch

Robert Reif reif at earthlink.net
Mon May 10 20:26:47 CDT 2004


Adds an interface name to wineoss, winealsa, winearts and winejack.
Adds support for wave interface message where missing.

Only wineoss has been tested.

The winmm test results for winetest don't list which driver is used.
This information is necessary for debugging  purposes.  The wave
query device interface message now returns the driver and device
name or index in the form: wineoss: /dev/dsp#, winealsa: hw???,
winearts: # and winejack: #.
-------------- next part --------------
Index: dlls/winmm/winealsa/audio.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/winealsa/audio.c,v
retrieving revision 1.42
diff -u -r1.42 audio.c
--- dlls/winmm/winealsa/audio.c	5 May 2004 22:03:48 -0000	1.42
+++ dlls/winmm/winealsa/audio.c	11 May 2004 01:11:00 -0000
@@ -149,7 +149,8 @@
     WAVEOUTCAPSA		caps;
 
     /* ALSA information (ALSA 0.9/1.x uses two different devices for playback/capture) */
-    char*                      device;
+    char*                       device;
+    char                        interface_name[64];
     snd_pcm_t*                  p_handle;                 /* handle to ALSA playback device */
     snd_pcm_t*                  c_handle;                 /* handle to ALSA capture device */
     snd_pcm_hw_params_t *	hw_params;		/* ALSA Hw params */
@@ -195,7 +196,8 @@
     WAVEOUTCAPSA		caps;
 
     /* ALSA information (ALSA 0.9/1.x uses two different devices for playback/capture) */
-    char*                      device;
+    char*                       device;
+    char                        interface_name[64];
     snd_pcm_t*                  p_handle;                 /* handle to ALSA playback device */
     snd_pcm_t*                  c_handle;                 /* handle to ALSA capture device */
     snd_pcm_hw_params_t *	hw_params;		/* ALSA Hw params */
@@ -581,6 +583,8 @@
     wwo->device = ALSA_GetDeviceFromReg("PlaybackDevice");
     TRACE("using waveout device \"%s\"\n", wwo->device);
 
+    snprintf(wwo->interface_name, sizeof(wwo->interface_name), "winealsa: %s", wwo->device);
+
     wwo->caps.wMid = 0x0002;
     wwo->caps.wPid = 0x0104;
     strcpy(wwo->caps.szPname, "SB16 Wave Out");
@@ -694,6 +698,8 @@
     wwi->device = ALSA_GetDeviceFromReg("RecordDevice");
     TRACE("using wavein device \"%s\"\n", wwi->device);
 
+    snprintf(wwi->interface_name, sizeof(wwi->interface_name), "winealsa: %s", wwi->device);
+
     wwi->caps.wMid = 0x0002;
     wwi->caps.wPid = 0x0104;
     strcpy(wwi->caps.szPname, "SB16 Wave In");
@@ -2000,7 +2006,7 @@
 {
     TRACE("(%u, %p)\n", wDevID, dwParam1);
 
-    *dwParam1 = MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].device, -1,
+    *dwParam1 = MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].interface_name, -1,
                                     NULL, 0 ) * sizeof(WCHAR);
     return MMSYSERR_NOERROR;
 }
@@ -2010,10 +2016,10 @@
  */
 static DWORD wodDevInterface(UINT wDevID, PWCHAR dwParam1, DWORD dwParam2)
 {
-    if (dwParam2 >= MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].device, -1,
+    if (dwParam2 >= MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].interface_name, -1,
                                         NULL, 0 ) * sizeof(WCHAR))
     {
-        MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].device, -1,
+        MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].interface_name, -1,
                             dwParam1, dwParam2 / sizeof(WCHAR));
 	return MMSYSERR_NOERROR;
     }
@@ -3394,6 +3400,33 @@
 }
 
 /**************************************************************************
+ *                              widDevInterfaceSize             [internal]
+ */
+static DWORD widDevInterfaceSize(UINT wDevID, LPDWORD dwParam1)
+{
+    TRACE("(%u, %p)\n", wDevID, dwParam1);
+                                                                                                                                             
+    *dwParam1 = MultiByteToWideChar(CP_ACP, 0, WInDev[wDevID].interface_name, -1,
+                                    NULL, 0 ) * sizeof(WCHAR);
+    return MMSYSERR_NOERROR;
+}
+
+/**************************************************************************
+ *                              widDevInterface                 [internal]
+ */
+static DWORD widDevInterface(UINT wDevID, PWCHAR dwParam1, DWORD dwParam2)
+{
+    if (dwParam2 >= MultiByteToWideChar(CP_ACP, 0, WInDev[wDevID].interface_name, -1,
+                                        NULL, 0 ) * sizeof(WCHAR))
+    {
+        MultiByteToWideChar(CP_ACP, 0, WInDev[wDevID].interface_name, -1,
+                            dwParam1, dwParam2 / sizeof(WCHAR));
+        return MMSYSERR_NOERROR;
+    }
+    return MMSYSERR_INVALPARAM;
+}
+
+/**************************************************************************
  * 				widMessage (WINEALSA.@)
  */
 DWORD WINAPI ALSA_widMessage(UINT wDevID, UINT wMsg, DWORD dwUser,
@@ -3420,9 +3453,9 @@
     case WIDM_RESET:		return widReset		(wDevID);
     case WIDM_START: 		return widStart	(wDevID, (LPWAVEHDR)dwParam1, 		dwParam2);
     case WIDM_STOP: 		return widStop	(wDevID, (LPWAVEHDR)dwParam1, 		dwParam2);
-    /*case DRV_QUERYDEVICEINTERFACESIZE: return wdDevInterfaceSize       (wDevID, (LPDWORD)dwParam1);
-    case DRV_QUERYDEVICEINTERFACE:     return wdDevInterface           (wDevID, (PWCHAR)dwParam1, dwParam2);
-    case DRV_QUERYDSOUNDIFACE:	return widDsCreate   (wDevID, (PIDSCDRIVER*)dwParam1);
+    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_QUERYDSOUNDDESC:	return widDsDesc     (wDevID, (PDSDRIVERDESC)dwParam1);
     case DRV_QUERYDSOUNDGUID:	return widDsGuid     (wDevID, (LPGUID)dwParam1);*/
     default:
Index: dlls/winmm/winearts/audio.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/winearts/audio.c,v
retrieving revision 1.16
diff -u -r1.16 audio.c
--- dlls/winmm/winearts/audio.c	26 Apr 2004 20:04:00 -0000	1.16
+++ dlls/winmm/winearts/audio.c	11 May 2004 01:11:01 -0000
@@ -146,6 +146,7 @@
     WORD			wFlags;
     PCMWAVEFORMAT		format;
     WAVEOUTCAPSA		caps;
+    char                        interface_name[32];
 
     DWORD			dwSleepTime;		/* Num of milliseconds to sleep between filling the dsp buffers */
 
@@ -183,6 +184,7 @@
     WORD			wFlags;
     PCMWAVEFORMAT		format;
     WAVEINCAPSA			caps;
+    char                        interface_name[32];
 
     /* arts information */
     arts_stream_t 		record_stream;		/* the stream structure we get from arts when opening a stream for recording */
@@ -378,6 +380,8 @@
     /*    strcpy(WOutDev[i].caps.szPname, "OpenSoundSystem WAVOUT Driver");*/
     	strcpy(WOutDev[i].caps.szPname, "CS4236/37/38");
 #endif
+        snprintf(WOutDev[i].interface_name, sizeof(WOutDev[i].interface_name), "winearts: %d", i);
+
     	WOutDev[i].caps.vDriverVersion = 0x0100;
     	WOutDev[i].caps.dwFormats = 0x00000000;
     	WOutDev[i].caps.dwSupport = WAVECAPS_VOLUME;
@@ -417,6 +421,8 @@
 	WInDev[i].caps.wPid = 0x0001;
 	strcpy(WInDev[i].caps.szPname,"CS4236/37/38");
 #endif
+        snprintf(WInDev[i].interface_name, sizeof(WInDev[i].interface_name), "winearts: %d", i);
+
 	WInDev[i].caps.vDriverVersion = 0x0100;
    	WInDev[i].caps.dwFormats = 0x00000000;
 
@@ -1498,6 +1504,33 @@
 }
 
 /**************************************************************************
+ *                              wodDevInterfaceSize             [internal]
+ */
+static DWORD wodDevInterfaceSize(UINT wDevID, LPDWORD dwParam1)
+{
+    TRACE("(%u, %p)\n", wDevID, dwParam1);
+                                                                                                       
+    *dwParam1 = MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].interface_name, -1,
+                                    NULL, 0 ) * sizeof(WCHAR);
+    return MMSYSERR_NOERROR;
+}
+                                                                                                       
+/**************************************************************************
+ *                              wodDevInterface                 [internal]
+ */
+static DWORD wodDevInterface(UINT wDevID, PWCHAR dwParam1, DWORD dwParam2)
+{
+    if (dwParam2 >= MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].interface_name, -1,
+                                        NULL, 0 ) * sizeof(WCHAR))
+    {
+        MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].interface_name, -1,
+                            dwParam1, dwParam2 / sizeof(WCHAR));
+        return MMSYSERR_NOERROR;
+    }
+    return MMSYSERR_INVALPARAM;
+}
+                                                                                                       
+/**************************************************************************
  * 				wodMessage (WINEARTS.@)
  */
 DWORD WINAPI ARTS_wodMessage(UINT wDevID, UINT wMsg, DWORD dwUser,
@@ -1532,6 +1565,8 @@
     case WODM_RESTART:		return wodRestart	(wDevID);
     case WODM_RESET:		return wodReset		(wDevID);
 
+    case DRV_QUERYDEVICEINTERFACESIZE: return wodDevInterfaceSize       (wDevID, (LPDWORD)dwParam1);
+    case DRV_QUERYDEVICEINTERFACE:     return wodDevInterface           (wDevID, (PWCHAR)dwParam1, dwParam2);
     case DRV_QUERYDSOUNDIFACE:	return wodDsCreate	(wDevID, (PIDSDRIVER*)dwParam1);
     case DRV_QUERYDSOUNDDESC:	return wodDsDesc	(wDevID, (PDSDRIVERDESC)dwParam1);
     case DRV_QUERYDSOUNDGUID:	return wodDsGuid	(wDevID, (LPGUID)dwParam1);
@@ -1555,6 +1590,34 @@
 }
 
 /**************************************************************************
+ *                              widDevInterfaceSize             [internal]
+ */
+static DWORD widDevInterfaceSize(UINT wDevID, LPDWORD dwParam1)
+{
+    TRACE("(%u, %p)\n", wDevID, dwParam1);
+                                                                                                       
+                                                                                                       
+    *dwParam1 = MultiByteToWideChar(CP_ACP, 0, WInDev[wDevID].interface_name, -1,
+                                    NULL, 0 ) * sizeof(WCHAR);
+    return MMSYSERR_NOERROR;
+}
+
+/**************************************************************************
+ *                              widDevInterface                 [internal]
+ */
+static DWORD widDevInterface(UINT wDevID, PWCHAR dwParam1, DWORD dwParam2)
+{
+    if (dwParam2 >= MultiByteToWideChar(CP_ACP, 0, WInDev[wDevID].interface_name, -1,
+                                        NULL, 0 ) * sizeof(WCHAR))
+    {
+        MultiByteToWideChar(CP_ACP, 0, WInDev[wDevID].interface_name, -1,
+                            dwParam1, dwParam2 / sizeof(WCHAR));
+        return MMSYSERR_NOERROR;
+    }
+    return MMSYSERR_INVALPARAM;
+}
+
+/**************************************************************************
  * 			widNotifyClient			[internal]
  */
 static DWORD widNotifyClient(WINE_WAVEIN* wwi, WORD wMsg, DWORD dwParam1, DWORD dwParam2)
@@ -2029,6 +2092,8 @@
     case WIDM_RESET:		return widReset		(wDevID);
     case WIDM_START:		return widStart		(wDevID);
     case WIDM_STOP:		return widStop		(wDevID);
+    case DRV_QUERYDEVICEINTERFACESIZE: return widDevInterfaceSize       (wDevID, (LPDWORD)dwParam1);
+    case DRV_QUERYDEVICEINTERFACE:     return widDevInterface           (wDevID, (PWCHAR)dwParam1, dwParam2);
     default:
 	FIXME("unknown message %d!\n", wMsg);
     }
Index: dlls/winmm/winejack/audio.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/winejack/audio.c,v
retrieving revision 1.10
diff -u -r1.10 audio.c
--- dlls/winmm/winejack/audio.c	5 May 2004 01:06:27 -0000	1.10
+++ dlls/winmm/winejack/audio.c	11 May 2004 01:11:03 -0000
@@ -128,6 +128,7 @@
     PCMWAVEFORMAT     format;
     WAVEOUTCAPSA      caps;
     WORD              wDevID;
+    char              interface_name[32];
 
     jack_port_t*      out_port_l;   /* ports for left and right channels */
     jack_port_t*      out_port_r;
@@ -171,6 +172,7 @@
     WAVEINCAPSA     caps;
     BOOL            bTriggerSupport;
     WORD              wDevID;
+    char              interface_name[32];
 
     jack_port_t*      in_port_l;   /* ports for left and right channels */
     jack_port_t*      in_port_r;
@@ -892,6 +894,9 @@
       /*    strcpy(WOutDev[i].caps.szPname, "OpenSoundSystem WAVOUT Driver");*/
       strcpy(WOutDev[i].caps.szPname, "CS4236/37/38");
 #endif
+
+      snprintf(WOutDev[i].interface_name, sizeof(WOutDev[i].interface_name), "winejack: %d", i);
+
       WOutDev[i].caps.vDriverVersion = 0x0100;
       WOutDev[i].caps.dwFormats = 0x00000000;
       WOutDev[i].caps.dwSupport = WAVECAPS_VOLUME;
@@ -933,6 +938,8 @@
 	WInDev[i].caps.wPid = 0x0001;
 	strcpy(WInDev[i].caps.szPname,"CS4236/37/38");
 #endif
+        snprintf(WInDev[i].interface_name, sizeof(WInDev[i].interface_name), "winejack: %d", i);
+
 	WInDev[i].caps.vDriverVersion = 0x0100;
 
 	WInDev[i].caps.wChannels = 0x2;
@@ -1676,6 +1683,33 @@
 }
 
 /**************************************************************************
+ *                              wodDevInterfaceSize             [internal]
+ */
+static DWORD wodDevInterfaceSize(UINT wDevID, LPDWORD dwParam1)
+{
+    TRACE("(%u, %p)\n", wDevID, dwParam1);
+                                                                                                       
+    *dwParam1 = MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].interface_name, -1,
+                                    NULL, 0 ) * sizeof(WCHAR);
+    return MMSYSERR_NOERROR;
+}
+
+/**************************************************************************
+ *                              wodDevInterface                 [internal]
+ */
+static DWORD wodDevInterface(UINT wDevID, PWCHAR dwParam1, DWORD dwParam2)
+{
+    if (dwParam2 >= MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].interface_name, -1,
+                                        NULL, 0 ) * sizeof(WCHAR))
+    {
+        MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].interface_name, -1,
+                            dwParam1, dwParam2 / sizeof(WCHAR));
+        return MMSYSERR_NOERROR;
+    }
+    return MMSYSERR_INVALPARAM;
+}
+
+/**************************************************************************
  * 				wodMessage (WINEJACK.7)
  */
 DWORD WINAPI JACK_wodMessage(UINT wDevID, UINT wMsg, DWORD dwUser, 
@@ -1718,6 +1752,8 @@
   case WODM_RESTART:          return wodRestart(wDevID);
   case WODM_RESET:            return wodReset(wDevID);
 
+  case DRV_QUERYDEVICEINTERFACESIZE: return wodDevInterfaceSize       (wDevID, (LPDWORD)dwParam1);
+  case DRV_QUERYDEVICEINTERFACE:     return wodDevInterface           (wDevID, (PWCHAR)dwParam1, dwParam2);
   case DRV_QUERYDSOUNDIFACE:	return wodDsCreate(wDevID, (PIDSDRIVER*)dwParam1);
   case DRV_QUERYDSOUNDDESC:	return wodDsDesc(wDevID, (PDSDRIVERDESC)dwParam1);
   case DRV_QUERYDSOUNDGUID:	return wodDsGuid(wDevID, (LPGUID)dwParam1);
@@ -2391,6 +2427,42 @@
 }
 
 /**************************************************************************
+ * 				widGetNumDevs			[internal]
+ */
+static DWORD widGetNumDevs(void)
+{
+  return MAX_WAVEINDRV;
+}
+
+/**************************************************************************
+ *                              widDevInterfaceSize             [internal]
+ */
+static DWORD widDevInterfaceSize(UINT wDevID, LPDWORD dwParam1)
+{
+    TRACE("(%u, %p)\n", wDevID, dwParam1);
+                                                                                                       
+                                                                                                       
+    *dwParam1 = MultiByteToWideChar(CP_ACP, 0, WInDev[wDevID].interface_name, -1,
+                                    NULL, 0 ) * sizeof(WCHAR);
+    return MMSYSERR_NOERROR;
+}
+
+/**************************************************************************
+ *                              widDevInterface                 [internal]
+ */
+static DWORD widDevInterface(UINT wDevID, PWCHAR dwParam1, DWORD dwParam2)
+{
+    if (dwParam2 >= MultiByteToWideChar(CP_ACP, 0, WInDev[wDevID].interface_name, -1,
+                                        NULL, 0 ) * sizeof(WCHAR))
+    {
+        MultiByteToWideChar(CP_ACP, 0, WInDev[wDevID].interface_name, -1,
+                            dwParam1, dwParam2 / sizeof(WCHAR));
+        return MMSYSERR_NOERROR;
+    }
+    return MMSYSERR_INVALPARAM;
+}
+
+/**************************************************************************
  * 				widMessage (WINEJACK.6)
  */
 DWORD WINAPI JACK_widMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
@@ -2412,10 +2484,12 @@
     case WIDM_PREPARE:		return widPrepare	(wDevID, (LPWAVEHDR)dwParam1, dwParam2);
     case WIDM_UNPREPARE:	return widUnprepare	(wDevID, (LPWAVEHDR)dwParam1, dwParam2);
     case WIDM_GETDEVCAPS:	return widGetDevCaps	(wDevID, (LPWAVEINCAPSA)dwParam1,	dwParam2);
-    case WIDM_GETNUMDEVS:	return MAX_WAVEINDRV;
+    case WIDM_GETNUMDEVS:	return widGetNumDevs();
     case WIDM_RESET:		return widReset		(wDevID);
     case WIDM_START:		return widStart		(wDevID);
     case WIDM_STOP:		return widStop		(wDevID);
+    case DRV_QUERYDEVICEINTERFACESIZE: return widDevInterfaceSize       (wDevID, (LPDWORD)dwParam1);
+    case DRV_QUERYDEVICEINTERFACE:     return widDevInterface           (wDevID, (PWCHAR)dwParam1, dwParam2);
     default:
 	FIXME("unknown message %d!\n", wMsg);
     }
Index: dlls/winmm/wineoss/audio.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/wineoss/audio.c,v
retrieving revision 1.127
diff -u -r1.127 audio.c
--- dlls/winmm/wineoss/audio.c	5 May 2004 01:09:24 -0000	1.127
+++ dlls/winmm/wineoss/audio.c	11 May 2004 01:11:07 -0000
@@ -150,6 +150,7 @@
 typedef struct tagOSS_DEVICE {
     char                        dev_name[32];
     char                        mixer_name[32];
+    char                        interface_name[64];
     unsigned                    open_count;
     WAVEOUTCAPSA                out_caps;
     WAVEINCAPSA                 in_caps;
@@ -256,17 +257,17 @@
 {
     TRACE("(%u, %p)\n", wDevID, dwParam1);
 
-    *dwParam1 = MultiByteToWideChar(CP_ACP, 0, OSS_Devices[wDevID].dev_name, -1,
+    *dwParam1 = MultiByteToWideChar(CP_ACP, 0, OSS_Devices[wDevID].interface_name, -1,
                                     NULL, 0 ) * sizeof(WCHAR);
     return MMSYSERR_NOERROR;
 }
 
 static DWORD wdDevInterface(UINT wDevID, PWCHAR dwParam1, DWORD dwParam2)
 {
-    if (dwParam2 >= MultiByteToWideChar(CP_ACP, 0, OSS_Devices[wDevID].dev_name, -1,
+    if (dwParam2 >= MultiByteToWideChar(CP_ACP, 0, OSS_Devices[wDevID].interface_name, -1,
                                         NULL, 0 ) * sizeof(WCHAR))
     {
-        MultiByteToWideChar(CP_ACP, 0, OSS_Devices[wDevID].dev_name, -1,
+        MultiByteToWideChar(CP_ACP, 0, OSS_Devices[wDevID].interface_name, -1,
                             dwParam1, dwParam2 / sizeof(WCHAR));
 	return MMSYSERR_NOERROR;
     }
@@ -964,6 +965,8 @@
 	    sprintf((char *)OSS_Devices[i].dev_name, "/dev/dsp%d", i);
 	    sprintf((char *)OSS_Devices[i].mixer_name, "/dev/mixer%d", i);
 	}
+
+        sprintf(OSS_Devices[i].interface_name, "wineoss: %s", OSS_Devices[i].dev_name);
 
 	INIT_GUID(OSS_Devices[i].ds_guid,  0xbd6dd71a, 0x3deb, 0x11d1, 0xb1, 0x71, 0x00, 0xc0, 0x4f, 0xc2, 0x00, 0x00 + i);
 	INIT_GUID(OSS_Devices[i].dsc_guid, 0xbd6dd71b, 0x3deb, 0x11d1, 0xb1, 0x71, 0x00, 0xc0, 0x4f, 0xc2, 0x00, 0x00 + i);


More information about the wine-patches mailing list