技術ノート:DirectMusicで一時停止を作る
ネットで探してみると、意外とみんな苦労しているので 記録用に書き残しておく。
--
以下の変数が宣言され、 うち上2つは正しく初期化されているものとする。
IDirectMusicPerformance* DMPerf; IDirectMusicSegment* DMSegment1; IDirectMusicSegmentState* SegmentState;
--
セグメントを再生する際に第4引数に IDirectMusicSegmentStateを渡しておく。
DMPerf->PlaySegment(DMSegment1,DMUS_SEGF_BEAT,0,&SegmentState);
これで演奏中のセグメントに対しての IDirectMusicSegmentStateが取得できる。 このIDirectMusicSegmentStateを使えば セグメントの状態を知ることができる。
IDirectMusicSegmentStateはのちに Releaseメソッドで解放してやる必要がある。
--
音楽を一時停止したいときに、Stopを実行する前に IDirectMusicSegmentStateのGetSeekメソッドを使って 今の演奏位置を取得する。
MUSIC_TIME MTime; SegmentState->GetSeek(&MTime); (この直後でIDirectMusicSegmentStateをReleaseしてもよい)
こののち、演奏を停止する。
DMPerf->Stop(NULL,NULL,0,0);
--
演奏を前回の場所から再開したいときは 再生を始める前にセグメントのSetStartPointを使って、 停止時に保存しておいた演奏位置に演奏開始場所を設定。 (最初から演奏したい場合は0に設定する)
DMSegment1->SetStartPoint(MTime);
こののちPlaySegmentメソッドなどで再生すれば 前回の位置で再開される。
DMPerf->PlaySegment(DMSegment1, DMUS_SEGF_BEAT,0,&SegmentState); (ここでは次回の一時停止のために 再度IDirectMusicSegmentStateを取得している)
|