aufgezeichneten Soundbuffer in Datei schreiben.



  • Noch mehr Fragen,

    ich möchte meinen aufgezeichneten Buffer nach dem ich die Aufzeichnung beende in eine Datei speichern um sie später noch mal abspielen zu können. Dies möchte ich ohne irgendwelche Kopfdaten machen.
    Wenn ich es einfach so mache:

    waveInClose(hWaveIn);
    FILE* pFile; 
    pFile = fopen("mywave.dat", "wb");
    lpSaveBuffer = pWaveHdr1->lpData;
    int nLen = strlen(lpSaveBuffer);
    fwrite(lpSaveBuffer, strlen(lpSaveBuffer), dwDataLength, pFile);
    fclose(pFile);
    

    kann ich die Aufzeichnung nicht wieder abspielen nachdem ich Sie aus der Datei geladen habe.
    Dies mache ich so:

    FILE* pFile = fopen("mywave.dat", "rb");
    fread(lpSaveBuffer, dwDataLength, dwDataLength, pFile);
    fclose(pFile);
    //open waveform audio for output
    waveOutOpen(&hWaveOut,WAVE_MAPPER,&waveform,0,0, CALLBACK_NULL);
    waveOutWrite(hWaveOut, &header, sizeof(WAVEHDR));
    

    Dann gibt es keine Ausgabe. Der Wavehdr zum Apspielen hat die gleichen Einstellungen wie der zum Aufzeichnen.

    waveform.wFormatTag = WAVE_FORMAT_PCM;
    waveform.nChannels = 1;
    waveform.nSamplesPerSec = 8000;
    waveform.wBitsPerSample = 16;
    waveform.cbSize = 0;
    waveform.nBlockAlign  = (waveform.nChannels * waveform.wBitsPerSample)/8;
    waveform.nAvgBytesPerSec = (waveform.nSamplesPerSec*waveform.nBlockAlign);
    

    Wo könnte den hier mein Fehler liegen?



  • Hallo,

    da stimmt einiges nicht. Zunächst ein wichtiger Punkt:

    The buffer must be prepared with the waveOutPrepareHeader function before it is passed to waveOutWrite.

    Dazu gehört noch waveOutUnprepareHeader:

    This function complements waveOutPrepareHeader. You must call this function before freeing the buffer. After passing a buffer to the device driver with the waveOutWrite function, you must wait until the driver is finished with the buffer before calling waveOutUnprepareHeader.

    Und mit strlen kannst du in diesem Falle nicht arbeiten, dafür gibt es aber die dwBufferLength-Komponente der WAVEHDR-Struktur.

    MfG,

    Probe-Nutzer



  • Sorry die waveOutUnprepareHeader hatte ich nur vergessen mit aufzführen. Es lag aber an dem Arbeiten mit strlen. Habe jetzt dwBufferLength eingesetzt und siehe da es läuft.

    Besten dank


Anmelden zum Antworten