Module: wine Branch: master Commit: be77443b7ca769fc9717ac42297f033742db8905 URL: https://gitlab.winehq.org/wine/wine/-/commit/be77443b7ca769fc9717ac42297f033...
Author: Anton Baskanov baskanov@gmail.com Date: Wed Nov 22 14:48:41 2023 +0700
dmime: Don't queue messages with immediate delivery type.
---
dlls/dmime/performance.c | 48 +++++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 23 deletions(-)
diff --git a/dlls/dmime/performance.c b/dlls/dmime/performance.c index eccc1f83683..e2ca75b9c10 100644 --- a/dlls/dmime/performance.c +++ b/dlls/dmime/performance.c @@ -97,19 +97,6 @@ static inline struct message *message_from_DMUS_PMSG(DMUS_PMSG *msg) return msg ? CONTAINING_RECORD(msg, struct message, msg) : NULL; }
-static void performance_queue_message(struct performance *This, struct message *message, struct list *hint) -{ - struct message *prev; - - LIST_FOR_EACH_ENTRY_REV(prev, hint ? hint : &This->messages, struct message, entry) - { - if (&prev->entry == &This->messages) break; - if (prev->msg.rtTime <= message->msg.rtTime) break; - } - - list_add_after(&prev->entry, &message->entry); -} - static struct message *performance_get_message(struct performance *This, DWORD *timeout) { static const DWORD delivery_flags = DMUS_PMSGF_TOOL_IMMEDIATE | DMUS_PMSGF_TOOL_QUEUE | DMUS_PMSGF_TOOL_ATTIME; @@ -129,8 +116,6 @@ static struct message *performance_get_message(struct performance *This, DWORD * { default: WARN("No delivery flag found for message %p\n", &message->msg); - /* fallthrough */ - case DMUS_PMSGF_TOOL_IMMEDIATE: break; case DMUS_PMSGF_TOOL_QUEUE: offset = This->dwBumperLength * 10000; @@ -186,6 +171,30 @@ static HRESULT performance_process_message(struct performance *This, DMUS_PMSG * return hr; }
+static HRESULT performance_queue_message(struct performance *This, struct message *message, struct list *hint) +{ + static const DWORD delivery_flags = DMUS_PMSGF_TOOL_IMMEDIATE | DMUS_PMSGF_TOOL_QUEUE | DMUS_PMSGF_TOOL_ATTIME; + struct message *prev; + HRESULT hr; + + while ((message->msg.dwFlags & delivery_flags) == DMUS_PMSGF_TOOL_IMMEDIATE) + { + hr = performance_process_message(This, &message->msg); + if (hr != DMUS_S_REQUEUE) + return hr; + } + + LIST_FOR_EACH_ENTRY_REV(prev, hint ? hint : &This->messages, struct message, entry) + { + if (&prev->entry == &This->messages) break; + if (prev->msg.rtTime <= message->msg.rtTime) break; + } + + list_add_after(&prev->entry, &message->entry); + + return S_OK; +} + static DWORD WINAPI message_thread_proc(void *args) { struct performance *This = args; @@ -856,14 +865,7 @@ static HRESULT WINAPI performance_SendPMsg(IDirectMusicPerformance8 *iface, DMUS msg->dwFlags |= DMUS_PMSGF_REFTIME; }
- if (msg->dwFlags & DMUS_PMSGF_TOOL_IMMEDIATE) - { - hr = performance_process_message(This, &message->msg); - if (hr != DMUS_S_REQUEUE) goto done; - } - - performance_queue_message(This, message, NULL); - hr = S_OK; + hr = performance_queue_message(This, message, NULL); }
done: