Coverage Summary for Class: PrimitiveAudioProvider (com.vsevolodganin.clicktrack.primitiveaudio)
Class |
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
PrimitiveAudioProvider |
0%
(0/6)
|
0%
(0/6)
|
0%
(0/14)
|
0%
(0/137)
|
PrimitiveAudioProvider$Const |
|
Total |
0%
(0/6)
|
0%
(0/6)
|
0%
(0/14)
|
0%
(0/137)
|
package com.vsevolodganin.clicktrack.primitiveaudio
import android.app.Application
import android.content.ContentResolver
import android.content.res.AssetFileDescriptor
import android.net.Uri
import androidx.annotation.RawRes
import com.vsevolodganin.clicktrack.di.component.ApplicationScope
import com.vsevolodganin.clicktrack.model.ClickSoundSource
import com.vsevolodganin.clicktrack.utils.log.Logger
import me.tatarka.inject.annotations.Inject
@ApplicationScope
@Inject
class PrimitiveAudioProvider(
private val application: Application,
private val primitiveAudioExtractor: PrimitiveAudioExtractor,
private val contentResolver: ContentResolver,
private val logger: Logger,
) {
fun get(sound: ClickSoundSource): PrimitiveFloatAudioData? {
return try {
load(sound)?.let(PrimitiveFloatAudioData::from)
} catch (t: Throwable) {
logger.logError(TAG, "Failed to load $sound", t)
null
}
}
private fun load(sound: ClickSoundSource): PrimitiveAudioData? {
return when (sound) {
is ClickSoundSource.Bundled -> load(sound.audioResource.rawResId)
is ClickSoundSource.Uri -> load(sound.value)
}
}
private fun load(@RawRes resId: Int): PrimitiveAudioData? {
return application.resources.openRawResourceFd(resId).use(::load)
}
private fun load(uri: String): PrimitiveAudioData? {
return contentResolver.openAssetFileDescriptor(Uri.parse(uri), "r")?.use(::load)
}
private fun load(afd: AssetFileDescriptor): PrimitiveAudioData? {
return primitiveAudioExtractor.extract(afd, MAX_SECONDS)
}
private companion object Const {
const val TAG = "PrimitiveAudioProvider"
const val MAX_SECONDS = 2
}
}