示例#1
0
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;
}
示例#2
0
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;
}