unsigned int a2dp_write(const void *pcm_buf, int pcm_buf_size, struct a2dp_info *a2dp, int format_bytes, int stream_fd, size_t link_mtu, int *written_bytes) { int processed; size_t out_encoded; if (link_mtu > A2DP_BUF_SIZE_BYTES) link_mtu = A2DP_BUF_SIZE_BYTES; *written_bytes = 0; processed = a2dp->codec->encode(a2dp->codec, pcm_buf, pcm_buf_size, a2dp->a2dp_buf + a2dp->a2dp_buf_used, link_mtu - a2dp->a2dp_buf_used, &out_encoded); if (a2dp->codesize > 0) a2dp->frame_count += processed / a2dp->codesize; a2dp->a2dp_buf_used += out_encoded; if (processed) { a2dp->samples += processed / format_bytes; a2dp->nsamples += processed / format_bytes; } /* Do avdtp write once no more pcm buffer processed to a2dp buffer, * or a2dp buffer already accumulated to half the mtu. */ if (processed == 0 || a2dp->a2dp_buf_used > link_mtu / 2) *written_bytes = avdtp_write(stream_fd, a2dp); return processed; }
int a2dp_write(a2dpData d, const void* buffer, int count) { struct bluetooth_data* data = (struct bluetooth_data*)d; uint8_t* src = (uint8_t *)buffer; int codesize; int err, ret = 0; long frames_left = count; int encoded; unsigned int written; const char *buff; int did_configure = 0; #ifdef ENABLE_TIMING uint64_t begin, end; DBG("********** a2dp_write **********"); begin = get_microseconds(); #endif err = wait_for_start(data, WRITE_TIMEOUT); if (err < 0) return err; codesize = data->codesize; while (frames_left >= codesize) { /* Enough data to encode (sbc wants 512 byte blocks) */ encoded = sbc_encode(&(data->sbc), src, codesize, data->buffer + data->count, sizeof(data->buffer) - data->count, &written); if (encoded <= 0) { ERR("Encoding error %d", encoded); goto done; } VDBG("sbc_encode returned %d, codesize: %d, written: %d\n", encoded, codesize, written); src += encoded; data->count += written; data->frame_count++; data->samples += encoded; data->nsamples += encoded; /* No space left for another frame then send */ if ((data->count + written >= data->link_mtu) || (data->count + written >= BUFFER_SIZE)) { VDBG("sending packet %d, count %d, link_mtu %u", data->seq_num, data->count, data->link_mtu); err = avdtp_write(data); if (err < 0) return err; } ret += encoded; frames_left -= encoded; } if (frames_left > 0) ERR("%ld bytes left at end of a2dp_write\n", frames_left); done: #ifdef ENABLE_TIMING end = get_microseconds(); print_time("a2dp_write total", begin, end); #endif return ret; }