diff --git a/audio/internal/readerdriver/driver_darwin.go b/audio/internal/readerdriver/driver_darwin.go index 0df88db0d..eac42840b 100644 --- a/audio/internal/readerdriver/driver_darwin.go +++ b/audio/internal/readerdriver/driver_darwin.go @@ -12,8 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -// +build !ios - package readerdriver // #cgo LDFLAGS: -framework AudioToolbox @@ -30,6 +28,7 @@ import ( "io" "runtime" "sync" + "time" "unsafe" ) @@ -366,10 +365,19 @@ func (p *playerImpl) Play() { return } - if osstatus := C.AudioQueueStart(p.audioQueue, nil); osstatus != C.noErr { - p.setErrorImpl(fmt.Errorf("readerdriver: AudioQueueStart failed: %d", osstatus)) - return + for { + if osstatus := C.AudioQueueStart(p.audioQueue, nil); osstatus != C.noErr { + // AudioQueueStart might fail just after recovering from Siri. + if osstatus == C.AVAudioSessionErrorCodeSiriIsRecording { + time.Sleep(10 * time.Millisecond) + continue + } + p.setErrorImpl(fmt.Errorf("readerdriver: AudioQueueStart failed: %d", osstatus)) + return + } + break } + p.state = playerPlay p.cond.Signal() diff --git a/audio/internal/readerdriver/driver_default.go b/audio/internal/readerdriver/driver_default.go index b54bd7fed..bef991a17 100644 --- a/audio/internal/readerdriver/driver_default.go +++ b/audio/internal/readerdriver/driver_default.go @@ -13,8 +13,8 @@ // limitations under the License. // +build !android +// +build !darwin // +build !js -// +build darwin,ios !darwin package readerdriver diff --git a/audio/internal/readerdriver/driver_ios.m b/audio/internal/readerdriver/driver_ios.m new file mode 100644 index 000000000..05daad7bc --- /dev/null +++ b/audio/internal/readerdriver/driver_ios.m @@ -0,0 +1,22 @@ +// Copyright 2021 The Ebiten Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build ios + +void ebiten_readerdriver_setNotificationHandler() { + // AVAudioSessionInterruptionNotification is not reliable on iOS. Rely on + // applicationWillResignActive and applicationDidBecomeActive instead. See + // https://stackoverflow.com/questions/24404463/ios-siri-not-available-does-not-return-avaudiosessioninterruptionoptionshouldre + return; +}