| /* Copyright 2018 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_APM_LIST_H_ |
| #define CRAS_APM_LIST_H_ |
| |
| #include "cras_types.h" |
| |
| struct cras_audio_area; |
| struct cras_audio_format; |
| struct cras_apm; |
| struct cras_apm_list; |
| struct float_buffer; |
| |
| #ifdef HAVE_WEBRTC_APM |
| |
| /* Initialize the apm list for analyzing output data. */ |
| int cras_apm_list_init(const char *device_config_dir); |
| |
| /* Reloads the aec config. Used for debug and tuning. */ |
| void cras_apm_list_reload_aec_config(); |
| |
| /* Deinitialize apm list to free all allocated resources. */ |
| int cras_apm_list_deinit(); |
| |
| /* |
| * Creates an list to hold all APM instances created when a stream |
| * attaches to iodev(s). This should be called in main thread. |
| * |
| * Below diagram explains the life cycle of an APM instance, how are |
| * related APIs used, and in which thread should each API be called. |
| * |
| * Main thread Audio thread |
| * maintaining apm_list maintaining active_apms |
| * ----------- ------------ |
| * cras_apm_list_create |
| * cras_apm_list_add_apm -> cras_apm_list_start_apm |
| * |
| * cras_apm_list_get_active_apm |
| * cras_apm_list_process |
| * cras_apm_list_get_processed |
| * cras_apm_list_put_processed |
| * |
| * cras_apm_list_remove_apm <- cras_apm_list_stop_apm |
| * cras_apm_list_destroy |
| * |
| * Args: |
| * stream_ptr - Pointer to the stream. |
| * effects - Bit map specifying the enabled effects on this stream. |
| */ |
| struct cras_apm_list *cras_apm_list_create(void *stream_ptr, uint64_t effects); |
| |
| /* |
| * Creates a cras_apm associated to given dev_ptr and adds it to the list. |
| * If there already exists an APM instance linked to dev_ptr, we assume |
| * the open format is unchanged so just return it. This should be called |
| * in main thread. |
| * Args: |
| * list - The list holding APM instances. |
| * dev_ptr - Pointer to the iodev to add new APM for. |
| * fmt - Format of the audio data used for this cras_apm. |
| * is_aec_use_case - If the dev_ptr is for typical AEC use case. |
| */ |
| struct cras_apm *cras_apm_list_add_apm(struct cras_apm_list *list, |
| void *dev_ptr, |
| const struct cras_audio_format *fmt, |
| bool is_aec_use_case); |
| |
| /* |
| * Gets the active APM instance that is associated to given stream and dev pair. |
| * This should be called in audio thread. |
| * Args: |
| * stream_ptr - Pointer to the stream. |
| * dev_ptr - The iodev as key to look up associated APM. |
| */ |
| struct cras_apm *cras_apm_list_get_active_apm(void *stream_ptr, void *dev_ptr); |
| |
| /* |
| * Starts the APM instance in the list that is associated with dev_ptr by |
| * adding it to the active APM list in audio thread. |
| */ |
| void cras_apm_list_start_apm(struct cras_apm_list *list, void *dev_ptr); |
| |
| /* |
| * Stops the APM instance in the list that is associated with dev_ptr by |
| * removing it from the active APM list in audio thread. |
| */ |
| void cras_apm_list_stop_apm(struct cras_apm_list *list, void *dev_ptr); |
| |
| /* |
| * Gets the effects bit map of the APM list. |
| * Args: |
| * list - The list holding APM instances. |
| */ |
| uint64_t cras_apm_list_get_effects(struct cras_apm_list *list); |
| |
| /* Removes a cras_apm from list and destroys it. */ |
| int cras_apm_list_destroy(struct cras_apm_list *list); |
| |
| /* |
| * Removes an APM from the list, expected to be used when an iodev is no |
| * longer open for the client stream holding the APM list. This should |
| * be called in main thread. |
| * Args: |
| * list - The list holding APM instances. |
| * dev_ptr - Device pointer used to look up which apm to remove. |
| */ |
| void cras_apm_list_remove_apm(struct cras_apm_list *list, void *dev_ptr); |
| |
| /* Passes audio data from hardware for cras_apm to process. |
| * Args: |
| * apm - The cras_apm instance. |
| * input - Float buffer from device for apm to process. |
| * offset - Offset in |input| to note the data position to start |
| * reading. |
| */ |
| int cras_apm_list_process(struct cras_apm *apm, struct float_buffer *input, |
| unsigned int offset); |
| |
| /* Gets the APM processed data in the form of audio area. |
| * Args: |
| * apm - The cras_apm instance that owns the audio area pointer and |
| * processed data. |
| * Returns: |
| * The audio area used to read processed data. No need to free |
| * by caller. |
| */ |
| struct cras_audio_area *cras_apm_list_get_processed(struct cras_apm *apm); |
| |
| /* Tells |apm| that |frames| of processed data has been used, so |apm| |
| * can allocate space to read more from input device. |
| * Args: |
| * apm - The cras_apm instance owns the processed data. |
| * frames - The number in frames of processed data to mark as used. |
| */ |
| void cras_apm_list_put_processed(struct cras_apm *apm, unsigned int frames); |
| |
| /* Gets the format of the actual data processed by webrtc-apm library. |
| * Args: |
| * apm - The cras_apm instance holding audio data and format info. |
| */ |
| struct cras_audio_format *cras_apm_list_get_format(struct cras_apm *apm); |
| |
| /* |
| * Gets if this apm instance is using tuned settings. |
| */ |
| bool cras_apm_list_get_use_tuned_settings(struct cras_apm *apm); |
| |
| /* Sets debug recording to start or stop. |
| * Args: |
| * list - List contains the apm instance to start/stop debug recording. |
| * dev_ptr - Use as key to look up specific apm to do aec dump. |
| * start - True to set debug recording start, otherwise stop. |
| * fd - File descriptor to aec dump destination. |
| */ |
| void cras_apm_list_set_aec_dump(struct cras_apm_list *list, void *dev_ptr, |
| int start, int fd); |
| |
| #else |
| |
| /* |
| * If webrtc audio processing library is not available then define all |
| * cras_apm_list functions as empty. As long as cras_apm_list_add returns |
| * NULL, non of the other functions should be called. |
| */ |
| static inline int cras_apm_list_init(const char *device_config_dir) |
| { |
| return 0; |
| } |
| static inline void cras_apm_list_reload_aec_config() |
| { |
| } |
| static inline struct cras_apm_list *cras_apm_list_create(void *stream_ptr, |
| unsigned int effects) |
| { |
| return NULL; |
| } |
| static inline struct cras_apm * |
| cras_apm_list_add_apm(struct cras_apm_list *list, void *dev_ptr, |
| const struct cras_audio_format *fmt, bool is_aec_use_case) |
| { |
| return NULL; |
| } |
| static inline struct cras_apm *cras_apm_list_get_active_apm(void *stream_ptr, |
| void *dev_ptr) |
| { |
| return NULL; |
| } |
| static inline uint64_t cras_apm_list_get_effects(struct cras_apm_list *list) |
| { |
| return 0; |
| } |
| static inline int cras_apm_list_destroy(struct cras_apm_list *list) |
| { |
| return 0; |
| } |
| static inline void cras_apm_list_remove_apm(struct cras_apm_list *list, |
| void *dev_ptr) |
| { |
| } |
| |
| static inline int cras_apm_list_process(struct cras_apm *apm, |
| struct float_buffer *input, |
| unsigned int offset) |
| { |
| return 0; |
| } |
| |
| static inline struct cras_audio_area * |
| cras_apm_list_get_processed(struct cras_apm *apm) |
| { |
| return NULL; |
| } |
| |
| static inline void cras_apm_list_put_processed(struct cras_apm *apm, |
| unsigned int frames) |
| { |
| } |
| static inline void cras_apm_list_start_apm(struct cras_apm_list *list, |
| void *dev_ptr) |
| { |
| } |
| static inline void cras_apm_list_stop_apm(struct cras_apm_list *list, |
| void *dev_ptr) |
| { |
| } |
| |
| static inline struct cras_audio_format * |
| cras_apm_list_get_format(struct cras_apm *apm) |
| { |
| return NULL; |
| } |
| |
| static inline bool cras_apm_list_get_use_tuned_settings(struct cras_apm *apm) |
| { |
| return 0; |
| } |
| |
| static inline void cras_apm_list_set_aec_dump(struct cras_apm_list *list, |
| void *dev_ptr, int start, int fd) |
| { |
| } |
| |
| #endif /* HAVE_WEBRTC_APM */ |
| |
| #endif /* CRAS_APM_LIST_H_ */ |