From: Arkadiusz Hiler <ahiler@codeweavers.com> --- dlls/dsound/dsound_convert.c | 28 ++++++++++++++++++++++++++++ dlls/dsound/dsound_private.h | 2 ++ dlls/dsound/mixer.c | 10 ++++++++++ 3 files changed, 40 insertions(+) diff --git a/dlls/dsound/dsound_convert.c b/dlls/dsound/dsound_convert.c index 4cd21f628e9..d494afc4441 100644 --- a/dlls/dsound/dsound_convert.c +++ b/dlls/dsound/dsound_convert.c @@ -210,6 +210,34 @@ void put_stereo2surround51(const IDirectSoundBufferImpl *dsb, DWORD pos, DWORD c } } +void put_mono2surround71(const IDirectSoundBufferImpl *dsb, DWORD pos, DWORD channel, float value) +{ + dsb->put_aux(dsb, pos, 0, value); + dsb->put_aux(dsb, pos, 1, value); + dsb->put_aux(dsb, pos, 2, value); + dsb->put_aux(dsb, pos, 3, value); + dsb->put_aux(dsb, pos, 4, value); + dsb->put_aux(dsb, pos, 5, value); + dsb->put_aux(dsb, pos, 6, value); + dsb->put_aux(dsb, pos, 7, value); +} + +void put_stereo2surround71(const IDirectSoundBufferImpl *dsb, DWORD pos, DWORD channel, float value) +{ + if (channel == 0) { /* Left */ + dsb->put_aux(dsb, pos, 0, value); /* Front left */ + dsb->put_aux(dsb, pos, 4, value); /* Back left */ + dsb->put_aux(dsb, pos, 6, value); /* Side left */ + + dsb->put_aux(dsb, pos, 2, 0.0f); /* Mute front centre */ + dsb->put_aux(dsb, pos, 3, 0.0f); /* Mute LFE */ + } else if (channel == 1) { /* Right */ + dsb->put_aux(dsb, pos, 1, value); /* Front right */ + dsb->put_aux(dsb, pos, 5, value); /* Back right */ + dsb->put_aux(dsb, pos, 7, value); /* Side right */ + } +} + void put_quad2surround71(const IDirectSoundBufferImpl *dsb, DWORD pos, DWORD channel, float value) { if (channel == 0) { /* Front left */ diff --git a/dlls/dsound/dsound_private.h b/dlls/dsound/dsound_private.h index 2b3aa9a9d25..3b4806a487b 100644 --- a/dlls/dsound/dsound_private.h +++ b/dlls/dsound/dsound_private.h @@ -182,6 +182,8 @@ void put_stereo2surround51(const IDirectSoundBufferImpl *dsb, DWORD pos, DWORD c void put_surround512stereo(const IDirectSoundBufferImpl *dsb, DWORD pos, DWORD channel, float value); void put_surround712stereo(const IDirectSoundBufferImpl *dsb, DWORD pos, DWORD channel, float value); void put_quad2stereo(const IDirectSoundBufferImpl *dsb, DWORD pos, DWORD channel, float value); +void put_stereo2surround71(const IDirectSoundBufferImpl *dsb, DWORD pos, DWORD channel, float value); +void put_mono2surround71(const IDirectSoundBufferImpl *dsb, DWORD pos, DWORD channel, float value); void put_quad2surround71(const IDirectSoundBufferImpl *dsb, DWORD pos, DWORD channel, float value); void put_surround512surround71(const IDirectSoundBufferImpl *dsb, DWORD pos, DWORD channel, float value); diff --git a/dlls/dsound/mixer.c b/dlls/dsound/mixer.c index c37011752b0..2ab7a88233f 100644 --- a/dlls/dsound/mixer.c +++ b/dlls/dsound/mixer.c @@ -195,6 +195,16 @@ void DSOUND_RecalcFormat(IDirectSoundBufferImpl *dsb) dsb->put = put_quad2stereo; dsb->put_aux = putieee32_sum; } + else if (ichannels == 1 && ochannels == 8) + { + dsb->mix_channels = 1; + dsb->put = put_mono2surround71; + } + else if (ichannels == 2 && ochannels == 8) + { + dsb->mix_channels = 2; + dsb->put = put_stereo2surround71; + } else if (ichannels == 4 && ochannels == 8) { dsb->mix_channels = 4; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11154