Как возобновить CHHapticAdvancedPatternPlayer с AHAP со звуком?IOS

Программируем под IOS
Ответить
Anonymous
 Как возобновить CHHapticAdvancedPatternPlayer с AHAP со звуком?

Сообщение Anonymous »

У меня есть AHAP, который воспроизводит внутри себя звук.

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

let patternPlayer = try hapticEngine.makeAdvancedPlayer(with: patternFile)
patternPlayer.loopEnabled = false
try patternPlayer.start(atTime: CHHapticTimeImmediate)
Когда я только использовал этот код, я обнаружил, что если я переведу приложение в фоновый режим во время воспроизведения тактильной последовательности, звук и тактильные ощущения пропадут и больше не появятся.
Я узнал о PatternPlayer.pause и PatternPlayer.resume. Я начал им звонить после получения UIApplication.willResignActiveNotification и UIApplication.didBecomeActiveNotification. Однако по какой-то причине ни звук, ни тактильные ощущения не возвращаются, даже после того, как я перезапустил CHHapticEngine с помощью start. Я еще вызывал AVAudioSession.setActive, но и это не помогло...

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

class ViewController: UIViewController {
var engine: CHHapticEngine!
var player: CHHapticAdvancedPatternPlayer!
var engineStopped: Bool = true

override func viewDidLoad() {
super.viewDidLoad()

let engine = try! CHHapticEngine(audioSession: .sharedInstance())
self.engine = engine

engine.stoppedHandler = { [unowned self] reason in
self.engineStopped = true
print("Engine stopped reason", reason)
}

let player = try! engine.makeAdvancedPlayer(
with: try! CHHapticPattern(
contentsOf: Bundle.main.url(
forResource: "res",
withExtension: "ahap"
)!
)
)

player.loopEnabled = true

player.completionHandler = { err in
print("Audio end", err)
}

try! engine.start()
try! player.start(atTime: CHHapticTimeImmediate)
self.player = player

NotificationCenter.default.addObserver(
self,
selector: #selector(appWillResignActive),
name: UIApplication.willResignActiveNotification,
object: nil
)
NotificationCenter.default.addObserver(
self,
selector: #selector(appDidBecomeActive),
name: UIApplication.didBecomeActiveNotification,
object: nil
)
}

@objc
private func appWillResignActive() {
try! player.pause(atTime: CHHapticTimeImmediate)
}

@objc
private func appDidBecomeActive() {
if engineStopped {
try! engine.start()
engineStopped = false
}
try! player.resume(atTime: CHHapticTimeImmediate)
}
}

Тогда я решил сделать следующее:
  • на паузе останавливаю оригинальный тактильный плеер, запоминая, для как долго он воспроизводился
  • при возобновлении я создаю новый тактильный проигрыватель со смещением, используя поиск, чтобы он воспроизводился с того места, где его предшественник был прерван
  • Я запускаю этот плеер
Забавный факт: теперь он работает тактильно, как и ожидалось! Но не звук...
Как перезапустить звук в этом сценарии? Я не вижу никакой прямой ссылки на AVAudioPlayer, AVAudioEngine или что-то в этом роде где-либо в отладчике памяти...

Подробнее здесь: https://stackoverflow.com/questions/787 ... with-audio
Ответить

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

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

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

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

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