]> Repos - portaudio/commitdiff
wasapi: fixed audio gain is decreased by 2 when audio stream is opened for capturing...
authordmitrykos <dmitrykos@0f58301d-fd10-0410-b4af-bbb618454e57>
Sun, 26 Dec 2010 16:17:56 +0000 (16:17 +0000)
committerdmitrykos <dmitrykos@0f58301d-fd10-0410-b4af-bbb618454e57>
Sun, 26 Dec 2010 16:17:56 +0000 (16:17 +0000)
src/hostapi/wasapi/pa_win_wasapi.c

index 48778e837eba85f36a4632d114cb88c6c40bc897..29a8aa805178448b66290c436cebe8fdae34c03a 100644 (file)
@@ -833,7 +833,7 @@ static BOOL UseWOW64Workaround()
 }\r
 \r
 // ------------------------------------------------------------------------------------------\r
-typedef enum EMixerDir { MIX_DIR__1TO2, MIX_DIR__2TO1 } EMixerDir;\r
+typedef enum EMixerDir { MIX_DIR__1TO2, MIX_DIR__2TO1, MIX_DIR__2TO1_L } EMixerDir;\r
 \r
 // ------------------------------------------------------------------------------------------\r
 #define _WASAPI_MONO_TO_STEREO_MIXER_1_TO_2(TYPE)\\r
@@ -858,6 +858,17 @@ typedef enum EMixerDir { MIX_DIR__1TO2, MIX_DIR__2TO1 } EMixerDir;
                from += 2;\\r
        }\r
 \r
+// ------------------------------------------------------------------------------------------\r
+#define _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_L(TYPE)\\r
+       TYPE * __restrict to   = (TYPE *)__to;\\r
+       TYPE * __restrict from = (TYPE *)__from;\\r
+       TYPE * __restrict end  = to + count;\\r
+       while (to != end)\\r
+       {\\r
+               *to ++ = from[0];\\r
+               from += 2;\\r
+       }\r
+\r
 // ------------------------------------------------------------------------------------------\r
 static void _MixMonoToStereo_1TO2_8(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_1_TO_2(BYTE); }\r
 static void _MixMonoToStereo_1TO2_16(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_1_TO_2(short); }\r
@@ -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); }\r
 static void _MixMonoToStereo_2TO1_32f(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1(float); }\r
 \r
+// ------------------------------------------------------------------------------------------\r
+static void _MixMonoToStereo_2TO1_8_L(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_L(BYTE); }\r
+static void _MixMonoToStereo_2TO1_16_L(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_L(short); }\r
+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*/ }\r
+static void _MixMonoToStereo_2TO1_32_L(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_L(int); }\r
+static void _MixMonoToStereo_2TO1_32f_L(void *__to, void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_L(float); }\r
+\r
 // ------------------------------------------------------------------------------------------\r
 static MixMonoToStereoF _GetMonoToStereoMixer(PaSampleFormat format, EMixerDir dir)\r
 {\r
@@ -898,6 +916,17 @@ static MixMonoToStereoF _GetMonoToStereoMixer(PaSampleFormat format, EMixerDir d
                case paFloat32: return _MixMonoToStereo_2TO1_32f;\r
                }\r
                break;\r
+\r
+       case MIX_DIR__2TO1_L:\r
+               switch (format & ~paNonInterleaved)\r
+               {\r
+               case paUInt8:   return _MixMonoToStereo_2TO1_8_L;\r
+               case paInt16:   return _MixMonoToStereo_2TO1_16_L;\r
+               case paInt24:   return _MixMonoToStereo_2TO1_24_L;\r
+               case paInt32:   return _MixMonoToStereo_2TO1_32_L;\r
+               case paFloat32: return _MixMonoToStereo_2TO1_32f_L;\r
+               }\r
+               break;\r
        }\r
 \r
        return NULL;\r
@@ -1998,7 +2027,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu
                }\r
 \r
                // select mixer\r
-               pSub->monoMixer = _GetMonoToStereoMixer(WaveToPaFormat(&pSub->wavex), (pInfo->flow == eRender ? MIX_DIR__1TO2 : MIX_DIR__2TO1));\r
+               pSub->monoMixer = _GetMonoToStereoMixer(WaveToPaFormat(&pSub->wavex), (pInfo->flow == eRender ? MIX_DIR__1TO2 : MIX_DIR__2TO1_L));\r
                if (pSub->monoMixer == NULL)\r
                {\r
                        LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT);\r
@@ -2237,7 +2266,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu
                        }\r
 \r
                        // Select mixer\r
-                       pSub->monoMixer = _GetMonoToStereoMixer(WaveToPaFormat(&pSub->wavex), (pInfo->flow == eRender ? MIX_DIR__1TO2 : MIX_DIR__2TO1));\r
+                       pSub->monoMixer = _GetMonoToStereoMixer(WaveToPaFormat(&pSub->wavex), (pInfo->flow == eRender ? MIX_DIR__1TO2 : MIX_DIR__2TO1_L));\r
                        if (pSub->monoMixer == NULL)\r
                        {\r
                                LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT);\r