| 371 | } sRiffChunkHeader; |
| 372 | |
| 373 | int cWaveSinkCut::writeWaveHeader() |
| 374 | { |
| 375 | if (fHandle == NULL) return 0; |
| 376 | |
| 377 | // use reader parameters to determine |
| 378 | // nChannels |
| 379 | // sampleRate |
| 380 | long sampleRate; |
| 381 | // TODO: detect overlap!! |
| 382 | double fss = reader_->getFrameSizeSec(); |
| 383 | double ft = reader_->getLevelT(); |
| 384 | |
| 385 | nOvl = (long)ceil( (double)fieldSize * (1.0 - (ft/fss)) ); |
| 386 | |
| 387 | // get sample format from config options |
| 388 | if (forceSampleRate != 0) { |
| 389 | sampleRate = forceSampleRate; |
| 390 | } else { |
| 391 | sampleRate = (long)( 1.0 / (fss / (double)fieldSize) ); |
| 392 | } |
| 393 | |
| 394 | sRiffPcmWaveHeader head; |
| 395 | head.Riff = 0x46464952; // RIFF |
| 396 | head.Format = 0x45564157; // WAVE |
| 397 | head.Subchunk1ID = 0x20746D66; // fmt |
| 398 | head.Subchunk1Size = 4*4; // size of format chunk |
| 399 | head.SampleRate = sampleRate; |
| 400 | head.BitsPerSample = nBitsPerSample; |
| 401 | head.ByteRate = sampleRate * nChannels * nBytesPerSample; |
| 402 | head.AudioFormat = sampleFormat == SMILE_SF_32BIT_FLOAT ? WAVE_FORMAT_IEEE_FLOAT : WAVE_FORMAT_PCM; |
| 403 | head.NumChannels = nChannels; |
| 404 | head.BlockAlign = nChannels * nBytesPerSample; |
| 405 | head.Subchunk2ID = 0x61746164; // data |
| 406 | head.Subchunk2Size = nBlocks * nChannels * nBytesPerSample; // size of wave data chunk |
| 407 | head.FileSize = sizeof(sRiffPcmWaveHeader) + head.Subchunk2Size; |
| 408 | |
| 409 | fseek(fHandle, 0, SEEK_SET); |
| 410 | return (fwrite(&head, sizeof(sRiffPcmWaveHeader), 1, fHandle) == 1 ? sizeof(sRiffPcmWaveHeader) : 0 ); |
| 411 | } |
| 412 | |
| 413 | int cWaveSinkCut::writeDataFrame(cVector *m) |
| 414 | { |
nothing calls this directly
no test coverage detected