/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef CRAS_A2DP_INFO_H_
#define CRAS_A2DP_INFO_H_
#include "a2dp-codecs.h"
#define A2DP_BUF_SIZE_BYTES 1024
/* Represents the codec and encoded state of a2dp iodev.
* Members:
* codec - The codec used to encode PCM buffer to a2dp buffer.
* a2dp_buf - The buffer to hold encoded frames.
* codesize - Size of a SBC frame in bytes.
* frame_length - Size of an encoded SBC frame in bytes.
* frame_count - Queued SBC frame count currently in a2dp buffer.
* seq_num - Sequence number in rtp header.
* samples - Queued PCM frame count currently in a2dp buffer.
* nsamples - Cumulative number of encoded PCM frames.
* a2dp_buf_used - Used a2dp buffer counter in bytes.
*/
struct a2dp_info {
struct cras_audio_codec *codec;
uint8_t a2dp_buf[A2DP_BUF_SIZE_BYTES];
int codesize;
int frame_length;
int frame_count;
uint16_t seq_num;
int samples;
int nsamples;
size_t a2dp_buf_used;
};
/*
* Set up codec for given sbc capability.
*/
int init_a2dp(struct a2dp_info *a2dp, a2dp_sbc_t *sbc);
/*
* Destroys an a2dp_info.
*/
void destroy_a2dp(struct a2dp_info *a2dp);
/*
* Gets the codesize of the SBC codec.
*/
int a2dp_codesize(struct a2dp_info *a2dp);
/*
* Gets original size of a2dp encoded bytes.
*/
int a2dp_block_size(struct a2dp_info *a2dp, int encoded_bytes);
/*
* Gets the number of queued frames in a2dp_info.
*/
int a2dp_queued_frames(const struct a2dp_info *a2dp);
/*
* Drains queued samples in a2dp_info.
*/
void a2dp_drain(struct a2dp_info *a2dp);
/*
* Encodes samples using the codec for this a2dp instance, returns the number of
* pcm bytes processed.
* Args:
* a2dp: The a2dp info object.
* pcm_buf: The buffer of pcm samples.
* pcm_buf_size: Size of the pcm buffer.
* format_bytes: Number of bytes per sample.
* link_mtu: The maximum transmit unit.
*/
int a2dp_encode(struct a2dp_info *a2dp, const void *pcm_buf, int pcm_buf_size,
int format_bytes, size_t link_mtu);
/*
* Writes samples using a2dp, returns number of frames written.
* Args:
* a2dp: The a2dp info object.
* stream_fd: The file descriptor to send stream to.
* link_mtu: The maximum transmit unit.
*/
int a2dp_write(struct a2dp_info *a2dp, int stream_fd, size_t link_mtu);
#endif /* CRAS_A2DP_INFO_H_ */