Skip to content

Commit 3a27066

Browse files
committed
feat(core): audio: use AudioSource.CAMCORDER as the default audio source
1 parent 1190412 commit 3a27066

3 files changed

Lines changed: 37 additions & 10 deletions

File tree

core/src/main/java/io/github/thibaultbee/streampack/core/elements/sources/audio/audiorecord/MicrophoneSource.kt

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,17 @@ import android.os.Build
2424
import androidx.annotation.RequiresPermission
2525
import io.github.thibaultbee.streampack.core.elements.sources.audio.AudioSourceConfig
2626
import io.github.thibaultbee.streampack.core.elements.sources.audio.IAudioSourceInternal
27+
import io.github.thibaultbee.streampack.core.elements.utils.AudioSourceValue
2728
import java.util.UUID
2829

2930
/**
3031
* The [MicrophoneSource] class is an implementation of [AudioRecordSource] that captures audio
3132
* from the microphone.
33+
*
34+
* @param audioSource The audio source to use (e.g., MediaRecorder.AudioSource.MIC).
3235
*/
33-
internal class MicrophoneSource : AudioRecordSource() {
36+
internal class MicrophoneSource(@AudioSourceValue val audioSource: Int) :
37+
AudioRecordSource() {
3438
@RequiresPermission(Manifest.permission.RECORD_AUDIO)
3539
override fun buildAudioRecord(config: AudioSourceConfig, bufferSize: Int): AudioRecord {
3640
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
@@ -43,11 +47,11 @@ internal class MicrophoneSource : AudioRecordSource() {
4347
AudioRecord.Builder()
4448
.setAudioFormat(audioFormat)
4549
.setBufferSizeInBytes(bufferSize)
46-
.setAudioSource(MediaRecorder.AudioSource.DEFAULT)
50+
.setAudioSource(audioSource)
4751
.build()
4852
} else {
4953
AudioRecord(
50-
MediaRecorder.AudioSource.DEFAULT,
54+
audioSource,
5155
config.sampleRate,
5256
config.channelConfig,
5357
config.byteFormat,
@@ -60,16 +64,18 @@ internal class MicrophoneSource : AudioRecordSource() {
6064
/**
6165
* A factory to create a [MicrophoneSource].
6266
*
67+
* @param audioSource the audio source to use (e.g., MediaRecorder.AudioSource.MIC)
6368
* @param effects a set of audio effects to apply to the audio source
6469
*/
6570
class MicrophoneSourceFactory(
71+
@AudioSourceValue val audioSource: Int = MediaRecorder.AudioSource.CAMCORDER,
6672
effects: Set<UUID> = defaultAudioEffects
6773
) :
6874
AudioRecordSourceFactory(effects) {
69-
override suspend fun createImpl(context: Context) = MicrophoneSource()
75+
override suspend fun createImpl(context: Context) = MicrophoneSource(audioSource)
7076

7177
override fun isSourceEquals(source: IAudioSourceInternal?): Boolean {
72-
return source is MicrophoneSource
78+
return source is MicrophoneSource && this.audioSource == source.audioSource
7379
}
7480

7581
override fun toString(): String {

core/src/main/java/io/github/thibaultbee/streampack/core/elements/utils/Annotations.kt

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package io.github.thibaultbee.streampack.core.elements.utils
33
import android.hardware.camera2.CameraCharacteristics
44
import android.media.AudioFormat
55
import android.media.MediaFormat
6+
import android.media.MediaRecorder
67
import android.os.Process
78
import android.view.Surface
89
import androidx.annotation.IntDef
@@ -85,7 +86,7 @@ annotation class ThreadPriorityValue
8586

8687

8788
/**
88-
* Valid thread priority values
89+
* Valid lens facing direction values
8990
*/
9091
@IntDef(
9192
CameraCharacteristics.LENS_FACING_BACK,
@@ -97,3 +98,22 @@ annotation class ThreadPriorityValue
9798
)
9899
annotation class Camera2FacingDirectionValue
99100

101+
/**
102+
* Valid audio source values
103+
*/
104+
@IntDef(
105+
MediaRecorder.AudioSource.CAMCORDER,
106+
MediaRecorder.AudioSource.DEFAULT,
107+
MediaRecorder.AudioSource.MIC,
108+
MediaRecorder.AudioSource.UNPROCESSED,
109+
MediaRecorder.AudioSource.VOICE_CALL,
110+
MediaRecorder.AudioSource.VOICE_COMMUNICATION,
111+
MediaRecorder.AudioSource.VOICE_DOWNLINK,
112+
MediaRecorder.AudioSource.VOICE_PERFORMANCE,
113+
MediaRecorder.AudioSource.VOICE_RECOGNITION,
114+
MediaRecorder.AudioSource.VOICE_UPLINK
115+
)
116+
@Retention(
117+
AnnotationRetention.SOURCE
118+
)
119+
annotation class AudioSourceValue

core/src/test/java/io/github/thibaultbee/streampack/core/elements/sources/AudioCaptureUnitTest.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package io.github.thibaultbee.streampack.core.elements.sources
1717

18+
import android.media.MediaRecorder
1819
import io.github.thibaultbee.streampack.core.elements.sources.audio.audiorecord.MicrophoneSource
1920
import io.github.thibaultbee.streampack.core.elements.utils.StubLogger
2021
import io.github.thibaultbee.streampack.core.elements.utils.StubRawFrameFactory
@@ -30,7 +31,7 @@ class MicrophoneSourceUnitTest {
3031

3132
@Test
3233
fun `assert exception on bad state`() = runTest {
33-
val microphoneSource = MicrophoneSource()
34+
val microphoneSource = MicrophoneSource(MediaRecorder.AudioSource.CAMCORDER)
3435
try {
3536
microphoneSource.startStream()
3637
Assert.fail()
@@ -45,15 +46,15 @@ class MicrophoneSourceUnitTest {
4546

4647
@Test
4748
fun `assert no exception on bad state`() = runTest {
48-
val microphoneSource = MicrophoneSource()
49+
val microphoneSource = MicrophoneSource(MediaRecorder.AudioSource.CAMCORDER)
4950
try {
5051
microphoneSource.stopStream()
51-
} catch (t: Throwable) {
52+
} catch (_: Throwable) {
5253
Assert.fail()
5354
}
5455
try {
5556
microphoneSource.release()
56-
} catch (t: Throwable) {
57+
} catch (_: Throwable) {
5758
Assert.fail()
5859
}
5960
}

0 commit comments

Comments
 (0)