wasapi: fixed audio gain is decreased by 2 when audio stream is opened for capturing and 1 (Mono) channel selected, this bug occurs only if non-Stereo input source used (mono mic).
This commit is contained in:
parent
db36090a98
commit
41645b30d5
1 changed files with 32 additions and 3 deletions
|
|
@ -833,7 +833,7 @@ static BOOL UseWOW64Workaround()
|
|||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------
|
||||
typedef enum EMixerDir { MIX_DIR__1TO2, MIX_DIR__2TO1 } EMixerDir;
|
||||
typedef enum EMixerDir { MIX_DIR__1TO2, MIX_DIR__2TO1, MIX_DIR__2TO1_L } EMixerDir;
|
||||
|
||||
// ------------------------------------------------------------------------------------------
|
||||
#define _WASAPI_MONO_TO_STEREO_MIXER_1_TO_2(TYPE)\
|
||||
|
|
@ -858,6 +858,17 @@ typedef enum EMixerDir { MIX_DIR__1TO2, MIX_DIR__2TO1 } EMixerDir;
|
|||
from += 2;\
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------
|
||||
#define _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_L(TYPE)\
|
||||
TYPE * __restrict to = (TYPE *)__to;\
|
||||
TYPE * __restrict from = (TYPE *)__from;\
|
||||
TYPE * __restrict end = to + count;\
|
||||
while (to != end)\
|
||||
{\
|
||||
*to ++ = from[0];\
|
||||
from += 2;\
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------
|
||||
static void _MixMonoToStereo_1TO2_8(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_1_TO_2(BYTE); }
|
||||
static void _MixMonoToStereo_1TO2_16(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_1_TO_2(short); }
|
||||
|
|
@ -872,6 +883,13 @@ static void _MixMonoToStereo_2TO1_24(void *__to, void *__from, UINT32 count) { _
|
|||
static void _MixMonoToStereo_2TO1_32(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1(int); }
|
||||
static void _MixMonoToStereo_2TO1_32f(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1(float); }
|
||||
|
||||
// ------------------------------------------------------------------------------------------
|
||||
static void _MixMonoToStereo_2TO1_8_L(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_L(BYTE); }
|
||||
static void _MixMonoToStereo_2TO1_16_L(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_L(short); }
|
||||
static void _MixMonoToStereo_2TO1_24_L(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_L(int); /* !!! int24 data is contained in 32-bit containers*/ }
|
||||
static void _MixMonoToStereo_2TO1_32_L(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_L(int); }
|
||||
static void _MixMonoToStereo_2TO1_32f_L(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_L(float); }
|
||||
|
||||
// ------------------------------------------------------------------------------------------
|
||||
static MixMonoToStereoF _GetMonoToStereoMixer(PaSampleFormat format, EMixerDir dir)
|
||||
{
|
||||
|
|
@ -898,6 +916,17 @@ static MixMonoToStereoF _GetMonoToStereoMixer(PaSampleFormat format, EMixerDir d
|
|||
case paFloat32: return _MixMonoToStereo_2TO1_32f;
|
||||
}
|
||||
break;
|
||||
|
||||
case MIX_DIR__2TO1_L:
|
||||
switch (format & ~paNonInterleaved)
|
||||
{
|
||||
case paUInt8: return _MixMonoToStereo_2TO1_8_L;
|
||||
case paInt16: return _MixMonoToStereo_2TO1_16_L;
|
||||
case paInt24: return _MixMonoToStereo_2TO1_24_L;
|
||||
case paInt32: return _MixMonoToStereo_2TO1_32_L;
|
||||
case paFloat32: return _MixMonoToStereo_2TO1_32f_L;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
|
@ -1998,7 +2027,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu
|
|||
}
|
||||
|
||||
// select mixer
|
||||
pSub->monoMixer = _GetMonoToStereoMixer(WaveToPaFormat(&pSub->wavex), (pInfo->flow == eRender ? MIX_DIR__1TO2 : MIX_DIR__2TO1));
|
||||
pSub->monoMixer = _GetMonoToStereoMixer(WaveToPaFormat(&pSub->wavex), (pInfo->flow == eRender ? MIX_DIR__1TO2 : MIX_DIR__2TO1_L));
|
||||
if (pSub->monoMixer == NULL)
|
||||
{
|
||||
LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT);
|
||||
|
|
@ -2237,7 +2266,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu
|
|||
}
|
||||
|
||||
// Select mixer
|
||||
pSub->monoMixer = _GetMonoToStereoMixer(WaveToPaFormat(&pSub->wavex), (pInfo->flow == eRender ? MIX_DIR__1TO2 : MIX_DIR__2TO1));
|
||||
pSub->monoMixer = _GetMonoToStereoMixer(WaveToPaFormat(&pSub->wavex), (pInfo->flow == eRender ? MIX_DIR__1TO2 : MIX_DIR__2TO1_L));
|
||||
if (pSub->monoMixer == NULL)
|
||||
{
|
||||
LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT);
|
||||
|
|
|
|||
Loading…
Reference in a new issue