はじめまして、てるんと申します。
ちょっと困っていることがあるので質問させていただきます。
アーカイブデータ(複数のWavファイルを一つにまとめたもの)から一つのデータをメモリに読み込み、
ファイルを再生するプログラムを書きました。
無事に再生できたのですが、必ず先頭にプチッというノイズが鳴ってから再生が始まります。
アーカイブにまとめる前の、単体Wavファイルではそのようなことはなく、原因の特定に困っています。
この場合、どのような要因が考えられるのでしょうか?何かお気づきの点がありましたら、教えてください。
ソースコードは次のとおりです(一部抜粋)
// initialize
CoInitializeEx( NULL, COINIT_MULTITHREADED );
XAudio2Create( &pXAudio2, 0);
IXAudio2* pXAudio2 = NULL;
pXAudio2->CreateMasteringVoice( &pMasteringVoice );
// load archive
CArchive* a=new CArchive();
a->SetPassWord(xxx);
a->LoadData("00.wav","wav.sound");// wav.soundというアーカイブファイルから00.wavというファイルを抽出
// Get format of wave file
WAVEFORMATEX pwfx;
pwfx.cbSize=0;
pwfx.nAvgBytesPerSec=176400;
pwfx.wFormatTag=WAVE_FORMAT_PCM;
pwfx.nBlockAlign=4;
pwfx.nChannels=2;
pwfx.nSamplesPerSec=44100;
pwfx.wBitsPerSample=16;
// Calculate how many bytes and samples are in the wave
DWORD cbWaveSize = (DWORD)a->GetFileSize();
// Create the source voice
pXAudio2->CreateSourceVoice( &pSourceVoice, &pwfx,
0, XAUDIO2_DEFAULT_FREQ_RATIO, NULL, NULL, NULL );
// Submit the wave sample data using an XAUDIO2_BUFFER structure
XAUDIO2_BUFFER buffer;
buffer.LoopCount=0;
buffer.LoopBegin=0;
buffer.LoopLength=0;
buffer.pContext=0;
buffer.PlayBegin=0;
buffer.PlayLength=0;
buffer.pAudioData = a->GetData();
buffer.Flags = XAUDIO2_END_OF_STREAM;
buffer.AudioBytes = a->GetFileSize();
pSourceVoice->SubmitSourceBuffer( &buffer );
pSourceVoice->Start();
SDKのサンプルコードを元に書きました。恐らく何かの設定値が原因なんじゃないかと思うのですが、
原因を把握しかねています。よろしくお願いします。
XAudio2で再生すると先頭にノイズが入る
Re: XAudio2で再生すると先頭にノイズが入る
貼っていただいたコードでは WAVEFORMATEX の設定を直接書いてますけど、
実際はちゃんとファイルからフォーマットを調べているのでしょうか?
あと、
pSourceVoice->SubmitSourceBuffer( &buffer );
の前に
pSourceVoice->FlushSourceBuffers();
と書いてみたらどうでしょうか?
実際はちゃんとファイルからフォーマットを調べているのでしょうか?
あと、
pSourceVoice->SubmitSourceBuffer( &buffer );
の前に
pSourceVoice->FlushSourceBuffers();
と書いてみたらどうでしょうか?
Re: XAudio2で再生すると先頭にノイズが入る
>貼っていただいたコードでは WAVEFORMATEX の設定を直接書いてますけど、
実際はちゃんとファイルからフォーマットを調べているのでしょうか?
ファイルから調べていませんでした。なのでファイル読み込み->設定値の格納としてみたのですが・・・
現象は解決できずでした。
>pSourceVoice->SubmitSourceBuffer( &buffer );
の前に
pSourceVoice->FlushSourceBuffers();
と書いてみたらどうでしょうか?
こちらの方法も、やはり現象は解決できませんでした。
この他にも、構造体の設定値を変更したり、ちゃんとファイルが読み込めているのか、書き出しを行って
確認しました。しかし異常は見られず・・・といった感じです。
このことから、OSやDirectXのファイル破損が要因として考えられるかな、と思い、再インストールを実行してみようと思います。
お時間とアドバイスを頂きまして、誠にありがとうございました。
実際はちゃんとファイルからフォーマットを調べているのでしょうか?
ファイルから調べていませんでした。なのでファイル読み込み->設定値の格納としてみたのですが・・・
現象は解決できずでした。
>pSourceVoice->SubmitSourceBuffer( &buffer );
の前に
pSourceVoice->FlushSourceBuffers();
と書いてみたらどうでしょうか?
こちらの方法も、やはり現象は解決できませんでした。
この他にも、構造体の設定値を変更したり、ちゃんとファイルが読み込めているのか、書き出しを行って
確認しました。しかし異常は見られず・・・といった感じです。
このことから、OSやDirectXのファイル破損が要因として考えられるかな、と思い、再インストールを実行してみようと思います。
お時間とアドバイスを頂きまして、誠にありがとうございました。