* limitations under the License.
*/
+#include <system/audio.h>
#include <audio_utils/sndfile.h>
#include <audio_utils/primitives.h>
#ifdef HAVE_STDERR
fseek(stream, (long) (chunkSize - minSize), SEEK_CUR);
}
unsigned channels = little2u(&fmt[2]);
- // FIXME FCC_8
- if (channels != 1 && channels != 2 && channels != 4 && channels != 6 && channels != 8) {
+ if ((channels < 1) || (channels > FCC_8)) {
#ifdef HAVE_STDERR
fprintf(stderr, "unsupported channels %u\n", channels);
#endif
int sub = info->format & SF_FORMAT_SUBMASK;
if (!(
(info->samplerate > 0) &&
- // FIXME FCC_8
- (info->channels > 0 && info->channels <= 8) &&
+ (info->channels > 0 && info->channels <= FCC_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;
}
case SF_FORMAT_PCM_24:
bitsPerSample = 24;
break;
+ case SF_FORMAT_PCM_32:
+ bitsPerSample = 32;
+ break;
default: // not reachable
bitsPerSample = 0;
break;
handle->remaining -= actualFrames;
switch (format) {
case SF_FORMAT_PCM_U8:
-#if 0
- // TODO - implement
memcpy_to_float_from_u8(ptr, (const unsigned char *) temp,
actualFrames * handle->info.channels);
-#endif
free(temp);
break;
case SF_FORMAT_PCM_16:
handle->remaining -= actualFrames;
switch (format) {
case SF_FORMAT_PCM_U8:
-#if 0
- // TODO - implement
memcpy_to_i32_from_u8(ptr, (const unsigned char *) temp,
actualFrames * handle->info.channels);
-#endif
free(temp);
break;
case SF_FORMAT_PCM_16:
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;
+}