000
09.09.2008, 17:02 Uhr
debianese
|
Hi Leute, ich bin's nochmal!
wie ich ja im letzten Thread geschrieben hatte, arbeit ich an einem Programm, das analoge signale über die Soundkarte aufnimmt.
a ich keine Erfahrung mit Sowas habe, hab ich mich da an nem Beispiel orientiert, und das klappt auch soweit ganz gut..
in der einen Funktion wir alles vorebereitet (WAVEFORMATEX und WaveHeader) und das einlesen gestartet. in einer Weiteren Funktion soll das ganze gestoppt werden und die daten sollen in eine Datei geschrieben werden..
Soweit so gut.. die Datei wird brav angelegt und mann kann auch die Riff, fmt und datachunks erkennen... allerdings folgten auf das 'data' nur lauter nullen also scheinbar läuft da beim einlesen irgendwas schief..
hier mal die entsprechenden Funktionen.. viellciht hat ja jemand ne idee, was ich flasch mache...
Einlesen starten:
C++: |
int sampleRate = 44100;
_format.wFormatTag = WAVE_FORMAT_PCM; // simple, uncompressed format _format.nChannels = 1; // 1=mono, 2=stereo _format.nSamplesPerSec = sampleRate; // 44100 _format.nAvgBytesPerSec = sampleRate; // = nSamplesPerSec * n.Channels * wBitsPerSample/8 _format.nBlockAlign = 1; // = n.Channels * wBitsPerSample/8 _format.wBitsPerSample = 8; // 16 for high quality, 8 for telephone-grade _format.cbSize = 0;
int test = 0; if (test = waveInOpen(&_hWaveIn, WAVE_MAPPER, &_format, 0L, 0L, WAVE_FORMAT_DIRECT)) { // ... Fehler abfangen... }
_data = (PBYTE) malloc(INP_BUFFER_SIZE); if (!_data) { // Unable to allocate memory for data return 6; }
_WaveInHdr = (PWAVEHDR) malloc(sizeof(WAVEHDR)); if (!_WaveInHdr) { // Unable to allocate memory for WaveHeader return 7; }
// initialize Header _WaveInHdr->lpData = (LPSTR) _data; _WaveInHdr->dwBufferLength = INP_BUFFER_SIZE; _WaveInHdr->dwBytesRecorded = 0; _WaveInHdr->dwUser = 0; _WaveInHdr->dwFlags = 0; _WaveInHdr->dwLoops = 1; _WaveInHdr->lpNext = NULL; _WaveInHdr->reserved = 0;
waveInPrepareHeader(_hWaveIn, _WaveInHdr, sizeof(WAVEHDR));
if (waveInAddBuffer(_hWaveIn, _WaveInHdr, sizeof(WAVEHDR))) // Unable to add buffer return 8;
if (waveInStart(_hWaveIn)) // unable to start reading return 9;
return 0;
|
Datei abspeichern:
C++: |
MMCKINFO ChunkInfo; MMCKINFO FormatChunk; MMCKINFO DataChunk;
waveInClose(_hWaveIn); HMMIO handle = mmioOpen(L"test4.wav", 0, MMIO_CREATE | MMIO_WRITE); if (!handle) { //Unable to open file return 1; }
mmioCreateChunk(handle, &ChunkInfo, MMIO_CREATERIFF); FormatChunk.ckid = mmioStringToFOURCC(L"fmt", 0); mmioCreateChunk(handle, &FormatChunk, 0); DataChunk.ckid = mmioStringToFOURCC(L"data", 0); mmioCreateChunk(handle, &DataChunk, 0);
mmioWrite(handle, (char*) &_format, sizeof(WAVEFORMATEX) - 2);
mmioAscend(handle, &FormatChunk, 0); mmioWrite(handle, (char*) &_data, DataChunk.cksize); mmioClose(handle, 0); return 0; } else { return 2; }
|
|