diff --git a/android/hal-sco.c b/android/hal-sco.c
index ecf7a09..7e1a981 100644
--- a/android/hal-sco.c
+++ b/android/hal-sco.c
int fd;
uint8_t *downmix_buf;
+ uint8_t *cache;
+ size_t cache_len;
+
size_t samples;
struct timespec start;
size_t len, written = 0;
int ret;
uint16_t mtu = out->cfg.mtu;
+ uint8_t *p;
uint64_t audio_sent_us, audio_passed_us;
pfd.fd = out->fd;
return false;
}
+ len = bytes - written > mtu ? mtu : bytes - written;
clock_gettime(CLOCK_REALTIME, &now);
/* Mark start of the stream */
memcpy(&out->start, &now, sizeof(out->start));
}
+ if (out->cache_len) {
+ DBG("First packet cache_len %zd", out->cache_len);
+ memcpy(out->cache + out->cache_len, buffer,
+ mtu - out->cache_len);
+ p = out->cache;
+ } else {
+ if (bytes - written >= mtu)
+ p = (void *) buffer + written;
+ else {
+ memcpy(out->cache, buffer + written,
+ bytes - written);
+ out->cache_len = bytes - written;
+ DBG("Last packet, cache %zd bytes",
+ bytes - written);
+ written += bytes - written;
+ continue;
+ }
+ }
- len = bytes - written > mtu ? mtu : bytes - written;
-
- ret = write(out->fd, buffer + written, len);
+ ret = write(out->fd, p, len);
if (ret > 0) {
- written += ret;
+ if (out->cache_len) {
+ written = mtu - out->cache_len;
+ out->cache_len = 0;
+ } else
+ written += ret;
out->samples += ret / 2;
return -ENOMEM;
}
+ out->cache = malloc(out->cfg.mtu);
+ if (!out->cache) {
+ free(out->downmix_buf);
+ free(out);
+ return -ENOMEM;
+ }
+
DBG("size %zd", out_get_buffer_size(&out->stream.common));
/* Channel numbers for resampler */
if (out->resampler)
release_resampler(out->resampler);
+ free(out->cache);
free(out->downmix_buf);
free(out);
stream_out = NULL;
if (out->resampler)
release_resampler(out->resampler);
+ free(out->cache);
free(out->downmix_buf);
free(out);
sco_dev->out = NULL;