ARKit SceneKit ARSCNView с позиционным аудио SCNAudioPlayer НЕ ОСТАНАВЛИВАЕТ воспроизведение - PullRequest
0 голосов
/ 06 января 2019

Запуск ARKit 2.0 с ARSCNView. iOS12 Приложение использует многопоточность, поэтому эти функции выполняются в основном потоке (просто чтобы быть уверенным). Я также пытался без явного выполнения функций в основном потоке, но безрезультатно.

Я использую звуковой файл .aiff, но также пробовал .wav. Нет радости.

Я даже попытался удалить audioNode_alarm из иерархии узлов, и звук все еще играет. Я даже удаляю ARSCNView из иерархии представлений, и звук все равно воспроизводится. FFS

Из того, что я вижу, я делаю ТОЧНО, как и положено, чтобы остановить воспроизведение звука. Звук просто не остановится, что бы я ни пытался. Кто-нибудь может подумать почему?!

weak var audioNode_alarm: SCNNode!
weak var audioPlayer_alarm: SCNAudioPlayer?

func setupAudioNode() {

    let audioNode_alarm = SCNNode()
    addChildNode(audioNode_alarm)
    self.audioNode_alarm = audioNode_alarm

}

func playAlarm() {

    DispatchQueue.main.async { [unowned self] in

        self.audioNode_alarm.removeAllAudioPlayers()

        if let audioSource_alarm = SCNAudioSource(fileNamed: "PATH_TO_MY_ALARM_SOUND.aiff") {

            audioSource_alarm.loops = true
            audioSource_alarm.load()
            audioSource_alarm.isPositional = true
            let audioPlayer_alarm = SCNAudioPlayer(source: audioSource_alarm)
            self.audioNode_alarm.addAudioPlayer(audioPlayer_alarm)
            self.audioPlayer_alarm = audioPlayer_alarm

        }

    }

}

func stopAlarm() {

    DispatchQueue.main.async { [unowned self] in

        self.audioNode_alarm?.removeAudioPlayer(self.audioPlayer_alarm!)
        self.audioNode_alarm?.removeAllAudioPlayers()

    }

}

1 Ответ

0 голосов
/ 09 июля 2019

В итоге я остановил звук и удалил плеер с помощью

yourNode.audioPlayers.forEach { audioLocalPlayer in
  audioLocalPlayer.audioNode?.engine?.stop()
  yourNode.removeAudioPlayer(audioLocalPlayer)
}

Согласно документации SCNAudioPlayer имеет audioNode , который должен использоваться "для изменения таких параметров, как громкость и реверберация в режиме реального времени во время воспроизведения ".

audioNode имеет тип AVAudioNode , поэтому, если мы перейдем к engine prop и его type определение, мы найдем все необходимые элементы управления.

...