アプリ版:「スタンプのみでお礼する」機能のリリースについて

200ミリ秒分の音声データとそれに対応した数値データのセットが1時間分あり、
音声を再生しつつ、それにあわせてグラフの更新(200ミリ秒ごとの更新となる)を行うことを考えています。

音声データを再生しつつ、タイマーを使って200ミリ秒周期でイベントを発生させ、
該当時間に対応した数値データをグラフ表示させるのもひとつの方法だと思うのですが、
タイマーの精度の問題か徐々に音声の再生と数値データの更新がずれてしまいます。

タイマーの精度を上げる工夫をするのもひとつの方向性だと思いますが、
音声データの再生において、200ミリ秒分再生したらイベントが発生するような仕組みがあれば
常に音声再生と該当の数値データのグラフ表示との同期がとれるのではと考えています。

音声再生において、ある一定時間再生するごとにイベントを発生させるにはどのような方法がありますでしょうか。

開発言語はC#(もしくはC++)を考えています。

A 回答 (2件)

#1 と同じことですが.



システムは書かれてないけど Windows 以外で C# を使うというのはよくわからんので Windows だと仮定する.

DirectSound を使えば「一定量の再生を行ったらプログラムに通知させる」ことができます. もちろん厳密には「一定量以上の再生を行った」ですが, 「特定の位置にあるデータを再生した」ことでトリガーされるので誤差がつもることはないはずです.

https://msdn.microsoft.com/ja-jp/library/ee41874 …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

まさにこういった仕組みがないかなと探していたところです。DirectSoundを試してみます。
またわからないところがあったら質問させて頂きたいと思います。

※開発環境はwindowsです。

お礼日時:2015/10/20 23:28

>タイマーの精度の問題か徐々に音声の再生と数値データの更新がずれて


なんとなくタイマーの精度とは違う原因のような気がしますが、それはさておき、通常このようなデータを扱う場合は、バッファを使います。
表示用にデータをバッファリングしておき、更新できるタイミングで最新からNサンプル(例えば200サンプル)分描画する、というような処理を行います。
タイマーイベントが期待したタイミングで受け取れないのと同様に、自前で発生させたイベントも受け取れない可能性があります。インターネット通信でも、エラーにより情報伝達が遅れるように、Windows等のマルチタスクOSではイベントの到着遅延が発生することは不可避で、時間的に余裕をもたせた開発する必要があるのです。その緩衝にバッファを使います。検討してみて下さい。
蛇足ですが、Windowsでも、100ミリ秒もズレてしまうということは少ないのではないかと思います。再生開始・タイマー受信のタイミングで時刻の表示を行って確認してみると良いと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>自前で発生させたイベントも受け取れない可能性があります。

タイマーと同様に受け取れない件、納得しました。

>再生開始・タイマー受信のタイミングで時刻の表示を行って確認してみると良いと思います。

まずは上記の確認してみたいと思います。

お礼日時:2015/10/20 23:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!