Allow configuration of output devices to use and change standard

output plugin requested to "default".
This commit is contained in:
Mike Hearn 2004-03-27 01:38:54 +00:00 committed by Alexandre Julliard
parent 4205880fd1
commit ce32fc5684
2 changed files with 53 additions and 5 deletions

View File

@ -3,7 +3,7 @@ TOPOBJDIR = ../../..
SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = winealsa.drv
IMPORTS = winmm user32 kernel32 ntdll
IMPORTS = winmm user32 advapi32 kernel32 ntdll
EXTRALIBS = -ldxguid -luuid @ALSALIBS@
C_SRCS = \

View File

@ -50,6 +50,7 @@
#include "winerror.h"
#include "winuser.h"
#include "winnls.h"
#include "winreg.h"
#include "mmddk.h"
#include "dsound.h"
#include "dsdriver.h"
@ -148,7 +149,7 @@ typedef struct {
WAVEOUTCAPSA caps;
/* ALSA information (ALSA 0.9/1.x uses two different devices for playback/capture) */
char device[32];
char* device;
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 */
@ -192,7 +193,7 @@ typedef struct {
WAVEOUTCAPSA caps;
/* ALSA information (ALSA 0.9/1.x uses two different devices for playback/capture) */
char device[32];
char* device;
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 */
@ -471,7 +472,46 @@ else \
}
/* return a string duplicated on the win32 process heap, free with HeapFree */
static char* ALSA_strdup(char *s) {
char *result = HeapAlloc(GetProcessHeap(), 0, strlen(s)+1);
strcpy(result, s);
return result;
}
/******************************************************************
* ALSA_GetDeviceFromReg
*
* Returns either "default" or reads the registry so the user can
* override the playback/record device used.
*/
char *ALSA_GetDeviceFromReg(char *value)
{
DWORD res;
DWORD type;
HKEY playbackKey = 0;
char *result = NULL;
DWORD resultSize;
res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\ALSA", 0, KEY_QUERY_VALUE, &playbackKey);
if (res != ERROR_SUCCESS) goto end;
res = RegQueryValueExA(playbackKey, value, NULL, &type, NULL, &resultSize);
if (res != ERROR_SUCCESS) goto end;
if (type != REG_SZ) {
ERR("Registry key [HKEY_LOCAL_MACHINE\\Software\\Wine\\Wine\\ALSA\\%s] must be a string\n", value);
goto end;
}
result = HeapAlloc(GetProcessHeap(), 0, resultSize);
res = RegQueryValueExA(playbackKey, value, NULL, NULL, result, &resultSize);
end:
if (!result) result = ALSA_strdup("default");
if (playbackKey) RegCloseKey(playbackKey);
return result;
}
/******************************************************************
* ALSA_WaveInit
@ -489,7 +529,9 @@ LONG ALSA_WaveInit(void)
wwo = &WOutDev[0];
/* FIXME: use better values */
strcpy(wwo->device, "hw");
wwo->device = ALSA_GetDeviceFromReg("PlaybackDevice");
TRACE("using waveout device \"%s\"\n", wwo->device);
wwo->caps.wMid = 0x0002;
wwo->caps.wPid = 0x0104;
strcpy(wwo->caps.szPname, "SB16 Wave Out");
@ -597,7 +639,9 @@ LONG ALSA_WaveInit(void)
wwi = &WInDev[0];
/* FIXME: use better values */
strcpy(wwi->device, "hw");
wwi->device = ALSA_GetDeviceFromReg("RecordDevice");
TRACE("using wavein device \"%s\"\n", wwi->device);
wwi->caps.wMid = 0x0002;
wwi->caps.wPid = 0x0104;
strcpy(wwi->caps.szPname, "SB16 Wave In");
@ -1513,6 +1557,8 @@ static DWORD wodClose(WORD wDevID)
wwo->p_handle = NULL;
ret = wodNotifyClient(wwo, WOM_CLOSE, 0L, 0L);
HeapFree(GetProcessHeap(), 0, wwo->device);
}
HeapFree(GetProcessHeap(), 0, wwo->ufds);
@ -2998,6 +3044,8 @@ static DWORD widClose(WORD wDevID)
wwi->p_handle = NULL;
ret = widNotifyClient(wwi, WIM_CLOSE, 0L, 0L);
HeapFree(GetProcessHeap(), 0, wwi->device);
}
HeapFree(GetProcessHeap(), 0, wwi->ufds);