Newsgroup: it.comp.programmare.win32
Titolo: Una volta era DECISAMENTE piu` facile.

Innanzitutto voglio ringraziare tutti coloro che mi hanno aiutato a fare
emettere uno schifo di suono sotto windoze alla scheda sonora. In questi
giorni mi sono guardato ben bene gli help del C++ Builder ed ho trovato
tutte le funzioni che mi servivano. Alla fine sembra che io sia riuscito
a far suonare uno stream di dati creato al volo. Ora pero` mi trovo di
fronte ad un problema che non so proprio da che parte pigliare: Se per
caso muovo il mouse durante la riproduzione del suono mi da un errore
del tipo "Address ***** could not be read". Cosa ve ne pare?
Ecco il codice che uso:
  WAVEFORMATEX wftx;
  HWAVEOUT hwo;
  WAVEHDR hdr;
  MMRESULT ris;
  short int buf[100000];
  unsigned long int a,x;
  // Costruisce il PCM.
  for (a=0;a<100000;){
    x=32767*sin(a/10.0);
    buf[a++]=x;
  }
  wftx.wFormatTag=WAVE_FORMAT_PCM;
  wftx.nChannels=1;
  wftx.nSamplesPerSec=44100;
  wftx.wBitsPerSample=16;
  wftx.cbSize=0;
  wftx.nBlockAlign=wftx.nChannels*wftx.wBitsPerSample;
  wftx.nAvgBytesPerSec=wftx.nSamplesPerSec*wftx.nBlockAlign;
  //-------------------------------------header
  hdr.lpData=(char*)buf;
  hdr.dwBufferLength=sizeof(buf);
  hdr.dwFlags=0;
  hdr.dwLoops=1;
  ris=waveOutOpen(&hwo,WAVE_MAPPER,&wftx,NULL,0,CALLBACK_NULL);
  ris=waveOutPrepareHeader(hwo,&hdr,sizeof(hdr));
  ris=waveOutWrite(hwo,&hdr,sizeof(hdr));
  ris=waveOutClose(hwo);
-- 
"Ci sono persone che guardano il mondo e si chiedono perche`. Ce ne sono
altre che guardano il mondo sognando come dovrebbe essere e si chiedono
perche` no."
(R. Kennedy)
ICQ#: 18469567

  short int buf[100000];
200000 bytes credo siano un po' troppi per lo stack... Allocali con
VirtualAlloc. E ricordati di chiamare anche waveOutUnprepareHeader(), quando
hai suonato il campione.
Saluti,
    Mardy

 hai suonato il campione.
Ho ridotto lo stream a 20000 (questi li teneva anche il turbo pascal) ed
ho chiamatao la funzione waveOutUnprepareHeader(), ma il risultato e` il
medesimo. Inoltre e` successa una cosa strana: quando ho aperto il
programma per fare le modifiche che mi hai consigliato questo non
funzionava. Ho riavviato e funzionava. Mistero. Hai altri suggerimenti
da darmi (per inciso voglio ringraziare la microsoft per i NUMEROSISSIMI
esempi inclusi negli help).
Ciao
  Roberto.


Ho ridotto lo stream a 20000 (questi li teneva anche il turbo pascal) ed
Non fidarti, potrebbe essere comunque un problema. Fai cosi':
WAVEFORMATEX wftx;
  HWAVEOUT hwo;
  WAVEHDR hdr;
  MMRESULT ris;
  short int *buf;
  unsigned long int a,x;
  buf = VirtualAlloc(NULL, 200000, MEM_COMMIT, PAGE_READWRITE);
  // Costruisce il PCM.
  for (a=0;a<100000;){
    x=32767*sin(a/10.0);
    buf[a++]=x;
  }
  wftx.wFormatTag=WAVE_FORMAT_PCM;
  wftx.nChannels=1;
  wftx.nSamplesPerSec=44100;
  wftx.wBitsPerSample=16;
  wftx.cbSize=0;
/* Questo era il tuo errore: devi dividere per 8, perche' vuole sapere il
numero di byte, non di bit.
  wftx.nBlockAlign=wftx.nChannels*wftx.wBitsPerSample;
*/
  wftx.nBlockAlign=wftx.nChannels*wftx.wBitsPerSample / 8;
  wftx.nAvgBytesPerSec=wftx.nSamplesPerSec*wftx.nBlockAlign;
  //-------------------------------------header
  hdr.lpData=(char*)buf;
  hdr.dwBufferLength=sizeof(buf);
  hdr.dwFlags=0;
  hdr.dwLoops=1;
  ris=waveOutOpen(&hwo,WAVE_MAPPER,&wftx,NULL,0,CALLBACK_NULL);
  ris=waveOutPrepareHeader(hwo,&hdr,sizeof(hdr));
  ris=waveOutWrite(hwo,&hdr,sizeof(hdr));
/* Prima di chiamare le prossime funzioni, devi pero' aspettare che il
buffer sonoro sia stato eseguito (waveOutWrite ritorna subito, senza
aspettare), magari prova ad usare la funzione Sleep() con un tempo adeguato
(in millisecondi)*/
  ris=waveOutUnPrepareHeader(hwo,&hdr,sizeof(hdr));
  ris=waveOutClose(hwo);
  VirtualFree(buf, 0, MEM_RELEASE);