トップページ > 過去ログ > 記事閲覧
SetSoundCurrentTimeの使い方について
名前:Dixq 日時: 2008/09/20 05:24

いつもお世話になっています。今回もよろしくお願いします。 今音楽と弾幕を同期を取ってゲームを進めようとしているのですが、 どうもSetSoundCurrentTimeかGetSoundCurrentTimeがうまく働いていないみたいです。(最新版v2.24cを使用しています) 再生ファイルはwavファイル、ogg共にやってみましたが同じ結果です。 (一応似たような過去ログは読みました) 今、tがフレームカウンタだとして60FPSで動作しているとします。 tが0の時、 PlaySoundMem(sound_handle,DX_PLAYTYPE_BACK); を行ったとします。 すると同期が取れているかどうかは if( abs ( (int)(t*16.666) - GetSoundCurrentTime(sound_handle) ) > 100 ) この時、0.1秒以上ずれている事がわかりますよね? このように、ずれが起きた時には再生を止めて、 再生ポイントをセットし、再度再生するというプログラムをかきました。 こちらがその一部です。 60フレームごとにチェックしています。 if(t%60==59){ int gettm=GetSoundCurrentTime(sound_handle);//再生して何ミリ秒か int nowflame=(int)(t*16.6666);//始まって何ミリ秒か printfDx("%d\n",gettm-nowflame);//ズレを表示 if(abs(gettm-nowflame)>50){//差が0.05秒以上なら StopSoundMem(sound_handle);//止める SetSoundCurrentTime( (int)(t*16.666666) , sound_handle);//フレームを基準に再生位置をセット PlaySoundMem(sound_handle, DX_PLAYTYPE_BACK,FALSE);//再生する printfDx("調整後%d\n",GetSoundCurrentTime(sound_handle)-(int)(t*16.6666));//改めてズレがいくらか表示 } } すると、最初はいいのですが、一度でも調整がはいると、 その後、常に狂っている表示になるんです。 しかし音楽は特にずれていません。 ・・ということは取得しているミリ秒の数がおかしいのでしょうか? h ttp://l.huu.cc/img/douki.png こんな感じで、ずっとズレは0〜3位で正常範囲内なんですが、 わざと待機させると(画像で言うと698となっている部分はわざと止めました) それ以降ずっとずれている表示になります。 これは何がいけないのでしょうか? どうも、音楽はきちんと同期がとれているので、 GetSoundCurrentTimeの返って来る値がおかしいんじゃないかと思います。

Page: 1 |

Re: SetSoundCurrentTimeの使い方について ( No.1 )
名前:管理人 日時:2008/09/22 06:57

私の手元でも簡単なテストプログラムを組んでみましたが とりあえず補正後のズレが30以上になることはありませんでした ソースと実行ファイルをアップしてみましたので宜しければ Dixqさんの環境でも正常に動作するかお試しになってみてください (テストプログラムを実行するには test.wav というファイル名の wavファイルをご用意ください) http://homepage2.nifty.com/natupaji/temp/SetSoundCurrentTimeTest.zip
Re: SetSoundCurrentTimeの使い方について ( No.2 )
名前:ディッション 日時:2008/09/23 16:54

サウンド関係でちょっと興味を持ったので、 試しにやってみたところ自分も補正後は10前後に収まりました。 しかし、管理人さんのプログラムにSetLoopPosSoundMemを追加したところ、 -5000前後に変化しました。(ちなみにこれは無圧縮PCM、MP3ともに) どうやら、GetStreamSoundCurrentTimeを呼び出すまでに内部の変数が書き換えられてしまうようです。
Re: SetSoundCurrentTimeの使い方について ( No.3 )
名前:ディッション 日時:2008/09/23 17:34

追記というか原因(おそらく)突き止めました。 dxsound.cpp(1764行前後)の if( UpdateFlag == 0 ) { if( sd->Stream.PrevCheckPlayPosition < CurPosition ) { sd->Stream.CompPlayWaveLength += CurPosition - sd->Stream.PrevCheckPlayPosition ; } else { //ここ sd->Stream.CompPlayWaveLength += ( sd->Stream.SoundBufferSize - sd->Stream.PrevCheckPlayPosition ) + CurPosition ; } } の部分でStream.CompPlayWaveLengthに対して+5000ずらしを行っていました。 この行をコメントアウトしてライブラリをリビルドしたところ、ずれはなくなりました。 しかし、ほんとうに必要になるタイミングがあるかもしれないので正直危険です。 あと、最後まで読み込んだ後、ループで戻るとズレが愉快なことになります。
Re: SetSoundCurrentTimeの使い方について ( No.4 )
名前:管理人 日時:2008/09/23 22:26

ご報告ありがとうございます ただ、私の手元で試した限りでは SetLoopPosSoundMem を使用しても 特にライブラリのソースを変更しなくても問題は発生しませんでしたので、 やはりここ最近の機能追加の際にサウンド関連のバグも修正していたようです こちらが最新バージョンのソースですので、もし宜しければお試しに なってみて下さい m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe あと、サンプルプログラムではループ以降は考慮していませんので、 表示される数値は正常ではなくなると思います ( SetSoundCurrentTime で指定する値がサウンドファイルの長さ 以上になってしまうので )
Re: SetSoundCurrentTimeの使い方について ( No.5 )
名前:Dixq 日時:2008/09/25 03:42

ありがとうございます。 確かに私の実行結果も5000msほどずれていますね。 頂いたソースコードは DXライブラリダウンロードの改造用をダウンロードして ファイルを置き換えてコンパイルすればいいのでしょうか? コンパイルしてみたところ >cl : コマンド ライン error D8016 : コマンド ライン オプション '/O2' と '/RTC1' は同時に指定できません と表示されてしまうのですが、何を直せばいいでしょうか;
Re: SetSoundCurrentTimeの使い方について ( No.6 )
名前:管理人 日時:2008/09/27 03:50

あ、DxLibMakeTest.exe はディッションさんに向けたものですので、 もしお確かめ頂けるのでしたらこちらのライブラリファイルを お使いください http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe //VC用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe //BCC用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい) こちらのバージョンでしたら不具合は解消されていると思います
Re: SetSoundCurrentTimeの使い方について ( No.7 )
名前:Dixq 日時:2008/09/30 08:29

ご用意くださりありがとうございました。 ダウンロードさせていただきました。

Page: 1 |