AudiotRack инициализируется только при созданииAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 AudiotRack инициализируется только при создании

Сообщение Anonymous »

Я пытаюсь внедрить аудиоплеер, который играет, в то время как данные вводят в него. Класс выглядит так: < /p>

Код: Выделить всё

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 , поэтому ничто не имеет к нему доступ за пределами класса. Любая другая точка и состояние ненициализировано.
Почему это?

Подробнее здесь: https://stackoverflow.com/questions/796 ... t-creation
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»