@@ -133,14 +133,23 @@ internal class CameraSource(
133133 override suspend fun hasPreview () = controller.hasOutput(PREVIEW_NAME )
134134
135135 @RequiresPermission(Manifest .permission.CAMERA )
136- override suspend fun setPreview (surface : Surface ) {
136+ private suspend fun setPreviewUnsafe (surface : Surface ) {
137137 if (isPreviewingFlow.value) {
138138 Logger .w(TAG , " Trying to set preview while previewing" )
139139 }
140140 Logger .e(TAG , " >>> Set preview $surface " )
141141 controller.addOutput(CameraSurface (PREVIEW_NAME , surface))
142142 }
143143
144+ @RequiresPermission(Manifest .permission.CAMERA )
145+ override suspend fun setPreview (surface : Surface ) {
146+ withContext(defaultDispatcher) {
147+ previewMutex.withLock {
148+ setPreviewUnsafe(surface)
149+ }
150+ }
151+ }
152+
144153 @SuppressLint(" MissingPermission" )
145154 override suspend fun resetPreviewImpl () {
146155 Logger .e(TAG , " >>> reset preview" )
@@ -195,7 +204,6 @@ internal class CameraSource(
195204 private suspend fun startPreviewUnsafe () {
196205 if (isPreviewingFlow.value) {
197206 Logger .w(TAG , " Camera is already previewing" )
198- return
199207 }
200208 Logger .w(TAG , " Add preview to controller" )
201209 controller.addTarget(PREVIEW_NAME )
@@ -219,11 +227,7 @@ internal class CameraSource(
219227 override suspend fun startPreview (previewSurface : Surface ) {
220228 withContext(defaultDispatcher) {
221229 previewMutex.withLock {
222- if (isPreviewingFlow.value) {
223- Logger .w(TAG , " Camera is already previewing" )
224- // return@withContext
225- }
226- setPreview(previewSurface)
230+ setPreviewUnsafe(previewSurface)
227231 startPreviewUnsafe()
228232 }
229233 }
0 commit comments