/*
 * Copyright (c) 2018 Actions Semiconductor Co., Ltd
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file Media memory interface
 */
#ifndef __MEDIA_MEMORY_H__
#define __MEDIA_MEMORY_H__

/**
 * @defgroup media_memory_apis Media Memory APIs
 * @ingroup media_system_apis
 * @{
 */

/** ---media service global memory type--- */
typedef enum {
	/** playback input stream buffer */
	INPUT_PLAYBACK,

	/** capture input stream buffer */
	INPUT_CAPTURE,

	/** playback output stream buffer, after decode and mix*/
	OUTPUT_PLAYBACK,

	/** capture output stream buffer, after aec and encode*/
	OUTPUT_CAPTURE,

	/** decoder output stream buffer*/
	OUTPUT_DECODER,

	/** decoder output resample buffer*/
	OUTPUT_RESAMPLE,

	/** encoder input stream buffer */
	INPUT_ENCBUF,

	/** AEC reference stream buffer */
	AEC_REFBUF0,

	/** audiostream internal input pcm buffer */
	INPUT_PCM,

	/** audiostream internal output pcm buffer */
	OUTPUT_PCM,

	/** audiostream internal output pcm buffer */
	INPUT_RESAMPLE,

	/* ---bt stream global memory--- */

	/** bt upload sco send cache buffer */
	OUTPUT_SCO,

	/** bt upload sco send temp buffer */
	TX_SCO,

	/** bt upload sco send cache buffer */
	RX_SCO,

	/** ---other global memory--- */
	SBC_DECODER_GLOBAL_DATA,
	SBC_DECODER_SHARE_DATA,

	SBC_ENCODER_GLOBAL_DATA,
	SBC_ENCODER_SHARE_DATA,

	SBC_ENCODER_2_GLOBAL_DATA,
	SBC_ENCODER_2_SHARE_DATA,

	DECODER_GLOBAL_DATA,
	DECODER_SHARE_DATA,

	ENCODER_GLOBAL_DATA,
	ENCODER_SHARE_DATA,

	USB_UPLOAD_CACHE,
	USB_UPLOAD_PAYLOAD,

	TWS_LOCAL_INPUT, /* tws local stream */

	TTS_STACK,
	CODEC_STACK,

	TOOL_ASQT_STUB_BUF,
	TOOL_ASQT_DUMP_BUF,
	TOOL_ECTT_BUF,

	/* libraries's exported buffer */
	AEC_GLOBAL_DATA,
	AEC_SHARE_DATA,
	PLC_GLOBAL_DATA,
	PLC_SHARE_DATA,
	RESAMPLE_GLOBAL_DATA,
	RESAMPLE_SHARE_DATA,
	RESAMPLE_FRAME_DATA,
	PARSER_STACK,
	PARSER_CHUCK,	
	OUTPUT_PARSER,

	BT_TRANSMIT_INPUT,
	BT_TRANSMIT_OUTPUT,
    /* stream header for snoop tws */
    OUTPUT_PKG_HDR,

    /** capture input isr reload buffer for adc driver */
	INPUT_RELOAD_CAPTURE,

    DAE_PARAM,
    ENCODE_TIME,
    ENCODE_HEADER,

	/** encoder input stream buffer */
	MCU_INPUT_ENCBUF,
    /** encoder output stream buffer*/
    MCU_OUTPUT_ENCBUF,

    PARSER_EVT_BUFFER,

    MIX_INPUT_BUF,
    MIX_RES_BUF,
} cache_pool_type_e;

/**
 * @brief get cache mem pool address
 *
 * This routine provides to get target memory addr
 *
 * @param mem_type memory type @see cache_pool_type_e
 * @param stream_type indicator for meida sence
 *
 * @return pointer of mem addr
 */
void *media_mem_get_cache_pool(int mem_type, int stream_type);

/**
 * @brief get cache mem pool size
 *
 * This routine provides to get target memory size
 *
 * @param mem_type memory type @see cache_pool_type_e
 * @param stream_type indicator for meida sence
 *
 * @return size of memory
 */
int media_mem_get_cache_pool_size(int mem_type, int stream_type);

typedef enum {
	MCU_MEMORY,
	DSP_MEMORY,
	MCU_DSP_SHARE_MEMORY,
} media_memory_type_e;

/**
 * @brief malloc memory from media heap
 *
 * This routine provides to malloc memory from media heap
 *
 * @param size sizeof memory want to malloc
 * @param memory_type indicator memory type
 *
 * @return pointer of media mem addr
 */
void *media_mem_malloc(int size, int memory_type);

/**
 * @brief free media memory
 *
 * This routine provides to free media memory
 *
 * @param ptr addr of memory want to free
 *
 * @return N/A
 */
void media_mem_free(void *ptr);

/**
 * @} end defgroup media_memory_apis
 */
#endif /* __MEDIA_MEMORY_H__ */
