Jörg Höhle : mciwave: MCI Set Input|Output allows to select wave device.
Alexandre Julliard
julliard at winehq.org
Thu Apr 1 11:25:05 CDT 2010
Module: wine
Branch: master
Commit: e8157bf50bd43ad9dad55d8383332ff9f266adec
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e8157bf50bd43ad9dad55d8383332ff9f266adec
Author: Jörg Höhle <hoehle at users.sourceforge.net>
Date: Fri Nov 20 20:55:22 2009 +0100
mciwave: MCI Set Input|Output allows to select wave device.
---
dlls/mciwave/mciwave.c | 83 ++++++++++++++++++++++++++---------------------
1 files changed, 46 insertions(+), 37 deletions(-)
diff --git a/dlls/mciwave/mciwave.c b/dlls/mciwave/mciwave.c
index 24e75ee..85aae0d 100644
--- a/dlls/mciwave/mciwave.c
+++ b/dlls/mciwave/mciwave.c
@@ -47,6 +47,8 @@ typedef struct {
WAVEFORMATEX wfxRef;
LPWAVEFORMATEX lpWaveFormat; /* Points to wfxRef until set by OPEN or RECORD */
BOOL fInput; /* FALSE = Output, TRUE = Input */
+ WORD wInput; /* wave input device */
+ WORD wOutput; /* wave output device */
volatile WORD dwStatus; /* one from MCI_MODE_xxxx */
DWORD dwMciTimeFormat;/* One of the supported MCI_FORMAT_xxxx */
DWORD dwPosition; /* position in bytes in chunk */
@@ -529,6 +531,7 @@ static LRESULT WAVE_mciOpen(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_WAVE_OPEN_P
wmw->nUseCount++;
+ wmw->wInput = wmw->wOutput = WAVE_MAPPER;
wmw->fInput = FALSE;
wmw->hWave = 0;
wmw->dwStatus = MCI_MODE_NOT_READY;
@@ -831,8 +834,7 @@ static DWORD WAVE_mciPlay(MCIDEVICEID wDevID, DWORD_PTR dwFlags, DWORD_PTR pmt,
*/
mmioSeek(wmw->hFile, wmw->ckWaveData.dwDataOffset + wmw->dwPosition, SEEK_SET); /* >= 0 */
- /* FIXME: how to choose between several output channels ? here mapper is forced */
- dwRet = waveOutOpen((HWAVEOUT *)&wmw->hWave, WAVE_MAPPER, wmw->lpWaveFormat,
+ dwRet = waveOutOpen((HWAVEOUT *)&wmw->hWave, wmw->wOutput, wmw->lpWaveFormat,
(DWORD_PTR)WAVE_mciPlayCallback, (DWORD_PTR)wmw, CALLBACK_FUNCTION);
if (dwRet != 0) {
@@ -1064,11 +1066,7 @@ static DWORD WAVE_mciRecord(MCIDEVICEID wDevID, DWORD_PTR dwFlags, DWORD_PTR pmt
*/
mmioSeek(wmw->hFile, wmw->ckWaveData.dwDataOffset + wmw->dwPosition, SEEK_SET); /* >= 0 */
- /* By default the device will be opened for output, the MCI_CUE function is there to
- * change from output to input and back
- */
- /* FIXME: how to choose between several output channels ? here mapper is forced */
- dwRet = waveInOpen((HWAVEIN*)&wmw->hWave, WAVE_MAPPER, wmw->lpWaveFormat,
+ dwRet = waveInOpen((HWAVEIN*)&wmw->hWave, wmw->wInput, wmw->lpWaveFormat,
(DWORD_PTR)WAVE_mciRecordCallback, (DWORD_PTR)wmw, CALLBACK_FUNCTION);
if (dwRet != MMSYSERR_NOERROR) {
@@ -1279,7 +1277,7 @@ static DWORD WAVE_mciSeek(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lp
/**************************************************************************
* WAVE_mciSet [internal]
*/
-static DWORD WAVE_mciSet(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
+static DWORD WAVE_mciSet(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_WAVE_SET_PARMS lpParms)
{
WINE_MCIWAVE* wmw = WAVE_mciGetOpenDev(wDevID);
@@ -1337,44 +1335,64 @@ static DWORD WAVE_mciSet(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpPa
default: WARN("Unknown audio channel %u\n", lpParms->dwAudio); break;
}
}
- if (dwFlags & MCI_WAVE_INPUT)
- TRACE("MCI_WAVE_INPUT !\n");
- if (dwFlags & MCI_WAVE_OUTPUT)
- TRACE("MCI_WAVE_OUTPUT !\n");
- if (dwFlags & MCI_WAVE_SET_ANYINPUT)
- TRACE("MCI_WAVE_SET_ANYINPUT !\n");
- if (dwFlags & MCI_WAVE_SET_ANYOUTPUT)
- TRACE("MCI_WAVE_SET_ANYOUTPUT !\n");
+ if (dwFlags & MCI_WAVE_INPUT) {
+ TRACE("MCI_WAVE_INPUT = %d\n", lpParms->wInput);
+ if (lpParms->wInput >= waveInGetNumDevs())
+ return MCIERR_OUTOFRANGE;
+ if (wmw->wInput != (WORD)lpParms->wInput)
+ WAVE_mciStop(wDevID, MCI_WAIT, NULL);
+ wmw->wInput = lpParms->wInput;
+ }
+ if (dwFlags & MCI_WAVE_OUTPUT) {
+ TRACE("MCI_WAVE_OUTPUT = %d\n", lpParms->wOutput);
+ if (lpParms->wOutput >= waveOutGetNumDevs())
+ return MCIERR_OUTOFRANGE;
+ if (wmw->wOutput != (WORD)lpParms->wOutput)
+ WAVE_mciStop(wDevID, MCI_WAIT, NULL);
+ wmw->wOutput = lpParms->wOutput;
+ }
+ if (dwFlags & MCI_WAVE_SET_ANYINPUT) {
+ TRACE("MCI_WAVE_SET_ANYINPUT\n");
+ if (wmw->wInput != (WORD)lpParms->wInput)
+ WAVE_mciStop(wDevID, MCI_WAIT, NULL);
+ wmw->wInput = WAVE_MAPPER;
+ }
+ if (dwFlags & MCI_WAVE_SET_ANYOUTPUT) {
+ TRACE("MCI_WAVE_SET_ANYOUTPUT\n");
+ if (wmw->wOutput != (WORD)lpParms->wOutput)
+ WAVE_mciStop(wDevID, MCI_WAIT, NULL);
+ wmw->wOutput = WAVE_MAPPER;
+ }
/* Set wave format parameters is refused after Open or Record.*/
if (dwFlags & MCI_WAVE_SET_FORMATTAG) {
- TRACE("MCI_WAVE_SET_FORMATTAG = %d\n", ((LPMCI_WAVE_SET_PARMS)lpParms)->wFormatTag);
+ TRACE("MCI_WAVE_SET_FORMATTAG = %d\n", lpParms->wFormatTag);
if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION;
- if (((LPMCI_WAVE_SET_PARMS)lpParms)->wFormatTag != WAVE_FORMAT_PCM)
+ if (lpParms->wFormatTag != WAVE_FORMAT_PCM)
return MCIERR_OUTOFRANGE;
}
if (dwFlags & MCI_WAVE_SET_AVGBYTESPERSEC) {
if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION;
- wmw->wfxRef.nAvgBytesPerSec = ((LPMCI_WAVE_SET_PARMS)lpParms)->nAvgBytesPerSec;
+ wmw->wfxRef.nAvgBytesPerSec = lpParms->nAvgBytesPerSec;
TRACE("MCI_WAVE_SET_AVGBYTESPERSEC = %d\n", wmw->wfxRef.nAvgBytesPerSec);
}
if (dwFlags & MCI_WAVE_SET_BITSPERSAMPLE) {
if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION;
- wmw->wfxRef.wBitsPerSample = ((LPMCI_WAVE_SET_PARMS)lpParms)->wBitsPerSample;
+ wmw->wfxRef.wBitsPerSample = lpParms->wBitsPerSample;
TRACE("MCI_WAVE_SET_BITSPERSAMPLE = %d\n", wmw->wfxRef.wBitsPerSample);
}
if (dwFlags & MCI_WAVE_SET_BLOCKALIGN) {
if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION;
- wmw->wfxRef.nBlockAlign = ((LPMCI_WAVE_SET_PARMS)lpParms)->nBlockAlign;
+ wmw->wfxRef.nBlockAlign = lpParms->nBlockAlign;
TRACE("MCI_WAVE_SET_BLOCKALIGN = %d\n", wmw->wfxRef.nBlockAlign);
}
if (dwFlags & MCI_WAVE_SET_CHANNELS) {
if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION;
- wmw->wfxRef.nChannels = ((LPMCI_WAVE_SET_PARMS)lpParms)->nChannels;
+ wmw->wfxRef.nChannels = lpParms->nChannels;
TRACE("MCI_WAVE_SET_CHANNELS = %d\n", wmw->wfxRef.nChannels);
}
if (dwFlags & MCI_WAVE_SET_SAMPLESPERSEC) {
if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION;
- wmw->wfxRef.nSamplesPerSec = ((LPMCI_WAVE_SET_PARMS)lpParms)->nSamplesPerSec;
+ wmw->wfxRef.nSamplesPerSec = lpParms->nSamplesPerSec;
TRACE("MCI_WAVE_SET_SAMPLESPERSEC = %d\n", wmw->wfxRef.nSamplesPerSec);
}
if (dwFlags & MCI_NOTIFY)
@@ -1500,21 +1518,12 @@ static DWORD WAVE_mciStatus(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_STATUS_PARM
ret = MCI_RESOURCE_RETURNED;
break;
case MCI_WAVE_INPUT:
- TRACE("MCI_WAVE_INPUT !\n");
- lpParms->dwReturn = 0;
- ret = MCIERR_WAVE_INPUTUNSPECIFIED;
+ lpParms->dwReturn = wmw->wInput;
+ TRACE("MCI_WAVE_INPUT => %d\n", (signed)wmw->wInput);
break;
case MCI_WAVE_OUTPUT:
- TRACE("MCI_WAVE_OUTPUT !\n");
- {
- UINT id;
- if (waveOutGetID(wmw->hWave, &id) == MMSYSERR_NOERROR) {
- lpParms->dwReturn = id;
- } else {
- lpParms->dwReturn = 0;
- ret = MCIERR_WAVE_OUTPUTUNSPECIFIED;
- }
- }
+ lpParms->dwReturn = wmw->wOutput;
+ TRACE("MCI_WAVE_OUTPUT => %d\n", (signed)wmw->wOutput);
break;
/* It is always ok to query wave format parameters,
* except on auto-open yield MCIERR_UNSUPPORTED_FUNCTION. */
@@ -1705,7 +1714,7 @@ LRESULT CALLBACK MCIWAVE_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg,
case MCI_PLAY: return WAVE_mciPlay (dwDevID, dwParam1, dwParam2, NULL);
case MCI_RECORD: return WAVE_mciRecord (dwDevID, dwParam1, dwParam2, NULL);
case MCI_STOP: return WAVE_mciStop (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
- case MCI_SET: return WAVE_mciSet (dwDevID, dwParam1, (LPMCI_SET_PARMS) dwParam2);
+ case MCI_SET: return WAVE_mciSet (dwDevID, dwParam1, (LPMCI_WAVE_SET_PARMS) dwParam2);
case MCI_PAUSE: return WAVE_mciPause (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
case MCI_RESUME: return WAVE_mciResume (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
case MCI_STATUS: return WAVE_mciStatus (dwDevID, dwParam1, (LPMCI_STATUS_PARMS) dwParam2);
More information about the wine-cvs
mailing list