[winecfg] sound driver test (take 2)

Robert Reif reif at earthlink.net
Mon Nov 21 19:48:20 CST 2005


Changelog:
- add a simple sound driver test

Download the test wave file from:

http://home.earthlink.net/~reif/winecfg.wav
 
Thanks to Randall Walls for the wave file.

This wave file is compressed using the IMA ADPCM codec
which gives a 4:1 compression.  This is the best I can
with wine's acm codecs.  You can get the original 
file from: http://csr.slightofcode.com/wine/testsound1.wav 

The major difference between this patch and the previous version
is that any wave file format supported by wine can be played
from a resource now.

To Do:
- better driver loading and status as requested by Eric Pouech
- update rc files for other languages

-------------- next part --------------
cvs diff: Diffing programs/winecfg
Index: programs/winecfg/En.rc
===================================================================
RCS file: /home/wine/wine/programs/winecfg/En.rc,v
retrieving revision 1.54
diff -p -u -r1.54 En.rc
--- programs/winecfg/En.rc	27 Oct 2005 11:24:02 -0000	1.54
+++ programs/winecfg/En.rc	22 Nov 2005 00:18:20 -0000
@@ -157,13 +157,14 @@ BEGIN
     COMBOBOX	IDC_AUDIO_DRIVER,70,18,85,85,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
     PUSHBUTTON	"Autodetect",IDC_AUDIO_AUTODETECT,170,20,49,14
     PUSHBUTTON	"Configure",IDC_AUDIO_CONFIGURE,170,40,49,14
-    PUSHBUTTON	"Control Panel",IDC_AUDIO_CONTROL_PANEL,170,60,49,14
+    PUSHBUTTON	"Test",IDC_AUDIO_TEST,170,60,49,14
+    PUSHBUTTON	"Control Panel",IDC_AUDIO_CONTROL_PANEL,170,80,49,14
 
-    GROUPBOX    " DirectSound ",IDC_STATIC,8,75,244,120
+    GROUPBOX    " DirectSound ",IDC_STATIC,8,95,244,120
 
-    LTEXT	"Hardware Acceleration: ",IDC_STATIC,15,85,90,10
-    COMBOBOX	IDC_DSOUND_HW_ACCEL,100,83,150,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    CONTROL     "Driver Emulation",IDC_DSOUND_DRV_EMUL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,100,230,10
+    LTEXT	"Hardware Acceleration: ",IDC_STATIC,15,105,90,10
+    COMBOBOX	IDC_DSOUND_HW_ACCEL,100,103,150,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL     "Driver Emulation",IDC_DSOUND_DRV_EMUL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,120,230,10
 
 END
 
@@ -197,6 +198,8 @@ BEGIN
     IDS_WINECFG_TITLE       "Wine configuration"
     IDS_THEMEFILE           "Theme files"
     IDS_THEMEFILE_SELECT    "Select a theme file"
+    IDS_AUDIO_DONE          "Done playing test sound."
+    IDS_AUDIO_ERROR         "Couldn't play test sound. "
 END
 
 
Index: programs/winecfg/Makefile.in
===================================================================
RCS file: /home/wine/wine/programs/winecfg/Makefile.in,v
retrieving revision 1.15
diff -p -u -r1.15 Makefile.in
--- programs/winecfg/Makefile.in	24 Aug 2005 10:59:40 -0000	1.15
+++ programs/winecfg/Makefile.in	22 Nov 2005 00:18:20 -0000
@@ -4,7 +4,7 @@ SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = winecfg.exe
 APPMODE   = -mwindows
-IMPORTS   = comdlg32 comctl32 shell32 ole32 winmm shlwapi uxtheme user32 advapi32 kernel32
+IMPORTS   = comdlg32 comctl32 shell32 ole32 shlwapi msacm32 uxtheme user32 advapi32 kernel32
 
 C_SRCS = \
 	appdefaults.c \
@@ -21,7 +21,7 @@ C_SRCS = \
 
 RC_SRCS = winecfg.rc
 RC_BINSRC = winecfg.rc
-RC_BINARIES = idb_wine.bmp 
+RC_BINARIES = idb_wine.bmp
 
 @MAKE_PROG_RULES@
 
Index: programs/winecfg/audio.c
===================================================================
RCS file: /home/wine/wine/programs/winecfg/audio.c,v
retrieving revision 1.15
diff -p -u -r1.15 audio.c
--- programs/winecfg/audio.c	3 Nov 2005 19:31:45 -0000	1.15
+++ programs/winecfg/audio.c	22 Nov 2005 00:18:21 -0000
@@ -38,6 +38,8 @@
 #include <shlwapi.h>
 #include <shlobj.h>
 #include <mmsystem.h>
+#include <mmreg.h>
+#include <msacm.h>
 
 #include "winecfg.h"
 #include "resource.h"
@@ -52,6 +54,322 @@ static const char* DSound_HW_Accels[] = 
   NULL
 };
 
+static HINSTANCE hWINMM = 0;
+static BOOL has_winmm = FALSE;
+static LPVOID wave_data = NULL;
+static DWORD wave_data_size = 0;
+
+HDRVR (WINAPI * pOpenDriverA)(LPCSTR lpDriverName, LPCSTR lpSectionName, LONG lParam);
+LRESULT (WINAPI *pSendDriverMessage)(HDRVR hdrvr, UINT msg, LONG lParam1, LONG lParam2);
+LRESULT (WINAPI *pCloseDriver)(HDRVR hdrvr, LONG lParam1, LONG lParam2);
+BOOL (WINAPI *pPlaySound)(LPCSTR pszSound, HMODULE hmod, DWORD fdwSound);
+HMMIO (WINAPI * pmmioOpenW)(LPWSTR szFilename, LPMMIOINFO lpmmioinfo, DWORD dwOpenFlags);
+MMRESULT (WINAPI * pmmioDescend)( HMMIO hmmio, LPMMCKINFO lpck, LPMMCKINFO lpckParent, UINT wFlags);
+LONG (WINAPI *pmmioRead)(HMMIO hmmio, HPSTR pch, LONG cch);
+MMRESULT (WINAPI *pmmioAscend)(HMMIO hmmio, LPMMCKINFO lpck, UINT wFlags);
+MMRESULT (WINAPI *pmmioClose)(HMMIO hmmio, UINT wFlags);
+MMRESULT (WINAPI *pmmioCreateChunk)(HMMIO hmmio, LPMMCKINFO lpck, UINT wFlags);
+LONG (WINAPI *pmmioWrite)(HMMIO hmmio, HPCSTR pch, LONG cch);
+
+static void loadWinmm()
+{
+    has_winmm = FALSE;
+
+    /* unload the current sound driver if present */
+    if (hWINMM)
+        while (FreeLibrary(hWINMM));
+    
+    hWINMM = LoadLibrary("winmm.dll");
+    if (!hWINMM) {
+        MessageBox(NULL, "Couldn't load winmm.dll", "Error",
+                   MB_OK | MB_ICONERROR);
+        return;
+    }
+
+    pOpenDriverA = (void*)GetProcAddress(hWINMM, "OpenDriverA");
+    pSendDriverMessage = (void*)GetProcAddress(hWINMM, "SendDriverMessage");
+    pCloseDriver = (void*)GetProcAddress(hWINMM, "CloseDriver");
+    pPlaySound = (void*)GetProcAddress(hWINMM, "PlaySound");
+    pmmioOpenW = (void*)GetProcAddress(hWINMM, "mmioOpenW");
+    pmmioDescend = (void*)GetProcAddress(hWINMM, "mmioDescend");
+    pmmioRead = (void*)GetProcAddress(hWINMM, "mmioRead");
+    pmmioAscend = (void*)GetProcAddress(hWINMM, "mmioAscend");
+    pmmioClose = (void*)GetProcAddress(hWINMM, "mmioClose");
+    pmmioCreateChunk = (void*)GetProcAddress(hWINMM, "mmioCreateChunk");
+    pmmioWrite = (void*)GetProcAddress(hWINMM, "mmioWrite");
+
+    if (!pOpenDriverA || !pSendDriverMessage || !pCloseDriver || !pPlaySound ||
+        !pmmioOpenW || !pmmioDescend || !pmmioRead || !pmmioAscend ||
+        !pmmioCreateChunk || !pmmioWrite)
+    {
+        MessageBox(NULL, "Couldn't load entries from winmm.dll", "Error",
+                   MB_OK | MB_ICONERROR);
+        return;
+    }
+
+    has_winmm = TRUE;
+}
+
+static void loadWaveFromResource(const char * resource)
+{
+    HRSRC hRes;
+
+    wave_data = NULL;
+    wave_data_size = 0;
+
+    if ((hRes = FindResource(NULL, resource, "WAVE")) != 0) {
+        HGLOBAL hGlob;
+
+        if ((hGlob = LoadResource(NULL, hRes)) != 0) {
+            wave_data = LockResource(hGlob);
+
+            if (wave_data)
+                wave_data_size = SizeofResource(NULL, hRes); 
+
+            FreeResource(hGlob);
+        }
+    }
+}
+
+static void loadWaveData()
+{
+    HMMIO hmmio = 0;
+    MMIOINFO mminfo;
+    MMCKINFO ckMainRIFF;
+    MMCKINFO mmckInfo;
+    LPWAVEFORMATEX lpSrcWaveFormat = NULL;
+    LPWAVEFORMATEX lpDstWaveFormat = NULL;
+    HACMSTREAM hAcmStream = 0;
+    LPVOID src_data = NULL;
+    LPVOID pcm_data = NULL;
+    DWORD pcm_data_size = 0;
+    LPVOID new_wave_data = NULL;
+    DWORD new_wave_data_size = 0;
+
+    /* load the wave file from a resource */
+    loadWaveFromResource("#300");
+
+    if (wave_data == NULL)
+        return;
+
+    /* check the wave file to see if it needs to be uncompressed */
+    ZeroMemory(&mminfo, sizeof(mminfo));
+    mminfo.fccIOProc = FOURCC_MEM;
+    mminfo.pchBuffer = wave_data;
+    mminfo.cchBuffer = wave_data_size;
+
+    hmmio = pmmioOpenW(NULL, &mminfo, MMIO_READ);
+ 
+    if (hmmio == 0)
+        return;
+
+    if (pmmioDescend(hmmio, &ckMainRIFF, NULL, 0))
+        goto Error;
+
+    /* make sure it's a wave file */
+    if ((ckMainRIFF.ckid != FOURCC_RIFF) ||
+        (ckMainRIFF.fccType != mmioFOURCC('W', 'A', 'V', 'E')))
+        goto Error;
+
+    /* get the wave format */
+    mmckInfo.ckid = mmioFOURCC('f', 'm', 't', ' ');
+    if (pmmioDescend(hmmio, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK))
+        goto Error;
+
+    lpSrcWaveFormat = HeapAlloc(GetProcessHeap(), 0, mmckInfo.cksize);
+    if (!lpSrcWaveFormat)
+        goto Error;
+
+    if (pmmioRead(hmmio, (HPSTR)lpSrcWaveFormat, mmckInfo.cksize) != mmckInfo.cksize)
+        goto Error;
+
+    /* uncompress it if it's not a PCM format */
+    if (lpSrcWaveFormat->wFormatTag != WAVE_FORMAT_PCM) {
+        MMIOINFO mmDstInfo;
+        HMMIO hmmDstIO = 0;
+        ACMSTREAMHEADER pcmStreamHead;
+        MMCKINFO ckDstRIFF;
+        MMCKINFO ckDstWaveFormat;
+        MMCKINFO ckDstWaveData;
+
+        /* move to end of 'fmt ' chunk */
+        if (pmmioAscend(hmmio, &mmckInfo, 0))
+            goto Error;
+
+        mmckInfo.ckid = mmioFOURCC('d', 'a', 't', 'a');
+        if (pmmioDescend(hmmio, &mmckInfo, &ckMainRIFF, MMIO_FINDCHUNK))
+            goto Error;
+
+        lpDstWaveFormat = HeapAlloc(GetProcessHeap(), 0, sizeof(WAVEFORMATEX));
+        if (!lpDstWaveFormat)
+            goto Error;
+
+        /* convert to a PCM format with same sample rate 
+         * and number of channels */
+        lpDstWaveFormat->wFormatTag = WAVE_FORMAT_PCM;
+        lpDstWaveFormat->nChannels = lpSrcWaveFormat->nChannels;
+        lpDstWaveFormat->nSamplesPerSec = lpSrcWaveFormat->nSamplesPerSec;
+        lpDstWaveFormat->wBitsPerSample = 16;
+        lpDstWaveFormat->nBlockAlign = (16 * lpDstWaveFormat->nChannels) / 8;
+        lpDstWaveFormat->nAvgBytesPerSec = lpDstWaveFormat->nSamplesPerSec * lpDstWaveFormat->nBlockAlign;
+        lpDstWaveFormat->cbSize = 0;
+
+        if (acmStreamOpen(&hAcmStream, 0, lpSrcWaveFormat, lpDstWaveFormat, NULL, 0, 0, 0))
+            goto Error;
+
+        if (acmStreamSize(hAcmStream, mmckInfo.cksize, &pcm_data_size, ACM_STREAMSIZEF_SOURCE)) {
+            acmStreamClose(hAcmStream, 0);
+            goto Error;
+        }
+
+        src_data = HeapAlloc(GetProcessHeap(), 0, mmckInfo.cksize);
+        if (!src_data) {
+            acmStreamClose(hAcmStream, 0);
+            goto Error;
+        }
+
+        if (pmmioRead(hmmio, src_data, mmckInfo.cksize) != mmckInfo.cksize) {
+            acmStreamClose(hAcmStream, 0);
+            goto Error;
+        }
+
+        pcm_data = HeapAlloc(GetProcessHeap(), 0, pcm_data_size);
+        if (!pcm_data) {
+            acmStreamClose(hAcmStream, 0);
+            goto Error;
+        }
+
+        ZeroMemory(&pcmStreamHead, sizeof(ACMSTREAMHEADER));
+        pcmStreamHead.cbStruct = sizeof(ACMSTREAMHEADER);
+        pcmStreamHead.pbSrc = src_data;
+        pcmStreamHead.cbSrcLength = mmckInfo.cksize; 
+        pcmStreamHead.pbDst = pcm_data;
+        pcmStreamHead.cbDstLength = pcm_data_size;
+
+        if (acmStreamPrepareHeader(hAcmStream, &pcmStreamHead, 0)) {
+            acmStreamClose(hAcmStream, 0);
+            goto Error;
+        }
+
+        if (acmStreamConvert(hAcmStream, &pcmStreamHead, ACM_STREAMCONVERTF_BLOCKALIGN)) {
+            acmStreamClose(hAcmStream, 0);
+            goto Error;
+        }
+
+        if (acmStreamUnprepareHeader(hAcmStream, &pcmStreamHead, 0)) {
+            acmStreamClose(hAcmStream, 0);
+            goto Error;
+        }
+
+        acmStreamClose(hAcmStream, 0);
+
+        /* create the uncompressed output wave file */
+        new_wave_data_size = pcm_data_size + 1024;	/* FIXME */
+        new_wave_data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, new_wave_data_size);
+        if (!new_wave_data)
+            goto Error;
+
+        ZeroMemory(&mmDstInfo, sizeof(mminfo));
+        mmDstInfo.fccIOProc = FOURCC_MEM;
+        mmDstInfo.pchBuffer = new_wave_data;
+        mmDstInfo.cchBuffer = new_wave_data_size;
+
+        hmmDstIO = pmmioOpenW(NULL, &mmDstInfo, MMIO_CREATE | MMIO_WRITE);
+        if (hmmDstIO == 0)
+            goto Error;
+
+        ckDstRIFF.fccType = mmioFOURCC('W', 'A', 'V', 'E');
+        ckDstRIFF.cksize  = 0;
+
+        if (pmmioCreateChunk(hmmDstIO, &ckDstRIFF, MMIO_CREATERIFF)) {
+            pmmioClose(hmmDstIO, 0);
+            goto Error;
+        }
+
+        ckDstWaveFormat.ckid = mmioFOURCC('f', 'm', 't', ' ');
+        ckDstWaveFormat.cksize = sizeof(PCMWAVEFORMAT);
+
+        if (pmmioCreateChunk(hmmDstIO, &ckDstWaveFormat, 0)) {
+            pmmioClose(hmmDstIO, 0);
+            goto Error;
+        }
+
+        if (pmmioWrite(hmmDstIO, (char *)lpDstWaveFormat, sizeof(PCMWAVEFORMAT)) != sizeof(PCMWAVEFORMAT)) {
+            pmmioClose(hmmDstIO, 0);
+            goto Error;
+        }
+
+        if (pmmioAscend(hmmDstIO, &ckDstWaveFormat, 0)) {
+            pmmioClose(hmmDstIO, 0);
+            goto Error;
+        }
+
+        ckDstWaveData.ckid = mmioFOURCC('d', 'a', 't', 'a');
+        ckDstWaveData.cksize  = pcm_data_size;
+
+        if (pmmioCreateChunk(hmmDstIO, &ckDstWaveData, 0)) {
+            pmmioClose(hmmDstIO, 0);
+            goto Error;
+        }
+
+        if (pmmioWrite(hmmDstIO, pcm_data, pcm_data_size) != pcm_data_size) {
+            pmmioClose(hmmDstIO, 0);
+            goto Error;
+        }
+
+        if (pmmioAscend(hmmDstIO, &ckDstWaveData, 0)) {
+            pmmioClose(hmmDstIO, 0);
+            goto Error;
+        }
+
+        if (pmmioAscend(hmmDstIO, &ckDstRIFF, 0)) {
+            pmmioClose(hmmDstIO, 0);
+            goto Error;
+        }
+
+        pmmioClose(hmmDstIO, 0);
+
+        wave_data = new_wave_data;
+        wave_data_size = new_wave_data_size;
+    }
+
+Error:
+    HeapFree(GetProcessHeap(), 0, pcm_data);
+    HeapFree(GetProcessHeap(), 0, src_data);
+    HeapFree(GetProcessHeap(), 0, lpDstWaveFormat);
+    HeapFree(GetProcessHeap(), 0, lpSrcWaveFormat);
+    pmmioClose(hmmio, 0);
+}
+
+/* play a wave file from a resource */
+static void testAudioDriver(HWND hDlg)
+{ 
+    if (has_winmm) {
+         WCHAR title[64];
+
+         LoadStringW(GetModuleHandle(NULL), IDS_WINECFG_TITLE, title,
+             sizeof(title)/sizeof(title[0]));
+
+         if (wave_data == NULL)
+             loadWaveData();
+
+         if (pPlaySound(wave_data, NULL, SND_MEMORY)) {
+             WCHAR wave_done[64];
+
+             LoadStringW(GetModuleHandle(NULL), IDS_AUDIO_DONE,
+                 wave_done, sizeof(wave_done)/sizeof(wave_done[0]));
+             MessageBoxW(hDlg, wave_done, title, MB_OK);
+             pPlaySound(NULL, NULL, SND_MEMORY);
+         } else {
+             WCHAR wave_error[64];
+
+             LoadStringW(GetModuleHandle(NULL), IDS_AUDIO_ERROR,
+                 wave_error, sizeof(wave_error)/sizeof(wave_error[0]));
+             MessageBoxW(hDlg, wave_error, title, MB_OK);
+         }
+     }
+}
+
 /* Select the correct entry in the combobox based on drivername */
 static void selectAudioDriver(HWND hDlg, const char *drivername)
 {
@@ -78,6 +396,9 @@ static void configureAudioDriver(HWND hD
   int i;
   const AUDIO_DRIVER *pAudioDrv = NULL;
 
+  if (!has_winmm)
+    return;
+
   if ((pAudioDrv = getAudioDrivers()))
   {
     for (i = 0; *pAudioDrv->szName; i++, pAudioDrv++)
@@ -89,19 +410,19 @@ static void configureAudioDriver(HWND hD
           HDRVR hdrvr;
 	  char wine_driver[MAX_NAME_LENGTH + 8];
 	  sprintf(wine_driver, "wine%s.drv", pAudioDrv->szDriver);
-          hdrvr = OpenDriverA(wine_driver, 0, 0);
+          hdrvr = pOpenDriverA(wine_driver, 0, 0);
 	  if (hdrvr != 0)
 	  {
-	    if (SendDriverMessage(hdrvr, DRV_QUERYCONFIGURE, 0, 0) != 0)
+	    if (pSendDriverMessage(hdrvr, DRV_QUERYCONFIGURE, 0, 0) != 0)
 	    {
               DRVCONFIGINFO dci;
               LONG lRes;
               dci.dwDCISize = sizeof (dci);
               dci.lpszDCISectionName = NULL;
               dci.lpszDCIAliasName = NULL;
-              lRes = SendDriverMessage(hdrvr, DRV_CONFIGURE, 0, (LONG)&dci);
+              lRes = pSendDriverMessage(hdrvr, DRV_CONFIGURE, 0, (LONG)&dci);
 	    }
-	    CloseDriver(hdrvr, 0, 0);
+	    pCloseDriver(hdrvr, 0, 0);
 	  }
           else
           {
@@ -125,6 +446,8 @@ static void initAudioDlg (HWND hDlg)
 
     WINE_TRACE("\n");
 
+    loadWinmm();
+
     pAudioDrv = getAudioDrivers ();
     for (i = 0; *pAudioDrv->szName; i++, pAudioDrv++) {
         SendDlgItemMessage (hDlg, IDC_AUDIO_DRIVER, CB_ADDSTRING, 
@@ -272,6 +595,9 @@ AudioDlgProc (HWND hDlg, UINT uMsg, WPAR
 		configureAudioDriver(hDlg, (char*)pAudioDrv[selected_driver].szDriver);
 	     }
 	     break;
+          case IDC_AUDIO_TEST:
+             testAudioDriver(hDlg);
+             break;
           case IDC_AUDIO_CONTROL_PANEL:
 	     MessageBox(NULL, "Launching audio control panel not implemented yet!", "Fixme", MB_OK | MB_ICONERROR);
              break;
@@ -305,6 +631,7 @@ AudioDlgProc (HWND hDlg, UINT uMsg, WPAR
 	      SetWindowLongPtr(hDlg, DWLP_MSGRESULT, FALSE);
 	      break;
 	    case PSN_APPLY:
+              loadWinmm(); /* load the new driver */
               apply();
 	      SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
 	      break;
Index: programs/winecfg/resource.h
===================================================================
RCS file: /home/wine/wine/programs/winecfg/resource.h,v
retrieving revision 1.33
diff -p -u -r1.33 resource.h
--- programs/winecfg/resource.h	27 Oct 2005 11:24:02 -0000	1.33
+++ programs/winecfg/resource.h	22 Nov 2005 00:18:21 -0000
@@ -39,6 +39,8 @@
 #define IDS_WINECFG_TITLE               13
 #define IDS_THEMEFILE                   14
 #define IDS_THEMEFILE_SELECT            15
+#define IDS_AUDIO_DONE                  16
+#define IDS_AUDIO_ERROR                 17
 #define IDD_MAINDLG                     101
 #define IDB_WINE                        104
 #define IDD_ABOUTCFG                    107
@@ -50,6 +52,7 @@
 #define IDD_DRIVE_EDIT                  114
 #define IDD_APPEARANCE                  115
 #define IDB_WINE_LOGO                   200
+#define IDR_WAVE                        300
 #define IDC_TABABOUT                    1001
 #define IDC_APPLYBTN                    1002
 #define IDC_WINVER                      1012
@@ -136,9 +139,10 @@
 #define IDC_AUDIO_AUTODETECT            1300
 #define IDC_AUDIO_DRIVER                1301
 #define IDC_AUDIO_CONFIGURE             1302
-#define IDC_AUDIO_CONTROL_PANEL         1303
-#define IDC_DSOUND_HW_ACCEL             1304
-#define IDC_DSOUND_DRV_EMUL             1305
+#define IDC_AUDIO_TEST                  1303
+#define IDC_AUDIO_CONTROL_PANEL         1304
+#define IDC_DSOUND_HW_ACCEL             1305
+#define IDC_DSOUND_DRV_EMUL             1306
 
 /* appearance tab */
 #define IDC_THEME_COLORCOMBO            1401
Index: programs/winecfg/winecfg.rc
===================================================================
RCS file: /home/wine/wine/programs/winecfg/winecfg.rc,v
retrieving revision 1.25
diff -p -u -r1.25 winecfg.rc
--- programs/winecfg/winecfg.rc	14 Nov 2005 11:27:36 -0000	1.25
+++ programs/winecfg/winecfg.rc	22 Nov 2005 00:18:22 -0000
@@ -964,3 +964,5 @@ IDB_WINE BITMAP idb_wine.bmp
  '1B 1B 1B 1B 1B 1B 1B 1B 1B 1B 1B 1B 1B 1B 1B 1B'
  '1B 1B 1B 1B 00 00'
 } */
+
+IDR_WAVE WAVE DISCARDABLE winecfg.wav


More information about the wine-patches mailing list