今年は春物件が少なくてそれほど忙しくなかったけど、苦労させられたトラブルが1件。
久しぶりの書き込みでその失敗について書いておきます。
この春には近場の現場に導入されたので打ち合わせがてらソフトの動作状況を確認に行きました。
その時点では何もなく事務所に戻りました。ところが事務所に着く頃に現場からエラーがでているとの連絡が入
りました (トラブルとは不思議とこんなタイミングで起きます)。
とりあえず確認してほしいことを伝えて翌朝改めて連絡したところやはり何らかの問題が発生している模様。
早速現場に向かって再現性をチャックしました。普通に使用している分にはいいのですが、テストのためにいろいろなボタン連打をするとかなりの確率でおかしくなります。このソフトは相当数の納入実績もあり他の現場でも同じテストは行っているのでここでだけ起きるのは理解できません。
早速再現パターンを見つけるためにいろいろと試し、30分ほどかかってそれらしきものを見つけました。
このソフトはサウンドの録音/再生ソフトなのですが、録音と再生を短時間で繰り返すと発生するようです。内部的には再生→停止→録音となるのですが、再生といっても普通のプレイヤーとは違ってDirectSound で二つのバッファを作って同時に再生しています。
早速持ち込んだ hp のノートパソコンで同じことをやってみましたが、どんなに繰り返しても再現しません。もしかすると DirectX のバージョンかと思い DirectX 診断ツールで詳細なバージョンを確認したが一致。
ところが DirectSound のテストを実行して違いが見つかりました。納入されているPCは N 社製のデスクトップなのですが、こちらのPCはハードウェアバッファによる再生をサポートしていません。どうもここに問題がありそうです。試しにノートパソコンの方でアクセラレーションの使用をオフにするとこちらでも発生するようになりました。
微妙なタイミングの問題なのでデバッガを使って追うこともできずOutputDebugString を使ってイベントを書き出す方法と想像力を駆使して何とか原因を突き止めました。
トラブルの原因は DirectSound の再生時の動作タイミングがソフトバッファだと微妙に変わってくることでした。
一番大きな問題としては同じサイズの音声をバッファ A,バッファB で再生した時。当然ながら本当の意味で同時ということはなく再生開始にミリ秒単位の時間差があるはずです。同じサイズなので終了も A,B の順のはずなのですが、まれに B,A の順序で各スレッドの終了イベントが逆転して発生するのが確認できました。
また、途中で再生を止める時には A を止めて停止を確認してからB を止めるのですが、A に STOP を発行してから実際に終了イベントがくるまでの時間が結構長いようでその間に B の再生が終わってしまい、この場合にも逆転現象が起きてしまいます。
ロジック的に逆転を想定していなかったのでこれがトラブルの原因となってしまいました。
かなりしつこくやってみたのですが、ハードウェアバッファを使っている環境ではこの現象の再現が確認できませんでした。
ちなみにハードウェアバッファをサポートしていないPCがどのくらいあるかは把握できていませんが、手元の同じ N 社のノートパソコンも同じでサポートしていませんでした。CPU パワーが大きくなったこととコストダウンの要求からこのようなPCが増えているんでしょう。
ことがことだけに原因がわかるまでにすごく苦労しました。
最近のコメント