トップページ > 記事閲覧
サウンドハンドルの再生時間を秒単位で得る方法について
名前:was-blue.0793 日時: 2022/06/15 18:15

いつもお世話になっております。 表題の件について、音楽ゲームで現在再生されているサウンドハンドルの再生位置を秒単位で取得することが必要ですが、 再生時間を秒単位で取得するためには以下の2つの方法が考えられます: @「GetSoundCurrentTime」で得られる値を1000.0で割る A「GetCurrentPositionSoundMem」で得られる値を「GetFrequencySoundMem」で得られる値で割る 2つの方法を試していますが、いずれも10ms単位での時間しか取得できないような挙動がみられます。 特にAの方法では、サンプリングレート44100Hzの音源であれば理論上約0.022msの精度を得られるはずですが、計算結果が@と同様に10ms単位の値となります。 (44100Hzの場合、441単位でしか値が取れない?) これでは100FPS以上でゲームを動作させる際に不都合が生じるので、Aの方法を使う場合に更に細かい値を取得できるような方法があればご教示いただけると幸いです。 それでは、よろしくお願いします。
メンテ

Page: 1 |

Re: サウンドハンドルの再生時間を秒単位で得る方法について ( No.1 )
名前:was-blue.0793 日時:2022/06/15 23:00

追記になります。 「44100Hzの場合、441単位でしか値が取れない?」と記述していましたが、検証したところ実際に「441」単位でしか値が取れないような挙動になっていました。 また、再生速度を変更するとそれに応じて取れる値の単位も変化します。(0.5倍速にすると約220単位の値が取得できる)
メンテ
Re: サウンドハンドルの再生時間を秒単位で得る方法について ( No.2 )
名前:管理人 日時:2022/06/16 02:08

> これでは100FPS以上でゲームを動作させる際に不都合が生じるので、Aの方法を使う場合に更に細かい値を取得できるような方法があればご教示いただけると幸いです。 環境は Windows でしょうか? 現状では仰られている通り 441単位( 10ms単位 )となるのは仕様となります こちらは Windows の APIレベルの仕様なので、これ以上精度を上げることはできません ( サウンドAPIの要求に応じて逐一波形データをサウンドAPIに渡す方式なのですが、1回辺りの要求サンプル数が10ms分となっていて、 『要求されたサンプルを API に渡す』=『API に渡したサンプルは再生された扱いにして再生時間を進める』 という方式になっているので、『要求される1回辺りのサンプル数が 10ms分』=『再生時間の粒度は10ms』となっています ) PlaySoundMem の直後に GetNowHiPerformanceCount でタイムカウントを取得して、 再生時間を取得したいタイミングで再度 GetNowHiPerformanceCount を実行して、 差分から現在の再生時間を算出する等の方法では 10ms 以上の精度で再生時間を取得できますので、 お手数で申し訳ありませんが GetCurrentPositionSoundMem 以外の方法による再生時間の取得をしてみてください m(_ _;m
メンテ
Re: サウンドハンドルの再生時間を秒単位で得る方法について ( No.3 )
名前:was-blue.0793 日時:2022/06/16 12:12

>>管理人さん ご返答ありがとうございます。 環境はWindows版であり、原則10ms単位でしか時間が取れないことはDxLibの仕様であることを了解しました。 ご教示いただいた「別のタイマーを並走させて時間を得る」方法では、処理落ちなどでタイマーの時間と実際の再生時間がズレてしまう懸念があります。 この場合「別に用意したタイマーの示す時間が実際の再生位置であることを保証する」処理が必要になるのですが、現行の仕様で可能でしょうか?
メンテ
Re: サウンドハンドルの再生時間を秒単位で得る方法について ( No.4 )
名前:管理人 日時:2022/06/18 02:48

> ご教示いただいた「別のタイマーを並走させて時間を得る」方法では、処理落ちなどでタイマーの時間と実際の再生時間がズレてしまう懸念があります。 タイマーはソフトの処理落ちに関係なく時を刻みますので、処理落ちによる再生時間とのずれの心配はありません > この場合「別に用意したタイマーの示す時間が実際の再生位置であることを保証する」処理が必要になるのですが、現行の仕様で可能でしょうか? 前述の通りタイマーはソフトの処理落ちに関係なく時を刻みますので、基本的にはタイマーの示す時間が実際の再生位置であると考えて問題ないと思います
メンテ

Page: 1 |

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

   クッキー保存