diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/asterisk/frame.h | 13 | ||||
-rw-r--r-- | include/asterisk/translate.h | 23 |
2 files changed, 33 insertions, 3 deletions
diff --git a/include/asterisk/frame.h b/include/asterisk/frame.h index 4fb4b732f..0b22a8462 100644 --- a/include/asterisk/frame.h +++ b/include/asterisk/frame.h @@ -123,6 +123,15 @@ enum ast_frame_type { }; #define AST_FRAME_DTMF AST_FRAME_DTMF_END +enum { + /*! This frame contains valid timing information */ + AST_FRFLAG_HAS_TIMING_INFO = (1 << 0), + /*! This frame came from a translator and is still the original frame. + * The translator can not be free'd if the frame inside of it still has + * this flag set. */ + AST_FRFLAG_FROM_TRANSLATOR = (1 << 1), +}; + /*! \brief Data structure associated with a single frame of data */ struct ast_frame { @@ -148,8 +157,8 @@ struct ast_frame { struct timeval delivery; /*! For placing in a linked list */ AST_LIST_ENTRY(ast_frame) frame_list; - /*! Timing data flag */ - int has_timing_info; + /*! Misc. frame flags */ + unsigned int flags; /*! Timestamp in milliseconds */ long ts; /*! Length in milliseconds */ diff --git a/include/asterisk/translate.h b/include/asterisk/translate.h index 54bdc067d..a81d0072a 100644 --- a/include/asterisk/translate.h +++ b/include/asterisk/translate.h @@ -135,7 +135,14 @@ struct ast_trans_pvt { struct ast_translator *t; struct ast_frame f; /*!< used in frameout */ int samples; /*!< samples available in outbuf */ - int datalen; /*!< actual space used in outbuf */ + /*! + * \brief actual space used in outbuf + * + * Also, for the sake of ABI compatability, a magic value of -1 in this + * field means that the pvt has been requested to be destroyed, but is + * pending destruction until ast_translate_frame_freed() gets called. + */ + int datalen; void *pvt; /*!< more private data, if any */ char *outbuf; /*!< the useful portion of the buffer */ plc_state_t *plc; /*!< optional plc pointer */ @@ -245,6 +252,20 @@ unsigned int ast_translate_path_steps(unsigned int dest, unsigned int src); */ unsigned int ast_translate_available_formats(unsigned int dest, unsigned int src); +/*! + * \brief Hint that a frame from a translator has been freed + * + * This is sort of a hack. This function gets called when ast_frame_free() gets + * called on a frame that has the AST_FRFLAG_FROM_TRANSLATOR flag set. This is + * because it is possible for a translation path to be destroyed while a frame + * from a translator is still in use. Specifically, this happens if a masquerade + * happens after a call to ast_read() but before the frame is done being processed, + * since the frame processing is generally done without the channel lock held. + * + * \return nothing + */ +void ast_translate_frame_freed(struct ast_frame *fr); + #if defined(__cplusplus) || defined(c_plusplus) } #endif |