WaveOut APIについて

解決


toyama  2009-11-28 01:47:27  No: 71150

遠山といいます。解決できずに投稿させていただきました。
OS:Windows Vista Home Premium SP1 32bit
マシン:Intel(R)CPU 1.66GHz

WaveOut APIを使ってサンプリングデータを直接書き込んで再生していますがOS環境によって動作が不安定になってしまいます。
Windows98,Me,XPではうまくいくのですが、Windows Vistaでうまく再生できません。再生データが重なったり雑音のような感じになってしまいます。

以下のようにwBitsPerSample=16でダブルバッファリングを使用してバッファ2つを繰り返し再生しています。
wBitsPerSample=16を2つとwBitsPerSample=8が1つで3つダブルバッファリングで繰り返し再生しています。

VistaでコンパイルとVisualC++6.0を起動するときに互換性に問題がありますとメッセージが出てきますがそのままスキップして実行しています。
OSによって動作が変わるので互換性の問題なのか、それともコード自体の問題でしょうか。どなたかアドバイスいただけたら宜しくお願いします。

wfe.wFormatTag = WAVE_FORMAT_PCM;
wfe.nChannels = 1;
wfe.nSamplesPerSec = SamplingRate;
wfe.nAvgBytesPerSec = SamplingRate;
wfe.wBitsPerSample = 16;
wfe.nBlockAlign = wfe.nChannels * wfe.wBitsPerSample / 8;
wfe.cbSize = 0;

waveOutOpen(&hOut,
WAVE_MAPPER, &wfe, (DWORD)OutProc, 0, CALLBACK_FUNCTION);
whdr1.lpData = (char *)buff1;
whdr1.dwBufferLength = SamplingSize * 2;
whdr1.dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP;
whdr1.dwLoops = 1;
waveOutPrepareHeader( hOut, &whdr1, sizeof(WAVEHDR) );
whdr2.lpData = (char *)buff2;
whdr2.dwBufferLength = SamplingSize * 2;
whdr2.dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP;
whdr2.dwLoops = 1;
waveOutPrepareHeader( hOut, &whdr2, sizeof(WAVEHDR) );


オショウ  2009-11-28 04:42:17  No: 71151

直接的な回答ではありません。

まず、VISTAでは、VC++6.0は非対応です。
動作は保証されてませんので・・・

次にバッファ数ですが、CPUの性能や環境の影響を大きく
受けますので、少ないのか適切なのか・・・はここから
は何とも言えません。

尚、wBitsPerSample=16を2つとwBitsPerSample=8が1つで3つ
と言う意味が理解できません。

何故、ビット数の違う構成で再生されているんですか?
他のOSで正常に動作したかもしれないが、VISTAで動作しない
のは、VISTAがおかしい・・・と言うこととは等価ではありま
せん。

私は十分に性能のあるCPU環境ででも、16個バッファを用意
して、再生させてますが・・・1個分のバッファを再生するの
にかかる時間をどの程度にされてますか?要はバファア長です

提示されたコードからは、これ以上突っ込めないので、各種設
定値がどうなっているのか、示して下さい。

以上。


toyama  2009-11-28 22:56:10  No: 71152

バッファの発音位置を遅らせている時間を100msほどずらたらうまくいきました。
Vistaでのみ確認しました。アドバイスいただき有難うございました。解決としたいと思います。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加