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)\
|
#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;\
|
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_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); }
|
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_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_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)
|
static MixMonoToStereoF _GetMonoToStereoMixer(PaSampleFormat format, EMixerDir dir)
|
||||||
{
|
{
|
||||||
|
|
@ -898,6 +916,17 @@ static MixMonoToStereoF _GetMonoToStereoMixer(PaSampleFormat format, EMixerDir d
|
||||||
case paFloat32: return _MixMonoToStereo_2TO1_32f;
|
case paFloat32: return _MixMonoToStereo_2TO1_32f;
|
||||||
}
|
}
|
||||||
break;
|
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;
|
return NULL;
|
||||||
|
|
@ -1998,7 +2027,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu
|
||||||
}
|
}
|
||||||
|
|
||||||
// select mixer
|
// 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)
|
if (pSub->monoMixer == NULL)
|
||||||
{
|
{
|
||||||
LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT);
|
LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT);
|
||||||
|
|
@ -2237,7 +2266,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu
|
||||||
}
|
}
|
||||||
|
|
||||||
// Select mixer
|
// 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)
|
if (pSub->monoMixer == NULL)
|
||||||
{
|
{
|
||||||
LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT);
|
LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue