/* 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);
}
Vorgefundene Kodierung: OEM (CP437) | 1
|
|