/* 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_SERVER_METRICS_H_
#define CRAS_SERVER_METRICS_H_

#include <stdbool.h>

#include "cras_iodev.h"
#include "cras_rstream.h"

extern const char kNoCodecsFoundMetric[];

enum CRAS_METRICS_BT_SCO_ERROR_TYPE {
	CRAS_METRICS_SCO_SKT_SUCCESS = 0,
	CRAS_METRICS_SCO_SKT_CONNECT_ERROR = 1,
	CRAS_METRICS_SCO_SKT_OPEN_ERROR = 2,
	CRAS_METRICS_SCO_SKT_POLL_TIMEOUT = 3,
	CRAS_METRICS_SCO_SKT_POLL_ERR_HUP = 4,
};

/* Logs the error type happens when setting up SCO connection. This is mainly
 * used to track whether the setup of SCO connection succeeds and the frequency
 * of different errors. This will also be used to track if our fixes for these
 * errors address the issues we find.
 */
int cras_server_metrics_hfp_sco_connection_error(
	enum CRAS_METRICS_BT_SCO_ERROR_TYPE type);

/* Logs an enum representing which spec does HFP headset supports battery
 * indicator. Apple, HFP, none or both. */
int cras_server_metrics_hfp_battery_indicator(int battery_indicator_support);

/* Logs an enum representing the spec through which the battery level change
 * event reported. Apple or HFP.*/
int cras_server_metrics_hfp_battery_report(int battery_report);

/* Logs if connected HFP headset supports wideband speech. */
int cras_server_metrics_hfp_wideband_support(bool supported);

/* Logs the selected codec in HFP wideband connection. */
int cras_server_metrics_hfp_wideband_selected_codec(int codec);

/* Logs the number of packet loss per 1000 packets under HFP capture. */
int cras_server_metrics_hfp_packet_loss(float packet_loss_ratio);

/* Logs runtime of a device. */
int cras_server_metrics_device_runtime(struct cras_iodev *iodev);

/* Logs the volume of a device. */
int cras_server_metrics_device_volume(struct cras_iodev *iodev);

/* Logs the highest delay time of a device. */
int cras_server_metrics_highest_device_delay(
	unsigned int hw_level, unsigned int largest_cb_level,
	enum CRAS_STREAM_DIRECTION direction);

/* Logs the highest hardware level of a device. */
int cras_server_metrics_highest_hw_level(unsigned hw_level,
					 enum CRAS_STREAM_DIRECTION direction);

/* Logs the longest fetch delay of a stream in millisecond. */
int cras_server_metrics_longest_fetch_delay(unsigned delay_msec);

/* Logs the number of underruns of a device. */
int cras_server_metrics_num_underruns(unsigned num_underruns);

/* Logs the missed callback event. */
int cras_server_metrics_missed_cb_event(struct cras_rstream *stream);

/* Logs information when a stream creates. */
int cras_server_metrics_stream_create(const struct cras_rstream_config *config);

/* Logs information when a stream destroys. */
int cras_server_metrics_stream_destroy(const struct cras_rstream *stream);

/* Logs the number of busyloops for different time periods. */
int cras_server_metrics_busyloop(struct timespec *ts, unsigned count);

/* Logs the length of busyloops. */
int cras_server_metrics_busyloop_length(unsigned length);

/* Initialize metrics logging stuff. */
int cras_server_metrics_init();

#endif /* CRAS_SERVER_METRICS_H_ */
