VC++ .net2005 MFCです。
今作成しているアプリで、playsoundでメモリ上に保存した音を再生させると特定のPCで
音が早く再生されてしまいます。
bRet = PlaySound ((PTSTR) pwaveform, NULL, SND_MEMORY | SND_MEMORY |
SND_ASYNC);
音声のサイズは800000バイトで約100秒の音声ですが
再生すると90秒程で終了してしまいます。
途中で終了するのではなく音が高くなるような感じです。
周波数が高くなる??
問題の発生するPCでこのデータをWAVファイルにしたものを再生しても問題なく100秒で
再生されます。
違いはファイルで再生するかメモリから再生するかと言う事と、
ファイルから再生させた時はメディアプレイヤーで音声のみ再生し
メモリから再生した時はアプリの動作があり他にも処理をしている状態です。
ただplaysoundで音を再生したらあとは再生が終わるまで特になにも処理はしていません
何が悪いのか良く分からないですが、PCの処理状況によってはplaysoundで音が早く再生
されるという事はあるのでしょうか?
>問題の発生するPCでこのデータをWAVファイルにしたものを再生しても問題なく100秒で
>再生されます。
PlaySoundはファイルを再生することも出来ますよね。
ファイルを再生してみたらどうですか?
症状だけ見ると、44.1kHzで記録された音声を48kHzで
再生しているように思えます。
この場合、やや音程が高くなり、1割ほど再生時間が
短くなります(441/480になります)。
問題の出るPCの出力デバイスのサンプリング周波数を
確認してみてはいかがでしょう。
PlaySoundは指定された音声のサンプリング周波数と
出力デバイスのサンプリング周波数との間の調整を
行わなかったはず(うろ覚え)。
# そうでなくても、ハード的なサンプリング周波数の
# 変更を頑として受けつけないものもありますし。
> ファイルから再生させた時はメディアプレイヤーで音声のみ再生し
そのプレーヤは、DirectXを使うなり何なりしてリサンプリング
しているため、問題が起こっていないのだと思います。
# PlaySoundは長い音声を再生するのに向いていない
# (メモリを食いすぎる)ので、音楽プレーヤがPlaySoundを
# 使っていることはないと思います。
返信ありがとうございます。
問題のPCでplaysoundでファイルを再生した場合は問題ないです。
また問題のPCでもその問題のファイルをメモリから再生せず、ファイルにして再生する
場合は問題ないです。
但しメモリから再生する場合は現在作成しているアプリでの再生になりますので
他の部分の処理が重く影響を与えているのかも知れません。
ただplaysoundは再生を行ったらアプリはもう関与出来ないですし
他のアプリの処理がplaysoundで再生している音に影響を与えるなんて事があるの?と思
っているのですが。
また、関係あるのか分かりませんが問題のあるPCはどちらもCPU1.3G程度。問題のないPC
は1.7G以上あります。
うーーん
ファイルで再生する分では問題ないとすると、playsoundでメモリー再生するには
負担が大きいということが推測できるのですが......
DirectX、メディアプレーヤ用API等を使うことも考えたほうがいいかも知れませんね。
#知っている方、補足願います。
うろ覚えのままというのが気持ち悪くて実験して
みましたが、これ、間違いのようでしたので取り消します。
# まあ、実験に使ったデバイスが少々変わり種ではありますが。
> PlaySoundは指定された音声のサンプリング周波数と
> 出力デバイスのサンプリング周波数との間の調整を
> 行わなかったはず(うろ覚え)。
以下の環境で、デバイスのサンプリング周波数の
設定を変えながら、PlaySoundを用いて音声を再生
してみましたが、デバイスの出力周波数が変わったり、
(周波数をロックした場合は)リサンプリングされたり
して再生されました。
開発環境: Visual C++ 2005 Express Edition
OS: Windows XP SP2
出力デバイス: M-Audio Delta 66
音声: CDから取り込んだwavファイル(44.1kHz)
(PlaySoundにSND_MEMORYを指定した場合は、
このファイル全体を単にReadFileしたものを
使いました)
# エクスプローラが時々間違ったサンプリング周波数で
# ビープを鳴らすことがあるんだけど、条件は何だろ……
waveformの内容はどうなっていますか?
waveform のサンプリング速度が、データとあっていない
メディアプレイヤーでは、ファイルのサンプリング速度に合わせて
再生している
のではないかと思います