}\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
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
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
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
}\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
}\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