MCPcopy Create free account
hub / github.com/audeering/opensmile / writeData

Method writeData

src/iocore/waveSink.cpp:270–324  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

268}
269
270int cWaveSink::writeData(cMatrix *m)
271{
272 if (m->N != nChannels) { SMILE_IERR(1,"number of channels is inconsistent! %i <-> %i",m->fmeta->N,nChannels); return 0; }
273 else {
274 // convert data
275 long i;
276 if ((m->nT > sampleBufferLen)&&(sampleBuffer!=NULL)) free(sampleBuffer);
277 sampleBufferLen = m->nT;
278 if (sampleBuffer == NULL) sampleBuffer = malloc(nBytesPerSample*nChannels*m->nT);
279
280 int8_t *b8;
281 int16_t *b16;
282 int32_t *b32;
283 float *b32f;
284
285 switch(sampleFormat) {
286 case SMILE_SF_8BIT:
287 b8 = (int8_t*)sampleBuffer;
288 for (i=0; i<m->nT*nChannels; i++) { b8[i] = (int8_t)round(m->data[i] * 127.0); }
289 break;
290 case SMILE_SF_16BIT:
291 b16 = (int16_t*)sampleBuffer;
292 for (i=0; i<m->nT*nChannels; i++) { b16[i] = (int16_t)round(m->data[i] * 32767.0); }
293 break;
294 case SMILE_SF_24BIT:
295 b32 = (int32_t*)sampleBuffer;
296 for (i=0; i<m->nT*nChannels; i++) { b32[i] = (int32_t)round(m->data[i] * 32767.0 * 256.0); }
297 break;
298 case SMILE_SF_24BITp:
299 COMP_ERR("24-bit wave file with 3 bytes per sample encoding not yet supported!");
300 //int16_t *b16 = buf;
301 //for (i=0; i<m->nT*nChannels; i++) { b16[i] = (int16_t)round(m->data[i] * 32767.0); }
302 //break;
303 case SMILE_SF_32BIT:
304 b32 = (int32_t*)sampleBuffer;
305 for (i=0; i<m->nT*nChannels; i++) { b32[i] = (int32_t)round(m->data[i] * 32767.0 * 32767.0 * 2.0); }
306 break;
307 case SMILE_SF_32BIT_FLOAT:
308 b32f = (float*)sampleBuffer;
309 for (i=0; i<m->nT*nChannels; i++) { b32f[i] = (float)(m->data[i]); }
310 break;
311 default:
312 SMILE_IERR(1,"unknown sampleFormat encountered in writeData(): %i",sampleFormat);
313 }
314
315 long written = (long)fwrite(sampleBuffer, nBytesPerSample*nChannels, m->nT, fHandle);
316 if (written != m->nT) {
317 SMILE_IERR(2, "Data lost during write to output file (%ld of %ld records written)\n ", written, m->nT);
318 // TODO: try to repeat write??
319 }
320 nBlocks += written;
321 curWritePos += nBytesPerSample*nChannels * written;
322 return written;
323 }
324}

Callers 2

Calls

no outgoing calls

Tested by

no test coverage detected