From dd82ba9976c2a00d4f2e2315e3afb8c0db38140c Mon Sep 17 00:00:00 2001 From: robiwan Date: Fri, 28 Dec 2012 16:54:25 +0000 Subject: [PATCH] Fix for WaveRT WDM drivers that do not support memory mapped position register, and correct 8 channel speaker geometry mapping. --- src/hostapi/wdmks/pa_win_wdmks.c | 20 ++++++++++++++++++++ src/os/win/pa_win_waveformat.c | 8 ++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/hostapi/wdmks/pa_win_wdmks.c b/src/hostapi/wdmks/pa_win_wdmks.c index 088057e..bbdc39a 100644 --- a/src/hostapi/wdmks/pa_win_wdmks.c +++ b/src/hostapi/wdmks/pa_win_wdmks.c @@ -4959,8 +4959,18 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, if (result != paNoError) { + unsigned long pos = 0xdeadc0de; PA_DEBUG(("Failed to register capture position register, using PinGetAudioPositionViaIOCTL\n")); stream->capture.pPin->fnAudioPosition = PinGetAudioPositionViaIOCTL; + /* Test position function */ + result = (stream->capture.pPin->fnAudioPosition)(stream->capture.pPin, &pos); + if (result != paNoError || pos != 0x0) + { + PA_DEBUG(("Failed to read capture position register (IOCTL)\n")); + PaWinWDM_SetLastErrorInfo(paUnanticipatedHostError, "Failed to read capture position register (IOCTL)"); + result = paUnanticipatedHostError; + goto error; + } } else { @@ -5071,8 +5081,18 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, if (result != paNoError) { + unsigned long pos = 0xdeadc0de; PA_DEBUG(("Failed to register rendering position register, using PinGetAudioPositionViaIOCTL\n")); stream->render.pPin->fnAudioPosition = PinGetAudioPositionViaIOCTL; + /* Test position function */ + result = (stream->render.pPin->fnAudioPosition)(stream->render.pPin, &pos); + if (result != paNoError || pos != 0x0) + { + PA_DEBUG(("Failed to read render position register (IOCTL)\n")); + PaWinWDM_SetLastErrorInfo(paUnanticipatedHostError, "Failed to read render position register (IOCTL)"); + result = paUnanticipatedHostError; + goto error; + } } else { diff --git a/src/os/win/pa_win_waveformat.c b/src/os/win/pa_win_waveformat.c index bbf616c..2eb2334 100644 --- a/src/os/win/pa_win_waveformat.c +++ b/src/os/win/pa_win_waveformat.c @@ -104,7 +104,6 @@ void PaWin_InitializeWaveFormatExtensible( PaWinWaveFormat *waveFormat, *((GUID*)&waveFormat->fields[PAWIN_INDEXOF_SUBFORMAT]) = guid; } - PaWinWaveFormatChannelMask PaWin_DefaultChannelMask( int numChannels ) { switch( numChannels ){ @@ -129,11 +128,16 @@ PaWinWaveFormatChannelMask PaWin_DefaultChannelMask( int numChannels ) return PAWIN_SPEAKER_5POINT1; /* case 7: */ case 8: - return PAWIN_SPEAKER_7POINT1; + /* RoBi: PAWIN_SPEAKER_7POINT1_SURROUND fits normal surround sound setups better than PAWIN_SPEAKER_7POINT1, f.i. NVidia HDMI Audio + output is silent on channels 5&6 with NVidia drivers, and channel 7&8 with Micrsoft HD Audio driver using PAWIN_SPEAKER_7POINT1. + With PAWIN_SPEAKER_7POINT1_SURROUND both setups work OK. */ + return PAWIN_SPEAKER_7POINT1_SURROUND; } /* Apparently some Audigy drivers will output silence if the direct-out constant (0) is used. So this is not ideal. + + RoBi 2012-12-19: Also, NVidia driver seem to output garbage instead. Again not very ideal. */ return PAWIN_SPEAKER_DIRECTOUT; -- 2.43.0