Source file: /~heha/basteln/Haus/Telefon/sprech.zip/src/s4.cpp

/* Nimmt Eingabedaten entgegen und schreibt diese
   als PCM mit 22 kHz, 8 bit, mono, auf WAVE_MAPPER
   TODO: Per Kommandozeile in WAV-Datei schreiben
   und Streamparameter variabel gestalten (auch ADPCM)
   Normalerweise kann SoX sowas, aber den fetten Brocken à
 */
#include <windows.h>
#include <mmsystem.h>
#include <stdio.h>
#include <fcntl.h>	// _O_BINARY
#include <io.h>		// _setmode()
#define elemof(x) (sizeof(x)/sizeof(*(x)))

void waitDone(WAVEHDR*pwh,HANDLE ev) {
 while (!(pwh->dwFlags&WHDR_DONE)) {
  WaitForSingleObject(ev,INFINITE);
//  MSG Msg;
//  GetMessage(&Msg,0,0,0);
 }
 pwh->dwFlags&=~WHDR_DONE;
}

void _cdecl mainCRTStartup() {
 HWAVEOUT hwo;
 WAVEFORMATEX wf={
   WAVE_FORMAT_PCM,
   1,
   22050,
   22050,
   1,
   8,
   0};
 HANDLE ev=CreateEvent(0,0,0,0);
 _setmode(_fileno(stdin),_O_BINARY);
 _setmode(_fileno(stdout),_O_BINARY);
 const int maxsamples=1024;
 int buflen=maxsamples*wf.nBlockAlign;
 waveOutOpen(&hwo,WAVE_MAPPER,&wf,(DWORD)ev,0,CALLBACK_EVENT);
 WAVEHDR wh[4];
 WAVEHDR*pwh;
 for (pwh=wh; pwh!=wh+elemof(wh); pwh++) {
  pwh->lpData=new char[pwh->dwBufferLength=buflen];
  pwh->dwFlags=0;
  waveOutPrepareHeader(hwo,pwh,sizeof*pwh);
  pwh->dwFlags|=WHDR_DONE;
 }
 pwh=wh;
 for(;;) {
//  fputc('a',stderr);
  if (feof(stdin)) break;	// geht nicht
  if (!(pwh->dwBufferLength=fread(pwh->lpData,1,buflen,stdin))) break;
  waitDone(pwh,ev);
  waveOutWrite(hwo,pwh,sizeof*pwh);
  pwh++; if (pwh==wh+elemof(wh)) pwh=wh;
 }
 for (pwh=wh; pwh!=wh+elemof(wh); pwh++) {
  waitDone(pwh,ev);
  waveOutUnprepareHeader(hwo,pwh,sizeof*wh);
  delete[] pwh->lpData;
 }
 waveOutClose(hwo);
 ExitProcess(0);
}
Detected encoding: OEM (CP437)1
Wrong umlauts? - Assume file is ANSI (CP1252) encoded