0

わかりました、あらゆる種類のタイトルを試しましたが、すべて失敗しました (誰かがより良いタイトルを思いついたら、自由に編集してください:P)

次の問題があります: API を使用して、コーディングしていないハードウェアにアクセスし、その API にライブラリを追加して、API インターフェイスから継承する必要があり、API がすべてを行います。

私はそのAPI、音楽ジェネレーターライブラリを入れました。問題は、言及されたAPIがバッファーが空のときにのみ音楽ライブラリを呼び出し、ハードコードされた量のデータを要求することです(正確には1024 * 16サンプル...理由はわかりません)。

これは、音楽ライブラリが追いついていない場合でも、音楽を再生している間、音楽ジェネレータ ライブラリがすべての CPU の可能性を使用できないことを意味します。複雑なもの、バッファ アンダーラン (つまり、音楽ライブラリ関数がまだ返されていないため、サウンドカードはバッファ内の空の領域を再生します)。

ハードコードされた番号を微調整すると、いくつかの要因に応じて、ソフトウェアが一部のマシンでのみ機能し、他のマシンでは機能しなくなります...

そこで私は 2 つの解決策を思いつきました。新しいバッファ ロジックを使用して API をハックしますが、その領域については何もわかりません。

または、私が実際にロジックを考え出したもの:音楽ライブラリに独自のスレッドを持たせると、APIが音楽ライブラリを呼び出してデータを生成する代わりに、常に満たす独自の個別のバッファが作成されます。その別のバッファからサウンドカードバッファにデータを単純にコピーしてから、音楽の生成を再開します。

私の問題は、プログラミングの経験が数年あるにも関わらず、常にマルチスレッドを避けてきたことです。

質問は次のとおりです。誰かが別の解決策を見つけることができますか、またはスレッド化されたソリューションを実装する方法に関する情報を提供してくれる場所を教えてくれますか?

編集:

私はファイルを読んでいるのではなく、音楽を生成または計算しています。これは .wav または .ogg ライブラリではありません。これが、CPU 時間について言及した理由です。CPU を 100% 使用できれば、アンダーランは発生しませんが、CPU を使用できるのは、プログラムがバッファーが終わりに近づいていることを認識してから実際に終了するまでの短い時間だけです。この時間は、プログラムが音楽を計算するのにかかる時間よりも短い場合があります。

4

2 に答える 2

2

要求されたときに準備ができるようにライブラリ用のデータを準備する別のスレッドを使用するソリューションが、待ち時間を短縮してこの問題を解決するための最良の方法であると私は信じています。1 つのスレッドが音楽データを生成してバッファに格納し、API スレッドが必要なときにそのバッファからデータを取得します。この場合、読み取りまたは書き込みに関係なくバッファへのアクセスを同期する必要があり、API が遅すぎる場合にバッファが大きすぎないようにする必要があります。これを実装するには、スレッド ライブラリのスレッド、ミューテックス、条件プリミティブと 2 つのフラグが必要です。1 つはいつ停止が要求されたかを示し、もう 1 つは API が追いつかず、バッファが大きくなりすぎた場合にスレッドに一時停止するように要求します。C++ 用の Boost Thread ライブラリを使用することをお勧めします。

于 2010-08-05T20:42:11.593 に答える
0

この問題を解決するために、必ずしも新しいスレッドは必要ありません。オペレーティングシステムが非同期読み取り操作を提供する場合があります。たとえば、Windowsでは、FILE_FLAG_OVERLAPPEDを使用してファイルを開き、そのファイルに対するすべての操作を非同期にします。

オペレーティングシステムがこの機能をサポートしている場合は、数回の呼び出しに相当するデータを保持できる大きなバッファを作成できます。アプリケーションが起動したら、バッファーをいっぱいにします。いっぱいになったら、バッファーの最初のセクションをAPIに渡すことができます。APIが戻ってきたら、さらにデータを読み込んで、最後のAPI呼び出しで消費されたバッファーのセクションを上書きできます。読み取りは非同期であるため、APIが音楽を再生している間はバッファがいっぱいになります。

実装はこれよりも複雑になる可能性があります。つまり、循環バッファを使用するか、いくつかのセクションが消費されるまで待機してから、一度に1つのセクションを読み取るのではなく、一度に複数のセクションを読み取ります。

于 2010-08-05T21:38:08.970 に答える