Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Wav Files schreiben

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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;
    }

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.09.2008, 23:07 Uhr
ao

(Operator)


Ich bin mir nicht so ganz sicher, aber ist dieses Wave-Reading nicht asynchron? Sprich, musst du nicht noch einen Callback anmelden, der vom MM-Subsystem aufgerufen wird, wenn der Wave-Header voll ist?

Das Dateischreiben gehört dann in diesen Callback, und die Datei muss natürlich vorher klargemacht sein.

Lies noch mal alles genau nach, was in der MSDN-Library über Wave-Input steht. Und such z.B. auf codeproject.com nach Beispielen, da müsste es eigentlich was geben.


C++:
    _format.nAvgBytesPerSec = sampleRate; // = nSamplesPerSec * n.Channels * wBitsPerSample/8


Das stimmt so nur für Mono und 8 Bit Auflösung. Ich wette, wenn du ein anderes Format einstellst, vergisst du, das anzupassen. Programmier das lieber sofort ordentlich.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: