ネイティブ vc++ (.Net ではない) でゲームを作成しています
私は実際のスピーカー (内部ではない) を通してノイズ (おそらく 8 ビットか何か) を再生する方法を探しています。PlaySound については知っていますが、EXE を大きくしたくありません。サウンドをプログラミングしたい。
APIの方法( Beep() のようなもの)はありますが、それは実際のスピーカーを通して再生されますか?
ありがとう
あなたは について知っていると言いましたPlaySound
。フラグの 1 つ ( SND_MEMORY
) を使用すると、既にメモリにロードされている WAVE、つまり自分で作成したバッファを再生できます。バッファに適切な WAVE ヘッダーがある限り、そこに何を入れてもスピーカーから再生されます。
ヘッダーは、かなり単純な 44 バイト ブロックです。
struct WaveHeader
{
DWORD chunkID; // 0x46464952 "RIFF" in little endian
DWORD chunkSize; // 4 + (8 + subChunk1Size) + (8 + subChunk2Size)
DWORD format; // 0x45564157 "WAVE" in little endian
DWORD subChunk1ID; // 0x20746d66 "fmt " in little endian
DWORD subChunk1Size; // 16 for PCM
WORD audioFormat; // 1 for PCM, 3 fot EEE floating point , 7 for μ-law
WORD numChannels; // 1 for mono, 2 for stereo
DWORD sampleRate; // 8000, 22050, 44100, etc...
DWORD byteRate; // sampleRate * numChannels * bitsPerSample/8
WORD blockAlign; // numChannels * bitsPerSample/8
WORD bitsPerSample; // number of bits (8 for 8 bits, etc...)
DWORD subChunk2ID; // 0x61746164 "data" in little endian
DWORD subChunk2Size; // numSamples * numChannels * bitsPerSample/8 (this is the actual data size in bytes)
};
次のようなものでバッファを設定します。
char *myBuffer = new char[sizeof(WaveHeader) + myDataSize];
WaveHeader *header = (WaveHeader*)myBuffer;
// fill out the header...
char *data = myBuffer + sizeof(WaveHeader); //jumps to beginning of data
// fill out waveform data...
したがって、次のように使用します。
PlaySound(myBuffer, NULL, SND_MEMORY | SND_ASYNC);
アプリの存続期間中、生成されたサウンドを使用することになると思います。そうでない場合は、そのSND_ASYNC
フラグに注意してください。つまり、PlaySound を呼び出した直後 (まだ使用中) にバッファーを解放しないでください。
MSDN PlaySound Docs
WAV ヘッダーの詳細が記載されたページ(旧- 現在は機能していません)
DirectX はメモリ内バッファからのオーディオの再生もサポートしており、はるかに強力な API ですが、必要なことにはやり過ぎかもしれません :)
Windowsにはいくつかの可能性がありますが、最も単純なものの1つはsndPlaySound()です。
mmsystem.h
winmm.lib
::sndPlaySound("sound.wav", SND_ASYNC|SND_NODEFAULT);
::sndPlaySound(NULL, NULL);
もちろん、mciやダイレクトサウンドのような他の方法もあります。必要なものをより明確に見れば、ニーズに合う可能性があります。
私はこれを見つけました: http ://www.xtremevbtalk.com/showthread.php?p=829281 それはあなたに役立つかもしれません
別の質問に対する私の回答が役立つ場合があります。ここで確認してください
私は、wav ファイルを読み書きするためのクラスを持ち、さまざまなドライバー (wdm、asio、jack など) にリアルタイム出力を行うための使いやすいラッパー クラスを備えた、使いやすいオープンソース API ( The Synthesis Toolkit ) について話します。
私見はwinapi関数よりも使いやすいです