4

ネイティブ vc++ (.Net ではない) でゲームを作成しています

私は実際のスピーカー (内部ではない) を通してノイズ (おそらく 8 ビットか何か) を再生する方法を探しています。PlaySound については知っていますが、EXE を大きくしたくありません。サウンドをプログラミングしたい。

APIの方法( Beep() のようなもの)はありますが、それは実際のスピーカーを通して再生されますか?

ありがとう

4

4 に答える 4

11

あなたは について知っていると言いました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 ですが、必要なことにはやり過ぎかもしれません :)

于 2009-09-20T19:28:05.043 に答える
1

Windowsにはいくつかの可能性がありますが、最も単純なものの1つはsndPlaySound()です。

  • 含むmmsystem.h
  • リンク先winmm.lib
  • ::sndPlaySound("sound.wav", SND_ASYNC|SND_NODEFAULT);
  • 再生を停止するには:::sndPlaySound(NULL, NULL);

もちろん、mciやダイレクトサウンドのような他の方法もあります。必要なものをより明確に見れば、ニーズに合う可能性があります。

于 2009-09-20T18:30:11.803 に答える
0

私はこれを見つけました: http ://www.xtremevbtalk.com/showthread.php?p=829281 それはあなたに役立つかもしれません

于 2009-09-20T18:07:45.140 に答える
0

別の質問に対する私の回答が役立つ場合があります。ここで確認してください

私は、wav ファイルを読み書きするためのクラスを持ち、さまざまなドライバー (wdm、asio、jack など) にリアルタイム出力を行うための使いやすいラッパー クラスを備えた、使いやすいオープンソース API ( The Synthesis Toolkit ) について話します。

私見はwinapi関数よりも使いやすいです

于 2009-09-20T19:54:28.700 に答える