[PATCH v2 1/3] winepulse: Store device-specific format and periods
Claire Girka
wine at gitlab.winehq.org
Wed Jun 29 09:14:53 CDT 2022
From: Claire Girka <claire at sitedethib.com>
In addition to those of the default device, also store device-specific format
and periods so that they can be returned on GetMixFormat and GetPeriod calls.
---
dlls/winepulse.drv/pulse.c | 31 +++++++++++++++++++++----------
1 file changed, 21 insertions(+), 10 deletions(-)
diff --git a/dlls/winepulse.drv/pulse.c b/dlls/winepulse.drv/pulse.c
index 42d73db45f9..1701b9c281c 100644
--- a/dlls/winepulse.drv/pulse.c
+++ b/dlls/winepulse.drv/pulse.c
@@ -89,6 +89,8 @@ typedef struct _PhysDevice {
EndpointFormFactor form;
UINT channel_mask;
UINT index;
+ REFERENCE_TIME min_period, def_period;
+ WAVEFORMATEXTENSIBLE fmt;
char pulse_name[0];
} PhysDevice;
@@ -659,7 +661,7 @@ static void convert_channel_map(const pa_channel_map *pa_map, WAVEFORMATEXTENSIB
fmt->dwChannelMask = pa_mask;
}
-static void pulse_probe_settings(int render, WAVEFORMATEXTENSIBLE *fmt) {
+static void pulse_probe_settings(int render, WAVEFORMATEXTENSIBLE *fmt, REFERENCE_TIME *def_period, REFERENCE_TIME *min_period, CHAR *pulse_name) {
WAVEFORMATEX *wfx = &fmt->Format;
pa_stream *stream;
pa_channel_map map;
@@ -684,10 +686,10 @@ static void pulse_probe_settings(int render, WAVEFORMATEXTENSIBLE *fmt) {
if (!stream)
ret = -1;
else if (render)
- ret = pa_stream_connect_playback(stream, NULL, &attr,
+ ret = pa_stream_connect_playback(stream, pulse_name, &attr,
PA_STREAM_START_CORKED|PA_STREAM_FIX_RATE|PA_STREAM_FIX_CHANNELS|PA_STREAM_EARLY_REQUESTS, NULL, NULL);
else
- ret = pa_stream_connect_record(stream, NULL, &attr, PA_STREAM_START_CORKED|PA_STREAM_FIX_RATE|PA_STREAM_FIX_CHANNELS|PA_STREAM_EARLY_REQUESTS);
+ ret = pa_stream_connect_record(stream, pulse_name, &attr, PA_STREAM_START_CORKED|PA_STREAM_FIX_RATE|PA_STREAM_FIX_CHANNELS|PA_STREAM_EARLY_REQUESTS);
if (ret >= 0) {
while (pa_mainloop_iterate(pulse_ml, 1, &ret) >= 0 &&
pa_stream_get_state(stream) == PA_STREAM_CREATING)
@@ -710,13 +712,13 @@ static void pulse_probe_settings(int render, WAVEFORMATEXTENSIBLE *fmt) {
pa_stream_unref(stream);
if (length)
- pulse_def_period[!render] = pulse_min_period[!render] = pa_bytes_to_usec(10 * length, &ss);
+ *def_period = *min_period = pa_bytes_to_usec(10 * length, &ss);
- if (pulse_min_period[!render] < MinimumPeriod)
- pulse_min_period[!render] = MinimumPeriod;
+ if (*min_period < MinimumPeriod)
+ *min_period = MinimumPeriod;
- if (pulse_def_period[!render] < DefaultPeriod)
- pulse_def_period[!render] = DefaultPeriod;
+ if (*def_period < DefaultPeriod)
+ *def_period = DefaultPeriod;
wfx->wFormatTag = WAVE_FORMAT_EXTENSIBLE;
wfx->cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
@@ -745,6 +747,7 @@ static NTSTATUS pulse_test_connect(void *args)
{
struct test_connect_params *params = args;
struct pulse_config *config = params->config;
+ PhysDevice *dev;
pa_operation *o;
int ret;
@@ -787,8 +790,8 @@ static NTSTATUS pulse_test_connect(void *args)
pa_context_get_server(pulse_ctx),
pa_context_get_server_protocol_version(pulse_ctx));
- pulse_probe_settings(1, &pulse_fmt[0]);
- pulse_probe_settings(0, &pulse_fmt[1]);
+ pulse_probe_settings(1, &pulse_fmt[0], &pulse_def_period[0], &pulse_min_period[0], NULL);
+ pulse_probe_settings(0, &pulse_fmt[1], &pulse_def_period[1], &pulse_min_period[1], NULL);
free_phys_device_lists();
list_init(&g_phys_speakers);
@@ -813,6 +816,14 @@ static NTSTATUS pulse_test_connect(void *args)
pa_operation_unref(o);
}
+ LIST_FOR_EACH_ENTRY(dev, &g_phys_speakers, PhysDevice, entry) {
+ pulse_probe_settings(1, &dev->fmt, &dev->def_period, &dev->min_period, dev->pulse_name);
+ }
+
+ LIST_FOR_EACH_ENTRY(dev, &g_phys_sources, PhysDevice, entry) {
+ pulse_probe_settings(0, &dev->fmt, &dev->def_period, &dev->min_period, dev->pulse_name);
+ }
+
pa_context_unref(pulse_ctx);
pulse_ctx = NULL;
pa_mainloop_free(pulse_ml);
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/337
More information about the wine-devel
mailing list