iOS版 ロック画面演奏情報表示対応
ロック画面に演奏情報を表示する際、演奏開始と一時停止のトグルボタンも合わせて表示される。 MIDIデータ演奏中なら一時停止ボタン、一時停止中または停止中なら演奏開始ボタンが表示されるべきだが、 表示が切り替わらない事象が発生した。
検証の結果、演奏の一時停止に合わせてオーディオセッションも非アクティブ化しておかないと、 ロック画面のトグルボタンの表示が切り替わらないことがわかった。 Ver.1.3.1においてチケット #39799 でバックグラウンド演奏に対応した時、 オーディオセッションのアクティブ化と非アクティブ化の処理は、アプリケーションクラスMIDITrailAppに実装した。 (メインビュー表示次にアクティブ化、メインビュークローズ時に非アクティブ化)
オーディオセッションのアクティブ化/非アクティブ化の制御は、オーディオユニットの開始/停止と連動している必要がある。 しかし一時停止や演奏再開に合わせて、アプリケーションクラスでオーディオセッションを直接制御することは難しいことがわかった。 なぜならオーディオユニットはWavetableシンセサイザクラスで管理しており、 アプリケーションクラスからWavetableシンセサイザクラスに指示を出す経路が、以下のように長いためである。
アプリケーションクラス MIDITrailApp ->シーケンサクラス SMSequencer ->拡張MIDI出力デバイス制御クラス SMOutDevCtrlEx ->Wavetableシンセサイザクラス SMWavetableSynthCtrl ->オーディオユニット以上のことから、アプリケーションクラスでのオーディオセッションの直接制御をあきらめ、 Wavetableシンセサイザクラスでオーディオセッションの制御を行うことにした。
オーディオセッションアクティブ設定メソッドを追加。
オーディオセッションアクティブ化する処理を追加。
演奏終了時にオーディオセッション非アクティブ化する処理を追加。
ユーザ操作による一時停止または停止の際にオーディオセッション非アクティブ化する処理を追加。
メンバにオーディオセッションm_pAudioSessionを追加。
オーディオセッションのメンバ初期化処理を追加。
オーディオセッション初期化処理を追加。
グラフ開始前にオーディオセッションアクティブ化処理を追加。
グラフ停止後にオーディオセッション非アクティブ化処理を追加。
オーディオセッションアクティブ設定メソッドを追加。
メンバm_pAudioSessionを削除。
メンバm_pAudioSessionの初期化処理を削除。
オーディオセッション初期化処理の呼び出しを削除。
メインビューへのリワインド/スキップ設定処理を追加。
ロック画面向け演奏情報設定処理呼び出しを追加。
一時停止の場合に演奏状態を更新する処理を削除。 演奏状態通知が届くまで再生中とみなすため。
ロック画面向け演奏状態設定処理呼び出しを追加。
ロック画面向け演奏情報更新処理呼び出しを追加。
オーディオセッションアクティブ化処理の呼び出しを削除。
オーディオセッション非アクティブ化処理の呼び出しを削除。 ロック画面向け演奏情報クリア処理の呼び出しを追加。
オーディオセッション初期化メソッドを削除。
オーディオセッションアクティブ設定メソッドを削除。
ロック画面向け演奏情報登録メソッドを追加。
ロック画面向け演奏情報クリアメソッドを追加。
ロック画面向け演奏情報更新メソッドを追加。
以下メンバを追加。
メンバm_SkipBackTimeSpanInMsec,m_SkipForwardTimeSpanInMsecの初期化処理を追加。
前回演奏経過時間の初期化処理を追加。
ロック画面向け演奏時間の更新処理呼び出しを追加。 時間の変更が発生したときだけ処理を呼び出すようにする。 すなわち1秒に1回の頻度で呼び出す。
FPSログ出力をコメントアウトする。
リワインド/スキップ設定メソッドを追加。
ロック画面向け演奏情報更新(演奏時間)メソッドを追加。
ロック画面に演奏情報を表示する。 演奏情報の内容は以下の通り。
MIDIデータ演奏中
MIDI INモニタ中