| 268 | } |
| 269 | |
| 270 | int 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 | } |
no outgoing calls
no test coverage detected