todo: should we add some condition to assure imageReader not be closed
while callback is running?
This commit is contained in:
rustdesk 2024-04-18 22:38:32 +08:00
parent edb5529df3
commit ae23f0de03

View File

@ -338,8 +338,11 @@ class MainService : Service() {
).apply { ).apply {
setOnImageAvailableListener({ imageReader: ImageReader -> setOnImageAvailableListener({ imageReader: ImageReader ->
try { try {
if (!isStart) {
return@setOnImageAvailableListener
}
imageReader.acquireLatestImage().use { image -> imageReader.acquireLatestImage().use { image ->
if (image == null) return@setOnImageAvailableListener if (image == null || !isStart) return@setOnImageAvailableListener
val planes = image.planes val planes = image.planes
val buffer = planes[0].buffer val buffer = planes[0].buffer
buffer.rewind() buffer.rewind()
@ -390,8 +393,11 @@ class MainService : Service() {
_isStart = false _isStart = false
// release video // release video
virtualDisplay?.release() virtualDisplay?.release()
surface?.release()
imageReader?.close() imageReader?.close()
imageReader = null
// suface needs to be release after imageReader.close to imageReader access released surface
// https://github.com/rustdesk/rustdesk/issues/4118#issuecomment-1515666629
surface?.release()
videoEncoder?.let { videoEncoder?.let {
it.signalEndOfInputStream() it.signalEndOfInputStream()
it.stop() it.stop()
@ -402,9 +408,6 @@ class MainService : Service() {
// release audio // release audio
audioRecordStat = false audioRecordStat = false
audioRecorder?.release()
audioRecorder = null
minBufferSize = 0
} }
fun destroy() { fun destroy() {
@ -412,8 +415,6 @@ class MainService : Service() {
_isReady = false _isReady = false
stopCapture() stopCapture()
imageReader?.close()
imageReader = null
mediaProjection = null mediaProjection = null
checkMediaPermission() checkMediaPermission()
@ -524,6 +525,10 @@ class MainService : Service() {
FFI.onAudioFrameUpdate(it) FFI.onAudioFrameUpdate(it)
} }
} }
// let's release here rather than onDestroy to avoid threading issue
audioRecorder?.release()
audioRecorder = null
minBufferSize = 0
Log.d(logTag, "Exit audio thread") Log.d(logTag, "Exit audio thread")
} }
} catch (e: Exception) { } catch (e: Exception) {