- ptrptr = &powd->to;
- for (i = 0; i < conf->numbuffers_arg; i++) {
- *ptrptr = para_malloc(sizeof(struct osx_buffer));
- (*ptrptr)->size = 0;
- (*ptrptr)->remaining = 0;
- (*ptrptr)->buffer = NULL;
- ptrptr = &(*ptrptr)->next;
- }
- *ptrptr = powd->from = powd->to;
-}
-
-static void fill_buffer(struct private_osx_write_data *powd, char *data, long bytes)
-{
- struct osx_buffer *b = powd->to;
- float *dest;
- long samples;
- enum sample_format sf = powd->sample_format;
-
- samples = (sf == SF_S8 || sf == SF_U8)? bytes : bytes / 2;
- assert(b->remaining == 0 || samples > 0);
- if (b->size != samples) {
- b->buffer = para_realloc(b->buffer, samples * sizeof(float));
- b->size = samples;
- }
- dest = b->buffer;
- switch (powd->sample_format) {
- case SF_U8: {
- uint8_t *src = (uint8_t *)data;
- while (samples--) {
- *dest++ = (*src++) / 256.0;
- }
- break;
- }
- case SF_S8: {
- int8_t *src = (int8_t *)data;
- while (samples--) {
- *dest++ = ((*src++) + 128) / 256.0;
+ mutex_lock(powd->mutex);
+ /*
+ * We fill with zeros if no data was yet written and we do not have
+ * enough to fill all buffers.
+ */
+ if (!powd->playing) {
+ size_t want = 0, have =
+ btr_get_input_queue_size(powd->callback_btrn);
+ for (i = 0; i < abl->mNumberBuffers; i++)
+ want += abl->mBuffers[i].mDataByteSize;
+ if (have < want) {
+ PARA_DEBUG_LOG("deferring playback (have = %zu < %zu = want)\n",
+ have, want);
+ for (i = 0; i < abl->mNumberBuffers; i++)
+ memset(abl->mBuffers[i].mData, 0,
+ abl->mBuffers[i].mDataByteSize);
+ goto out;