2017-06-26 4 views
0

私がやりたいことは(今のところ)AVAudioEngineAVAudioPlayerNodeを使ってサウンドファイルを再生しています。私のコードは次のとおりです。AVAudioPlayerNodeを出力に接続するときにAVAudioEngineが例外をスローする

//Init engine and player 
let audioEngine = AVAudioEngine() 
let audioPlayerNode = AVAudioPlayerNode() 

//Hook them up 
audioEngine.attach(audioPlayerNode) 
audioEngine.connect(audioPlayerNode, to: audioEngine.outputNode, format: nil) // < error 

最後の行を実行しているときに例外がスローされます。何もコンソールに出力されていないと実行が継続されますが、私はLLDBと、次の取得例外ブレークポイントを設定する場合:ここで何を

(lldb) po [$arg1 reason] 
error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=1, address=0xffffd593). 
The process has been returned to the state before expression evaluation. 

をアクセスすることはできませんか?私はまだファイルをロードしていない...任意のヒントのおかげで。

環境

  • のXcode 8.2.1
  • のiOS 10.3.2上で実行されているiPhone 5(14F89)

編集

ここではいくつかのより多くのコンテキスト情報があります。上記のコードは、SpriteKitGameplayKitで構築されたiOSゲームの一部です。それはplaySoundと呼ばれる方法の中でGKStateMachineのサブクラスにあります。このメソッドは、GameSceneと呼ばれるサブクラスSKSceneから発生したタッチイベントの過程で呼び出されます。 touchesBeganになると、同じシグネチャ(touchesBegan)のメソッドを持つTouchComponentのすべてのエンティティにコールが委任されます。これらのコンポーネントはtouchDownイベントをデリゲートに送信し、そのサブクラスはGKStateMachineのサブクラスで、GameStateMachineとなります。タッチイベントがの場合、正しい w.r.t.ゲームのルール、私のGameStateMachinescoreプロパティが増分されます。 score設定者の中では、スコアが増加すると最終的な方法playSoundが呼び出されます。ここで私は今説明したもののシーケンス図があります:

Sequence Diagram showing how "playSound" is invoked

+0

このコードはどのように実行していますか? iOSアプリの一部であるPlaygroundは、View Controllerのコードですか?あなたはもう少し文脈を与えることができますか?あなたがそれを使用しようとする前に何かが割り当て解除されたように見えるからです。 – marius

答えて

0

明らかに、投げられた例外は普通のです。これは、私がテストしたどんな環境下でも発生しますが、正常な機能を妨げません。

サウンドが再生されなかった理由は、オブジェクトが生き残っている強力なポインタがないため、関数が返されるとすぐにオブジェクトが解放されたということです。私はこれらの2つのオブジェクトをpropertiesのままにして問題を修正しました。

2

ここ遊び場でローカルファイルリソースを再生する作業例です:

import AVFoundation 
import PlaygroundSupport 

// prevent program from exiting immediately 
PlaygroundPage.current.needsIndefiniteExecution = true 

let fileURL = Bundle.main.url(forResource: "song", withExtension: "mp3")! 
let file = try! AVAudioFile(forReading: fileURL) 

let audioEngine = AVAudioEngine() 
let audioPlayerNode = AVAudioPlayerNode() 

audioEngine.attach(audioPlayerNode) 
audioEngine.connect(audioPlayerNode, to: audioEngine.outputNode, format: nil) 

audioPlayerNode.scheduleFile(file, at: nil, completionHandler: nil) 

// need to start the engine before we play 
try! audioEngine.start() 

audioPlayerNode.play() 

これはsong.mp3は遊び場リソースディレクトリに存在することを前提としてい。

+0

あなたのコードをありがとう、私はそれを遊び場で走らせました。その後、私はプロジェクトに正確なコードをコピーし、同じエラーが同じ場所でポップアップします。 iOS Simulatorでも動作しません。詳細については私の編集された答えをご覧ください。 –

関連する問題