トップページ > 過去ログ > 記事閲覧
VC++でのエラーについて
日時: 2008/01/07 00:18
名前: kaze

お世話になります。このソフトに非常に興味があり、試作で、いろいろとためさせていただいています。
現在、非同期(AquesTalkDa_Play)での再生を繰り返していると、不定期なタイミングでヒープ領域でのエラーが表示される現象でつまっています。
そこで、単に、「てすとです。」という文字を非同期で、2秒間隔でタイマーでまわすプログラムを作成しました。
音声は読み上げますが、早いときで十数回、長いときで800回くらいで、ヒープ領域のエラーと表示され、ストップします。
エラーは、関数(AquesTalkDa_Play)を通過した時点では起こりませんが、読み上げ中か、読み上げ終了時のタイミングで、AquesTalkDa_Play通過時に作成される2つのスレッドのうち1つで起こっているようです。
エラートラップなどで、回避も考えたのですが、上手くいっていません。
もし、よろしければ、使用方法のミスなのか、対処方法があれば教えていただけるとありがたいです。
使用させていただいているのに、わがままを申し上げて申し訳ありません。

環境
 Windows XP SP2
VC++ 2005
MFC でのダイアログで作成
 AquesTalk は、静的ライブラリと、LoadLibralyでの動的読み込みの2種類で試しました。

Page: 1 |

Re: VC++でのエラーについて ( No.1 )
日時: 2008/01/07 12:50
名前: 管理人

経験上、オーディオデバイス関係(ドライバを含む)のことが多いようです。
その場合、異なるサウンドカード(異なるメーカで)では、違う結果になるかと思います。
一度お試しいただければと思います。
Re: VC++でのエラーについて ( No.2 )
日時: 2008/01/07 22:24
名前: kaze

ご返答ありがとうございます。
サウンドボードを変えることもできず、どうしようか迷っていましたが、解決できたようです。
AquesTalkDa_Playで再生する前に、
AquesTalkDa_Releaseで解放
AquesTalkDa_Createで再作成と
毎回行うと、エラーが発生しなくなりました。

つまり、

初期化処理
 AquesTalkDa_Create 作成

2秒間隔のタイマー
 AquesTalkDa_Play("てすとです。");

と行っていたのを、

初期化処理
 AquesTalkDa_Create 作成

2秒間隔のタイマー
 AquesTalkDa_Release 解放
 AquesTalkDa_Create 再作成
 AquesTalkDa_Play("てすとです。");

とすることで、8000回以上繰り返しても普通に再生されるようになりました。
速度的にも、問題ありません。

他のSAPIライブラリも検討し、組み込んでみたのですが、やわらかく、なめらかな声質がとても気に入っています。

この対処が、最良なのかどうかわかりませんが、今のところは支障がなさそうなので、このまま使用させていただきたいと思います。

ありがとうございました。

Page: 1 |