| 1210 | } |
| 1211 | |
| 1212 | void MainWindow::deferReceivePresentation(ReceivePresentationSource source, |
| 1213 | ReceivePresentationSurface surface, |
| 1214 | std::function<void()> apply, |
| 1215 | const QString& sourceId) |
| 1216 | { |
| 1217 | if (!apply) { |
| 1218 | return; |
| 1219 | } |
| 1220 | |
| 1221 | const int delayMs = receivePresentationDelayMs(source, surface, sourceId); |
| 1222 | if (delayMs <= 0) { |
| 1223 | apply(); |
| 1224 | return; |
| 1225 | } |
| 1226 | |
| 1227 | if (surfaceUsesOrderedVisualQueue(surface)) { |
| 1228 | const qint64 nowMs = QDateTime::currentMSecsSinceEpoch(); |
| 1229 | const QString key = |
| 1230 | receivePresentationVisualQueueKey(source, surface, sourceId); |
| 1231 | qint64 dueMs = nowMs + delayMs; |
| 1232 | const qint64 previousDueMs = |
| 1233 | m_receivePresentationVisualLastDueMs.value(key, 0); |
| 1234 | if (previousDueMs > 0 && dueMs <= previousDueMs) { |
| 1235 | dueMs = previousDueMs + 1; |
| 1236 | } |
| 1237 | m_receivePresentationVisualLastDueMs.insert(key, dueMs); |
| 1238 | m_receivePresentationVisualQueue.enqueue( |
| 1239 | {.source = source, |
| 1240 | .surface = surface, |
| 1241 | .sourceId = key, |
| 1242 | .arrivalMs = nowMs, |
| 1243 | .dueMs = dueMs, |
| 1244 | .sequence = ++m_receivePresentationVisualSequence, |
| 1245 | .payload = std::move(apply)}); |
| 1246 | m_receivePresentationVisualQueue.trimToSize( |
| 1247 | kReceivePresentationVisualQueueMaxItems); |
| 1248 | scheduleReceivePresentationVisualQueue(); |
| 1249 | return; |
| 1250 | } |
| 1251 | |
| 1252 | QTimer::singleShot(delayMs, this, [apply = std::move(apply)]() { |
| 1253 | apply(); |
| 1254 | }); |
| 1255 | } |
| 1256 | |
| 1257 | void MainWindow::syncReceivePresentationDelaysToAudioEngine( |
| 1258 | bool clearVisualQueueOnAbruptDelayChange) |
nothing calls this directly
no test coverage detected