質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

316閲覧

AUHostMusicalContextBlockの使い方

ykokubo

総合スコア15

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/11/27 12:46

前提・実現したいこと

SwiftでiOS用のAudioUnitV3を利用可能なシーケンサーソフトを作っています。

AudioUnitV3でテンポ情報を共有するために、AUHostMusicalContextBlockを利用したいと思うのですが、うまくいきません。以下のようなコードを書きましたが、エラーが発生します。

アドバイス頂けますと幸いです。

発生している問題・エラーメッセージ

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

該当のソースコード

var n:Double = 200.0 let bpm = UnsafeMutablePointer<Double>(&n) let num : Optional<UnsafeMutablePointer<Double>> = nil let den : Optional<UnsafeMutablePointer<Int>> = nil let pos : Optional<UnsafeMutablePointer<Double>> = nil let nxt : Optional<UnsafeMutablePointer<Int>> = nil let dwn : Optional<UnsafeMutablePointer<Double>> = nil var aublock:AUHostMusicalContextBlock! let auhb = aublock!(bpm,num,den,pos,nxt,dwn)

試したこと

AUHostMusicalContextBlock の書き方自体が間違っているのかもしれません。Appleの以下のドキュメントを参照していろいろ試していますが、うまくいきません。

https://developer.apple.com/documentation/audiotoolbox/auhostmusicalcontextblock

Type Alias   AUHostMusicalContextBlock

A block through which hosts provide musical tempo, time signature, and beat position.

typealias AUHostMusicalContextBlock = (UnsafeMutablePointer<Double>?, UnsafeMutablePointer<Double>?, UnsafeMutablePointer<Int>?, UnsafeMutablePointer<Double>?, UnsafeMutablePointer<Int>?, UnsafeMutablePointer<Double>?) -> Bool

補足情報(FW/ツールのバージョンなど)

Xcode9.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

AudioUnitV3が判らないのでSwiftの文法的な解釈からの指摘しかできませんが、
AUHostMusicalContextBlockはただの型(ブロック型)です。

var aublock:AUHostMusicalContextBlock!

↑これはブロック型の変数を宣言しただけで、中身はnilです。

let auhb = aublock!(bpm,num,den,pos,nxt,dwn)

↑ nilのブロックを強制アンラップで呼び出そうとしたので、当然「Unexpectedly found nil while unwrapping an Optional value 」が出ます。

以下完全に予測ですが、テンポなどを共有する仕組みはすでにあって、その通知の際にAUHostMusicalContextBlock型を使っているだけだと思います。
(ホストに対して(?)自分のブロックを登録しておくと、そこに通知されるんだろうなと思います。)

投稿2018/12/11 00:32

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ykokubo

2018/12/14 04:25

アドバイス、ありがとうございます。AUHostMusicalContextBlockが型であるとのこと、そちらが分かっただけでも助かります。 文法も含め、新たに調べてみます。
guest

0

解決しました。AVAudioUnit.instantiate内で、musicalContextBlockにブロックを指定することで、テンポをAudioUnitV3と共有できました。

AVAudioUnit.instantiate(with: availableEffects[ind!].audioComponentDescription, options: []) { avAudioUnit, error in guard let avAudioUnit = avAudioUnit else { return } var contextblock:AUHostMusicalContextBlock = { opBPM, opNUM, opDEN, opPOS, opNXT, opDWN in if let bpm = opBPM {bpm.pointee = 200} if let num = opNUM {num.pointee = 4} if let den = opDEN {den.pointee = 4} if let pos = opPOS {pos.pointee = 0} if let nxt = opNXT {nxt.pointee = 100} if let dwn = opDWN {dwn.pointee = 0} return true } avAudioUnit.auAudioUnit.musicalContextBlock = contextblock self.engine.attach(avAudioUnit) }

投稿2018/12/20 15:31

ykokubo

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問