OSDN Ticket Archive


Ticket #41981

iOS版 ロック画面演奏情報表示対応

登録: 2021-04-11 22:07 最終更新: 2021-04-12 00:14

報告者:
yknk
担当者:
yknk
チケットの種類:
機能リクエスト
状況:
完了
コンポーネント:
MIDITrail Ver.1.3.x for iOS
マイルストーン:
Version 1.3.3 for iOS (完了済み)
優先度:
5 - 中
重要度:
5 - 中
解決法:
修正済み
ファイル:
なし

詳細

ロック画面に演奏情報を表示する。 演奏情報の内容は以下の通り。

MIDIデータ演奏中

  • MIDIデータから取得したタイトル
  • MIDIデータファイル名
  • 演奏時間

MIDI INモニタ中

  • MIDI INデバイス名

チケットの履歴

2021-04-11 22:07 更新者: yknk
  • 新しいチケット "iOS版 ロック画面演奏情報表示対応" が作成されました
2021-04-11 22:08 更新者: yknk
コメント

対策方針メモ

ロック画面に演奏情報を表示する際、演奏開始と一時停止のトグルボタンも合わせて表示される。 MIDIデータ演奏中なら一時停止ボタン、一時停止中または停止中なら演奏開始ボタンが表示されるべきだが、 表示が切り替わらない事象が発生した。

検証の結果、演奏の一時停止に合わせてオーディオセッションも非アクティブ化しておかないと、 ロック画面のトグルボタンの表示が切り替わらないことがわかった。 Ver.1.3.1においてチケット #39799 でバックグラウンド演奏に対応した時、 オーディオセッションのアクティブ化と非アクティブ化の処理は、アプリケーションクラスMIDITrailAppに実装した。 (メインビュー表示次にアクティブ化、メインビュークローズ時に非アクティブ化)

オーディオセッションのアクティブ化/非アクティブ化の制御は、オーディオユニットの開始/停止と連動している必要がある。 しかし一時停止や演奏再開に合わせて、アプリケーションクラスでオーディオセッションを直接制御することは難しいことがわかった。 なぜならオーディオユニットはWavetableシンセサイザクラスで管理しており、 アプリケーションクラスからWavetableシンセサイザクラスに指示を出す経路が、以下のように長いためである。

アプリケーションクラス MIDITrailApp
  ->シーケンサクラス SMSequencer
    ->拡張MIDI出力デバイス制御クラス SMOutDevCtrlEx
      ->Wavetableシンセサイザクラス SMWavetableSynthCtrl
        ->オーディオユニット
以上のことから、アプリケーションクラスでのオーディオセッションの直接制御をあきらめ、 Wavetableシンセサイザクラスでオーディオセッションの制御を行うことにした。

2021-04-11 22:08 更新者: yknk
コメント

対策1:MIDIライブラリ修正

SMOutDevCtrlEx::SetAudioSessionActive

オーディオセッションアクティブ設定メソッドを追加。

SMSequencer::Play

オーディオセッションアクティブ化する処理を追加。

SMSequencer::IntervalProc

演奏終了時にオーディオセッション非アクティブ化する処理を追加。

SMSequencer::ProcUserRequest

ユーザ操作による一時停止または停止の際にオーディオセッション非アクティブ化する処理を追加。

SMWavetableSynthCtrl

メンバにオーディオセッションm_pAudioSessionを追加。

SMWavetableSynthCtrl::SMWavetableSynthCtrl

オーディオセッションのメンバ初期化処理を追加。

SMWavetableSynthCtrl::Initialize

オーディオセッション初期化処理を追加。

SMWavetableSynthCtrl::Open

グラフ開始前にオーディオセッションアクティブ化処理を追加。

SMWavetableSynthCtrl::Close

グラフ停止後にオーディオセッション非アクティブ化処理を追加。

SMWavetableSynthCtrl::SetAudioSessionActive

オーディオセッションアクティブ設定メソッドを追加。

2021-04-11 22:08 更新者: yknk
コメント

対策2:アプリケーションクラス修正

MIDITrailApp

メンバm_pAudioSessionを削除。

MIDITrailApp::init

メンバm_pAudioSessionの初期化処理を削除。

MIDITrailApp::initialize

オーディオセッション初期化処理の呼び出しを削除。

MIDITrailApp::onSelectFile

メインビューへのリワインド/スキップ設定処理を追加。

MIDITrailApp::onFinishCreateScene

ロック画面向け演奏情報設定処理呼び出しを追加。

MIDITrailApp::onPlayButton

一時停止の場合に演奏状態を更新する処理を削除。 演奏状態通知が届くまで再生中とみなすため。

MIDITrailApp::onStartMonitoring

ロック画面向け演奏状態設定処理呼び出しを追加。

MIDITrailApp::changePlayStatus

ロック画面向け演奏情報更新処理呼び出しを追加。

MIDITrailApp::openMainView

オーディオセッションアクティブ化処理の呼び出しを削除。

MIDITrailApp::closeMainView

オーディオセッション非アクティブ化処理の呼び出しを削除。 ロック画面向け演奏情報クリア処理の呼び出しを追加。

MIDITrailApp::initAudioSession

オーディオセッション初期化メソッドを削除。

MIDITrailApp::setAudioSessionActive

オーディオセッションアクティブ設定メソッドを削除。

MIDITrailApp::setNowPlayingInfoWithMonitor

ロック画面向け演奏情報登録メソッドを追加。

MIDITrailApp::clearNowPlayingInfo

ロック画面向け演奏情報クリアメソッドを追加。

MIDITrailApp::setNowPlayingInfoPlaybackStatus

ロック画面向け演奏情報更新メソッドを追加。

2021-04-11 22:08 更新者: yknk
コメント

対策3:メインビュー制御クラス修正

MTMainViewCtrl

以下メンバを追加。

  • リワインド時間間隔 m_SkipBackTimeSpanInMsec
  • スキップ時間間隔 m_SkipForwardTimeSpanInMsec
  • 前回演奏経過時間 m_PrevPlayTimeSec

MTMainViewCtrl::initWithNibName:bundle:rendererParam

メンバm_SkipBackTimeSpanInMsec,m_SkipForwardTimeSpanInMsecの初期化処理を追加。

MTMainViewCtrl::startScene:isMonitor

前回演奏経過時間の初期化処理を追加。

MTMainViewCtrl::sequencerMsgProc

ロック画面向け演奏時間の更新処理呼び出しを追加。 時間の変更が発生したときだけ処理を呼び出すようにする。 すなわち1秒に1回の頻度で呼び出す。

MTMainViewCtrl::updateFPS

FPSログ出力をコメントアウトする。

MTMainViewCtrl::setSkipTimeSpanWithBack:foward

リワインド/スキップ設定メソッドを追加。

MTMainViewCtrl::setNowPlayingInfoPlaybackTime

ロック画面向け演奏情報更新(演奏時間)メソッドを追加。

2021-04-12 00:14 更新者: yknk
  • 状況オープン から 完了 に更新されました
  • 解決法なし から 修正済み に更新されました

添付ファイルリスト

添付ファイルはありません