Skip to content

Commit

Permalink
fix(demos): camera: add support for audio only streamer
Browse files Browse the repository at this point in the history
  • Loading branch information
ThibaultBee committed Nov 20, 2024
1 parent ba72195 commit 5e9ab83
Showing 1 changed file with 31 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import io.github.thibaultbee.streampack.core.data.mediadescriptor.UriMediaDescri
import io.github.thibaultbee.streampack.core.internal.endpoints.composites.muxers.ts.data.TSServiceInfo
import io.github.thibaultbee.streampack.core.internal.sources.video.camera.CameraSettings
import io.github.thibaultbee.streampack.core.internal.utils.RotationValue
import io.github.thibaultbee.streampack.core.streamers.DefaultAudioOnlyStreamer
import io.github.thibaultbee.streampack.core.streamers.DefaultCameraStreamer
import io.github.thibaultbee.streampack.core.streamers.interfaces.ICameraStreamer
import io.github.thibaultbee.streampack.core.streamers.interfaces.ICoroutineStreamer
Expand All @@ -51,7 +52,7 @@ class StreamerManager(
private val context: Context,
private val configuration: Configuration
) : IRotationProvider.Listener {
private val streamer: ICoroutineStreamer =
private var streamer: ICoroutineStreamer =
DefaultCameraStreamer(context, configuration.audio.enable)

val throwable: StateFlow<Throwable?> = streamer.throwable
Expand Down Expand Up @@ -105,6 +106,20 @@ class StreamerManager(

@RequiresPermission(Manifest.permission.RECORD_AUDIO)
fun configureStreamer() {
require(configuration.video.enable || configuration.audio.enable) { "At least one of audio or video must be enabled" }

// Change streamer if needed
if (configuration.video.enable) {
if (streamer !is DefaultCameraStreamer) {
streamer = DefaultCameraStreamer(context, configuration.audio.enable)
}
} else {
if (streamer !is DefaultAudioOnlyStreamer) {
streamer = DefaultAudioOnlyStreamer(context)
}
}

// Configure
val videoConfig = VideoConfig(
mimeType = configuration.video.encoder,
startBitrate = configuration.video.bitrate * 1000, // to b/s
Expand Down Expand Up @@ -132,8 +147,10 @@ class StreamerManager(
}

suspend fun inflateStreamerView(view: PreviewView) {
view.streamer = (streamer as ICameraStreamer?)
view.startPreview()
if (streamer is ICameraStreamer) {
view.streamer = streamer as ICameraStreamer
view.startPreview()
}
}

suspend fun startStream() {
Expand Down Expand Up @@ -233,21 +250,28 @@ class StreamerManager(
}

fun toggleCamera() {
(streamer as ICameraStreamer?)?.let {
if (streamer is ICameraStreamer) {
val streamer = (streamer as ICameraStreamer)
// Handle devices with only one camera
val cameras = if (context.isBackCamera(it.camera)) {
val cameras = if (context.isBackCamera(streamer.camera)) {
context.frontCameras
} else {
context.backCameras
}
if (cameras.isNotEmpty()) {
it.camera = cameras[0]
streamer.camera = cameras[0]
}
}
}

val cameraSettings: CameraSettings?
get() = (streamer as ICameraStreamer?)?.videoSource?.settings
get() {
return if (streamer is ICameraStreamer) {
(streamer as ICameraStreamer).videoSource.settings
} else {
null
}
}


var isMuted: Boolean
Expand Down

0 comments on commit 5e9ab83

Please sign in to comment.