/* * Copyright (c) 2018 Actions Semiconductor Co., Ltd * * SPDX-License-Identifier: Apache-2.0 */ /** * @file media service interface */ #ifndef __MEDIA_SERVICE_H__ #define __MEDIA_SERVICE_H__ #include #include #include #include #include #include #ifdef CONFIG_BT_MANAGER #include #endif /** * @defgroup media_service_apis App Media Service APIs * @ingroup media_system_apis * @{ */ /** * @cond INTERNAL_HIDDEN */ /** * @brief media service event notify callback * * This routine called by media service, notify media service state changed * event media_event_type_e * * @param event event type of media_srv_status_e. * @param data event data. * @param len event data length. * @param user_data user_data passed in media_init_param_t during media_player_open * * @return N/A. */ typedef void (*media_srv_event_notify_t)(uint32_t event, void *data, uint32_t len, void *user_data); typedef void (*MIX_CALLBAK)(io_stream_t, int, void*); typedef struct { uint8_t in_rate; uint8_t out_rate; uint8_t channels; uint8_t format; uint8_t sample_bits; /*master channel gain -12db - 0db*/ short master_db; /*master channel gain -12db - 0db*/ short mix_db; /*for close input stream*/ MIX_CALLBAK callback; io_stream_t input_stream; } mix_service_param_t; /** media service operation message type*/ enum media_srv_operation_e { /** open a new media service instance*/ MSG_MEDIA_SRV_OPEN = MSG_SRV_MESSAGE_START, /** close target media service instance*/ MSG_MEDIA_SRV_CLOSE, /** start to play*/ MSG_MEDIA_SRV_PLAY, /** stop to play*/ MSG_MEDIA_SRV_STOP, /** media service pause*/ MSG_MEDIA_SRV_PAUSE, /** media service resume*/ MSG_MEDIA_SRV_RESUME, MSG_MEDIA_SRV_START_STOP_DECODE, /** media service trigger to process data*/ MSG_MEDIA_SRV_DATA_PROCESS, /** media service dump data*/ MSG_MEDIA_SRV_DUMP_DATA, /** media service seek to play*/ MSG_MEDIA_SRV_SEEK, /** media service query parameter*/ MSG_MEDIA_SRV_GET_PARAMETER, /** media service set parameter*/ MSG_MEDIA_SRV_SET_PARAMETER, /** media service get global parameter*/ MSG_MEDIA_SRV_GET_GLOBAL_PARAMETER, /** media service set global parameter*/ MSG_MEDIA_SRV_SET_GLOBAL_PARAMETER, /** media service set mix stream*/ MSG_MEDIA_SRV_SET_MIX_STREAM, }; /** dumpable data tag */ enum media_dump_data_tag_e { /** mic left channel */ MEDIA_DATA_TAG_MIC1 = 0, /** mic right channel */ MEDIA_DATA_TAG_MIC2, /** reference (single channel) */ MEDIA_DATA_TAG_REF, /** AEC left channel */ MEDIA_DATA_TAG_AEC1, /** AEC right channel */ MEDIA_DATA_TAG_AEC2, /** encoder (left channel) input */ MEDIA_DATA_TAG_ENCODE_IN1, /** encoder right channel input */ MEDIA_DATA_TAG_ENCODE_IN2, /** encoder output stream */ MEDIA_DATA_TAG_ENCODE_OUT, /* resample in data*/ MEDIA_DATA_TAG_RESAMPLE_IN, /*resample out data*/ MEDIA_DATA_TAG_RESAMPLE_OUT, /** decoder input stream */ MEDIA_DATA_TAG_DECODE_IN, /** decoder (left channel) output */ MEDIA_DATA_TAG_DECODE_OUT1, /** decoder right channel output */ MEDIA_DATA_TAG_DECODE_OUT2, /** plc output */ MEDIA_DATA_TAG_PLC, /** dac (left channel) output */ MEDIA_DATA_TAG_DAC1, /** dac right channel output */ MEDIA_DATA_TAG_DAC2, MEDIA_TAG_FFVP_DATA, MEDIA_TAG_ENCODED_DATA, }; /** media service state */ typedef enum { /** media service stop state */ MEDIA_SRV_STATUS_STOP = 0, /** media service configed state */ MEDIA_SRV_STATUS_CONFIG, /** media service ready state */ MEDIA_SRV_STATUS_READY, /** media service playing state */ MEDIA_SRV_STATUS_PLAY, /** media service paused state */ MEDIA_SRV_STATUS_PAUSE, /** media service finished state */ MEDIA_SRV_STATUS_FINISHED, /** media service Error state */ MEDIA_SRV_STATUS_ERROR, /** media service NULL state */ MEDIA_SRV_STATUS_NULL, } media_srv_status_e; /** media service parameter name */ typedef enum { /** media service global parameter */ /** set background recording */ MEDIA_PARAM_SET_RECORD, /** media player parameter */ /** media info */ MEDIA_PARAM_MEDIAINFO, /** break point */ MEDIA_PARAM_BREAKPOINT, /** output mode */ MEDIA_PARAM_OUTPUT_MODE, /** get state */ MEDIA_PARAM_GET_STATE, /** energy filter param */ MEDIA_PARAM_ENERGY_FILTER, /** audio max lantency param */ MEDIA_PARAM_AUDIO_LATENCY, /** audio sync play time */ MEDIA_PARAM_SET_PLAY_TIME, /** get record time */ MEDIA_PARAM_GET_RECORD_TIME, /** The following are audio effect operations, do not mix other operation types */ /** audio effect operation set volume */ MEDIA_EFFECT_EXT_SET_VOLUME, /** audio effect operation set mic mute */ MEDIA_EFFECT_EXT_SET_MIC_MUTE, /** audio effect operation set hfp connected flag */ MEDIA_EFFECT_EXT_HFP_CONNECTED, /** audio effect operation enable dae all functions */ MEDIA_EFFECT_EXT_SET_DAE_ENABLE, /** audio effect operation bypass dae all functions, except fade in/out */ MEDIA_EFFECT_EXT_SET_DAE_BYPASS, /** audio effect operation bypass dae all functions, except fade in/out */ MEDIA_EFFECT_EXT_SET_EFFECT_BYPASS, /** audio effect operation set dae output mode*/ MEDIA_EFFECT_EXT_SET_DAE_OUTPUT_MODE, /** audio effect operation update effect param*/ MEDIA_EFFECT_EXT_UPDATE_PARAM, MEDIA_EFFECT_EXT_UPDATE_AEC_PARAM, /** audio effect operation get dae output mode*/ MEDIA_EFFECT_EXT_GET_DAE_OUTPUT_MODE, /** audio effect operation get freq point energy*/ MEDIA_EFFECT_EXT_GET_FREQPOINT_ENERGY, MEDIA_EFFECT_EXT_GET_TIMEDOMAIN_ENERGY, MEDIA_EFFECT_EXT_GET_FREQBAND_ENERGY, MEDIA_EFFECT_EXT_GET_EFFECT_ENABLE, /** audio effect operation set energy freq points */ MEDIA_EFFECT_EXT_SET_ENERGY_FREQPOINT, /** audio effect operation set fade in*/ MEDIA_EFFECT_EXT_FADEIN, MEDIA_EFFECT_EXT_GET_FADEIN_TIME, MEDIA_EFFECT_EXT_GET_FADEIN_STATUS, /** audio effect operation set fade out*/ MEDIA_EFFECT_EXT_FADEOUT, MEDIA_EFFECT_EXT_GET_FADEOUT_TIME, MEDIA_EFFECT_EXT_GET_FADEOUT_STATUS, /** audio effect operation check fade out finished*/ MEDIA_EFFECT_EXT_CHECK_FADEOUT_FINISHED, MEDIA_EFFECT_EXT_SET_ENERGY_PARAM, /** audio effect operation set subwoofer volume */ MEDIA_EFFECT_EXT_SET_SUBWOOFER_VOLUME, /** audio effect operation set LR balance*/ MEDIA_EFFECT_EXT_SET_LR_BALANCE, MEDIA_EFFECT_EXT_SET_SUBEFFECT, MEDIA_EFFECT_EXT_SET_UPSTREAM_DAE_ENABLE, } media_param_e; /* MEDIA_PARAM_OUTPUT_MODE */ typedef enum { MEDIA_OUTPUT_MODE_DEFAULT = 0, MEDIA_OUTPUT_MODE_LEFT = 1, MEDIA_OUTPUT_MODE_RIGHT = 2, NUM_MEDIA_OUTPUT_MODES, } media_output_mode_e; /* MEDIA_PARAM_OUTPUT_MODE */ typedef enum { CAPTURE_INPUT_FROM_STREAM = 0, CAPTURE_INPUT_FROM_DSP_ADC_FIFO = 1, CAPTURE_INPUT_FROM_DSP_DEC_OUTPUT = 2, NUM_CAPTURE_INPUT_MODES, } media_capture_input_mode_e; /* MEDIA_EFFECT_EXT_SET_DAE_OUTPUT_MODE */ typedef enum { MEDIA_EFFECT_OUTPUT_DEFAULT = 0, MEDIA_EFFECT_OUTPUT_L_R_SWAP = 1, MEDIA_EFFECT_OUTPUT_L_R_MIX = 2, MEDIA_EFFECT_OUTPUT_L_ONLY = 3, MEDIA_EFFECT_OUTPUT_R_ONLY = 4, NUM_MEDIA_EFFECT_OUTPUT_MODES, } media_effect_output_mode_e; typedef struct { /** param type */ int type; /** param buffer */ void *pbuf; /** param buffer length */ unsigned int plen; } media_param_t; typedef struct { /** media handle */ void *handle; /** param */ media_param_t param; /** store the result: 0 successful, others failed */ int result; } media_srv_param_t; typedef struct { int total_time; /* total time in milliseconds */ int avg_bitrate; /* average bit reate in kbps */ int sample_rate; /* sample rate in Hz */ int channels; /* channels */ unsigned int file_hdr_len; /* file header(tags) length */ } media_info_t; typedef struct { uint8_t type; uint32_t overlay_id; as_parser_ops_t ops; } parser_config_info_t; typedef struct { /** required in ms*/ int time_offset; /** optional, may accelerate the seeking for some codec format (mp3, etc.) * must set <= 0, if not available. in bytes */ int file_offset; } media_breakpoint_info_t; typedef struct { int num_points; short values[10]; } media_freqpoint_energy_info_t; #define MEDIA_SEEK_SET SEEK_DIR_BEG #define MEDIA_SEEK_CUR SEEK_DIR_CUR #define MEDIA_SEEK_END SEEK_DIR_END /** media seek info structure*/ typedef struct { /** should be one of AP_SEEK_SET, AP_SEEK_CUR and AP_SEEK_END */ int whence; /** required in ms*/ int time_offset; /** optional, may accelerate the seeking for some codec format (mp3, etc.) * must set <= 0, if not available. */ int file_offset; /* return seeking result */ int chunk_time_offset; /* in ms */ int chunk_file_offset; /* in bytes */ } media_seek_info_t; typedef struct { /* number of data tags */ int num; /* data tags array */ const uint8_t *tags; /* buffer array to stort data */ struct acts_ringbuf **bufs; } media_data_dump_info_t; typedef struct { uint8_t state; int result; } media_state_info_t; typedef enum { MEDIA_PLAYBACK = 0, MEDIA_CAPTURE, MEDIA_PARSER, NUM_MEDIA_SUBSRVS, } media_subsrv_index_e; typedef enum { MEDIA_SRV_TYPE_PLAYBACK = BIT(MEDIA_PLAYBACK), MEDIA_SRV_TYPE_CAPTURE = BIT(MEDIA_CAPTURE), MEDIA_SRV_TYPE_PLAYBACK_AND_CAPTURE = (MEDIA_SRV_TYPE_PLAYBACK | MEDIA_SRV_TYPE_CAPTURE), MEDIA_SRV_TYPE_PARSER = BIT(MEDIA_PARSER), MEDIA_SRV_TYPE_PARSER_AND_PLAYBACK = (MEDIA_SRV_TYPE_PLAYBACK | MEDIA_SRV_TYPE_PARSER), } media_srv_sub_type_e; typedef struct { uint8_t type; uint8_t flag; uint8_t status; uint8_t prev_status; void *subsrv_handles[NUM_MEDIA_SUBSRVS]; #ifdef CONFIG_THREAD_TIMER struct thread_timer srv_data_process_timer; #endif os_tid_t srv_thread; char *srv_thread_stack; uint16_t srv_thread_stack_size; uint8_t srv_thread_stack_allocated : 1; uint8_t srv_thread_terminal : 1; uint8_t srv_thread_terminaled : 1; os_mutex srv_process_mutex; os_sem srv_process_sem; /* evnet notify */ media_srv_event_notify_t event_notify; void *user_data; /* reference buffer for sub services */ struct acts_ringbuf *refbuf; /* attached background recorder */ void *bg_recorder; uint8_t bg_recorder_can_run : 1; } media_srv_handle_t; typedef struct { uint8_t type; uint8_t dumpable:1; uint8_t support_tws:1; uint8_t aec_enable:1; uint8_t auto_mute:1; uint8_t dsp_output:1; uint8_t dsp_latency_calc:1; uint8_t dsp_sleep:1; uint8_t dsp_sleep_mode:1; uint8_t sleep_stat_log:1; uint8_t stream_type; uint8_t efx_stream_type; uint8_t format; uint8_t sample_rate; /* kHz */ uint8_t sample_bits; uint8_t channels; uint16_t auto_mute_threshold; io_stream_t input_stream; io_stream_t output_stream; io_stream_t output_stream_subwoofer; uint8_t capture_format; /* capture input sample rate (kHz) */ uint8_t capture_sample_rate_input; /* capture output sample rate (kHz) */ uint8_t capture_sample_rate_output; /* capture input sample bits, 16, 24, etc. */ uint8_t capture_sample_bits; /* capture input channels */ uint8_t capture_channels_input; /* capture output (encoding) channels */ uint8_t capture_channels_output; uint8_t capture_input_src; uint16_t capture_bit_rate; /* kbps */ io_stream_t capture_input_stream; io_stream_t capture_output_stream; /** break point of time ms */ uint32_t bp_time_offset; /** break point of file offset byte */ uint32_t bp_file_offset; media_srv_event_notify_t event_notify_handle; /* will be passed to event_notify_handle as parameter "user_data". * If set NULL, it will fallback to the media_player_t returned by media_player_open. */ void *user_data; uint8_t capture_complexity; } media_init_param_t; typedef enum { /* transmit and output channeles decided by decoding output channels */ MEDIA_TWS_MODE_DEFAULT = 0, /* mono transmit to slave, mono output on master/slave */ MEDIA_TWS_MODE_MONO, /* (force) stereo transmit to slave, (force) stereo output on master/slave */ MEDIA_TWS_MODE_STEREO, } media_tws_mode_e; typedef struct { /** public parameters for application */ media_init_param_t *user_param; /** private parameters for media sub-services */ void *mediasrv_handle; #ifdef CONFIG_BT_MANAGER tws_runtime_observer_t *tws_observer; #endif uint8_t tws_mode; /* see media_tws_mode_e */ /* whether tws only support samplerate 44 or 48kHz */ uint8_t tws_samplerate_44_48_only; } media_srv_init_param_t; #define NUM_MEDIA_RECORDS (MEDIA_CAPTURE + 1) typedef enum { MEDIA_RECORD_PLAYBACK = BIT(MEDIA_PLAYBACK), MEDIA_RECORD_CAPTURE = BIT(MEDIA_CAPTURE), MEDIA_RECORD_PLAYBACK_AND_CAPTURE = MEDIA_RECORD_PLAYBACK | MEDIA_RECORD_CAPTURE, } media_record_type_t; typedef struct { /* record type */ uint8_t type; /* encoder parameters */ uint8_t format; uint8_t sample_rate; uint8_t channels; uint16_t bit_rate; /* kbps */ io_stream_t stream; } media_record_info_t; /* * @struct effect_f_energy_set_t * * @brief Use to enable/disable time and freq energy sample, or set the frequency of the * frequency sample. */ typedef struct { /** Enable time domain energy sample */ uint16_t t_energy_en; /** Enable frequency domain (band mode) energy sample */ uint16_t f_band_energy_en; /** Frequency domain (band mode) sample time window width(ms)*/ uint16_t f_band_energy_timewindow_ms; /** The count of the bands energy to sample */ uint16_t f_band_energy_num; /** Bandwidth in band mode */ uint16_t f_band_bandwidth; /** Center frequency of the band 0 */ uint16_t f_band_energy_f0; /** Center frequency of the band 1 */ uint16_t f_band_energy_f1; /** Center frequency of the band 2 */ uint16_t f_band_energy_f2; /** Center frequency of the band 3 */ uint16_t f_band_energy_f3; /** Center frequency of the band 4 */ uint16_t f_band_energy_f4; /** Center frequency of the band 5 */ uint16_t f_band_energy_f5; /** Center frequency of the band 6 */ uint16_t f_band_energy_f6; /** Center frequency of the band 7 */ uint16_t f_band_energy_f7; /** Center frequency of the band 8 */ uint16_t f_band_energy_f8; /** Center frequency of the band 9 */ uint16_t f_band_energy_f9; /** Enable frequency domain (point mode) energy sample */ uint16_t f_pt_energy_en; /** The count of the points energy to sample */ uint16_t f_pt_energy_num; uint16_t f_pt_energy[16]; } effect_f_energy_set_t; #define MEDIA_SRV_DEVICE_USED_FLAG (1 << 0) #define MEDIA_SRV_SET_USED_FLAG(HANDLE, FLAG) (((HANDLE)->flag) |= (FLAG)) #define MEDIA_SRV_CLEAR_USED_FLAG(HANDLE, FLAG) (((HANDLE)->flag) &= ~(FLAG)) #define MEDIA_SRV_IS_FLAG_SET(HANDLE, FLAG) (((HANDLE)->flag & (FLAG)) == (FLAG)) /** * @brief open new media service instance * * This routine provides open new media service instance, if open failed * or no more media handle ,return NULL. this operation is sync operation, * may block calling thread. * * @param msg message of open service * msg.type = MSG_MEDIA_SRV_OPEN; * msg.ptr = init_param; * msg.callback = _media_service_open_callback; * msg.sync_sem sem for sync operation; * * @return handle of new service instance */ void *media_service_open(struct app_msg *msg); /** * @brief start play for media service * * This routine provides to start meida service play * * @param msg message of service play * msg.type = MSG_MEDIA_SRV_PLAY; * msg.ptr = handle->media_srv_handle handle of media service ; * * @return 0 excute successed , others failed */ int media_service_play(struct app_msg *msg); /** * @brief triggle media service process data * * This routine provides to triggle media service process data, * always triggle from thread timer * * @param msg message of service play * msg.type = MSG_MEDIA_SRV_DATA_PROCESS; * msg.ptr = handle->media_srv_handle handle of media service ; * * @return 0 excute successed , others failed */ int media_service_data_process(struct app_msg *msg); /** * @brief pause for media service * * This routine provides to pause meida service . only excute when meida * service playing. * * @param msg message of service play * msg.type = MSG_MEDIA_SRV_PAUSE; * msg.ptr = handle->media_srv_handle handle of media service ; * * @return 0 excute successed , others failed */ int media_service_pause(struct app_msg *msg); /** * @brief resume for media service * * This routine provides to resume media service, only excute when meida * service paused. * * @param msg message of service play * msg.type = MSG_MEDIA_SRV_RESUME; * msg.ptr = handle->media_srv_handle handle of media service ; * * @return 0 excute successed , others failed */ int media_service_resume(struct app_msg *msg); /** * @brief seek for media service * * This routine provides to seek meida service * * @param msg message of service play * msg.type = MSG_MEDIA_SRV_SEEK * msg.ptr = param seek param @see media_srv_seek_param_t; * * @return 0 excute successed , others failed */ int media_service_seek(struct app_msg *msg); /** * @brief stop media service * * This routine provides to stop meida service, if media service stop * inner process must be stoped, but resource of media service may not * free in this function . * * @param msg message of service stop * msg.type = MSG_MEDIA_SRV_STOP; * msg.ptr = handle->media_srv_handle handle of media service ; * * @return 0 excute successed , others failed */ int media_service_stop(struct app_msg *msg); /** * @brief close media service handle * * This routine provides to close media service handle, media service must * release all resource of this media servie handle,and put the handle to * free media service handle pool. * * @param msg message of service close * msg.type = MSG_MEDIA_SRV_CLOSE; * msg.ptr = handle->media_srv_handle handle of media service ; * * @return 0 excute successed , others failed */ int media_service_close(struct app_msg *msg); /** * @brief dump media service data * * This routine provides to dump media service inner data for debug or * for other debug tools , such as asqt ,aset ,ectt. * * @param msg message of service dump data msg.type = MSG_MEDIA_SRV_DUMP_DATA; msg.ptr = pointer to media_srv_data_dump_param_t * * @return 0 excute successed , others failed */ int media_service_dump_data(struct app_msg *msg); /** * @brief get media service parameter * * This routine provides to get media service parameter. * * @param msg message of service dump data msg.type = MSG_MEDIA_SRV_GET_PARAMETER; msg.ptr = pointer to media_srv_param_t * * @return 0 excute successed , others failed */ int media_service_get_parameter(struct app_msg *msg); /** * @brief set media service parameter * * This routine provides to set media service parameter. * * @param msg message of service dump data msg.type = MSG_MEDIA_SRV_SET_PARAMETER; msg.ptr = pointer to media_srv_param_t * * @return 0 excute successed , others failed */ int media_service_set_parameter(struct app_msg *msg); /** * @brief get media service global parameter * * This routine provides to get media service global parameter. * * @param msg message of service dump data msg.type = MSG_MEDIA_SRV_GET_GLOBAL_PARAMETER; msg.ptr = pointer to media_srv_param_t * * @return 0 excute successed , others failed */ int media_service_get_global_parameter(struct app_msg *msg); /** * @brief set media service global parameter * * This routine provides to set media service global parameter. * * @param msg message of service dump data msg.type = MSG_MEDIA_SRV_SET_GLOBAL_PARAMETER; msg.ptr = pointer to media_srv_param_t * * @return 0 excute successed , others failed */ int media_service_set_global_parameter(struct app_msg *msg); int codec_get_overlay_id(enum media_type format, enum codec_type type); void *codec_get_ops(enum media_type format, enum codec_type type); bool codec_support_hw_acceleration(enum media_type format, enum codec_type type); const char *codec_get_hw_acceleration_dec_lib(enum media_type format, enum codec_type type); const char *codec_get_hw_acceleration_effect_lib(enum media_type format, enum codec_type type); int media_service_init(void); /** * INTERNAL_HIDDEN @endcond */ /** * @} end defgroup media_service_apis */ #endif /* __MEDIA_SERVICE_H__ */