Progtwigble hacer y reproducir un sonido a través de altavoces C ++

Estoy haciendo un juego en vc ++ nativo (no .Net)

Estoy buscando una forma de reproducir un ruido (quizás de 8 bits o algo) a través de los altavoces reales (no internos). Sé sobre PlaySound, pero no quiero que mi EXE sea grande. Quiero progtwigr el sonido.

¿Hay una forma de api (un poco como Beep ()) pero que se reproduce a través de los oradores reales?

Gracias

Mencionas que sabes sobre PlaySound . Una de las banderas ( SND_MEMORY ) le permitirá reproducir un WAVE que ya está cargado en la memoria, es decir, un búfer que usted mismo ha creado. Siempre que el búfer tenga el encabezado WAVE adecuado, cualquier cosa que pongas allí debe reproducirse a través de los altavoces.

El encabezado es un bloque de 44 bytes que es bastante sencillo.

 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) }; 

Configurarías tu búfer con algo similar a:

 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... 

Así que lo usas algo como:

 PlaySound(myBuffer, NULL, SND_MEMORY | SND_ASYNC); 

Supongo que va a utilizar el sonido generado durante toda la vida de su aplicación. Si no lo está, tenga cuidado con ese indicador SND_ASYNC . Es decir, no libere el búfer directamente después de llamar a PlaySound (mientras aún está en uso).

MSDN PlaySound Docs
Una página con más detalles en el encabezado WAV ( OLD – no funciona ahora)

DirectX también admite la reproducción de audio desde búferes en memoria y es una API mucho más potente, pero tal vez sea demasiado para lo que necesitas hacer 🙂

Si bien hay varias posibilidades en Windows, una de las más simples es sndPlaySound ():

  • incluye mmsystem.h
  • enlace a winmm.lib
  • ::sndPlaySound("sound.wav", SND_ASYNC|SND_NODEFAULT);
  • para detener la reproducción: ::sndPlaySound(NULL, NULL);

Por supuesto, hay otras formas, como mci y sonido directo, que podrían adaptarse mejor a sus necesidades si ve con mayor claridad lo que necesita.

Encontré esto: http://www.xtremevbtalk.com/showthread.php?p=829281 podría ser de alguna utilidad para usted

Mi respuesta a otra pregunta podría ser útil, échale un vistazo aquí

Hablo de una API de código abierto fácil de usar ( The Synthesis Toolkit ) que tiene clases para leer / escribir archivos wav, y tiene clases de envoltorio fáciles de usar para hacer salidas en tiempo real a diferentes controladores (wdm, asio, jack, …)

Imho es más fácil de usar que las funciones winapi.