mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-07 10:28:32 +00:00
Merge "Binaural synthesis (confbridge): interleaved two-channel audio."
This commit is contained in:
@@ -2016,6 +2016,16 @@ int ast_set_write_format_from_cap(struct ast_channel *chan, struct ast_format_ca
|
|||||||
*/
|
*/
|
||||||
int ast_set_write_format(struct ast_channel *chan, struct ast_format *format);
|
int ast_set_write_format(struct ast_channel *chan, struct ast_format *format);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Sets write format for a channel.
|
||||||
|
* All internal data will than be handled in an interleaved format. (needed by binaural opus)
|
||||||
|
*
|
||||||
|
* \param chan channel to change
|
||||||
|
* \param format format to set for writing
|
||||||
|
* \return Returns 0 on success, -1 on failure
|
||||||
|
*/
|
||||||
|
int ast_set_write_format_interleaved_stereo(struct ast_channel *chan, struct ast_format *format);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Sends text to a channel
|
* \brief Sends text to a channel
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -231,6 +231,7 @@ struct ast_trans_pvt {
|
|||||||
* explicit_dst contains an attribute which describes whether both parties
|
* explicit_dst contains an attribute which describes whether both parties
|
||||||
* want to do forward-error correction (FEC). */
|
* want to do forward-error correction (FEC). */
|
||||||
struct ast_format *explicit_dst;
|
struct ast_format *explicit_dst;
|
||||||
|
int interleaved_stereo; /*!< indicates if samples are in interleaved order, for stereo lin */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*! \brief generic frameout function */
|
/*! \brief generic frameout function */
|
||||||
|
|||||||
@@ -5442,7 +5442,7 @@ static const struct set_format_access set_format_access_write = {
|
|||||||
.setoption = AST_OPTION_FORMAT_WRITE,
|
.setoption = AST_OPTION_FORMAT_WRITE,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int set_format(struct ast_channel *chan, struct ast_format_cap *cap_set, const int direction)
|
static int set_format(struct ast_channel *chan, struct ast_format_cap *cap_set, const int direction, int interleaved_stereo)
|
||||||
{
|
{
|
||||||
struct ast_trans_pvt *trans_pvt;
|
struct ast_trans_pvt *trans_pvt;
|
||||||
struct ast_format_cap *cap_native;
|
struct ast_format_cap *cap_native;
|
||||||
@@ -5544,16 +5544,20 @@ static int set_format(struct ast_channel *chan, struct ast_format_cap *cap_set,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Now we have a good choice for both. */
|
/* Now we have a good choice for both. */
|
||||||
|
trans_pvt = access->get_trans(chan);
|
||||||
if ((ast_format_cmp(rawformat, best_native_fmt) != AST_FORMAT_CMP_NOT_EQUAL) &&
|
if ((ast_format_cmp(rawformat, best_native_fmt) != AST_FORMAT_CMP_NOT_EQUAL) &&
|
||||||
(ast_format_cmp(format, best_set_fmt) != AST_FORMAT_CMP_NOT_EQUAL) &&
|
(ast_format_cmp(format, best_set_fmt) != AST_FORMAT_CMP_NOT_EQUAL) &&
|
||||||
((ast_format_cmp(rawformat, format) != AST_FORMAT_CMP_NOT_EQUAL) || access->get_trans(chan))) {
|
((ast_format_cmp(rawformat, format) != AST_FORMAT_CMP_NOT_EQUAL) || access->get_trans(chan))) {
|
||||||
/* the channel is already in these formats, so nothing to do */
|
/* the channel is already in these formats, so nothing to do, unless the interleaved format is not set correctly */
|
||||||
ast_channel_unlock(chan);
|
if (trans_pvt != NULL) {
|
||||||
return 0;
|
if (trans_pvt->interleaved_stereo == interleaved_stereo) {
|
||||||
|
ast_channel_unlock(chan);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free any translation we have right now */
|
/* Free any translation we have right now */
|
||||||
trans_pvt = access->get_trans(chan);
|
|
||||||
if (trans_pvt) {
|
if (trans_pvt) {
|
||||||
ast_translator_free_path(trans_pvt);
|
ast_translator_free_path(trans_pvt);
|
||||||
access->set_trans(chan, NULL);
|
access->set_trans(chan, NULL);
|
||||||
@@ -5571,9 +5575,11 @@ static int set_format(struct ast_channel *chan, struct ast_format_cap *cap_set,
|
|||||||
if (!direction) {
|
if (!direction) {
|
||||||
/* reading */
|
/* reading */
|
||||||
trans_pvt = ast_translator_build_path(best_set_fmt, best_native_fmt);
|
trans_pvt = ast_translator_build_path(best_set_fmt, best_native_fmt);
|
||||||
|
trans_pvt->interleaved_stereo = 0;
|
||||||
} else {
|
} else {
|
||||||
/* writing */
|
/* writing */
|
||||||
trans_pvt = ast_translator_build_path(best_native_fmt, best_set_fmt);
|
trans_pvt = ast_translator_build_path(best_native_fmt, best_set_fmt);
|
||||||
|
trans_pvt->interleaved_stereo = interleaved_stereo;
|
||||||
}
|
}
|
||||||
access->set_trans(chan, trans_pvt);
|
access->set_trans(chan, trans_pvt);
|
||||||
res = trans_pvt ? 0 : -1;
|
res = trans_pvt ? 0 : -1;
|
||||||
@@ -5613,7 +5619,7 @@ int ast_set_read_format(struct ast_channel *chan, struct ast_format *format)
|
|||||||
}
|
}
|
||||||
ast_format_cap_append(cap, format, 0);
|
ast_format_cap_append(cap, format, 0);
|
||||||
|
|
||||||
res = set_format(chan, cap, 0);
|
res = set_format(chan, cap, 0, 0);
|
||||||
|
|
||||||
ao2_cleanup(cap);
|
ao2_cleanup(cap);
|
||||||
return res;
|
return res;
|
||||||
@@ -5621,7 +5627,25 @@ int ast_set_read_format(struct ast_channel *chan, struct ast_format *format)
|
|||||||
|
|
||||||
int ast_set_read_format_from_cap(struct ast_channel *chan, struct ast_format_cap *cap)
|
int ast_set_read_format_from_cap(struct ast_channel *chan, struct ast_format_cap *cap)
|
||||||
{
|
{
|
||||||
return set_format(chan, cap, 0);
|
return set_format(chan, cap, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ast_set_write_format_interleaved_stereo(struct ast_channel *chan, struct ast_format *format)
|
||||||
|
{
|
||||||
|
struct ast_format_cap *cap = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT);
|
||||||
|
int res;
|
||||||
|
|
||||||
|
ast_assert(format != NULL);
|
||||||
|
|
||||||
|
if (!cap) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
ast_format_cap_append(cap, format, 0);
|
||||||
|
|
||||||
|
res = set_format(chan, cap, 1, 1);
|
||||||
|
|
||||||
|
ao2_cleanup(cap);
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ast_set_write_format(struct ast_channel *chan, struct ast_format *format)
|
int ast_set_write_format(struct ast_channel *chan, struct ast_format *format)
|
||||||
@@ -5636,7 +5660,7 @@ int ast_set_write_format(struct ast_channel *chan, struct ast_format *format)
|
|||||||
}
|
}
|
||||||
ast_format_cap_append(cap, format, 0);
|
ast_format_cap_append(cap, format, 0);
|
||||||
|
|
||||||
res = set_format(chan, cap, 1);
|
res = set_format(chan, cap, 1, 0);
|
||||||
|
|
||||||
ao2_cleanup(cap);
|
ao2_cleanup(cap);
|
||||||
return res;
|
return res;
|
||||||
@@ -5644,7 +5668,7 @@ int ast_set_write_format(struct ast_channel *chan, struct ast_format *format)
|
|||||||
|
|
||||||
int ast_set_write_format_from_cap(struct ast_channel *chan, struct ast_format_cap *cap)
|
int ast_set_write_format_from_cap(struct ast_channel *chan, struct ast_format_cap *cap)
|
||||||
{
|
{
|
||||||
return set_format(chan, cap, 1);
|
return set_format(chan, cap, 1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *ast_channel_reason2str(int reason)
|
const char *ast_channel_reason2str(int reason)
|
||||||
|
|||||||
Reference in New Issue
Block a user