From ed3820bec0a9e58c912d29c19426809cfefcff03 Mon Sep 17 00:00:00 2001 From: Kelvin Date: Thu, 3 Jul 2025 19:15:14 +0200 Subject: [PATCH] Finish async generates --- .../java/com/futo/platformplayer/Extensions_V8.kt | 13 +++++++------ .../views/video/FutoVideoPlayerBase.kt | 5 ++++- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/futo/platformplayer/Extensions_V8.kt b/app/src/main/java/com/futo/platformplayer/Extensions_V8.kt index bb127e42..d8427dc6 100644 --- a/app/src/main/java/com/futo/platformplayer/Extensions_V8.kt +++ b/app/src/main/java/com/futo/platformplayer/Extensions_V8.kt @@ -231,26 +231,27 @@ fun V8ValuePromise.toV8ValueBlocking(plugin: V8Plugin): T { return promiseResult!!; } fun V8ValuePromise.toV8ValueAsync(plugin: V8Plugin): V8Deferred { + val underlyingDef = CompletableDeferred(); val def = if(this.has("estDuration")) - V8Deferred(CompletableDeferred(), + V8Deferred(underlyingDef, this.getOrDefault(plugin.config, "estDuration", "toV8ValueAsync", -1) ?: -1); else - V8Deferred(CompletableDeferred()); + V8Deferred(underlyingDef); val promise = this; plugin.busy { this.register(object: IV8ValuePromise.IListener { override fun onFulfilled(p0: V8Value?) { plugin.resolvePromise(promise); - def.complete(p0 as T); + underlyingDef.complete(p0 as T); } override fun onRejected(p0: V8Value?) { plugin.resolvePromise(promise); - def.completeExceptionally(NotImplementedError("onRejected promise not implemented..")); + underlyingDef.completeExceptionally(NotImplementedError("onRejected promise not implemented..")); } override fun onCatch(p0: V8Value?) { plugin.resolvePromise(promise); - def.completeExceptionally(NotImplementedError("onCatch promise not implemented..")); + underlyingDef.completeExceptionally(NotImplementedError("onCatch promise not implemented..")); } }); } @@ -277,7 +278,7 @@ class V8Deferred(val deferred: Deferred, val estDuration: Int = -1): Defer companion object { - fun merge(scope: CoroutineScope, defs: List> conversion: (result: List)->R): V8Deferred { + fun merge(scope: CoroutineScope, defs: List>, conversion: (result: List)->R): V8Deferred { var amount = -1; for(def in defs) diff --git a/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt b/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt index 6630ccf3..09cbeba5 100644 --- a/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt +++ b/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayerBase.kt @@ -696,10 +696,13 @@ abstract class FutoVideoPlayerBase : RelativeLayout { Logger.i(TAG, "Loading AudioSource [DashRaw]"); if(audioSource.hasGenerate) { findViewTreeLifecycleOwner()?.lifecycle?.coroutineScope?.launch(Dispatchers.IO) { + val scope = this; var startId = -1; try { + val plugin = audioSource.getUnderlyingPlugin() ?: return@launch; startId = audioSource.getUnderlyingPlugin()?.getUnderlyingPlugin()?.runtimeId ?: -1; - val generated = audioSource.generate(); + val generatedDef = plugin.busy { audioSource.generateAsync(scope); } + val generated = generatedDef.await(); if(generated != null) { val dataSource = if(audioSource is JSSource && (audioSource.requiresCustomDatasource)) audioSource.getHttpDataSourceFactory()