diff --git a/application/app/src/main/java/org/videolan/mobile/app/AppSetupDelegate.kt b/application/app/src/main/java/org/videolan/mobile/app/AppSetupDelegate.kt index 4bf8fd7cc..9cb4f129a 100644 --- a/application/app/src/main/java/org/videolan/mobile/app/AppSetupDelegate.kt +++ b/application/app/src/main/java/org/videolan/mobile/app/AppSetupDelegate.kt @@ -91,7 +91,7 @@ class AppSetupDelegate : AppDelegate, AppScope.launch(Dispatchers.IO) { if (!VLCInstance.testCompatibleCPU(AppContextProvider.appContext)) return@launch - Dialog.setCallbacks(VLCInstance[this@backgroundInit], DialogDelegate) + Dialog.setCallbacks(VLCInstance.getInstance(this@backgroundInit), DialogDelegate) } packageManager.setComponentEnabledSetting(ComponentName(this, SendCrashActivity::class.java), if (BuildConfig.BETA) PackageManager.COMPONENT_ENABLED_STATE_ENABLED else PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP) diff --git a/application/resources/src/main/java/org/videolan/resources/VLCInstance.kt b/application/resources/src/main/java/org/videolan/resources/VLCInstance.kt index 50172f228..ee9ee1d35 100644 --- a/application/resources/src/main/java/org/videolan/resources/VLCInstance.kt +++ b/application/resources/src/main/java/org/videolan/resources/VLCInstance.kt @@ -30,52 +30,46 @@ import org.videolan.libvlc.FactoryManager import org.videolan.libvlc.interfaces.ILibVLC import org.videolan.libvlc.interfaces.ILibVLCFactory import org.videolan.libvlc.util.VLCUtil +import org.videolan.resources.VLCInstance.init import org.videolan.resources.util.VLCCrashHandler +import org.videolan.tools.SingletonHolder @ObsoleteCoroutinesApi -object VLCInstance { +object VLCInstance : SingletonHolder({ init(it.applicationContext) }) { const val TAG = "VLC/UiTools/VLCInstance" @SuppressLint("StaticFieldLeak") - private var sLibVLC: ILibVLC? = null + private lateinit var sLibVLC: ILibVLC - private val libVLCFactory by lazy { FactoryManager.getFactory(ILibVLCFactory.factoryId) as ILibVLCFactory } + private val libVLCFactory= FactoryManager.getFactory(ILibVLCFactory.factoryId) as ILibVLCFactory - /** A set of utility functions for the VLC application */ - @Synchronized @Throws(IllegalStateException::class) - operator fun get(ctx: Context): ILibVLC { - if (sLibVLC == null) { - Thread.setDefaultUncaughtExceptionHandler(VLCCrashHandler()) + fun init(ctx: Context) : ILibVLC { + Thread.setDefaultUncaughtExceptionHandler(VLCCrashHandler()) - val context = ctx.applicationContext - if (!VLCUtil.hasCompatibleCPU(context)) { - Log.e(TAG, VLCUtil.getErrorMsg()) - throw IllegalStateException("LibVLC initialisation failed: " + VLCUtil.getErrorMsg()) - } - - // TODO change LibVLC signature to accept a List instead of an ArrayList - sLibVLC = libVLCFactory.getFromOptions(context, VLCOptions.libOptions) + if (!VLCUtil.hasCompatibleCPU(ctx)) { + Log.e(TAG, VLCUtil.getErrorMsg()) + throw IllegalStateException("LibVLC initialisation failed: " + VLCUtil.getErrorMsg()) } - return sLibVLC!! + + // TODO change LibVLC signature to accept a List instead of an ArrayList + sLibVLC = libVLCFactory.getFromOptions(ctx, VLCOptions.libOptions) + return sLibVLC } - @Synchronized @Throws(IllegalStateException::class) fun restart() { - sLibVLC?.release() + sLibVLC.release() sLibVLC = libVLCFactory.getFromOptions(AppContextProvider.appContext, VLCOptions.libOptions) } - @Synchronized fun testCompatibleCPU(context: Context): Boolean { - return if (sLibVLC == null && !VLCUtil.hasCompatibleCPU(context)) { + return if (!VLCUtil.hasCompatibleCPU(context)) { if (context is Activity) { val i = Intent(Intent.ACTION_VIEW).setClassName(context.applicationContext, COMPATERROR_ACTIVITY) context.startActivity(i) } false - } else - true + } else true } } diff --git a/application/vlc-android/src/org/videolan/vlc/PreviewVideoInputService.kt b/application/vlc-android/src/org/videolan/vlc/PreviewVideoInputService.kt index 110ef70b6..13990775f 100644 --- a/application/vlc-android/src/org/videolan/vlc/PreviewVideoInputService.kt +++ b/application/vlc-android/src/org/videolan/vlc/PreviewVideoInputService.kt @@ -64,7 +64,7 @@ class PreviewVideoInputService : TvInputService(), CoroutineScope by MainScope() return@launch } try { - val media = mFactory.getFromUri(VLCInstance.get(this@PreviewVideoInputService), mw.uri) + val media = mFactory.getFromUri(VLCInstance.getInstance(this@PreviewVideoInputService), mw.uri) val start = if (mw.length <= 0L) 0L else mw.length.random() media.addOption(":start-time=${start/1000L}") awaitSurface() diff --git a/application/vlc-android/src/org/videolan/vlc/RendererDelegate.kt b/application/vlc-android/src/org/videolan/vlc/RendererDelegate.kt index 491f0fb7a..798af976a 100644 --- a/application/vlc-android/src/org/videolan/vlc/RendererDelegate.kt +++ b/application/vlc-android/src/org/videolan/vlc/RendererDelegate.kt @@ -49,7 +49,7 @@ object RendererDelegate : RendererDiscoverer.EventListener { suspend fun start() { if (started) return - val libVlc = withContext(Dispatchers.IO) { VLCInstance.get(AppContextProvider.appContext) } + val libVlc = withContext(Dispatchers.IO) { VLCInstance.getInstance(AppContextProvider.appContext) } started = true for (discoverer in RendererDiscoverer.list(libVlc)) { val rd = RendererDiscoverer(libVlc, discoverer.name) diff --git a/application/vlc-android/src/org/videolan/vlc/gui/InfoActivity.kt b/application/vlc-android/src/org/videolan/vlc/gui/InfoActivity.kt index 0299fc82a..771eaae6b 100644 --- a/application/vlc-android/src/org/videolan/vlc/gui/InfoActivity.kt +++ b/application/vlc-android/src/org/videolan/vlc/gui/InfoActivity.kt @@ -245,7 +245,7 @@ class InfoModel : ViewModel() { internal fun parseTracks(context: Context, mw: MediaWrapper) = viewModelScope.launch { val media = withContext(Dispatchers.IO) { - val libVlc = VLCInstance[context] + val libVlc = VLCInstance.getInstance(context) mMediaFactory.getFromUri(libVlc, mw.uri).apply { parse() } } if (!isActive) return@launch diff --git a/application/vlc-android/src/org/videolan/vlc/gui/audio/EqualizerFragment.kt b/application/vlc-android/src/org/videolan/vlc/gui/audio/EqualizerFragment.kt index 685fa5692..2dc19fc94 100644 --- a/application/vlc-android/src/org/videolan/vlc/gui/audio/EqualizerFragment.kt +++ b/application/vlc-android/src/org/videolan/vlc/gui/audio/EqualizerFragment.kt @@ -140,7 +140,7 @@ class EqualizerFragment : VLCBottomSheetDialogFragment() { if (context == null || presets == null) return@launch if (bandCount == -1) bandCount = withContext(Dispatchers.IO) { - VLCInstance.get(requireContext()) + VLCInstance.getInstance(requireContext()) MediaPlayer.Equalizer.getBandCount() } if (!isStarted()) return@launch @@ -466,7 +466,7 @@ class EqualizerFragment : VLCBottomSheetDialogFragment() { } } if (bandCount == -1) bandCount = withContext(Dispatchers.IO) { - VLCInstance.get(requireContext()) + VLCInstance.getInstance(requireContext()) MediaPlayer.Equalizer.getBandCount() } if (!isStarted()) return@launch diff --git a/application/vlc-android/src/org/videolan/vlc/media/PlayerController.kt b/application/vlc-android/src/org/videolan/vlc/media/PlayerController.kt index 5c633b0d8..25d9c5cfe 100644 --- a/application/vlc-android/src/org/videolan/vlc/media/PlayerController.kt +++ b/application/vlc-android/src/org/videolan/vlc/media/PlayerController.kt @@ -210,7 +210,7 @@ class PlayerController(val context: Context) : IVLCVout.Callback, MediaPlayer.Ev } private fun newMediaPlayer() : MediaPlayer { - return MediaPlayer(VLCInstance.get(context)).apply { + return MediaPlayer(VLCInstance.getInstance(context)).apply { setAudioDigitalOutputEnabled(VLCOptions.isAudioDigitalOutputEnabled(settings)) VLCOptions.getAout(settings)?.let { setAudioOutput(it) } setRenderer(PlaybackService.renderer.value) diff --git a/application/vlc-android/src/org/videolan/vlc/media/PlaylistManager.kt b/application/vlc-android/src/org/videolan/vlc/media/PlaylistManager.kt index aa11bd284..19f82d774 100644 --- a/application/vlc-android/src/org/videolan/vlc/media/PlaylistManager.kt +++ b/application/vlc-android/src/org/videolan/vlc/media/PlaylistManager.kt @@ -314,7 +314,7 @@ class PlaylistManager(val service: PlaybackService) : MediaWrapperList.EventList val title = mw.getMetaLong(MediaWrapper.META_TITLE) if (title > 0) uri = Uri.parse("$uri#$title") val start = getStartTime(mw) - val media = mediaFactory.getFromUri(VLCInstance.get(service), uri) + val media = mediaFactory.getFromUri(VLCInstance.getInstance(service), uri) media.addOption(":start-time=${start/1000L}") VLCOptions.setMediaOptions(media, ctx, flags or mw.flags, PlaybackService.hasRenderer()) /* keeping only video during benchmark */ diff --git a/application/vlc-android/src/org/videolan/vlc/providers/BrowserProvider.kt b/application/vlc-android/src/org/videolan/vlc/providers/BrowserProvider.kt index de19b014d..1dfc8365a 100644 --- a/application/vlc-android/src/org/videolan/vlc/providers/BrowserProvider.kt +++ b/application/vlc-android/src/org/videolan/vlc/providers/BrowserProvider.kt @@ -114,7 +114,7 @@ abstract class BrowserProvider(val context: Context, val dataset: LiveDataset