Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions app/src/main/java/com/pedro/streamer/screen/ScreenActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ import com.pedro.streamer.utils.updateMenuColor
class ScreenActivity : AppCompatActivity(), ConnectChecker {

enum class Action {
STREAM, RECORD, NONE
STREAM, RECORD, NONE, CHANGE
}

private lateinit var button: ImageView
Expand All @@ -69,7 +69,9 @@ class ScreenActivity : AppCompatActivity(), ConnectChecker {
if (data != null && result.resultCode == RESULT_OK) {
val screenService = ScreenService.INSTANCE
if (screenService != null) {
if (screenService.prepareStream(result.resultCode, data)) {
if (action == Action.CHANGE) {
screenService.screenS(result.resultCode, data)
}else if (screenService.prepareStream(result.resultCode, data)) {
when (action) {
Action.STREAM -> startStream()
Action.RECORD -> toggleRecord()
Expand Down Expand Up @@ -180,7 +182,12 @@ class ScreenActivity : AppCompatActivity(), ConnectChecker {
R.id.audio_source_microphone, R.id.audio_source_internal, R.id.audio_source_mix -> {
val service = ScreenService.INSTANCE
if (service != null) {
service.toggleAudioSource(item.itemId)
if (item.itemId == R.id.audio_source_internal) {
action = Action.CHANGE
activityResultContract.launch(service.sendIntent())
} else {
service.toggleAudioSource(item.itemId)
}
currentAudioSource = item.updateMenuColor(this, currentAudioSource)
}
}
Expand Down
32 changes: 13 additions & 19 deletions app/src/main/java/com/pedro/streamer/screen/ScreenService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import com.pedro.encoder.input.sources.audio.AudioSource
import com.pedro.encoder.input.sources.audio.InternalAudioSource
import com.pedro.encoder.input.sources.audio.MicrophoneSource
import com.pedro.encoder.input.sources.audio.MixAudioSource
import com.pedro.encoder.input.sources.video.Camera2Source
import com.pedro.encoder.input.sources.video.NoVideoSource
import com.pedro.encoder.input.sources.video.ScreenSource
import com.pedro.library.base.recording.RecordController
Expand Down Expand Up @@ -73,7 +74,7 @@ class ScreenService: Service(), ConnectChecker {
private val aBitrate = 128 * 1000
private var prepared = false
private var recordPath = ""
private var selectedAudioSource: Int = R.id.audio_source_microphone
private var selectedAudioSource: Int = R.id.audio_source_internal

override fun onCreate() {
super.onCreate()
Expand Down Expand Up @@ -159,9 +160,8 @@ class ScreenService: Service(), ConnectChecker {
val mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data) ?: throw IllegalStateException("get MediaProjection failed")
this.mediaProjection = mediaProjection
val screenSource = ScreenSource(applicationContext, mediaProjection)
genericStream.changeVideoSource(screenSource)
return try {
genericStream.changeVideoSource(screenSource)
toggleAudioSource(selectedAudioSource)
true
} catch (_: IllegalArgumentException) {
false
Expand All @@ -170,30 +170,24 @@ class ScreenService: Service(), ConnectChecker {

fun getCurrentAudioSource(): AudioSource = genericStream.audioSource

fun screenS(resultCode: Int, data: Intent) {
selectedAudioSource = R.id.audio_source_internal
val mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data) ?: throw IllegalStateException("get MediaProjection failed")
val screenSource = ScreenSource(applicationContext, mediaProjection)
genericStream.changeVideoSource(screenSource)
}

fun toggleAudioSource(itemId: Int) {
when (itemId) {
R.id.audio_source_microphone -> {
selectedAudioSource = R.id.audio_source_microphone
if (genericStream.audioSource is MicrophoneSource) return
genericStream.changeAudioSource(MicrophoneSource())
genericStream.changeVideoSource(Camera2Source(applicationContext))
}
R.id.audio_source_internal -> {
selectedAudioSource = R.id.audio_source_internal
if (genericStream.audioSource is InternalAudioSource) return
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
mediaProjection?.let { genericStream.changeAudioSource(InternalAudioSource(it)) }
} else {
throw IllegalArgumentException("You need min API 29+")
}

}
R.id.audio_source_mix -> {
selectedAudioSource = R.id.audio_source_mix
if (genericStream.audioSource is MixAudioSource) return
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
mediaProjection?.let { genericStream.changeAudioSource(MixAudioSource(it)) }
} else {
throw IllegalArgumentException("You need min API 29+")
}

}
}
}
Expand Down
Loading