[asterisk-commits] Binaural synthesis (confbridge): interleaved two-channel audio. (asterisk[master])
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Wed Oct 12 11:36:06 CDT 2016
Anonymous Coward #1000019 has submitted this change and it was merged.
Change subject: Binaural synthesis (confbridge): interleaved two-channel audio.
......................................................................
Binaural synthesis (confbridge): interleaved two-channel audio.
Asterisk only supports mono audio at the moment.
This patch adds interleaved two-channel audio to Asterisk's channels.
ASTERISK-26292
Change-Id: I7a547cea0fd3c6d1e502709d9e7e39605035757a
---
M include/asterisk/channel.h
M include/asterisk/translate.h
M main/channel.c
3 files changed, 44 insertions(+), 9 deletions(-)
Approvals:
George Joseph: Looks good to me, but someone else must approve
Anonymous Coward #1000019: Verified
Matthew Fredrickson: Looks good to me, approved
diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h
index 14bd32c..94f72b8 100644
--- a/include/asterisk/channel.h
+++ b/include/asterisk/channel.h
@@ -2017,6 +2017,16 @@
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
*
* \param chan channel to act upon
diff --git a/include/asterisk/translate.h b/include/asterisk/translate.h
index b8cd219..8188eb8 100644
--- a/include/asterisk/translate.h
+++ b/include/asterisk/translate.h
@@ -231,6 +231,7 @@
* explicit_dst contains an attribute which describes whether both parties
* want to do forward-error correction (FEC). */
struct ast_format *explicit_dst;
+ int interleaved_stereo; /*!< indicates if samples are in interleaved order, for stereo lin */
};
/*! \brief generic frameout function */
diff --git a/main/channel.c b/main/channel.c
index 1f18d53..f8b218f 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -5407,7 +5407,7 @@
.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_format_cap *cap_native;
@@ -5509,16 +5509,20 @@
}
/* 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) &&
(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))) {
- /* the channel is already in these formats, so nothing to do */
- ast_channel_unlock(chan);
- return 0;
+ /* the channel is already in these formats, so nothing to do, unless the interleaved format is not set correctly */
+ if (trans_pvt != NULL) {
+ if (trans_pvt->interleaved_stereo == interleaved_stereo) {
+ ast_channel_unlock(chan);
+ return 0;
+ }
+ }
}
/* Free any translation we have right now */
- trans_pvt = access->get_trans(chan);
if (trans_pvt) {
ast_translator_free_path(trans_pvt);
access->set_trans(chan, NULL);
@@ -5536,9 +5540,11 @@
if (!direction) {
/* reading */
trans_pvt = ast_translator_build_path(best_set_fmt, best_native_fmt);
+ trans_pvt->interleaved_stereo = 0;
} else {
/* writing */
trans_pvt = ast_translator_build_path(best_native_fmt, best_set_fmt);
+ trans_pvt->interleaved_stereo = interleaved_stereo;
}
access->set_trans(chan, trans_pvt);
res = trans_pvt ? 0 : -1;
@@ -5578,7 +5584,7 @@
}
ast_format_cap_append(cap, format, 0);
- res = set_format(chan, cap, 0);
+ res = set_format(chan, cap, 0, 0);
ao2_cleanup(cap);
return res;
@@ -5586,7 +5592,25 @@
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)
@@ -5601,7 +5625,7 @@
}
ast_format_cap_append(cap, format, 0);
- res = set_format(chan, cap, 1);
+ res = set_format(chan, cap, 1, 0);
ao2_cleanup(cap);
return res;
@@ -5609,7 +5633,7 @@
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)
--
To view, visit https://gerrit.asterisk.org/3521
To unsubscribe, visit https://gerrit.asterisk.org/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I7a547cea0fd3c6d1e502709d9e7e39605035757a
Gerrit-PatchSet: 3
Gerrit-Project: asterisk
Gerrit-Branch: master
Gerrit-Owner: Frank Haase <fra.haase at googlemail.com>
Gerrit-Reviewer: Anonymous Coward #1000019
Gerrit-Reviewer: Dennis Guse <dennis.guse at alumni.tu-berlin.de>
Gerrit-Reviewer: George Joseph <gjoseph at digium.com>
Gerrit-Reviewer: Joshua Colp <jcolp at digium.com>
Gerrit-Reviewer: Matthew Fredrickson <creslin at digium.com>
More information about the asterisk-commits
mailing list