[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