/* 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_HFP_INFO_H_
#define CRAS_HFP_INFO_H_

#include "cras_audio_format.h"
#include "cras_types.h"

/* Linked list to hold the information of callbacks to trigger
 * when the size of SCO packet has changed.
 */
struct hfp_packet_size_changed_callback {
	void *data;
	void (*cb)(void *data);
	struct hfp_packet_size_changed_callback *next, *prev;
};

/* Structure to handle sample transmission between CRAS and the SCO
 * socket acquired from bluez.
 */
struct hfp_info;

/* Creates an hfp_info instance.
 */
struct hfp_info *hfp_info_create();

/* Destroys given hfp_info instance. */
void hfp_info_destroy(struct hfp_info *info);

/* Sets the wbs_logger to hfp_info instance. */
void hfp_info_set_wbs_logger(struct hfp_info *info,
			     struct packet_status_logger *wbs_logger);

/* Checks if given hfp_info is running. */
int hfp_info_running(struct hfp_info *info);

/* Starts the hfp_info to transmit and reveice samples to and from the file
 * descriptor of a SCO socket. This should be called from main thread.
 * Args:
 *    codec - 1 for CVSD, 2 for mSBC per HFP 1.7 specification.
 */
int hfp_info_start(int fd, unsigned int mtu, int codec, struct hfp_info *info);

/* Stops given hfp_info. This implies sample transmission will
 * stop and socket be closed. This should be called from main thread.
 */
int hfp_info_stop(struct hfp_info *info);

/* Queries how many frames of data are queued.
 * Args:
 *    info - The hfp_info holding the buffer to query.
 *    direction - The direction to indicate which buffer to query, playback
 *          or capture.
 */
int hfp_buf_queued(struct hfp_info *info, enum CRAS_STREAM_DIRECTION direction);

/* Fill output buffer with zero frames.
 * Args:
 *    info - The hfp_info holding the output buffer.
 *    nframes - How many zero frames to fill.
 * Returns:
 *    The actual number of zero frames filled.
 */
int hfp_fill_output_with_zeros(struct hfp_info *info, unsigned int nframes);

/* Force output buffer level to given value. Calling this may override
 * existing data so use it only when buffer has been filled by zeros.
 * If no output device was added, calling this has no effect.
 * Args:
 *    info - The hfp_info holding output buffer.
 *    level - Value of the target output level.
 */
void hfp_force_output_level(struct hfp_info *info, unsigned int level);

/* Gets how many frames of the buffer are used.
 * Args:
 *    info - The hfp_info holding buffer.
 *    direction - The direction of the buffer.
 */
int hfp_buf_size(struct hfp_info *info, enum CRAS_STREAM_DIRECTION direction);

/* Acquire buffer of count frames for dev to write(or read,
 * depend on dev's direction).
 * Args:
 *    info - The hfp_info holding buffer.
 *    direction - The direction of dev to acquire buffer for.
 *    buf - To hold the returned pointer of acquired buffer.
 *    count - Number of bytes of buffer to acquire, will be filled with the
 *    actual acquired buffer size in bytes.
 */
void hfp_buf_acquire(struct hfp_info *info,
		     enum CRAS_STREAM_DIRECTION direction, uint8_t **buf,
		     unsigned *count);

/* Releases the previously acquired buffer.
 * Args:
 *    info - The hfp_info holding the buffer.
 *    direction - The direction of dev to release buffer for.
 *    written_frames - The size of the previously acquired buffer in frames
 *    which's been used.
 */
void hfp_buf_release(struct hfp_info *info,
		     enum CRAS_STREAM_DIRECTION direction,
		     unsigned written_frames);

/* Adds cras_iodev to given hfp_info.  Only when an output iodev is added,
 * hfp_info starts sending samples to the SCO socket. Similarly, only when an
 * input iodev is added, it starts to read samples from SCO socket.
 */
int hfp_info_add_iodev(struct hfp_info *info,
		       enum CRAS_STREAM_DIRECTION direction,
		       struct cras_audio_format *format);

/* Removes cras_iodev from hfp_info.  hfp_info will stop sending or
 * reading samples right after the iodev is removed. This function is used for
 * iodev closure.
 */
int hfp_info_rm_iodev(struct hfp_info *info,
		      enum CRAS_STREAM_DIRECTION direction);

/* Checks if there's any iodev added to the given hfp_info. */
int hfp_info_has_iodev(struct hfp_info *info);

#endif /* CRAS_HFP_INFO_H_ */
