Web アプリケーション用の次のコードがあり、改善が必要です。何とか機能しますが、結果は非常に遅いです。
このコードの背後にある考え方は次のとおりです。
- この関数は現在のバッファを取得し、それを配列に転置します (50ms のサンプリング レートで)
- サンプリングごとに、updateWave 関数で各要素を渡すことにより、配列の要素をレンダリングする必要があります。
- 次の反復では、現在のバッファーが再度フェッチされますが、以前のデータが含まれているため (以前のデータ/要素はレンダリングされません)、新しい要素を再度レンダリングする必要があります。
更新(簡略化されたコード):
private String data = "";
// This function renders the waveform in the page, has been tested to
// render properly and smoothly by passing random double value at 50ms interval
public void updateWave(String waveValue){
wave.renderWaveOnFly(Double.parseDouble(waveValue));
}
public final native void waveIt()/*-{
var instance = this;
$wnd._waver = setInterval(function(){
// Get the current buffer from the flash interface
// Note it fetches everything in the buffer
var newData = $wnd.Recorder.audioData().toString();
var strData = newData.toString();
var arr = strData.split(',');
var arrEl = arr.pop();
instance.@com.mycode.wavegwt.showcase.client.Showcase::updateWave(Ljava/lang/String;)(arrEl.toString());
//console.log(arrEl);
}
,50);
}-*/;
// This function renders the waveform from math function
// and the waveform is smooth and the UI is still responsive
public final native void waveItByRandomValue()/*-{
var instance = this;
$wnd._waver = setInterval(function(){
var arrEl = Math.cos(i++/25) - 0.2 + Math.random() * 0.3;
instance.@com.mycode.wavegwt.showcase.client.Showcase::updateWave(Ljava/lang/String;)(arrEl.toString());
}
,50);
}-*/;
public native void renderWaveOnFly(Double _data)/*-{
var data = $wnd.data;
data.push(_data);
$wnd._waveform.update({
data: data
});
}-*/;
waveIt()
フラッシュ インターフェイス (マイクからデータを取得する) からバッファを読み取る関数です。デモでは、トリガーされたときに 10 秒間録音するようにマイク レコーダーを設定し、録音が開始されるwaveIt()
と、10 秒の通話後にclearInterval($wnd._waver)
これに関する問題:
waveIt()
つまり、これを実行すると UI が応答せず、レンダリングが非常に遅くなります。waveItByRandomValue()
この関数を実行すると、レンダリングが速く、UI の応答性が高いものと比較して
これを正しく機能させる方法についての戦略が不足しています。
私のプロジェクトをライブで見るには、これを参照してください: http://bitly.com/XGboA1
また、Google グループでこの問題についてもう少し説明しました: http://bitly.com/SqSZVl