mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-04-15 08:29:45 +00:00
freetdm: ftmod_pritap: Allow specifying different audio mixing modes
This commit is contained in:
parent
e9fe51124f
commit
29bfcb16be
@ -45,6 +45,12 @@ typedef enum {
|
|||||||
PRITAP_MASTER = (1 << 1),
|
PRITAP_MASTER = (1 << 1),
|
||||||
} pritap_flags_t;
|
} pritap_flags_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
PRITAP_MIX_BOTH = 0,
|
||||||
|
PRITAP_MIX_PEER,
|
||||||
|
PRITAP_MIX_SELF,
|
||||||
|
} pritap_mix_mode_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
void *callref;
|
void *callref;
|
||||||
ftdm_number_t callingnum;
|
ftdm_number_t callingnum;
|
||||||
@ -66,7 +72,7 @@ typedef struct pritap {
|
|||||||
int32_t flags;
|
int32_t flags;
|
||||||
struct pri *pri;
|
struct pri *pri;
|
||||||
int debug;
|
int debug;
|
||||||
uint8_t mixaudio;
|
pritap_mix_mode_t mixaudio;
|
||||||
ftdm_channel_t *dchan;
|
ftdm_channel_t *dchan;
|
||||||
ftdm_span_t *span;
|
ftdm_span_t *span;
|
||||||
ftdm_span_t *peerspan;
|
ftdm_span_t *peerspan;
|
||||||
@ -976,11 +982,16 @@ static ftdm_status_t ftdm_pritap_sig_read(ftdm_channel_t *ftdmchan, void *data,
|
|||||||
return FTDM_SUCCESS;
|
return FTDM_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!pritap->mixaudio) {
|
if (pritap->mixaudio == PRITAP_MIX_SELF) {
|
||||||
/* No mixing requested */
|
|
||||||
return FTDM_SUCCESS;
|
return FTDM_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pritap->mixaudio == PRITAP_MIX_PEER) {
|
||||||
|
/* start out by clearing the self audio to make sure we don't return audio we were
|
||||||
|
* not supposed to in an error condition */
|
||||||
|
memset(data, FTDM_SILENCE_VALUE(ftdmchan), size);
|
||||||
|
}
|
||||||
|
|
||||||
if (ftdmchan->native_codec != peerchan->native_codec) {
|
if (ftdmchan->native_codec != peerchan->native_codec) {
|
||||||
ftdm_log_chan(ftdmchan, FTDM_LOG_CRIT, "Invalid peer channel with format %d, ours = %d\n",
|
ftdm_log_chan(ftdmchan, FTDM_LOG_CRIT, "Invalid peer channel with format %d, ours = %d\n",
|
||||||
peerchan->native_codec, ftdmchan->native_codec);
|
peerchan->native_codec, ftdmchan->native_codec);
|
||||||
@ -998,6 +1009,12 @@ static ftdm_status_t ftdm_pritap_sig_read(ftdm_channel_t *ftdmchan, void *data,
|
|||||||
return FTDM_FAIL;
|
return FTDM_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pritap->mixaudio == PRITAP_MIX_PEER) {
|
||||||
|
/* only the peer audio is requested */
|
||||||
|
memcpy(data, peerbuf, size);
|
||||||
|
return FTDM_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
codec_func = peerchan->native_codec == FTDM_CODEC_ULAW ? fio_ulaw2slin : peerchan->native_codec == FTDM_CODEC_ALAW ? fio_alaw2slin : NULL;
|
codec_func = peerchan->native_codec == FTDM_CODEC_ULAW ? fio_ulaw2slin : peerchan->native_codec == FTDM_CODEC_ALAW ? fio_alaw2slin : NULL;
|
||||||
if (codec_func) {
|
if (codec_func) {
|
||||||
sizeread = size;
|
sizeread = size;
|
||||||
@ -1053,7 +1070,7 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_pritap_configure_span)
|
|||||||
uint32_t i;
|
uint32_t i;
|
||||||
const char *var, *val;
|
const char *var, *val;
|
||||||
const char *debug = NULL;
|
const char *debug = NULL;
|
||||||
uint8_t mixaudio = 1;
|
pritap_mix_mode_t mixaudio = PRITAP_MIX_BOTH;
|
||||||
ftdm_channel_t *dchan = NULL;
|
ftdm_channel_t *dchan = NULL;
|
||||||
pritap_t *pritap = NULL;
|
pritap_t *pritap = NULL;
|
||||||
ftdm_span_t *peerspan = NULL;
|
ftdm_span_t *peerspan = NULL;
|
||||||
@ -1084,7 +1101,16 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_pritap_configure_span)
|
|||||||
if (!strcasecmp(var, "debug")) {
|
if (!strcasecmp(var, "debug")) {
|
||||||
debug = val;
|
debug = val;
|
||||||
} else if (!strcasecmp(var, "mixaudio")) {
|
} else if (!strcasecmp(var, "mixaudio")) {
|
||||||
mixaudio = ftdm_true(val);
|
if (ftdm_true(val) || !strcasecmp(val, "both")) {
|
||||||
|
ftdm_log(FTDM_LOG_DEBUG, "Setting mix audio mode to 'both' for span %s\n", span->name);
|
||||||
|
mixaudio = PRITAP_MIX_BOTH;
|
||||||
|
} else if (!strcasecmp(val, "peer")) {
|
||||||
|
ftdm_log(FTDM_LOG_DEBUG, "Setting mix audio mode to 'peer' for span %s\n", span->name);
|
||||||
|
mixaudio = PRITAP_MIX_PEER;
|
||||||
|
} else {
|
||||||
|
ftdm_log(FTDM_LOG_DEBUG, "Setting mix audio mode to 'self' for span %s\n", span->name);
|
||||||
|
mixaudio = PRITAP_MIX_SELF;
|
||||||
|
}
|
||||||
} else if (!strcasecmp(var, "interface")) {
|
} else if (!strcasecmp(var, "interface")) {
|
||||||
if (!strcasecmp(val, "cpe")) {
|
if (!strcasecmp(val, "cpe")) {
|
||||||
iface = PRITAP_IFACE_CPE;
|
iface = PRITAP_IFACE_CPE;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user