トップページ > 記事閲覧
GetCurrentPositionSoundMemについて
名前:柳翠 日時: 2015/11/22 22:01

GetCurrentPositionSoundMemで取得した数値を マイクロ秒単位に変換することは可能でしょうか? GetCurrentPositionSoundMem/GetFrequencySoundMem では誤差が発生してミリ秒単位でしか取得できないです
メンテ

Page: 1 |

Re: GetCurrentPositionSoundMemについて ( No.1 )
名前:管理人 日時:2015/11/22 23:00

GetCurrentPositionSoundMem の戻り値は 44100Hz のサウンドの場合 戻り値の 1 辺り 22.67マイクロ秒( 0.02267ミリ秒 ) の精度がありますが、それでは駄目でしょうか? とはいえ、それは数値だけの話で、実際にスピーカーから鳴っている音の再生時間位置と GetCurrentPositionSoundMem の戻り値が伝える再生時間位置の誤差は 22.67マイクロ秒以上の 誤差があります( 数ミリ〜数十ミリ秒の誤差 ) DXライブラリはサウンドの再生に XAudio2 又は DirectSound を使用しているのですが、 どちらを使用した場合も「音を再生するAPI」を呼び出してから実際にスピーカーから音が 鳴るまでに何ミリ秒掛かっているか分かりませんし、XAudio2 を使用した場合と DirectSound を 使用した場合とでは GetCurrentPositionSoundMem で返す「現在再生している時間位置」の 処理方法が異なるため、ここでも数ミリ秒の誤差が発生しますので、仮にマイクロ秒で戻り値を 返す関数を作成したとしても精度的には十数ミリ〜数十ミリ秒が限界となります ( 60fps の画面のフレーム数で例えれば1〜2フレームくらいの誤差 ) また、画面表示も合わせて言えば画面の表示は 60fps の場合1フレーム辺り 16.666ミリ秒 掛かる上に、プログラムで「画面の表示内容を更新するAPI」を呼んでから実際にモニターの 表示内容が更新されるまで何ミリ秒( 十ミリ秒以上? )掛かるか分かりませんので、 総合的に考えるとサウンドと描画内容の同期などでマイクロ秒単位の精度を得ることは現在の WindowsPCの環境では難しいと思います ( そういう意味ではアーケードの音ゲーの筐体などはハードウエア設計の段階でレイテンシを 最小にしたり音と映像の同期をとるための仕組みを組み込んだりできるので羨ましい限りです・・・ ) なので、「補正値」を使って誤魔化すしかありません 例えば再生時間10秒ピッタリのタイミングで何かの音が鳴るとして、画面にもそのタイミングに 合わせて何か表示しようとしたとき GetCurrentPositionSoundMem の戻り値で10秒ピッタリに なったのを確認して画面に表示をしたら、どうも「画面の表示」の方がワンテンポ遅れてしまう ( もしくはワンテンポ早く表示されてしまう )、ということがあるとしましたら、遅れている ( 若しくは早い )分だけ GetCurrentPositionSoundMem の戻り値に値を足して( 若しくは引いて ) GetCurrentPositionSoundMem の戻り値はまだ再生時間が10秒に達していない( 若しくは既に経過している ) というタイミングで「画面の表示」を行い、無理やり音と映像のタイミングを合わせる、といった方法です 因みに環境によってどの程度誤差があるのか分かりませんので、仮にこの方法でタイミングを 合わせる場合は「補正値」をオプション画面などで変更できるようにしておく必要があります
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存