Add sf_writef_int to tiny libsndfile
Change-Id: I301781c079b0c6501a940dd7f6b782dd876d2899
diff --git a/audio_utils/tinysndfile.c b/audio_utils/tinysndfile.c
index e35c75d..ca03a72 100644
--- a/audio_utils/tinysndfile.c
+++ b/audio_utils/tinysndfile.c
@@ -303,7 +303,7 @@
(info->channels > 0 && info->channels <= 8) &&
((info->format & SF_FORMAT_TYPEMASK) == SF_FORMAT_WAV) &&
(sub == SF_FORMAT_PCM_16 || sub == SF_FORMAT_PCM_U8 || sub == SF_FORMAT_FLOAT ||
- sub == SF_FORMAT_PCM_24)
+ sub == SF_FORMAT_PCM_24 || sub == SF_FORMAT_PCM_32)
)) {
return NULL;
}
@@ -343,6 +343,9 @@
case SF_FORMAT_PCM_24:
bitsPerSample = 24;
break;
+ case SF_FORMAT_PCM_32:
+ bitsPerSample = 32;
+ break;
default: // not reachable
bitsPerSample = 0;
break;
@@ -626,3 +629,21 @@
handle->remaining += actualFrames;
return actualFrames;
}
+
+sf_count_t sf_writef_int(SNDFILE *handle, const int *ptr, sf_count_t desiredFrames)
+{
+ if (handle == NULL || handle->mode != SFM_WRITE || ptr == NULL || desiredFrames <= 0)
+ return 0;
+ size_t desiredBytes = desiredFrames * handle->bytesPerFrame;
+ size_t actualBytes = 0;
+ switch (handle->info.format & SF_FORMAT_SUBMASK) {
+ case SF_FORMAT_PCM_32:
+ actualBytes = fwrite(ptr, sizeof(char), desiredBytes, handle->stream);
+ break;
+ default: // transcoding from other formats not yet implemented
+ break;
+ }
+ size_t actualFrames = actualBytes / handle->bytesPerFrame;
+ handle->remaining += actualFrames;
+ return actualFrames;
+}