遠山といいます。解決できずに投稿させていただきました。
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) );
直接的な回答ではありません。
まず、VISTAでは、VC++6.0は非対応です。
動作は保証されてませんので・・・
次にバッファ数ですが、CPUの性能や環境の影響を大きく
受けますので、少ないのか適切なのか・・・はここから
は何とも言えません。
尚、wBitsPerSample=16を2つとwBitsPerSample=8が1つで3つ
と言う意味が理解できません。
何故、ビット数の違う構成で再生されているんですか?
他のOSで正常に動作したかもしれないが、VISTAで動作しない
のは、VISTAがおかしい・・・と言うこととは等価ではありま
せん。
私は十分に性能のあるCPU環境ででも、16個バッファを用意
して、再生させてますが・・・1個分のバッファを再生するの
にかかる時間をどの程度にされてますか?要はバファア長です
提示されたコードからは、これ以上突っ込めないので、各種設
定値がどうなっているのか、示して下さい。
以上。
バッファの発音位置を遅らせている時間を100msほどずらたらうまくいきました。
Vistaでのみ確認しました。アドバイスいただき有難うございました。解決としたいと思います。
ツイート | ![]() |