actual class AudioPlayer(private val context: Context) {
private val audioTrack = createAudioTrack()
private val audioChannel = Channel(capacity = Channel.UNLIMITED)
private var streamingJob: Job? = null
@OptIn(DelicateCoroutinesApi::class)
actual fun cache(data: ByteArray) {
Napier.d(tag = TAG) { "caching; audio track state: ${audioTrack.state}" }
if (audioChannel.isClosedForSend.not()) {
audioChannel.trySend(data)
}
}
actual fun play() {
if (audioTrack.state != AudioTrack.STATE_INITIALIZED) {
Napier.d(tag = TAG) { "state at play: ${audioTrack.state}" }
} else {
Napier.d(tag = TAG) { "playing" }
audioTrack.play()
streamingJob = CoroutineScope(Dispatchers.IO).launch {
for (chunk in audioChannel) {
audioTrack.write(chunk, 0, chunk.size)
}
}
}
}
actual fun stop() {
streamingJob?.cancel()
audioTrack.apply {
stop()
release()
}
audioChannel.close()
}
actual fun retrieveFile(path: String): ByteArray? {
Napier.d(tag = TAG) { "state at retrieval: ${audioTrack.state}" }
try {
return File(context.cacheDir, "snow.wav").readBytes()
// return File(context.cacheDir, path).readBytes()
} catch (e: Exception) {
Napier.e(tag = TAG) { "Error: ${e.message}" }
return null
}
}
private fun createAudioTrack(): AudioTrack {
val channelConfig = AudioFormat.CHANNEL_OUT_MONO
val audioFormat = AudioFormat.ENCODING_PCM_16BIT
val bufferSize = AudioTrack.getMinBufferSize(SAMPLE_RATE, channelConfig, audioFormat)
return AudioTrack(
AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
.setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
.build(),
AudioFormat.Builder()
.setEncoding(audioFormat)
.setSampleRate(SAMPLE_RATE)
.setChannelMask(channelConfig)
.build(),
bufferSize,
AudioTrack.MODE_STREAM,
AudioManager.AUDIO_SESSION_ID_GENERATE
).also { Napier.d(tag = TAG) { "state at creation: ${it.state}" } }
}
}
private const val TAG = "AudioPlayer"
private const val SAMPLE_RATE = 24_000
Свойство AudiotRack - val и private , поэтому ничто не имеет к нему доступ за пределами класса. Любая другая точка и состояние ненициализировано.
Почему это?
Я пытаюсь внедрить аудиоплеер, который играет, в то время как данные вводят в него. Класс выглядит так: < /p> [code]actual class AudioPlayer(private val context: Context) { private val audioTrack = createAudioTrack() private val audioChannel = Channel(capacity = Channel.UNLIMITED) private var streamingJob: Job? = null
@OptIn(DelicateCoroutinesApi::class) actual fun cache(data: ByteArray) { Napier.d(tag = TAG) { "caching; audio track state: ${audioTrack.state}" } if (audioChannel.isClosedForSend.not()) { audioChannel.trySend(data) } }
actual fun play() { if (audioTrack.state != AudioTrack.STATE_INITIALIZED) { Napier.d(tag = TAG) { "state at play: ${audioTrack.state}" } } else { Napier.d(tag = TAG) { "playing" } audioTrack.play()
streamingJob = CoroutineScope(Dispatchers.IO).launch { for (chunk in audioChannel) { audioTrack.write(chunk, 0, chunk.size) } } } }
actual fun stop() { streamingJob?.cancel() audioTrack.apply { stop() release() } audioChannel.close() }
actual fun retrieveFile(path: String): ByteArray? { Napier.d(tag = TAG) { "state at retrieval: ${audioTrack.state}" }
private fun createAudioTrack(): AudioTrack { val channelConfig = AudioFormat.CHANNEL_OUT_MONO val audioFormat = AudioFormat.ENCODING_PCM_16BIT val bufferSize = AudioTrack.getMinBufferSize(SAMPLE_RATE, channelConfig, audioFormat)
private const val TAG = "AudioPlayer" private const val SAMPLE_RATE = 24_000 [/code] Свойство AudiotRack - val и private , поэтому ничто не имеет к нему доступ за пределами класса. Любая другая точка и состояние ненициализировано. Почему это?