Rebase against b053e924e8e13b3637f2a5a8ffe88d84c2d17075.

This commit is contained in:
Zebediah Figura
2024-03-21 19:29:09 -05:00
parent 621740283c
commit a5a28003b4
5 changed files with 57 additions and 53 deletions

View File

@@ -1,4 +1,4 @@
From d09ac9a348309f956a2f3985a1b465b51b6e174c Mon Sep 17 00:00:00 2001
From 6ef73a30a9f0c7c6775786d4cdba169f95056393 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Sat, 28 Mar 2015 08:18:10 +0100
Subject: [PATCH] dsound: Apply filters before sound is multiplied to speakers.
@@ -11,10 +11,10 @@ Based on a patch by Mark Harmstone.
3 files changed, 81 insertions(+), 36 deletions(-)
diff --git a/dlls/dsound/dsound.c b/dlls/dsound/dsound.c
index 0b8edaaaf06..bdf3a824511 100644
index 7629810db50..4c1c022acb7 100644
--- a/dlls/dsound/dsound.c
+++ b/dlls/dsound/dsound.c
@@ -234,6 +234,7 @@ static ULONG DirectSoundDevice_Release(DirectSoundDevice * device)
@@ -236,6 +236,7 @@ static ULONG DirectSoundDevice_Release(DirectSoundDevice * device)
if(device->mmdevice)
IMMDevice_Release(device->mmdevice);
CloseHandle(device->sleepev);
@@ -23,10 +23,10 @@ index 0b8edaaaf06..bdf3a824511 100644
free(device->cp_buffer);
free(device->buffer);
diff --git a/dlls/dsound/dsound_private.h b/dlls/dsound/dsound_private.h
index 124a4311b4c..fe39ca221fa 100644
index 61323be99d8..c2656ab82f1 100644
--- a/dlls/dsound/dsound_private.h
+++ b/dlls/dsound/dsound_private.h
@@ -89,8 +89,8 @@ struct DirectSoundDevice
@@ -90,8 +90,8 @@ struct DirectSoundDevice
int speaker_num[DS_MAX_CHANNELS];
int num_speakers;
int lfe_channel;
@@ -34,14 +34,14 @@ index 124a4311b4c..fe39ca221fa 100644
- DWORD tmp_buffer_len, cp_buffer_len;
+ float *tmp_buffer, *cp_buffer, *dsp_buffer;
+ DWORD tmp_buffer_len, cp_buffer_len, dsp_buffer_len;
CO_MTA_USAGE_COOKIE mta_cookie;
DSVOLUMEPAN volpan;
diff --git a/dlls/dsound/mixer.c b/dlls/dsound/mixer.c
index c26b19ea8c1..68a45c46d1e 100644
index 042b9499727..f261588454a 100644
--- a/dlls/dsound/mixer.c
+++ b/dlls/dsound/mixer.c
@@ -283,10 +283,9 @@ static inline float get_current_sample(const IDirectSoundBufferImpl *dsb,
@@ -286,10 +286,9 @@ static inline float get_current_sample(const IDirectSoundBufferImpl *dsb,
return dsb->get(dsb, buffer + (mixpos % buflen), channel);
}
@@ -53,7 +53,7 @@ index c26b19ea8c1..68a45c46d1e 100644
UINT committed_samples = 0;
DWORD channel, i;
@@ -305,17 +304,16 @@ static UINT cp_fields_noresample(IDirectSoundBufferImpl *dsb, UINT count)
@@ -308,17 +307,16 @@ static UINT cp_fields_noresample(IDirectSoundBufferImpl *dsb, UINT count)
for (; i < count; i++)
for (channel = 0; channel < dsb->mix_channels; channel++)
@@ -74,7 +74,7 @@ index c26b19ea8c1..68a45c46d1e 100644
UINT channels = dsb->mix_channels;
LONG64 freqAcc_start = *freqAccNum;
@@ -343,7 +341,7 @@ static UINT cp_fields_resample_lq(IDirectSoundBufferImpl *dsb, UINT count, LONG6
@@ -346,7 +344,7 @@ static UINT cp_fields_resample_lq(IDirectSoundBufferImpl *dsb, UINT count, LONG6
float s1 = get_current_sample(dsb, dsb->buffer->memory, dsb->buflen, idx, channel);
float s2 = get_current_sample(dsb, dsb->buffer->memory, dsb->buflen, idx + istride, channel);
float result = s1 * cur_freqAcc2 + s2 * cur_freqAcc;
@@ -83,7 +83,7 @@ index c26b19ea8c1..68a45c46d1e 100644
}
}
@@ -351,11 +349,11 @@ static UINT cp_fields_resample_lq(IDirectSoundBufferImpl *dsb, UINT count, LONG6
@@ -354,11 +352,11 @@ static UINT cp_fields_resample_lq(IDirectSoundBufferImpl *dsb, UINT count, LONG6
return max_ipos;
}
@@ -97,7 +97,7 @@ index c26b19ea8c1..68a45c46d1e 100644
UINT committed_samples = 0;
LONG64 freqAcc_start = *freqAccNum;
@@ -430,23 +428,24 @@ static UINT cp_fields_resample_hq(IDirectSoundBufferImpl *dsb, UINT count, LONG6
@@ -433,23 +431,24 @@ static UINT cp_fields_resample_hq(IDirectSoundBufferImpl *dsb, UINT count, LONG6
float* cache = &intermediate[channel * required_input + ipos];
for (j = 0; j < fir_used; j++)
sum += fir_copy[j] * cache[j];
@@ -127,7 +127,7 @@ index c26b19ea8c1..68a45c46d1e 100644
ipos = dsb->sec_mixpos + adv * dsb->pwfx->nBlockAlign;
if (ipos >= dsb->buflen) {
@@ -482,6 +481,21 @@ static inline DWORD DSOUND_BufPtrDiff(DWORD buflen, DWORD ptr1, DWORD ptr2)
@@ -485,6 +484,21 @@ static inline DWORD DSOUND_BufPtrDiff(DWORD buflen, DWORD ptr1, DWORD ptr2)
return buflen + ptr1 - ptr2;
}
}
@@ -149,7 +149,7 @@ index c26b19ea8c1..68a45c46d1e 100644
/**
* Mix at most the given amount of data into the allocated temporary buffer
* of the given secondary buffer, starting from the dsb's first currently
@@ -497,31 +511,61 @@ static inline DWORD DSOUND_BufPtrDiff(DWORD buflen, DWORD ptr1, DWORD ptr2)
@@ -500,31 +514,61 @@ static inline DWORD DSOUND_BufPtrDiff(DWORD buflen, DWORD ptr1, DWORD ptr2)
*/
static void DSOUND_MixToTemporary(IDirectSoundBufferImpl *dsb, DWORD frames)
{
@@ -180,12 +180,22 @@ index c26b19ea8c1..68a45c46d1e 100644
+ }
+ if(dsb->put_aux == putieee32_sum)
+ memset(dsb->device->tmp_buffer, 0, dsb->device->tmp_buffer_len);
+
- if (size_bytes > 0) {
- for (i = 0; i < dsb->num_filters; i++) {
- if (dsb->filters[i].inplace) {
- hr = IMediaObjectInPlace_Process(dsb->filters[i].inplace, size_bytes, (BYTE*)dsb->device->tmp_buffer, 0, DMO_INPLACE_NORMAL);
+ if (using_filters) {
+ put = putieee32_dsp;
+ ostride = dsb->mix_channels * sizeof(float);
+ size_bytes = frames * ostride;
+
- if (FAILED(hr))
- WARN("IMediaObjectInPlace_Process failed for filter %u\n", i);
- } else
- WARN("filter %u has no inplace object - unsupported\n", i);
- }
- }
+ if (dsb->device->dsp_buffer_len < size_bytes || !dsb->device->dsp_buffer) {
+ if (dsb->device->dsp_buffer)
+ dsb->device->dsp_buffer = HeapReAlloc(GetProcessHeap(), 0, dsb->device->dsp_buffer, size_bytes);
@@ -194,11 +204,7 @@ index c26b19ea8c1..68a45c46d1e 100644
+ dsb->device->dsp_buffer_len = size_bytes;
+ }
+ }
- if (size_bytes > 0) {
- for (i = 0; i < dsb->num_filters; i++) {
- if (dsb->filters[i].inplace) {
- hr = IMediaObjectInPlace_Process(dsb->filters[i].inplace, size_bytes, (BYTE*)dsb->device->tmp_buffer, 0, DMO_INPLACE_NORMAL);
+
+ cp_fields(dsb, put, ostride, frames, &dsb->freqAccNum);
+
+ if (using_filters) {
@@ -213,13 +219,7 @@ index c26b19ea8c1..68a45c46d1e 100644
+ WARN("filter %lu has no inplace object - unsupported\n", i);
+ }
+ }
- if (FAILED(hr))
- WARN("IMediaObjectInPlace_Process failed for filter %u\n", i);
- } else
- WARN("filter %u has no inplace object - unsupported\n", i);
- }
- }
+
+ istride = ostride;
+ ostride = dsb->device->pwfx->nChannels * sizeof(float);
+ for (i = 0; i < frames; i++) {
@@ -232,5 +232,5 @@ index c26b19ea8c1..68a45c46d1e 100644
static void DSOUND_MixerVol(const IDirectSoundBufferImpl *dsb, INT frames)
--
2.39.2
2.43.0