- if (pcm_convert_to_native_sint16(sfmt, self->pivot, nframes, buffer) < 0)
- return -1;
+ count = nframes * sfmt->channels_per_frame;
+ if (PCM_IS_FLOAT(sfmt)) {
+ float *ip = self->pivot;
+ int16_t *op = buffer;
+ for (i = 0; i < count; ++i)
+ op[i] = pcm_clip(ip[i] * 32768.0, -32768.0, 32767.0);
+ } else {
+ int32_t *ip = self->pivot;
+ int16_t *op = buffer;
+ if (sfmt->bits_per_channel <= 16) {
+ for (i = 0; i < count; ++i)
+ op[i] = ip[i] >> 16;
+ } else {
+ for (i = 0; i < count; ++i) {
+ int n = ((ip[i] >> 15) + 1) >> 1;
+ op[i] = (n == 0x8000) ? 0x7fff : n;
+ }
+ }
+ }