Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con sonido

Estas en el tema de Problema con sonido en el foro de C/C++ en Foros del Web. Miren el siguiente codigo, lo que tiene que hacer es dejar sonando un tono, La frecuencia del tono esta determinada por la variable samples_por_ciclo, cuanto ...
  #1 (permalink)  
Antiguo 15/05/2011, 21:11
 
Fecha de Ingreso: septiembre-2010
Mensajes: 137
Antigüedad: 13 años, 6 meses
Puntos: 0
Problema con sonido

Miren el siguiente codigo, lo que tiene que hacer es dejar sonando un tono,

La frecuencia del tono esta determinada por la variable samples_por_ciclo, cuanto mas baja sea esta variable es mas agudo el sonido

Anda bien con valores 8, 16, 32, 64, 128 (los valores tienen q ser potencia de 2 para que suene agradable), pero si pongo un numero mas grande (como 256) no suena nada.

¿saben porque?



miren la linea 33, prueben el programa con samples_por_ciclo=128, y luego con samples_por_ciclo=256
Código C++:
Ver original
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <mmsystem.h>
  4. #include <math.h>
  5. #define BUFFER 2048
  6. #define FREC 44100
  7.  
  8. WAVEFORMATEX WaveFormat;
  9. HWAVEOUT    HWaveOut;
  10. DWORD       WaveBufSize;
  11. WAVEHDR     WaveHeader[2];
  12.  
  13. void CALLBACK WaveOutProc(HWAVEOUT waveOut, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
  14. {
  15.     if(uMsg==MM_WOM_DONE) waveOutWrite(HWaveOut, (WAVEHDR *)dwParam1, sizeof(WAVEHDR));
  16. }
  17.  
  18. int main(int argc, char **argv)
  19. {
  20.     WaveFormat.nSamplesPerSec = FREC;
  21.     WaveFormat.wBitsPerSample = 8;
  22.     WaveFormat.nChannels = 1;
  23.     WaveFormat.cbSize = 0;
  24.     WaveFormat.wFormatTag = WAVE_FORMAT_PCM;
  25.     WaveFormat.nBlockAlign = (WaveFormat.wBitsPerSample /8) * WaveFormat.nChannels;
  26.     WaveFormat.nAvgBytesPerSec = WaveFormat.nBlockAlign * WaveFormat.nSamplesPerSec;
  27.     WaveBufSize=BUFFER;
  28.    
  29.     float PI=3.14159265358979323846;
  30.     unsigned char onda[BUFFER];
  31.     for(int i=0;i<BUFFER;i++)
  32.     {
  33.         int samples_por_ciclo=128;//ACA
  34.         onda[i]=int(sin( i*2*PI/(samples_por_ciclo) )*127)+127;
  35.     }
  36.     waveOutOpen(&HWaveOut, WAVE_MAPPER, &WaveFormat, (DWORD)WaveOutProc, 0, CALLBACK_FUNCTION);
  37.     WaveHeader[0].dwBufferLength=WaveBufSize;
  38.     WaveHeader[1].dwBufferLength=WaveBufSize;
  39.     WaveHeader[0].lpData=(char *)onda;
  40.     WaveHeader[1].lpData=(char *)onda
  41.     waveOutSetVolume(HWaveOut,0x1101);
  42.     waveOutPrepareHeader(HWaveOut, &WaveHeader[0], sizeof(WAVEHDR));
  43.     waveOutPrepareHeader(HWaveOut, &WaveHeader[1], sizeof(WAVEHDR));
  44.     waveOutWrite(HWaveOut, &WaveHeader[0], sizeof(WAVEHDR));
  45.     waveOutWrite(HWaveOut, &WaveHeader[1], sizeof(WAVEHDR));
  46.     while(GetKeyState(0x31)>=0) printf("");//Esta linea detiene el hasta que se aprete la tecla "1"
  47.     waveOutUnprepareHeader(HWaveOut, &WaveHeader[1], sizeof(WAVEHDR));
  48.     waveOutUnprepareHeader(HWaveOut, &WaveHeader[0], sizeof(WAVEHDR));
  49.     waveOutReset(HWaveOut);
  50.     waveOutClose(HWaveOut);
  51. }

Última edición por Alfonso1; 15/05/2011 a las 21:23

Etiquetas: sonido
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:50.