3

私は、通常、サイズが約 50 MB の大きなオーディオ マルチサンプルを使用する必要があるアプリケーションを作成しています。1 つのファイルには約 80 の個別の短いサウンド レコーディングが含まれており、アプリケーションでいつでも再生できます。このため、すべてのオーディオ データがメモリにロードされ、すばやくアクセスできます。

ただし、これらのファイルのいずれかをロードする場合、メモリに格納するのに数秒かかることがあります。つまり、プログラムが一時的にフリーズした場合です。これを回避する良い方法は何ですか?Windows および OS X と互換性がある必要があります。この時点でフリーズします。myMultiSampleClass->open();多くの動的メモリ割り当てと、ifstream を使用したファイルからの読み取りを行う必要があります。

私は2つの可能なオプションを考えました:

  1. ファイルを開き、別のスレッドでメモリにロードして、アプリケーション プロセスがフリーズしないようにします。これを行うためにBoostライブラリを調べましたが、実装する準備が整う前にかなり多くのことを読む必要があります. 私がする必要があるのは、スレッドで open() 関数を呼び出し、その後スレッドを破棄することだけです。

  2. 一度にファイル全体をメモリにロードしないようにするためのスキームを考え出します。いわば、その場でロードするだけです。問題は、任意のサンプルがいつでもトリガーされる可能性があることです。他のソフトウェアでこの種のシステムが導入されていることは知っていますが、それがどのように機能するかはわかりません。個々のコンピューターの仕様に大きく依存します。私のコンピューターでは問題なく動作する可能性がありますが、遅い HDD/メモリを使用している人は非常に悪い結果になる可能性があります。私が持っていた 1 つのアイデアは、各オーディオ録音の x サンプルをメモリにロードし、再生する必要がある場合は、残りのオーディオをメモリにロードしながら、既存のサンプルの再生を開始することでした。

アイデアや批判はありますか?前もって感謝します :-)

4

4 に答える 4

1

メモリ マップ ファイルを使用します。ロード時間は最初は「瞬時」であり、I/O のオーバーヘッドは時間とともに分散されます。

于 2010-03-03T17:04:32.340 に答える
0

生産者/消費者アプローチを検討することをお勧めします。これには基本的に、1つのスレッドを使用してサウンドデータをバッファに読み込み、別のスレッドを使用してバッファからサウンドカードにデータをストリーミングすることが含まれていました。

データリーダーはプロデューサーであり、サウンドカードへのデータのストリーミングはコンシューマーです。バッファーがいっぱいになるとプロデューサーが読み取りを停止し、バッファーが低くなるとプロデューサーが再び読み取りを開始するように、最高水準点と最低水準点が必要です。

C++プロデューサー-コンシューマー同時実行テンプレートライブラリ
http://www.bayimage.com/code/pcpaper.html

編集:私はこの種のものはトリッキーであることを追加する必要があります。サンプルプレーヤーを作成している場合、システムの負荷は、再生されているキー、一度に再生されているサウンドの数、各サウンドの長さ、サスティンペダルが押されているかどうかに応じて、継続的に変化します。ハードディスクの速度とバッファリング、および使用可能なプロセッサの馬力の量などの他の要因。最終的に採用するプログラミングの最適化の中には、一見しただけでは明らかでないものもあります。

于 2010-03-03T16:43:09.793 に答える
0

最善の解決策は、非同期 I/O (John Dibling が述べたように) を使用して、再生中にウェーブ データの小さなチャンクまたは 1 つのサンプルを一度に固定サイズの再生バッファーにロードすることだと思います。

戦略は、最初に再生バッファを埋めてから再生することです(これにより、わずかな遅延が追加されますが、連続再生が保証されます)、バッファの再生中に、別のスレッド(オーバーラップ)で別の再生バッファを再充填できます。バックグラウンドで再生用と補充用の2つの再生バッファを用意し、リアルタイムで切り替えます

後で、クライアント PC のパフォーマンスに基づいて再生バッファ サイズを設定できます (メモリ サイズと処理能力のトレードオフになります。最速の CPU は必要なバッファが小さいため、遅延が少なくなります)。

于 2010-03-04T08:45:44.687 に答える
0

私は最初の試みとして解決策1が好きです - シンプルで要点です。

Windows を使用している場合は、非同期ファイル操作 ( OVERLAPPED と呼ばれるもの) を実行して、OS にファイルをロードするように指示し、準備ができたときに通知することができます。

于 2010-03-03T16:47:22.653 に答える