/* if the best path is not 'pass through', then
transcoding is needed; if desired, force transcode path
- to use SLINEAR between channels */
- if ((src != dst) && ast_opt_transcode_via_slin)
+ to use SLINEAR between channels, but only if there is
+ no direct conversion available */
+ if ((src != dst) && ast_opt_transcode_via_slin && ast_translate_path_steps(dst, src))
dst = AST_FORMAT_SLINEAR;
if (ast_set_read_format(chan, dst) < 0) {
ast_log(LOG_WARNING, "Unable to set read format on channel %s to %d\n", chan->name, dst);
ast_log(LOG_WARNING, "No path to translate from %s(%d) to %s(%d)\n", peer->name, src, chan->name, dst);
return -1;
}
+
/* if the best path is not 'pass through', then
transcoding is needed; if desired, force transcode path
- to use SLINEAR between channels */
- if ((src != dst) && ast_opt_transcode_via_slin)
+ to use SLINEAR between channels, but only if there is
+ no direct conversion available */
+ if ((src != dst) && ast_opt_transcode_via_slin && ast_translate_path_steps(dst, src))
dst = AST_FORMAT_SLINEAR;
if (ast_set_read_format(peer, dst) < 0) {
ast_log(LOG_WARNING, "Unable to set read format on channel %s to %d\n", peer->name, dst);
/*
* Asterisk -- An open source telephony toolkit.
*
- * Copyright (C) 1999 - 2005, Digium, Inc.
+ * Copyright (C) 1999 - 2006, Digium, Inc.
*
* Mark Spencer <markster@digium.com>
*
* \brief Register a translator
* \param t populated ast_translator structure
* This registers a codec translator with asterisk
- * Returns 0 on success, -1 on failure
+ * \return 0 on success, -1 on failure
*/
int ast_register_translator(struct ast_translator *t, void *module);
* \brief Unregister a translator
* \param t translator to unregister
* Unregisters the given tranlator
- * Returns 0 on success, -1 on failure
+ * \return 0 on success, -1 on failure
*/
int ast_unregister_translator(struct ast_translator *t);
* \param dest destination format
* \param source source format
* Build a path (possibly NULL) from source to dest
- * Returns ast_trans_pvt on success, NULL on failure
+ * \return ast_trans_pvt on success, NULL on failure
* */
struct ast_trans_pvt *ast_translator_build_path(int dest, int source);
* \param consume Whether or not to free the original frame
* Apply an input frame into the translator and receive zero or one output frames. Consume
* determines whether the original frame should be freed
- * Returns an ast_frame of the new translation format on success, NULL on failure
+ * \return an ast_frame of the new translation format on success, NULL on failure
*/
struct ast_frame *ast_translate(struct ast_trans_pvt *tr, struct ast_frame *f, int consume);
+/*!
+ * \brief Returns the number of steps required to convert from 'src' to 'dest'.
+ * \param dest Destination format
+ * \param src Source format
+ * \return the number of translation steps required, or -1 if no path is available
+ */
+unsigned int ast_translate_path_steps(unsigned int dest, unsigned int src);
+
#if defined(__cplusplus) || defined(c_plusplus)
}
#endif
* indicates the total cost of translation and the first step.
* The full path can be reconstricted iterating on the matrix
* until step->dstfmt == desired_format.
+ *
+ * Array indexes are 'src' and 'dest', in that order.
*/
static struct translator_path tr_matrix[MAX_FORMAT][MAX_FORMAT];
return best;
}
}
+
+unsigned int ast_translate_path_steps(unsigned int dest, unsigned int src)
+{
+ if (!tr_matrix[src][dest].step)
+ return -1;
+ else
+ return tr_matrix[src][dest].multistep;
+}