Various little cleanups, many of them from a clang static analysis

This commit is contained in:
Steve Underwood 2014-05-02 23:32:33 +08:00
parent 317f4b1442
commit 28a9a40e37
75 changed files with 646 additions and 499 deletions

View File

@ -463,7 +463,6 @@ static int parse_hex_num(const char **s, int max_value)
/* The spec. says a hex value is always 2 digits, and the alpha digits are /* The spec. says a hex value is always 2 digits, and the alpha digits are
upper case. */ upper case. */
i = 0;
if (isdigit((int) **s)) if (isdigit((int) **s))
i = **s - '0'; i = **s - '0';
else if (**s >= 'A' && **s <= 'F') else if (**s >= 'A' && **s <= 'F')
@ -912,7 +911,6 @@ static const char *at_cmd_dummy(at_state_t *s, const char *t)
static const char *at_cmd_A(at_state_t *s, const char *t) static const char *at_cmd_A(at_state_t *s, const char *t)
{ {
/* V.250 6.3.5 - Answer (abortable) */ /* V.250 6.3.5 - Answer (abortable) */
t += 1;
if (!answer_call(s)) if (!answer_call(s))
return NULL; return NULL;
return (const char *) -1; return (const char *) -1;
@ -921,7 +919,6 @@ static const char *at_cmd_A(at_state_t *s, const char *t)
static const char *at_cmd_D(at_state_t *s, const char *t) static const char *at_cmd_D(at_state_t *s, const char *t)
{ {
int ok;
char *u; char *u;
char num[100 + 1]; char num[100 + 1];
char ch; char ch;
@ -932,7 +929,6 @@ static const char *at_cmd_D(at_state_t *s, const char *t)
s->silent_dial = false; s->silent_dial = false;
s->command_dial = false; s->command_dial = false;
t += 1; t += 1;
ok = false;
/* There are a numbers of options in a dial command string. /* There are a numbers of options in a dial command string.
Many are completely irrelevant in this application. */ Many are completely irrelevant in this application. */
u = num; u = num;
@ -1024,7 +1020,7 @@ static const char *at_cmd_D(at_state_t *s, const char *t)
} }
} }
*u = '\0'; *u = '\0';
if ((ok = at_modem_control(s, AT_MODEM_CONTROL_CALL, num)) < 0) if (at_modem_control(s, AT_MODEM_CONTROL_CALL, num) < 0)
return NULL; return NULL;
/* Dialing should now be in progress. No AT response should be /* Dialing should now be in progress. No AT response should be
issued at this point. */ issued at this point. */

View File

@ -479,7 +479,6 @@ SPAN_DECLARE(int) bell_mf_rx(bell_mf_rx_state_t *s, const int16_t amp[], int sam
int limit; int limit;
uint8_t hit; uint8_t hit;
hit = 0;
for (sample = 0; sample < samples; sample = limit) for (sample = 0; sample < samples; sample = limit)
{ {
if ((samples - sample) >= (BELL_MF_SAMPLES_PER_BLOCK - s->current_sample)) if ((samples - sample) >= (BELL_MF_SAMPLES_PER_BLOCK - s->current_sample))
@ -700,8 +699,6 @@ SPAN_DECLARE(int) r2_mf_rx(r2_mf_rx_state_t *s, const int16_t amp[], int samples
int hit_digit; int hit_digit;
int limit; int limit;
hit = 0;
hit_digit = 0;
for (sample = 0; sample < samples; sample = limit) for (sample = 0; sample < samples; sample = limit)
{ {
if ((samples - sample) >= (R2_MF_SAMPLES_PER_BLOCK - s->current_sample)) if ((samples - sample) >= (R2_MF_SAMPLES_PER_BLOCK - s->current_sample))

View File

@ -131,7 +131,6 @@ SPAN_DECLARE(int) dtmf_rx(dtmf_rx_state_t *s, const int16_t amp[], int samples)
int limit; int limit;
uint8_t hit; uint8_t hit;
hit = 0;
for (sample = 0; sample < samples; sample = limit) for (sample = 0; sample < samples; sample = limit)
{ {
/* The block length is optimised to meet the DTMF specs. */ /* The block length is optimised to meet the DTMF specs. */

View File

@ -392,7 +392,7 @@ static __inline__ int16_t echo_can_hpf(int32_t coeff[2], int16_t amp)
coeff[1] = z; coeff[1] = z;
z = coeff[0] >> 15; z = coeff[0] >> 15;
return saturate(z); return saturate16(z);
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
@ -498,7 +498,7 @@ printf("Rotate to %d at %d\n", ec->tap_set, sample_no);
/* ... and we are not in the dwell time from previous speech. */ /* ... and we are not in the dwell time from previous speech. */
if ((ec->adaption_mode & ECHO_CAN_USE_ADAPTION) && ec->narrowband_score == 0) if ((ec->adaption_mode & ECHO_CAN_USE_ADAPTION) && ec->narrowband_score == 0)
{ {
//nsuppr = saturate((clean_rx << 16)/ec->tx_power[1]); //nsuppr = saturate16((clean_rx << 16)/ec->tx_power[1]);
//nsuppr = clean_rx/ec->tx_power[1]; //nsuppr = clean_rx/ec->tx_power[1];
/* If a sudden surge in signal level (e.g. the onset of a tone /* If a sudden surge in signal level (e.g. the onset of a tone
burst) cause an abnormally high instantaneous to average burst) cause an abnormally high instantaneous to average

View File

@ -171,8 +171,10 @@ SPAN_DECLARE_NONSTD(int) fax_rx(fax_state_t *s, int16_t *amp, int len)
#endif #endif
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
amp[i] = dc_restore(&s->modems.dc_restore, amp[i]); amp[i] = dc_restore(&s->modems.dc_restore, amp[i]);
/*endfor*/
if (s->modems.rx_handler) if (s->modems.rx_handler)
s->modems.rx_handler(s->modems.rx_user_data, amp, len); s->modems.rx_handler(s->modems.rx_user_data, amp, len);
/*endif*/
t30_timer_update(&s->t30, len); t30_timer_update(&s->t30, len);
return 0; return 0;
} }
@ -198,6 +200,7 @@ SPAN_DECLARE_NONSTD(int) fax_rx_fillin(fax_state_t *s, int len)
vec_zeroi16(amp, len); vec_zeroi16(amp, len);
write(s->modems.audio_rx_log, amp, len*sizeof(int16_t)); write(s->modems.audio_rx_log, amp, len*sizeof(int16_t));
} }
/*endif*/
#endif #endif
/* Call the fillin function of the current modem (if there is one). */ /* Call the fillin function of the current modem (if there is one). */
s->modems.rx_fillin_handler(s->modems.rx_fillin_user_data, len); s->modems.rx_fillin_handler(s->modems.rx_fillin_user_data, len);
@ -254,6 +257,7 @@ static void fax_set_rx_type(void *user_data, int type, int bit_rate, int short_t
span_log(&s->logging, SPAN_LOG_FLOW, "Set rx type %d\n", type); span_log(&s->logging, SPAN_LOG_FLOW, "Set rx type %d\n", type);
if (t->current_rx_type == type) if (t->current_rx_type == type)
return; return;
/*endif*/
t->current_rx_type = type; t->current_rx_type = type;
t->rx_bit_rate = bit_rate; t->rx_bit_rate = bit_rate;
hdlc_rx_init(&t->hdlc_rx, false, true, HDLC_FRAMING_OK_THRESHOLD, fax_modems_hdlc_accept, t); hdlc_rx_init(&t->hdlc_rx, false, true, HDLC_FRAMING_OK_THRESHOLD, fax_modems_hdlc_accept, t);
@ -279,6 +283,7 @@ static void fax_set_rx_type(void *user_data, int type, int bit_rate, int short_t
fax_modems_set_rx_handler(t, (span_rx_handler_t) &span_dummy_rx, s, (span_rx_fillin_handler_t) &span_dummy_rx_fillin, s); fax_modems_set_rx_handler(t, (span_rx_handler_t) &span_dummy_rx, s, (span_rx_fillin_handler_t) &span_dummy_rx_fillin, s);
break; break;
} }
/*endswitch*/
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
@ -293,7 +298,7 @@ static void fax_set_tx_type(void *user_data, int type, int bit_rate, int short_t
span_log(&s->logging, SPAN_LOG_FLOW, "Set tx type %d\n", type); span_log(&s->logging, SPAN_LOG_FLOW, "Set tx type %d\n", type);
if (t->current_tx_type == type) if (t->current_tx_type == type)
return; return;
/*endif*/
switch (type) switch (type)
{ {
case T30_MODEM_PAUSE: case T30_MODEM_PAUSE:
@ -359,6 +364,7 @@ static void fax_set_tx_type(void *user_data, int type, int bit_rate, int short_t
t->transmit = false; t->transmit = false;
break; break;
} }
/*endswitch*/
t->tx_bit_rate = bit_rate; t->tx_bit_rate = bit_rate;
t->current_tx_type = type; t->current_tx_type = type;
} }
@ -398,12 +404,16 @@ SPAN_DECLARE(int) fax_restart(fax_state_t *s, int calling_party)
v8_parms.modulations = V8_MOD_V21; v8_parms.modulations = V8_MOD_V21;
if (s->t30.supported_modems & T30_SUPPORT_V27TER) if (s->t30.supported_modems & T30_SUPPORT_V27TER)
v8_parms.modulations |= V8_MOD_V27TER; v8_parms.modulations |= V8_MOD_V27TER;
/*endif*/
if (s->t30.supported_modems & T30_SUPPORT_V29) if (s->t30.supported_modems & T30_SUPPORT_V29)
v8_parms.modulations |= V8_MOD_V29; v8_parms.modulations |= V8_MOD_V29;
/*endif*/
if (s->t30.supported_modems & T30_SUPPORT_V17) if (s->t30.supported_modems & T30_SUPPORT_V17)
v8_parms.modulations |= V8_MOD_V17; v8_parms.modulations |= V8_MOD_V17;
/*endif*/
if (s->t30.supported_modems & T30_SUPPORT_V34HDX) if (s->t30.supported_modems & T30_SUPPORT_V34HDX)
v8_parms.modulations |= V8_MOD_V34HDX; v8_parms.modulations |= V8_MOD_V34HDX;
/*endif*/
v8_parms.protocol = V8_PROTOCOL_NONE; v8_parms.protocol = V8_PROTOCOL_NONE;
v8_parms.pcm_modem_availability = 0; v8_parms.pcm_modem_availability = 0;
v8_parms.pstn_access = 0; v8_parms.pstn_access = 0;
@ -453,7 +463,9 @@ SPAN_DECLARE(fax_state_t *) fax_init(fax_state_t *s, int calling_party)
{ {
if ((s = (fax_state_t *) span_alloc(sizeof(*s))) == NULL) if ((s = (fax_state_t *) span_alloc(sizeof(*s))) == NULL)
return NULL; return NULL;
/*endif*/
} }
/*endif*/
memset(s, 0, sizeof(*s)); memset(s, 0, sizeof(*s));
span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_init(&s->logging, SPAN_LOG_NONE, NULL);
span_log_set_protocol(&s->logging, "FAX"); span_log_set_protocol(&s->logging, "FAX");
@ -479,12 +491,16 @@ SPAN_DECLARE(fax_state_t *) fax_init(fax_state_t *s, int calling_party)
v8_parms.modulations = V8_MOD_V21; v8_parms.modulations = V8_MOD_V21;
if (s->t30.supported_modems & T30_SUPPORT_V27TER) if (s->t30.supported_modems & T30_SUPPORT_V27TER)
v8_parms.modulations |= V8_MOD_V27TER; v8_parms.modulations |= V8_MOD_V27TER;
/*endif*/
if (s->t30.supported_modems & T30_SUPPORT_V29) if (s->t30.supported_modems & T30_SUPPORT_V29)
v8_parms.modulations |= V8_MOD_V29; v8_parms.modulations |= V8_MOD_V29;
/*endif*/
if (s->t30.supported_modems & T30_SUPPORT_V17) if (s->t30.supported_modems & T30_SUPPORT_V17)
v8_parms.modulations |= V8_MOD_V17; v8_parms.modulations |= V8_MOD_V17;
/*endif*/
if (s->t30.supported_modems & T30_SUPPORT_V34HDX) if (s->t30.supported_modems & T30_SUPPORT_V34HDX)
v8_parms.modulations |= V8_MOD_V34HDX; v8_parms.modulations |= V8_MOD_V34HDX;
/*endif*/
v8_parms.protocol = V8_PROTOCOL_NONE; v8_parms.protocol = V8_PROTOCOL_NONE;
v8_parms.pcm_modem_availability = 0; v8_parms.pcm_modem_availability = 0;
v8_parms.pstn_access = 0; v8_parms.pstn_access = 0;

View File

@ -157,6 +157,8 @@ SPAN_DECLARE_NONSTD(void) fax_modems_hdlc_accept(void *user_data, const uint8_t
fax_modems_state_t *s; fax_modems_state_t *s;
s = (fax_modems_state_t *) user_data; s = (fax_modems_state_t *) user_data;
/* If this is a good frame report - i.e. not a status report, or a bad frame - we can
say the current signal source is valid. */
if (len >= 0 && ok) if (len >= 0 && ok)
s->rx_frame_received = true; s->rx_frame_received = true;
if (s->hdlc_accept) if (s->hdlc_accept)

View File

@ -195,6 +195,11 @@ void compute_hilbert_transform(double coeffs[], int len)
coeffs[h + i] = -x; coeffs[h + i] = -x;
coeffs[h - i] = x; coeffs[h - i] = x;
} }
else
{
coeffs[h + i] =
coeffs[h - i] = 0.0;
}
} }
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/

View File

@ -175,7 +175,9 @@ SPAN_DECLARE(fsk_tx_state_t *) fsk_tx_init(fsk_tx_state_t *s,
{ {
if ((s = (fsk_tx_state_t *) span_alloc(sizeof(*s))) == NULL) if ((s = (fsk_tx_state_t *) span_alloc(sizeof(*s))) == NULL)
return NULL; return NULL;
/*endif*/
} }
/*endif*/
memset(s, 0, sizeof(*s)); memset(s, 0, sizeof(*s));
s->get_bit = get_bit; s->get_bit = get_bit;
@ -205,6 +207,7 @@ SPAN_DECLARE_NONSTD(int) fsk_tx(fsk_tx_state_t *s, int16_t amp[], int len)
if (s->shutdown) if (s->shutdown)
return 0; return 0;
/*endif*/
/* Make the transitions between 0 and 1 phase coherent, but instantaneous /* Make the transitions between 0 and 1 phase coherent, but instantaneous
jumps. There is currently no interpolation for bauds that end mid-sample. jumps. There is currently no interpolation for bauds that end mid-sample.
Mainstream users will not care. Some specialist users might have a problem Mainstream users will not care. Some specialist users might have a problem
@ -218,15 +221,20 @@ SPAN_DECLARE_NONSTD(int) fsk_tx(fsk_tx_state_t *s, int16_t amp[], int len)
{ {
if (s->status_handler) if (s->status_handler)
s->status_handler(s->status_user_data, SIG_STATUS_END_OF_DATA); s->status_handler(s->status_user_data, SIG_STATUS_END_OF_DATA);
/*endif*/
if (s->status_handler) if (s->status_handler)
s->status_handler(s->status_user_data, SIG_STATUS_SHUTDOWN_COMPLETE); s->status_handler(s->status_user_data, SIG_STATUS_SHUTDOWN_COMPLETE);
/*endif*/
s->shutdown = true; s->shutdown = true;
break; break;
} }
/*endif*/
s->current_phase_rate = s->phase_rates[bit & 1]; s->current_phase_rate = s->phase_rates[bit & 1];
} }
amp[sample] = dds_mod(&(s->phase_acc), s->current_phase_rate, s->scaling, 0); /*endif*/
amp[sample] = dds_mod(&s->phase_acc, s->current_phase_rate, s->scaling, 0);
} }
/*endfor*/
return sample; return sample;
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
@ -304,6 +312,7 @@ SPAN_DECLARE(int) fsk_rx_restart(fsk_rx_state_t *s, const fsk_spec_t *spec, int
buffer. */ buffer. */
if (s->correlation_span > FSK_MAX_WINDOW_LEN) if (s->correlation_span > FSK_MAX_WINDOW_LEN)
s->correlation_span = FSK_MAX_WINDOW_LEN; s->correlation_span = FSK_MAX_WINDOW_LEN;
/*endif*/
/* We need to scale, to avoid overflow in the correlation. */ /* We need to scale, to avoid overflow in the correlation. */
s->scaling_shift = 0; s->scaling_shift = 0;
@ -313,6 +322,7 @@ SPAN_DECLARE(int) fsk_rx_restart(fsk_rx_state_t *s, const fsk_spec_t *spec, int
s->scaling_shift++; s->scaling_shift++;
chop >>= 1; chop >>= 1;
} }
/*endwhile*/
/* Initialise the baud/bit rate tracking. */ /* Initialise the baud/bit rate tracking. */
s->baud_phase = 0; s->baud_phase = 0;
@ -321,7 +331,7 @@ SPAN_DECLARE(int) fsk_rx_restart(fsk_rx_state_t *s, const fsk_spec_t *spec, int
s->last_bit = 0; s->last_bit = 0;
/* Initialise a power detector, so sense when a signal is present. */ /* Initialise a power detector, so sense when a signal is present. */
power_meter_init(&(s->power), 4); power_meter_init(&s->power, 4);
s->signal_present = 0; s->signal_present = 0;
return 0; return 0;
} }
@ -337,7 +347,9 @@ SPAN_DECLARE(fsk_rx_state_t *) fsk_rx_init(fsk_rx_state_t *s,
{ {
if ((s = (fsk_rx_state_t *) span_alloc(sizeof(*s))) == NULL) if ((s = (fsk_rx_state_t *) span_alloc(sizeof(*s))) == NULL)
return NULL; return NULL;
/*endif*/
} }
/*endif*/
memset(s, 0, sizeof(*s)); memset(s, 0, sizeof(*s));
s->put_bit = put_bit; s->put_bit = put_bit;
@ -366,6 +378,7 @@ static void report_status_change(fsk_rx_state_t *s, int status)
s->status_handler(s->status_user_data, status); s->status_handler(s->status_user_data, status);
else if (s->put_bit) else if (s->put_bit)
s->put_bit(s->put_bit_user_data, status); s->put_bit(s->put_bit_user_data, status);
/*endif*/
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
@ -382,7 +395,6 @@ SPAN_DECLARE_NONSTD(int) fsk_rx(fsk_rx_state_t *s, const int16_t *amp, int len)
complexi_t ph; complexi_t ph;
buf_ptr = s->buf_ptr; buf_ptr = s->buf_ptr;
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
{ {
/* The *totally* asynchronous character to character behaviour of these /* The *totally* asynchronous character to character behaviour of these
@ -393,7 +405,7 @@ SPAN_DECLARE_NONSTD(int) fsk_rx(fsk_rx_state_t *s, const int16_t *amp, int len)
s->dot[j].re -= s->window[j][buf_ptr].re; s->dot[j].re -= s->window[j][buf_ptr].re;
s->dot[j].im -= s->window[j][buf_ptr].im; s->dot[j].im -= s->window[j][buf_ptr].im;
ph = dds_complexi(&(s->phase_acc[j]), s->phase_rate[j]); ph = dds_complexi(&s->phase_acc[j], s->phase_rate[j]);
s->window[j][buf_ptr].re = (ph.re*amp[i]) >> s->scaling_shift; s->window[j][buf_ptr].re = (ph.re*amp[i]) >> s->scaling_shift;
s->window[j][buf_ptr].im = (ph.im*amp[i]) >> s->scaling_shift; s->window[j][buf_ptr].im = (ph.im*amp[i]) >> s->scaling_shift;
@ -405,13 +417,14 @@ SPAN_DECLARE_NONSTD(int) fsk_rx(fsk_rx_state_t *s, const int16_t *amp, int len)
dot = s->dot[j].im >> 15; dot = s->dot[j].im >> 15;
sum[j] += dot*dot; sum[j] += dot*dot;
} }
/*endfor*/
/* If there isn't much signal, don't demodulate - it will only produce /* If there isn't much signal, don't demodulate - it will only produce
useless junk results. */ useless junk results. */
/* There should be no DC in the signal, but sometimes there is. /* There should be no DC in the signal, but sometimes there is.
We need to measure the power with the DC blocked, but not using We need to measure the power with the DC blocked, but not using
a slow to respond DC blocker. Use the most elementary HPF. */ a slow to respond DC blocker. Use the most elementary HPF. */
x = amp[i] >> 1; x = amp[i] >> 1;
power = power_meter_update(&(s->power), x - s->last_sample); power = power_meter_update(&s->power, x - s->last_sample);
s->last_sample = x; s->last_sample = x;
if (s->signal_present) if (s->signal_present)
{ {
@ -426,7 +439,9 @@ SPAN_DECLARE_NONSTD(int) fsk_rx(fsk_rx_state_t *s, const int16_t *amp, int len)
s->baud_phase = 0; s->baud_phase = 0;
continue; continue;
} }
/*endif*/
} }
/*endif*/
} }
else else
{ {
@ -436,11 +451,13 @@ SPAN_DECLARE_NONSTD(int) fsk_rx(fsk_rx_state_t *s, const int16_t *amp, int len)
s->baud_phase = 0; s->baud_phase = 0;
continue; continue;
} }
/*endif*/
if (s->baud_phase < (s->correlation_span >> 1) - 30) if (s->baud_phase < (s->correlation_span >> 1) - 30)
{ {
s->baud_phase++; s->baud_phase++;
continue; continue;
} }
/*endif*/
s->signal_present = 1; s->signal_present = 1;
/* Initialise the baud/bit rate tracking. */ /* Initialise the baud/bit rate tracking. */
s->baud_phase = 0; s->baud_phase = 0;
@ -449,6 +466,7 @@ SPAN_DECLARE_NONSTD(int) fsk_rx(fsk_rx_state_t *s, const int16_t *amp, int len)
s->last_bit = 0; s->last_bit = 0;
report_status_change(s, SIG_STATUS_CARRIER_UP); report_status_change(s, SIG_STATUS_CARRIER_UP);
} }
/*endif*/
/* Non-coherent FSK demodulation by correlation with the target tones /* Non-coherent FSK demodulation by correlation with the target tones
over a one baud interval. The slow V.xx specs. are too open ended over a one baud interval. The slow V.xx specs. are too open ended
to allow anything fancier to be used. The dot products are calculated to allow anything fancier to be used. The dot products are calculated
@ -469,7 +487,9 @@ SPAN_DECLARE_NONSTD(int) fsk_rx(fsk_rx_state_t *s, const int16_t *amp, int len)
s->baud_phase += (s->baud_rate >> 3); s->baud_phase += (s->baud_rate >> 3);
else else
s->baud_phase -= (s->baud_rate >> 3); s->baud_phase -= (s->baud_rate >> 3);
/*endif*/
} }
/*endif*/
if ((s->baud_phase += s->baud_rate) >= (SAMPLE_RATE*100)) if ((s->baud_phase += s->baud_rate) >= (SAMPLE_RATE*100))
{ {
/* We should be in the middle of a baud now, so report the current /* We should be in the middle of a baud now, so report the current
@ -477,6 +497,7 @@ SPAN_DECLARE_NONSTD(int) fsk_rx(fsk_rx_state_t *s, const int16_t *amp, int len)
s->baud_phase -= (SAMPLE_RATE*100); s->baud_phase -= (SAMPLE_RATE*100);
s->put_bit(s->put_bit_user_data, baudstate); s->put_bit(s->put_bit_user_data, baudstate);
} }
/*endif*/
break; break;
case FSK_FRAME_MODE_ASYNC: case FSK_FRAME_MODE_ASYNC:
/* Fully asynchronous mode */ /* Fully asynchronous mode */
@ -492,6 +513,7 @@ SPAN_DECLARE_NONSTD(int) fsk_rx(fsk_rx_state_t *s, const int16_t *amp, int len)
the most accurate baud alignment we can do. */ the most accurate baud alignment we can do. */
s->baud_phase = SAMPLE_RATE*50; s->baud_phase = SAMPLE_RATE*50;
} }
/*endif*/
if ((s->baud_phase += s->baud_rate) >= (SAMPLE_RATE*100)) if ((s->baud_phase += s->baud_rate) >= (SAMPLE_RATE*100))
{ {
/* We should be in the middle of a baud now, so report the current /* We should be in the middle of a baud now, so report the current
@ -499,6 +521,7 @@ SPAN_DECLARE_NONSTD(int) fsk_rx(fsk_rx_state_t *s, const int16_t *amp, int len)
s->baud_phase -= (SAMPLE_RATE*100); s->baud_phase -= (SAMPLE_RATE*100);
s->put_bit(s->put_bit_user_data, baudstate); s->put_bit(s->put_bit_user_data, baudstate);
} }
/*endif*/
break; break;
case FSK_FRAME_MODE_5N1_FRAMES: case FSK_FRAME_MODE_5N1_FRAMES:
case FSK_FRAME_MODE_7N1_FRAMES: case FSK_FRAME_MODE_7N1_FRAMES:
@ -517,6 +540,7 @@ SPAN_DECLARE_NONSTD(int) fsk_rx(fsk_rx_state_t *s, const int16_t *amp, int len)
s->frame_bits = 0; s->frame_bits = 0;
s->last_bit = -1; s->last_bit = -1;
} }
/*endif*/
} }
else if (s->frame_state == -1) else if (s->frame_state == -1)
{ {
@ -535,7 +559,9 @@ SPAN_DECLARE_NONSTD(int) fsk_rx(fsk_rx_state_t *s, const int16_t *amp, int len)
s->frame_state = 1; s->frame_state = 1;
s->last_bit = baudstate; s->last_bit = baudstate;
} }
/*endif*/
} }
/*endif*/
} }
else else
{ {
@ -544,6 +570,7 @@ SPAN_DECLARE_NONSTD(int) fsk_rx(fsk_rx_state_t *s, const int16_t *amp, int len)
{ {
if (s->last_bit < 0) if (s->last_bit < 0)
s->last_bit = baudstate; s->last_bit = baudstate;
/*endif*/
/* Look for the bit being consistent over the central 20% of the bit time. */ /* Look for the bit being consistent over the central 20% of the bit time. */
if (s->last_bit != baudstate) if (s->last_bit != baudstate)
{ {
@ -563,6 +590,7 @@ SPAN_DECLARE_NONSTD(int) fsk_rx(fsk_rx_state_t *s, const int16_t *amp, int len)
/* Drop the start bit, and pass the rest back */ /* Drop the start bit, and pass the rest back */
s->put_bit(s->put_bit_user_data, s->frame_bits >> 2); s->put_bit(s->put_bit_user_data, s->frame_bits >> 2);
} }
/*endif*/
s->frame_state = 0; s->frame_state = 0;
} }
else else
@ -570,21 +598,29 @@ SPAN_DECLARE_NONSTD(int) fsk_rx(fsk_rx_state_t *s, const int16_t *amp, int len)
s->frame_bits |= (baudstate << s->framing_mode); s->frame_bits |= (baudstate << s->framing_mode);
s->frame_bits >>= 1; s->frame_bits >>= 1;
} }
/*endif*/
s->baud_phase -= (SAMPLE_RATE*100); s->baud_phase -= (SAMPLE_RATE*100);
} }
else else
{ {
s->frame_state = 0; s->frame_state = 0;
} }
/*endif*/
s->last_bit = -1; s->last_bit = -1;
} }
/*endif*/
} }
/*endif*/
} }
/*endif*/
break; break;
} }
/*endswitch*/
if (++buf_ptr >= s->correlation_span) if (++buf_ptr >= s->correlation_span)
buf_ptr = 0; buf_ptr = 0;
/*endif*/
} }
/*endfor*/
s->buf_ptr = buf_ptr; s->buf_ptr = buf_ptr;
return 0; return 0;
} }
@ -592,10 +628,33 @@ SPAN_DECLARE_NONSTD(int) fsk_rx(fsk_rx_state_t *s, const int16_t *amp, int len)
SPAN_DECLARE_NONSTD(int) fsk_rx_fillin(fsk_rx_state_t *s, int len) SPAN_DECLARE_NONSTD(int) fsk_rx_fillin(fsk_rx_state_t *s, int len)
{ {
int buf_ptr;
int i;
int j;
/* The valid choice here is probably to do nothing. We don't change state /* The valid choice here is probably to do nothing. We don't change state
(i.e carrier on<->carrier off), and we'll just output less bits than we (i.e carrier on<->carrier off), and we'll just output less bits than we
should. */ should. */
/* TODO: Advance the symbol phase the appropriate amount */ buf_ptr = s->buf_ptr;
for (i = 0; i < len; i++)
{
for (j = 0; j < 2; j++)
{
s->dot[j].re -= s->window[j][buf_ptr].re;
s->dot[j].im -= s->window[j][buf_ptr].im;
dds_advance(&s->phase_acc[j], s->phase_rate[j]);
s->window[j][buf_ptr].re = 0;
s->window[j][buf_ptr].im = 0;
s->dot[j].re += s->window[j][buf_ptr].re;
s->dot[j].im += s->window[j][buf_ptr].im;
}
/*endfor*/
}
/*endfor*/
s->buf_ptr = buf_ptr;
return 0; return 0;
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/

View File

@ -194,37 +194,37 @@ static void block4(g722_band_t *s, int16_t dx)
int i; int i;
/* RECONS */ /* RECONS */
r = saturated_add16(s->s, dx); r = sat_add16(s->s, dx);
/* PARREC */ /* PARREC */
p = saturated_add16(s->sz, dx); p = sat_add16(s->sz, dx);
/* UPPOL2 */ /* UPPOL2 */
wd1 = saturate((int32_t) s->a[0] << 2); wd1 = saturate16((int32_t) s->a[0] << 2);
wd32 = ((p ^ s->p[0]) & 0x8000) ? wd1 : -wd1; wd32 = ((p ^ s->p[0]) & 0x8000) ? wd1 : -wd1;
if (wd32 > 32767) if (wd32 > 32767)
wd32 = 32767; wd32 = 32767;
wd3 = (int16_t) ((((p ^ s->p[1]) & 0x8000) ? -128 : 128) wd3 = (int16_t) ((((p ^ s->p[1]) & 0x8000) ? -128 : 128)
+ (wd32 >> 7) + (wd32 >> 7)
+ (((int32_t) s->a[1]*(int32_t) 32512) >> 15)); + (((int32_t) s->a[1]*32512) >> 15));
if (abs(wd3) > 12288) if (abs(wd3) > 12288)
wd3 = (wd3 < 0) ? -12288 : 12288; wd3 = (wd3 < 0) ? -12288 : 12288;
ap[1] = wd3; ap[1] = wd3;
/* UPPOL1 */ /* UPPOL1 */
wd1 = ((p ^ s->p[0]) & 0x8000) ? -192 : 192; wd1 = ((p ^ s->p[0]) & 0x8000) ? -192 : 192;
wd2 = (int16_t) (((int32_t) s->a[0]*(int32_t) 32640) >> 15); wd2 = (int16_t) (((int32_t) s->a[0]*32640) >> 15);
ap[0] = saturated_add16(wd1, wd2); ap[0] = sat_add16(wd1, wd2);
wd3 = saturated_sub16(15360, ap[1]); wd3 = sat_sub16(15360, ap[1]);
if (abs(ap[0]) > wd3) if (abs(ap[0]) > wd3)
ap[0] = (ap[0] < 0) ? -wd3 : wd3; ap[0] = (ap[0] < 0) ? -wd3 : wd3;
/* FILTEP */ /* FILTEP */
wd1 = saturated_add16(r, r); wd1 = sat_add16(r, r);
wd1 = (int16_t) (((int32_t) ap[0]*(int32_t) wd1) >> 15); wd1 = (int16_t) (((int32_t) ap[0]*wd1) >> 15);
wd2 = saturated_add16(s->r, s->r); wd2 = sat_add16(s->r, s->r);
wd2 = (int16_t) (((int32_t) ap[1]*(int32_t) wd2) >> 15); wd2 = (int16_t) (((int32_t) ap[1]*wd2) >> 15);
sp = saturated_add16(wd1, wd2); sp = sat_add16(wd1, wd2);
s->r = r; s->r = r;
s->a[1] = ap[1]; s->a[1] = ap[1];
s->a[0] = ap[0]; s->a[0] = ap[0];
@ -240,16 +240,16 @@ static void block4(g722_band_t *s, int16_t dx)
for (i = 5; i >= 0; i--) for (i = 5; i >= 0; i--)
{ {
wd2 = ((s->d[i + 1] ^ dx) & 0x8000) ? -wd1 : wd1; wd2 = ((s->d[i + 1] ^ dx) & 0x8000) ? -wd1 : wd1;
wd3 = (int16_t) (((int32_t) s->b[i]*(int32_t) 32640) >> 15); wd3 = (int16_t) (((int32_t) s->b[i]*32640) >> 15);
s->b[i] = saturated_add16(wd2, wd3); s->b[i] = sat_add16(wd2, wd3);
wd3 = saturated_add16(s->d[i], s->d[i]); wd3 = sat_add16(s->d[i], s->d[i]);
sz += ((int32_t) s->b[i]*(int32_t) wd3) >> 15; sz += ((int32_t) s->b[i]*wd3) >> 15;
s->d[i + 1] = s->d[i]; s->d[i + 1] = s->d[i];
} }
s->sz = saturate(sz); s->sz = saturate16(sz);
/* PREDIC */ /* PREDIC */
s->s = saturated_add16(sp, s->sz); s->s = sat_add16(sp, s->sz);
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
@ -349,18 +349,18 @@ SPAN_DECLARE(int) g722_decode(g722_decode_state_t *s, int16_t amp[], const uint8
break; break;
} }
/* Block 5L, LOW BAND INVQBL */ /* Block 5L, LOW BAND INVQBL */
wd2 = ((int32_t) s->band[0].det*(int32_t) wd2) >> 15; wd2 = ((int32_t) s->band[0].det*wd2) >> 15;
/* Block 5L, RECONS */ /* Block 5L, RECONS */
/* Block 6L, LIMIT */ /* Block 6L, LIMIT */
rlow = saturate15(s->band[0].s + wd2); rlow = saturate15(s->band[0].s + wd2);
/* Block 2L, INVQAL */ /* Block 2L, INVQAL */
wd2 = qm4[wd1]; wd2 = qm4[wd1];
dlow = (int16_t) (((int32_t) s->band[0].det*(int32_t) wd2) >> 15); dlow = (int16_t) (((int32_t) s->band[0].det*wd2) >> 15);
/* Block 3L, LOGSCL */ /* Block 3L, LOGSCL */
wd2 = rl42[wd1]; wd2 = rl42[wd1];
wd1 = ((int32_t) s->band[0].nb*(int32_t) 127) >> 7; wd1 = ((int32_t) s->band[0].nb*127) >> 7;
wd1 += wl[wd2]; wd1 += wl[wd2];
if (wd1 < 0) if (wd1 < 0)
wd1 = 0; wd1 = 0;
@ -380,14 +380,14 @@ SPAN_DECLARE(int) g722_decode(g722_decode_state_t *s, int16_t amp[], const uint8
{ {
/* Block 2H, INVQAH */ /* Block 2H, INVQAH */
wd2 = qm2[ihigh]; wd2 = qm2[ihigh];
dhigh = (int16_t) (((int32_t) s->band[1].det*(int32_t) wd2) >> 15); dhigh = (int16_t) (((int32_t) s->band[1].det*wd2) >> 15);
/* Block 5H, RECONS */ /* Block 5H, RECONS */
/* Block 6H, LIMIT */ /* Block 6H, LIMIT */
rhigh = saturate15(dhigh + s->band[1].s); rhigh = saturate15(dhigh + s->band[1].s);
/* Block 2H, INVQAH */ /* Block 2H, INVQAH */
wd2 = rh2[ihigh]; wd2 = rh2[ihigh];
wd1 = ((int32_t) s->band[1].nb*(int32_t) 127) >> 7; wd1 = ((int32_t) s->band[1].nb*127) >> 7;
wd1 += wh[wd2]; wd1 += wh[wd2];
if (wd1 < 0) if (wd1 < 0)
wd1 = 0; wd1 = 0;
@ -532,14 +532,14 @@ SPAN_DECLARE(int) g722_encode(g722_encode_state_t *s, uint8_t g722_data[], const
} }
} }
/* Block 1L, SUBTRA */ /* Block 1L, SUBTRA */
el = saturated_sub16(xlow, s->band[0].s); el = sat_sub16(xlow, s->band[0].s);
/* Block 1L, QUANTL */ /* Block 1L, QUANTL */
wd = (el >= 0) ? el : ~el; wd = (el >= 0) ? el : ~el;
for (i = 1; i < 30; i++) for (i = 1; i < 30; i++)
{ {
wd1 = ((int32_t) q6[i]*(int32_t) s->band[0].det) >> 12; wd1 = ((int32_t) q6[i]*s->band[0].det) >> 12;
if (wd < wd1) if (wd < wd1)
break; break;
} }
@ -548,11 +548,11 @@ SPAN_DECLARE(int) g722_encode(g722_encode_state_t *s, uint8_t g722_data[], const
/* Block 2L, INVQAL */ /* Block 2L, INVQAL */
ril = ilow >> 2; ril = ilow >> 2;
wd2 = qm4[ril]; wd2 = qm4[ril];
dlow = (int16_t) (((int32_t) s->band[0].det*(int32_t) wd2) >> 15); dlow = (int16_t) (((int32_t) s->band[0].det*wd2) >> 15);
/* Block 3L, LOGSCL */ /* Block 3L, LOGSCL */
il4 = rl42[ril]; il4 = rl42[ril];
wd = ((int32_t) s->band[0].nb*(int32_t) 127) >> 7; wd = ((int32_t) s->band[0].nb*127) >> 7;
s->band[0].nb = (int16_t) (wd + wl[il4]); s->band[0].nb = (int16_t) (wd + wl[il4]);
if (s->band[0].nb < 0) if (s->band[0].nb < 0)
s->band[0].nb = 0; s->band[0].nb = 0;
@ -575,7 +575,7 @@ SPAN_DECLARE(int) g722_encode(g722_encode_state_t *s, uint8_t g722_data[], const
else else
{ {
/* Block 1H, SUBTRA */ /* Block 1H, SUBTRA */
eh = saturated_sub16(xhigh, s->band[1].s); eh = sat_sub16(xhigh, s->band[1].s);
/* Block 1H, QUANTH */ /* Block 1H, QUANTH */
wd = (eh >= 0) ? eh : ~eh; wd = (eh >= 0) ? eh : ~eh;
@ -585,11 +585,11 @@ SPAN_DECLARE(int) g722_encode(g722_encode_state_t *s, uint8_t g722_data[], const
/* Block 2H, INVQAH */ /* Block 2H, INVQAH */
wd2 = qm2[ihigh]; wd2 = qm2[ihigh];
dhigh = (int16_t) (((int32_t) s->band[1].det*(int32_t) wd2) >> 15); dhigh = (int16_t) (((int32_t) s->band[1].det*wd2) >> 15);
/* Block 3H, LOGSCH */ /* Block 3H, LOGSCH */
ih2 = rh2[ihigh]; ih2 = rh2[ihigh];
wd = ((int32_t) s->band[1].nb*(int32_t) 127) >> 7; wd = ((int32_t) s->band[1].nb*127) >> 7;
s->band[1].nb = (int16_t) (wd + wh[ih2]); s->band[1].nb = (int16_t) (wd + wh[ih2]);
if (s->band[1].nb < 0) if (s->band[1].nb < 0)
s->band[1].nb = 0; s->band[1].nb = 0;

View File

@ -65,9 +65,9 @@ static void postprocessing(gsm0610_state_t *s, int16_t amp[])
{ {
tmp = gsm_mult_r(msr, 28180); tmp = gsm_mult_r(msr, 28180);
/* De-emphasis */ /* De-emphasis */
msr = saturated_add16(amp[k], tmp); msr = sat_add16(amp[k], tmp);
/* Truncation & upscaling */ /* Truncation and upscaling */
amp[k] = (int16_t) (saturated_add16(msr, msr) & 0xFFF8); amp[k] = (int16_t) (sat_add16(msr, msr) & 0xFFF8);
} }
/*endfor*/ /*endfor*/
s->msr = msr; s->msr = msr;
@ -162,7 +162,6 @@ SPAN_DECLARE(int) gsm0610_unpack_wav49(gsm0610_frame_t *s, const uint8_t c[])
s->xmaxc[i] = sr & 0x3F; s->xmaxc[i] = sr & 0x3F;
sr >>= 6; sr >>= 6;
s->xMc[i][0] = sr & 0x7; s->xMc[i][0] = sr & 0x7;
sr >>= 3;
sr = *c++; sr = *c++;
s->xMc[i][1] = sr & 0x7; s->xMc[i][1] = sr & 0x7;
sr >>= 3; sr >>= 3;
@ -181,7 +180,6 @@ SPAN_DECLARE(int) gsm0610_unpack_wav49(gsm0610_frame_t *s, const uint8_t c[])
s->xMc[i][7] = sr & 0x7; s->xMc[i][7] = sr & 0x7;
sr >>= 3; sr >>= 3;
s->xMc[i][8] = sr & 0x7; s->xMc[i][8] = sr & 0x7;
sr >>= 3;
sr = *c++; sr = *c++;
s->xMc[i][9] = sr & 0x7; s->xMc[i][9] = sr & 0x7;
sr >>= 3; sr >>= 3;
@ -199,7 +197,6 @@ SPAN_DECLARE(int) gsm0610_unpack_wav49(gsm0610_frame_t *s, const uint8_t c[])
s->LARc[0] = sr & 0x3F; s->LARc[0] = sr & 0x3F;
sr >>= 6; sr >>= 6;
s->LARc[1] = sr & 0x3F; s->LARc[1] = sr & 0x3F;
sr >>= 6;
sr = *c++; sr = *c++;
s->LARc[2] = sr & 0x1F; s->LARc[2] = sr & 0x1F;
sr >>= 5; sr >>= 5;
@ -214,7 +211,6 @@ SPAN_DECLARE(int) gsm0610_unpack_wav49(gsm0610_frame_t *s, const uint8_t c[])
s->LARc[6] = sr & 0x7; s->LARc[6] = sr & 0x7;
sr >>= 3; sr >>= 3;
s->LARc[7] = sr & 0x7; s->LARc[7] = sr & 0x7;
sr >>= 3;
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
{ {
@ -239,7 +235,6 @@ SPAN_DECLARE(int) gsm0610_unpack_wav49(gsm0610_frame_t *s, const uint8_t c[])
s->xMc[i][3] = sr & 0x7; s->xMc[i][3] = sr & 0x7;
sr >>= 3; sr >>= 3;
s->xMc[i][4] = sr & 0x7; s->xMc[i][4] = sr & 0x7;
sr >>= 3;
sr = *c++; sr = *c++;
s->xMc[i][5] = sr & 0x7; s->xMc[i][5] = sr & 0x7;
sr >>= 3; sr >>= 3;
@ -258,7 +253,6 @@ SPAN_DECLARE(int) gsm0610_unpack_wav49(gsm0610_frame_t *s, const uint8_t c[])
s->xMc[i][11] = sr & 0x7; s->xMc[i][11] = sr & 0x7;
sr >>= 3; sr >>= 3;
s->xMc[i][12] = sr & 0x7; s->xMc[i][12] = sr & 0x7;
sr >>= 3;
} }
return 65; return 65;
} }

View File

@ -93,7 +93,7 @@ static void encode_a_frame(gsm0610_state_t *s, gsm0610_frame_t *f, const int16_t
gsm0610_rpe_encoding(s, s->e + 5, &f->xmaxc[k], &f->Mc[k], f->xMc[k]); gsm0610_rpe_encoding(s, s->e + 5, &f->xmaxc[k], &f->Mc[k], f->xMc[k]);
for (i = 0; i < 40; i++) for (i = 0; i < 40; i++)
dp[i] = saturated_add16(s->e[5 + i], dpp[i]); dp[i] = sat_add16(s->e[5 + i], dpp[i]);
/*endfor*/ /*endfor*/
dp += 40; dp += 40;
dpp += 40; dpp += 40;

View File

@ -53,7 +53,7 @@ static __inline__ int16_t gsm_add(int16_t a, int16_t b)
int32_t sum; int32_t sum;
sum = (int32_t) a + (int32_t) b; sum = (int32_t) a + (int32_t) b;
return saturate(sum); return saturate16(sum);
#endif #endif
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
@ -98,7 +98,7 @@ static __inline__ int16_t gsm_sub(int16_t a, int16_t b)
int32_t diff; int32_t diff;
diff = (int32_t) a - (int32_t) b; diff = (int32_t) a - (int32_t) b;
return saturate(diff); return saturate16(diff);
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/

View File

@ -269,7 +269,7 @@ static int16_t evaluate_ltp_parameters(int16_t d[40],
for (k = 0; k < 40; k++) for (k = 0; k < 40; k++)
{ {
temp = d[k]; temp = d[k];
temp = saturated_abs16(temp); temp = sat_abs16(temp);
if (temp > dmax) if (temp > dmax)
dmax = temp; dmax = temp;
/*endif*/ /*endif*/
@ -337,7 +337,7 @@ static int16_t evaluate_ltp_parameters(int16_t d[40],
quantization of the LTP gain b to get the coded version bc. */ quantization of the LTP gain b to get the coded version bc. */
for (bc = 0; bc <= 2; bc++) for (bc = 0; bc <= 2; bc++)
{ {
if (R <= saturated_mul16(S, gsm_DLB[bc])) if (R <= sat_mul16(S, gsm_DLB[bc]))
break; break;
/*endif*/ /*endif*/
} }
@ -363,7 +363,7 @@ static void long_term_analysis_filtering(int16_t bc,
for (k = 0; k < 40; k++) for (k = 0; k < 40; k++)
{ {
dpp[k] = gsm_mult_r(gsm_QLB[bc], dp[k - Nc]); dpp[k] = gsm_mult_r(gsm_QLB[bc], dp[k - Nc]);
e[k] = saturated_sub16(d[k], dpp[k]); e[k] = sat_sub16(d[k], dpp[k]);
} }
/*endfor*/ /*endfor*/
} }
@ -421,7 +421,7 @@ void gsm0610_long_term_synthesis_filtering(gsm0610_state_t *s,
for (k = 0; k < 40; k++) for (k = 0; k < 40; k++)
{ {
drpp = gsm_mult_r(brp, drp[k - Nr]); drpp = gsm_mult_r(brp, drp[k - Nr]);
drp[k] = saturated_add16(erp[k], drpp); drp[k] = sat_add16(erp[k], drpp);
} }
/*endfor*/ /*endfor*/

View File

@ -290,11 +290,11 @@ static void autocorrelation(int16_t amp[GSM0610_FRAME_LEN], int32_t L_ACF[9])
/* Dynamic scaling of the array s[0..159] */ /* Dynamic scaling of the array s[0..159] */
/* Search for the maximum. */ /* Search for the maximum. */
#if defined(__GNUC__) && defined(SPANDSP_USE_MMX) #if defined(__GNUC__) && defined(SPANDSP_USE_MMX)
smax = saturate(vec_min_maxi16(amp, GSM0610_FRAME_LEN, NULL)); smax = saturate16(vec_min_maxi16(amp, GSM0610_FRAME_LEN, NULL));
#else #else
for (smax = 0, k = 0; k < GSM0610_FRAME_LEN; k++) for (smax = 0, k = 0; k < GSM0610_FRAME_LEN; k++)
{ {
temp = saturated_abs16(amp[k]); temp = sat_abs16(amp[k]);
if (temp > smax) if (temp > smax)
smax = (int16_t) temp; smax = (int16_t) temp;
/*endif*/ /*endif*/
@ -462,7 +462,7 @@ static void reflection_coefficients(int32_t L_ACF[9], int16_t r[8])
for (n = 1; n <= 8; n++, r++) for (n = 1; n <= 8; n++, r++)
{ {
temp = P[1]; temp = P[1];
temp = saturated_abs16(temp); temp = sat_abs16(temp);
if (P[0] < temp) if (P[0] < temp)
{ {
for (i = n; i <= 8; i++) for (i = n; i <= 8; i++)
@ -485,15 +485,15 @@ static void reflection_coefficients(int32_t L_ACF[9], int16_t r[8])
/* Schur recursion */ /* Schur recursion */
temp = gsm_mult_r(P[1], *r); temp = gsm_mult_r(P[1], *r);
P[0] = saturated_add16(P[0], temp); P[0] = sat_add16(P[0], temp);
for (m = 1; m <= 8 - n; m++) for (m = 1; m <= 8 - n; m++)
{ {
temp = gsm_mult_r(K[m], *r); temp = gsm_mult_r(K[m], *r);
P[m] = saturated_add16(P[m + 1], temp); P[m] = sat_add16(P[m + 1], temp);
temp = gsm_mult_r(P[m + 1], *r); temp = gsm_mult_r(P[m + 1], *r);
K[m] = saturated_add16(K[m], temp); K[m] = sat_add16(K[m], temp);
} }
/*endfor*/ /*endfor*/
} }
@ -517,7 +517,7 @@ static void transform_to_log_area_ratios(int16_t r[8])
/* Computation of the LAR[0..7] from the r[0..7] */ /* Computation of the LAR[0..7] from the r[0..7] */
for (i = 1; i <= 8; i++, r++) for (i = 1; i <= 8; i++, r++)
{ {
temp = saturated_abs16(*r); temp = sat_abs16(*r);
assert(temp >= 0); assert(temp >= 0);
if (temp < 22118) if (temp < 22118)
@ -559,8 +559,8 @@ static void quantization_and_coding(int16_t LAR[8])
#undef STEP #undef STEP
#define STEP(A,B,MAC,MIC) \ #define STEP(A,B,MAC,MIC) \
temp = saturated_mul16(A, *LAR); \ temp = sat_mul16(A, *LAR); \
temp = saturated_add16(temp, (B + 256)); \ temp = sat_add16(temp, (B + 256)); \
temp >>= 9; \ temp >>= 9; \
*LAR = (int16_t) ((temp > MAC) \ *LAR = (int16_t) ((temp > MAC) \
? \ ? \

View File

@ -121,7 +121,7 @@ void gsm0610_preprocess(gsm0610_state_t *s, const int16_t amp[GSM0610_FRAME_LEN]
* L_temp = (++L_temp) >> 1; * L_temp = (++L_temp) >> 1;
* L_z2 = L_z2 - L_temp; * L_z2 = L_z2 - L_temp;
*/ */
L_z2 = saturated_add32(L_z2, L_s2); L_z2 = sat_add32(L_z2, L_s2);
#else #else
/* This does L_z2 = L_z2 * 0x7FD5/0x8000 + L_s2 */ /* This does L_z2 = L_z2 * 0x7FD5/0x8000 + L_s2 */
msp = (int16_t) (L_z2 >> 15); msp = (int16_t) (L_z2 >> 15);
@ -129,16 +129,16 @@ void gsm0610_preprocess(gsm0610_state_t *s, const int16_t amp[GSM0610_FRAME_LEN]
L_s2 += gsm_mult_r(lsp, 32735); L_s2 += gsm_mult_r(lsp, 32735);
L_temp = (int32_t) msp*32735; L_temp = (int32_t) msp*32735;
L_z2 = saturated_add32(L_temp, L_s2); L_z2 = sat_add32(L_temp, L_s2);
#endif #endif
/* Compute sof[k] with rounding */ /* Compute sof[k] with rounding */
L_temp = saturated_add32(L_z2, 16384); L_temp = sat_add32(L_z2, 16384);
/* 4.2.3 Preemphasis */ /* 4.2.3 Preemphasis */
msp = gsm_mult_r(mp, -28180); msp = gsm_mult_r(mp, -28180);
mp = (int16_t) (L_temp >> 15); mp = (int16_t) (L_temp >> 15);
so[k] = saturated_add16(mp, msp); so[k] = sat_add16(mp, msp);
} }
/*endfor*/ /*endfor*/

View File

@ -196,8 +196,8 @@ static void weighting_filter(int16_t x[40],
/* for (i = 0; i <= 10; i++) /* for (i = 0; i <= 10; i++)
* { * {
* temp = saturated_mul16_32(wt[k + i], gsm_H[i]); * temp = sat_mul16_32(wt[k + i], gsm_H[i]);
* result = saturated_add32(result, temp); * result = sat_add32(result, temp);
* } * }
*/ */
@ -223,7 +223,7 @@ static void weighting_filter(int16_t x[40],
/* 2 adds vs. >> 16 => 14, minus one shift to compensate for /* 2 adds vs. >> 16 => 14, minus one shift to compensate for
those we lost when replacing L_MULT by '*'. */ those we lost when replacing L_MULT by '*'. */
result >>= 13; result >>= 13;
x[k] = saturate(result); x[k] = saturate16(result);
} }
/*endfor*/ /*endfor*/
#endif #endif
@ -242,7 +242,6 @@ static void rpe_grid_selection(int16_t x[40], int16_t xM[13], int16_t *Mc_out)
/* The signal x[0..39] is used to select the RPE grid which is /* The signal x[0..39] is used to select the RPE grid which is
represented by Mc. */ represented by Mc. */
EM = 0; EM = 0;
Mc = 0; Mc = 0;
@ -327,10 +326,7 @@ static void rpe_grid_selection(int16_t x[40], int16_t xM[13], int16_t *Mc_out)
STEP(3, 12); STEP(3, 12);
L_result <<= 1; L_result <<= 1;
if (L_result > EM) if (L_result > EM)
{
Mc = 3; Mc = 3;
EM = L_result;
}
/*endif*/ /*endif*/
/* Down-sampling by a factor 3 to get the selected xM[0..12] /* Down-sampling by a factor 3 to get the selected xM[0..12]
@ -408,7 +404,7 @@ static void apcm_quantization(int16_t xM[13],
for (i = 0; i < 13; i++) for (i = 0; i < 13; i++)
{ {
temp = xM[i]; temp = xM[i];
temp = saturated_abs16(temp); temp = sat_abs16(temp);
if (temp > xmax) if (temp > xmax)
xmax = temp; xmax = temp;
/*endif*/ /*endif*/
@ -436,7 +432,7 @@ static void apcm_quantization(int16_t xM[13],
temp = (int16_t) (exp + 5); temp = (int16_t) (exp + 5);
assert(temp <= 11 && temp >= 0); assert(temp <= 11 && temp >= 0);
xmaxc = saturated_add16((xmax >> temp), exp << 3); xmaxc = sat_add16((xmax >> temp), exp << 3);
/* Quantizing and coding of the xM[0..12] RPE sequence /* Quantizing and coding of the xM[0..12] RPE sequence
to get the xMc[0..12] */ to get the xMc[0..12] */
@ -463,7 +459,7 @@ static void apcm_quantization(int16_t xM[13],
assert(temp1 >= 0 && temp1 < 16); assert(temp1 >= 0 && temp1 < 16);
temp = xM[i] << temp1; temp = xM[i] << temp1;
temp = saturated_mul16(temp, temp2); temp = sat_mul16(temp, temp2);
temp >>= 12; temp >>= 12;
xMc[i] = (int16_t) (temp + 4); /* See note below */ xMc[i] = (int16_t) (temp + 4); /* See note below */
} }
@ -483,7 +479,7 @@ static void apcm_inverse_quantization(int16_t xMc[13],
int16_t xMp[13]) int16_t xMp[13])
{ {
/* Table 4.6 Normalized direct mantissa used to compute xM/xmax */ /* Table 4.6 Normalized direct mantissa used to compute xM/xmax */
static const int16_t gsm_FAC[8] = static const int16_t gsm_fac[8] =
{ {
18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767 18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767
}; };
@ -501,9 +497,9 @@ static void apcm_inverse_quantization(int16_t xMc[13],
assert(mant >= 0 && mant <= 7); assert(mant >= 0 && mant <= 7);
#endif #endif
temp1 = gsm_FAC[mant]; /* See 4.2-15 for mant */ temp1 = gsm_fac[mant]; /* See 4.2-15 for mant */
temp2 = saturated_sub16(6, exp); /* See 4.2-15 for exp */ temp2 = sat_sub16(6, exp); /* See 4.2-15 for exp */
temp3 = gsm_asl(1, saturated_sub16(temp2, 1)); temp3 = gsm_asl(1, sat_sub16(temp2, 1));
for (i = 0; i < 13; i++) for (i = 0; i < 13; i++)
{ {
@ -514,7 +510,7 @@ static void apcm_inverse_quantization(int16_t xMc[13],
temp <<= 12; /* 16 bit signed */ temp <<= 12; /* 16 bit signed */
temp = gsm_mult_r(temp1, temp); temp = gsm_mult_r(temp1, temp);
temp = saturated_add16(temp, temp3); temp = sat_add16(temp, temp3);
xMp[i] = gsm_asr(temp, temp2); xMp[i] = gsm_asr(temp, temp2);
} }
/*endfor*/ /*endfor*/

View File

@ -68,10 +68,10 @@ static void decode_log_area_ratios(int16_t LARc[8], int16_t *LARpp)
#undef STEP #undef STEP
#define STEP(B,MIC,INVA) \ #define STEP(B,MIC,INVA) \
temp1 = saturated_add16(*LARc++, MIC) << 10; \ temp1 = sat_add16(*LARc++, MIC) << 10; \
temp1 = saturated_sub16(temp1, B << 1); \ temp1 = sat_sub16(temp1, B << 1); \
temp1 = gsm_mult_r(INVA, temp1); \ temp1 = gsm_mult_r(INVA, temp1); \
*LARpp++ = saturated_add16(temp1, temp1); *LARpp++ = sat_add16(temp1, temp1);
STEP( 0, -32, 13107); STEP( 0, -32, 13107);
STEP( 0, -32, 13107); STEP( 0, -32, 13107);
@ -109,8 +109,8 @@ static void coefficients_0_12(int16_t *LARpp_j_1,
for (i = 1; i <= 8; i++, LARp++, LARpp_j_1++, LARpp_j++) for (i = 1; i <= 8; i++, LARp++, LARpp_j_1++, LARpp_j++)
{ {
*LARp = saturated_add16(*LARpp_j_1 >> 2, *LARpp_j >> 2); *LARp = sat_add16(*LARpp_j_1 >> 2, *LARpp_j >> 2);
*LARp = saturated_add16(*LARp, *LARpp_j_1 >> 1); *LARp = sat_add16(*LARp, *LARpp_j_1 >> 1);
} }
/*endfor*/ /*endfor*/
} }
@ -123,7 +123,7 @@ static void coefficients_13_26(int16_t *LARpp_j_1,
int i; int i;
for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++)
*LARp = saturated_add16(*LARpp_j_1 >> 1, *LARpp_j >> 1); *LARp = sat_add16(*LARpp_j_1 >> 1, *LARpp_j >> 1);
/*endfor*/ /*endfor*/
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
@ -136,8 +136,8 @@ static void coefficients_27_39(int16_t *LARpp_j_1,
for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++)
{ {
*LARp = saturated_add16(*LARpp_j_1 >> 2, *LARpp_j >> 2); *LARp = sat_add16(*LARpp_j_1 >> 2, *LARpp_j >> 2);
*LARp = saturated_add16(*LARp, *LARpp_j >> 1); *LARp = sat_add16(*LARp, *LARpp_j >> 1);
} }
/*endfor*/ /*endfor*/
} }
@ -181,7 +181,7 @@ static void larp_to_rp(int16_t LARp[8])
else if (temp < 20070) else if (temp < 20070)
temp += 11059; temp += 11059;
else else
temp = saturated_add16(temp >> 2, 26112); temp = sat_add16(temp >> 2, 26112);
/*endif*/ /*endif*/
*LARpx = -temp; *LARpx = -temp;
} }
@ -192,7 +192,7 @@ static void larp_to_rp(int16_t LARp[8])
else if (temp < 20070) else if (temp < 20070)
temp += 11059; temp += 11059;
else else
temp = saturated_add16(temp >> 2, 26112); temp = sat_add16(temp >> 2, 26112);
/*endif*/ /*endif*/
*LARpx = temp; *LARpx = temp;
} }
@ -242,8 +242,8 @@ static void short_term_analysis_filtering(gsm0610_state_t *s,
rpi = *rpx++; rpi = *rpx++;
u_out = ui + (((rpi*di) + 0x4000) >> 15); u_out = ui + (((rpi*di) + 0x4000) >> 15);
di = di + (((rpi*ui) + 0x4000) >> 15); di = di + (((rpi*ui) + 0x4000) >> 15);
u_out = saturate(u_out); u_out = saturate16(u_out);
di = saturate(di); di = saturate16(di);
} }
/*endfor*/ /*endfor*/
amp[i] = (int16_t) di; amp[i] = (int16_t) di;
@ -278,7 +278,7 @@ static void short_term_synthesis_filtering(gsm0610_state_t *s,
: :
(int16_t) (((int32_t) tmp1*(int32_t) tmp2 + 16384) >> 15) & 0xFFFF); (int16_t) (((int32_t) tmp1*(int32_t) tmp2 + 16384) >> 15) & 0xFFFF);
sri = saturated_sub16(sri, tmp2); sri = sat_sub16(sri, tmp2);
tmp1 = ((tmp1 == INT16_MIN && sri == INT16_MIN) tmp1 = ((tmp1 == INT16_MIN && sri == INT16_MIN)
? ?
@ -286,7 +286,7 @@ static void short_term_synthesis_filtering(gsm0610_state_t *s,
: :
(int16_t) (((int32_t) tmp1*(int32_t) sri + 16384) >> 15) & 0xFFFF); (int16_t) (((int32_t) tmp1*(int32_t) sri + 16384) >> 15) & 0xFFFF);
v[i + 1] = saturated_add16(v[i], tmp1); v[i + 1] = sat_add16(v[i], tmp1);
} }
/*endfor*/ /*endfor*/
*sr++ = *sr++ =

View File

@ -194,7 +194,7 @@ static int16_t decode(ima_adpcm_state_t *s, uint8_t adpcm)
int ss; int ss;
int16_t linear; int16_t linear;
/* e = (adpcm+0.5)*step/4 */ /* e = (adpcm + 0.5)*step/4 */
ss = step_size[s->step_index]; ss = step_size[s->step_index];
e = ss >> 3; e = ss >> 3;
if (adpcm & 0x01) if (adpcm & 0x01)
@ -209,7 +209,7 @@ static int16_t decode(ima_adpcm_state_t *s, uint8_t adpcm)
if (adpcm & 0x08) if (adpcm & 0x08)
e = -e; e = -e;
/*endif*/ /*endif*/
linear = saturate(s->last + e); linear = saturate16(s->last + e);
s->last = linear; s->last = linear;
s->step_index += step_adjustment[adpcm & 0x07]; s->step_index += step_adjustment[adpcm & 0x07];
if (s->step_index < 0) if (s->step_index < 0)
@ -266,7 +266,7 @@ static uint8_t encode(ima_adpcm_state_t *s, int16_t linear)
else else
diff = diff + initial_e - e; diff = diff + initial_e - e;
/*endif*/ /*endif*/
s->last = saturate(diff + s->last); s->last = saturate16(diff + s->last);
s->step_index += step_adjustment[adpcm & 0x07]; s->step_index += step_adjustment[adpcm & 0x07];
if (s->step_index < 0) if (s->step_index < 0)
s->step_index = 0; s->step_index = 0;

View File

@ -461,7 +461,6 @@ static int image_resize_row(image_translate_state_t *s, uint8_t buf[])
case T4_IMAGE_TYPE_GRAY_12BIT: case T4_IMAGE_TYPE_GRAY_12BIT:
row16[0] = (uint16_t *) s->raw_pixel_row[0]; row16[0] = (uint16_t *) s->raw_pixel_row[0];
row16[1] = (uint16_t *) s->raw_pixel_row[1]; row16[1] = (uint16_t *) s->raw_pixel_row[1];
buf16 = (uint16_t *) buf;
for (i = 0; i < output_width; i++) for (i = 0; i < output_width; i++)
{ {
#if defined(SPANDSP_USE_FIXED_POINT) #if defined(SPANDSP_USE_FIXED_POINT)
@ -668,7 +667,6 @@ static int image_format_to_bytes_per_pixel(int image_format)
{ {
switch (image_format) switch (image_format)
{ {
default:
case T4_IMAGE_TYPE_BILEVEL: case T4_IMAGE_TYPE_BILEVEL:
case T4_IMAGE_TYPE_GRAY_8BIT: case T4_IMAGE_TYPE_GRAY_8BIT:
return 1; return 1;
@ -685,6 +683,7 @@ static int image_format_to_bytes_per_pixel(int image_format)
case T4_IMAGE_TYPE_4COLOUR_12BIT: case T4_IMAGE_TYPE_4COLOUR_12BIT:
return 8; return 8;
} }
return 1;
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/

View File

@ -143,7 +143,7 @@ SPAN_DECLARE(int) span_log(logging_state_t *s, int level, const char *format, ..
/*endif*/ /*endif*/
} }
/*endif*/ /*endif*/
len += vsnprintf(msg + len, 1024 - len, format, arg_ptr); vsnprintf(msg + len, 1024 - len, format, arg_ptr);
if (s->span_message) if (s->span_message)
s->span_message(s->user_data, level, msg); s->span_message(s->user_data, level, msg);
else if (__span_message) else if (__span_message)
@ -170,13 +170,19 @@ SPAN_DECLARE(int) span_log_buf(logging_state_t *s, int level, const char *tag, c
msg_len += snprintf(msg + msg_len, 1024 - msg_len, "%s", tag); msg_len += snprintf(msg + msg_len, 1024 - msg_len, "%s", tag);
for (i = 0; i < len && msg_len < 800; i++) for (i = 0; i < len && msg_len < 800; i++)
msg_len += snprintf(msg + msg_len, 1024 - msg_len, " %02x", buf[i]); msg_len += snprintf(msg + msg_len, 1024 - msg_len, " %02x", buf[i]);
msg_len += snprintf(msg + msg_len, 1024 - msg_len, "\n"); snprintf(msg + msg_len, 1024 - msg_len, "\n");
return span_log(s, level, msg); return span_log(s, level, msg);
} }
return 0; return 0;
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
SPAN_DECLARE(int) span_log_get_level(logging_state_t *s)
{
return s->level;
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(int) span_log_set_level(logging_state_t *s, int level) SPAN_DECLARE(int) span_log_set_level(logging_state_t *s, int level)
{ {
s->level = level; s->level = level;
@ -185,6 +191,12 @@ SPAN_DECLARE(int) span_log_set_level(logging_state_t *s, int level)
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
SPAN_DECLARE(const char *) span_log_get_tag(logging_state_t *s)
{
return s->tag;
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(int) span_log_set_tag(logging_state_t *s, const char *tag) SPAN_DECLARE(int) span_log_set_tag(logging_state_t *s, const char *tag)
{ {
s->tag = tag; s->tag = tag;
@ -193,6 +205,12 @@ SPAN_DECLARE(int) span_log_set_tag(logging_state_t *s, const char *tag)
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
SPAN_DECLARE(const char *) span_log_get_protocol(logging_state_t *s)
{
return s->protocol;
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(int) span_log_set_protocol(logging_state_t *s, const char *protocol) SPAN_DECLARE(int) span_log_set_protocol(logging_state_t *s, const char *protocol)
{ {
s->protocol = protocol; s->protocol = protocol;

View File

@ -269,7 +269,6 @@ static int pitsyn(lpc10_decode_state_t *s,
*ratio = *rms/(s->rmso + 8.0f); *ratio = *rms/(s->rmso + 8.0f);
if (s->first_pitsyn) if (s->first_pitsyn)
{ {
lsamp = 0;
ivoice = voice[1]; ivoice = voice[1];
if (ivoice == 0) if (ivoice == 0)
*pitch = LPC10_SAMPLES_PER_FRAME/4; *pitch = LPC10_SAMPLES_PER_FRAME/4;
@ -291,7 +290,6 @@ static int pitsyn(lpc10_decode_state_t *s,
{ {
vflag = 0; vflag = 0;
lsamp = LPC10_SAMPLES_PER_FRAME + s->jsamp; lsamp = LPC10_SAMPLES_PER_FRAME + s->jsamp;
slope = (*pitch - s->ipito)/(float) lsamp;
*nout = 0; *nout = 0;
jused = 0; jused = 0;
istart = 1; istart = 1;
@ -335,7 +333,6 @@ static int pitsyn(lpc10_decode_state_t *s,
rci[i + (rci_dim1 << 1) + 1] = s->rco[i]; rci[i + (rci_dim1 << 1) + 1] = s->rco[i];
s->rco[i] = rc[i]; s->rco[i] = rc[i];
} }
slope = 0.0f;
*nout = 2; *nout = 2;
s->ipito = *pitch; s->ipito = *pitch;
jused = nl; jused = nl;
@ -360,9 +357,9 @@ static int pitsyn(lpc10_decode_state_t *s,
rc[i] = s->rco[i]; rc[i] = s->rco[i];
} }
ivoice = 1; ivoice = 1;
slope = 0.0f;
vflag = 1; vflag = 1;
} }
slope = 0.0f;
} }
/* Here is the value of most variables that are used below, depending on */ /* Here is the value of most variables that are used below, depending on */
/* the values of IVOICO, VOICE(1), and VOICE(2). VOICE(1) and VOICE(2) */ /* the values of IVOICO, VOICE(1), and VOICE(2). VOICE(1) and VOICE(2) */

View File

@ -357,7 +357,6 @@ void lpc10_voicing(lpc10_encode_state_t *s,
/* a consistent value from one call to the next when HALF .EQ. 1. */ /* a consistent value from one call to the next when HALF .EQ. 1. */
/* The value of VSTATE is not used for any other purpose when this is */ /* The value of VSTATE is not used for any other purpose when this is */
/* true. */ /* true. */
vstate = -1;
if (half != 0) if (half != 0)
{ {
/* Voicing decision smoothing rules (override of linear combination): */ /* Voicing decision smoothing rules (override of linear combination): */

View File

@ -551,7 +551,8 @@ static void trie_add(trie_t *s, const char *u, size_t len)
/* Is there a child node for this character? */ /* Is there a child node for this character? */
if (t->child_list[index] == NULL) if (t->child_list[index] == NULL)
{ {
t->child_list[index] = trie_node_create(); if ((t->child_list[index] = trie_node_create()) == NULL)
exit(2);
if (index < t->first) if (index < t->first)
t->first = index; t->first = index;
if (index > t->last) if (index > t->last)
@ -609,7 +610,12 @@ int main(int argc, char *argv[])
trie_t *s; trie_t *s;
int i; int i;
s = trie_create(); if ((s = trie_create()) == NULL)
exit(2);
printf("/* THIS FILE WAS AUTOMATICALLY GENERATED - ANY MODIFICATIONS MADE TO THIS");
printf(" FILE MAY BE OVERWRITTEN DURING FUTURE BUILDS OF THE SOFTWARE */\n");
printf("\n");
for (i = 0; wordlist[i]; i++) for (i = 0; wordlist[i]; i++)
trie_add(s, wordlist[i], strlen(wordlist[i])); trie_add(s, wordlist[i], strlen(wordlist[i]));

View File

@ -46,6 +46,10 @@ int main(int argc, char *argv[])
uint8_t srgb; uint8_t srgb;
int i; int i;
printf("/* THIS FILE WAS AUTOMATICALLY GENERATED - ANY MODIFICATIONS MADE TO THIS");
printf(" FILE MAY BE OVERWRITTEN DURING FUTURE BUILDS OF THE SOFTWARE */\n");
printf("\n");
printf("static const float srgb_to_linear[256] =\n"); printf("static const float srgb_to_linear[256] =\n");
printf("{\n"); printf("{\n");
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)

View File

@ -37,6 +37,10 @@ int main(int argc, char *argv[])
double val; double val;
int ival; int ival;
printf("/* THIS FILE WAS AUTOMATICALLY GENERATED - ANY MODIFICATIONS MADE TO THIS");
printf(" FILE MAY BE OVERWRITTEN DURING FUTURE BUILDS OF THE SOFTWARE */\n");
printf("\n");
printf("static const uint16_t fixed_reciprocal_table[129] =\n"); printf("static const uint16_t fixed_reciprocal_table[129] =\n");
printf("{\n"); printf("{\n");
for (i = 0; i < 129; i++) for (i = 0; i < 129; i++)

View File

@ -103,6 +103,9 @@ static void make_tx_filter(int coeff_sets,
/* Churn out the data as a C source code header file, which can be directly included by the /* Churn out the data as a C source code header file, which can be directly included by the
modem code. */ modem code. */
printf("/* THIS FILE WAS AUTOMATICALLY GENERATED - ANY MODIFICATIONS MADE TO THIS");
printf(" FILE MAY BE OVERWRITTEN DURING FUTURE BUILDS OF THE SOFTWARE */\n");
printf("\n");
printf("#if defined(SPANDSP_USE_FIXED_POINT)\n"); printf("#if defined(SPANDSP_USE_FIXED_POINT)\n");
printf("#define TX_PULSESHAPER%s_SCALE(x) ((int16_t) (%f*x + ((x >= 0.0) ? 0.5 : -0.5)))\n", tag, fixed_scaling); printf("#define TX_PULSESHAPER%s_SCALE(x) ((int16_t) (%f*x + ((x >= 0.0) ? 0.5 : -0.5)))\n", tag, fixed_scaling);
printf("#define TX_PULSESHAPER%s_GAIN %ff\n", tag, fixed_gain); printf("#define TX_PULSESHAPER%s_GAIN %ff\n", tag, fixed_gain);

View File

@ -39,6 +39,10 @@ int main(int argc, char *argv[])
int new_gray; int new_gray;
int restore; int restore;
printf("/* THIS FILE WAS AUTOMATICALLY GENERATED - ANY MODIFICATIONS MADE TO THIS");
printf(" FILE MAY BE OVERWRITTEN DURING FUTURE BUILDS OF THE SOFTWARE */\n");
printf("\n");
printf("static const int16_t gray_code[4096] =\n{\n"); printf("static const int16_t gray_code[4096] =\n{\n");
for (i = 0; i < 4096; i++) for (i = 0; i < 4096; i++)
{ {

View File

@ -53,6 +53,12 @@
#if defined(SPANDSP_USE_SSE5) #if defined(SPANDSP_USE_SSE5)
#include <bmmintrin.h> #include <bmmintrin.h>
#endif #endif
#if defined(SPANDSP_USE_AVX)
#include <immintrin.h>
#endif
#if defined(SPANDSP_USE_AVX2)
#include <x86intrin.h>
#endif
#endif #endif

View File

@ -75,7 +75,7 @@ SPAN_DECLARE(int16_t) noise(noise_state_t *s)
simple approx. leaves the signal about 0.35dB low. */ simple approx. leaves the signal about 0.35dB low. */
val = s->state << 1; val = s->state << 1;
} }
return saturate((val*s->rms) >> 10); return saturate16((val*s->rms) >> 10);
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/

View File

@ -303,7 +303,7 @@ SPAN_DECLARE(int) sig_tone_tx(sig_tone_tx_state_t *s, int16_t amp[], int len)
for (j = i; j < i + n; j++) for (j = i; j < i + n; j++)
{ {
tone = dds_mod(&(s->phase_acc[k]), s->phase_rate[k], s->tone_scaling[k][high_low], 0); tone = dds_mod(&(s->phase_acc[k]), s->phase_rate[k], s->tone_scaling[k][high_low], 0);
amp[j] = saturated_add16(amp[j], tone); amp[j] = sat_add16(amp[j], tone);
} }
/*endfor*/ /*endfor*/
} }

View File

@ -1,5 +1,5 @@
/* /*
* SpanDSP a series of DSP components for telephony * SpanDSP - a series of DSP components for telephony
* *
* ademco_contactid.h Ademco ContactID alarm protocol * ademco_contactid.h Ademco ContactID alarm protocol
* *

View File

@ -53,6 +53,13 @@ static __inline__ int top_bit(uint32_t bits)
: [res] "=&r" (res) : [res] "=&r" (res)
: [bits] "rm" (bits)); : [bits] "rm" (bits));
return res; return res;
#elif defined(__GNUC__x) && (defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__))
int res;
__asm__("clz %[res], %[bits]"
: [res] "=r" (res)
: [bits] "r" (bits));
return res;
#elif defined(__ppc__) || defined(__powerpc__) #elif defined(__ppc__) || defined(__powerpc__)
int res; int res;

View File

@ -46,7 +46,11 @@ enum
FAX_MODEM_V21_RX, FAX_MODEM_V21_RX,
FAX_MODEM_V17_RX, FAX_MODEM_V17_RX,
FAX_MODEM_V27TER_RX, FAX_MODEM_V27TER_RX,
FAX_MODEM_V29_RX FAX_MODEM_V29_RX,
#if defined(SPANDSP_SUPPORT_V34)
FAX_MODEM_V34_TX,
FAX_MODEM_V34_RX
#endif
}; };
/*! /*!
@ -59,6 +63,7 @@ extern "C"
{ {
#endif #endif
/* TEMPORARY FUDGE */
SPAN_DECLARE_NONSTD(void) fax_modems_hdlc_accept(void *user_data, const uint8_t *msg, int len, int ok); SPAN_DECLARE_NONSTD(void) fax_modems_hdlc_accept(void *user_data, const uint8_t *msg, int len, int ok);
/*! Convert a FAX modem type to a short text description. /*! Convert a FAX modem type to a short text description.

View File

@ -104,10 +104,16 @@ SPAN_DECLARE(int) span_log(logging_state_t *s, int level, const char *format, ..
*/ */
SPAN_DECLARE(int) span_log_buf(logging_state_t *s, int level, const char *tag, const uint8_t *buf, int len); SPAN_DECLARE(int) span_log_buf(logging_state_t *s, int level, const char *tag, const uint8_t *buf, int len);
SPAN_DECLARE(int) span_log_get_level(logging_state_t *s);
SPAN_DECLARE(int) span_log_set_level(logging_state_t *s, int level); SPAN_DECLARE(int) span_log_set_level(logging_state_t *s, int level);
SPAN_DECLARE(const char *) span_log_get_tag(logging_state_t *s);
SPAN_DECLARE(int) span_log_set_tag(logging_state_t *s, const char *tag); SPAN_DECLARE(int) span_log_set_tag(logging_state_t *s, const char *tag);
SPAN_DECLARE(const char *) span_log_get_protocol(logging_state_t *s);
SPAN_DECLARE(int) span_log_set_protocol(logging_state_t *s, const char *protocol); SPAN_DECLARE(int) span_log_set_protocol(logging_state_t *s, const char *protocol);
SPAN_DECLARE(int) span_log_set_sample_rate(logging_state_t *s, int samples_per_second); SPAN_DECLARE(int) span_log_set_sample_rate(logging_state_t *s, int samples_per_second);

View File

@ -64,18 +64,22 @@ struct fax_modems_state_s
/*! \brief A V.29 modem context used when receiving FAXes at 7200bps, 9600bps /*! \brief A V.29 modem context used when receiving FAXes at 7200bps, 9600bps
12000bps or 14400bps */ 12000bps or 14400bps */
v17_rx_state_t v17_rx; v17_rx_state_t v17_rx;
/*! \brief A V.29 modem context used when sending FAXes at 7200bps or
9600bps */
v29_tx_state_t v29_tx;
/*! \brief A V.29 modem context used when receiving FAXes at 7200bps or
9600bps */
v29_rx_state_t v29_rx;
/*! \brief A V.27ter modem context used when sending FAXes at 2400bps or /*! \brief A V.27ter modem context used when sending FAXes at 2400bps or
4800bps */ 4800bps */
v27ter_tx_state_t v27ter_tx; v27ter_tx_state_t v27ter_tx;
/*! \brief A V.27ter modem context used when receiving FAXes at 2400bps or /*! \brief A V.27ter modem context used when receiving FAXes at 2400bps or
4800bps */ 4800bps */
v27ter_rx_state_t v27ter_rx; v27ter_rx_state_t v27ter_rx;
/*! \brief A V.29 modem context used when sending FAXes at 7200bps or
9600bps */
v29_tx_state_t v29_tx;
/*! \brief A V.29 modem context used when receiving FAXes at 7200bps or
9600bps */
v29_rx_state_t v29_rx;
#if defined(SPANDSP_SUPPORT_V34)
/*! \brief A V.34 modem context used when sending or receiving Super-G3 FAXes */
v34_state_t v34;
#endif
} fast_modems; } fast_modems;
/*! \brief Used to insert timed silences. */ /*! \brief Used to insert timed silences. */
silence_gen_state_t silence_gen; silence_gen_state_t silence_gen;

View File

@ -47,12 +47,12 @@ typedef struct
*/ */
struct g722_encode_state_s struct g722_encode_state_s
{ {
/*! True if the operating in the special ITU test mode, with the band split filters /*! True if operating in the special ITU test mode, with the band split filters
disabled. */ disabled. */
bool itu_test_mode; bool itu_test_mode;
/*! True if the G.722 data is packed */ /*! True if the G.722 data is packed */
bool packed; bool packed;
/*! True if encode from 8k samples/second */ /*! True if encoding from 8k samples/second */
bool eight_k; bool eight_k;
/*! 6 for 48000kbps, 7 for 56000kbps, or 8 for 64000kbps. */ /*! 6 for 48000kbps, 7 for 56000kbps, or 8 for 64000kbps. */
int bits_per_sample; int bits_per_sample;
@ -73,12 +73,12 @@ struct g722_encode_state_s
*/ */
struct g722_decode_state_s struct g722_decode_state_s
{ {
/*! True if the operating in the special ITU test mode, with the band split filters /*! True if operating in the special ITU test mode, with the band split filters
disabled. */ disabled. */
bool itu_test_mode; bool itu_test_mode;
/*! True if the G.722 data is packed */ /*! True if the G.722 data is packed */
bool packed; bool packed;
/*! True if decode to 8k samples/second */ /*! True if decoding to 8k samples/second */
bool eight_k; bool eight_k;
/*! 6 for 48000kbps, 7 for 56000kbps, or 8 for 64000kbps. */ /*! 6 for 48000kbps, 7 for 56000kbps, or 8 for 64000kbps. */
int bits_per_sample; int bits_per_sample;

View File

@ -138,8 +138,8 @@ typedef struct
t31_hdlc_state_t hdlc_from_t31; t31_hdlc_state_t hdlc_from_t31;
/*! \brief True if we are using ECM mode. This is used to select HDLC faking, necessary /*! \brief True if we are using ECM mode. This is used to select HDLC faking, which is
with clunky class 1 modems. */ necessary with clunky class 1 modems. */
int ecm_mode; int ecm_mode;
/*! \brief Counter for trailing non-ECM bytes, used to flush out the far end's modem. */ /*! \brief Counter for trailing non-ECM bytes, used to flush out the far end's modem. */

View File

@ -42,32 +42,6 @@ extern "C"
{ {
#endif #endif
/* This is the same as saturate16(), but is here for historic reasons */
static __inline__ int16_t saturate(int32_t amp)
{
#if defined(__GNUC__) && (defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__))
int16_t z;
__asm__ __volatile__(
" ssat %[z],#16,%[amp];\n"
: [z] "=r" (z)
: [amp] "r" (amp)
);
return z;
#else
int16_t z;
/* Hopefully this is optimised for the common case - not clipping */
z = (int16_t) amp;
if (amp == z)
return z;
if (amp > INT16_MAX)
return INT16_MAX;
return INT16_MIN;
#endif
}
/*- End of function --------------------------------------------------------*/
static __inline__ int16_t saturate16(int32_t amp) static __inline__ int16_t saturate16(int32_t amp)
{ {
#if defined(__GNUC__) && (defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__)) #if defined(__GNUC__) && (defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__))
@ -229,152 +203,141 @@ static __inline__ double ffsaturate(double famp)
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
static __inline__ int16_t saturated_add16(int16_t a, int16_t b) static __inline__ int16_t sat_add16(int16_t x, int16_t y)
{ {
#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
__asm__ __volatile__( __asm__ __volatile__(" addw %[y],%[x];\n"
" addw %2,%0;\n"
" jno 0f;\n" " jno 0f;\n"
" movw $0x7fff,%0;\n" " movw $0x7FFF,%[x];\n"
" adcw $0,%0;\n" " adcw $0,%[x];\n"
"0:" "0:"
: "=r" (a) : [x] "+r" (x)
: "0" (a), "ir" (b) : [y] "ir" (y)
: "cc" : "cc");
); return x;
return a;
#elif defined(__GNUC__) && (defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__)) #elif defined(__GNUC__) && (defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__))
int16_t z; int16_t z;
__asm__ __volatile__( __asm__ __volatile__(
" qadd16 %[z],%[a],%[b];\n" " qadd16 %[z],%[c],%[y];\n"
: [z] "=r" (z) : [z] "=r" (z)
: [a] "r" (a), [b] "r" (b) : [x] "r" (x), [y] "r" (y)
); );
return z; return z;
//#elif defined(__GNUC__) && defined(__ARM_ARCH_5T__)
#else #else
return saturate((int32_t) a + (int32_t) b); return saturate16((int32_t) x + y);
#endif #endif
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
static __inline__ int32_t saturated_add32(int32_t a, int32_t b) static __inline__ int32_t sat_add32(int32_t x, int32_t y)
{ {
#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
__asm__ __volatile__( __asm__ __volatile__(" addl %[y],%[x];\n"
" addl %2,%0;\n"
" jno 0f;\n" " jno 0f;\n"
" movl $0x7fffffff,%0;\n" " movl $0x7FFFFFFF,%[x];\n"
" adcl $0,%0;\n" " adcl $0,%[x];\n"
"0:" "0:"
: "=r" (a) : [x] "+r" (x)
: "0" (a), "ir" (b) : [y] "ir" (y)
: "cc" : "cc");
); return x;
return a;
#elif defined(__GNUC__) && (defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__)) #elif defined(__GNUC__) && (defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__))
int32_t z; int32_t z;
__asm__ __volatile__( __asm__ __volatile__(" qadd %[z],%[x],%[y];\n"
" qadd %[z],%[a],%[b];\n"
: [z] "=r" (z) : [z] "=r" (z)
: [a] "r" (a), [b] "r" (b) : [x] "r" (x), [y] "r" (y));
);
return z; return z;
//#elif defined(__GNUC__) && defined(__ARM_ARCH_5T__)
#else #else
int32_t z; int32_t z;
z = a + b; z = x + y;
if ((a ^ b) >= 0) if ((x ^ y) >= 0)
{ {
if ((z ^ a) < 0) if ((z ^ x) < 0)
z = (a < 0) ? INT32_MIN : INT32_MAX; z = (x < 0) ? INT32_MIN : INT32_MAX;
} }
return z; return z;
#endif #endif
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
static __inline__ int16_t saturated_sub16(int16_t a, int16_t b) static __inline__ int16_t sat_sub16(int16_t x, int16_t y)
{ {
#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
__asm__ __volatile__( __asm__ __volatile__(" subw %[y],%[x];\n"
" subw %2,%0;\n"
" jno 0f;\n" " jno 0f;\n"
" movw $0x8000,%0;\n" " movw $0x8000,%[x];\n"
" sbbw $0,%0;\n" " sbbw $0,%[x];\n"
"0:" "0:"
: "=r" (a) : [x] "+r" (x)
: "0" (a), "ir" (b) : [y] "ir" (y)
: "cc" : "cc");
); return x;
return a;
#elif defined(__GNUC__) && (defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__)) #elif defined(__GNUC__) && (defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__))
int16_t z; int16_t z;
__asm__ __volatile__( __asm__ __volatile__(" qsub16 %[z],%[x],%[y];\n"
" qsub16 %[z],%[a],%[b];\n"
: [z] "=r" (z) : [z] "=r" (z)
: [a] "r" (a), [b] "r" (b) : [x] "r" (x), [y] "r" (y));
);
return z; return z;
//#elif defined(__GNUC__) && defined(__ARM_ARCH_5T__)
#else #else
return saturate((int32_t) a - (int32_t) b); return saturate16((int32_t) x - y);
#endif #endif
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
static __inline__ int32_t saturated_sub32(int32_t a, int32_t b) static __inline__ int32_t sat_sub32(int32_t x, int32_t y)
{ {
#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
__asm__ __volatile__( __asm__ __volatile__(" subl %[y],%[x];\n"
" subl %2,%0;\n"
" jno 0f;\n" " jno 0f;\n"
" movl $0x80000000,%0;\n" " movl $0x80000000,%[x];\n"
" sbbl $0,%0;\n" " sbbl $0,%[x];\n"
"0:" "0:"
: "=r" (a) : [x] "+r" (x)
: "0" (a), "ir" (b) : [y] "ir" (y)
: "cc" : "cc");
); return x;
return a;
#elif defined(__GNUC__) && (defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__)) #elif defined(__GNUC__) && (defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__))
int32_t z; int32_t z;
__asm__ __volatile__( __asm__ __volatile__(" qsub %[z],%[x],%[y];\n"
" qsub %[z],%[a],%[b];\n"
: [z] "=r" (z) : [z] "=r" (z)
: [a] "r" (a), [b] "r" (b) : [x] "r" (x), [y] "r" (y));
);
return z; return z;
//#elif defined(__GNUC__) && defined(__ARM_ARCH_5T__)
#else #else
int32_t z; int32_t z;
z = a - b; z = x - y;
if ((a ^ b) < 0) if ((x ^ y) < 0)
{ {
if ((z ^ a) & INT32_MIN) if ((z ^ x) < 0)
z = (a < 0L) ? INT32_MIN : INT32_MAX; z = (x < 0L) ? INT32_MIN : INT32_MAX;
} }
return z; return z;
#endif #endif
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
static __inline__ int16_t saturated_mul16(int16_t a, int16_t b) static __inline__ int16_t sat_mul16(int16_t x, int16_t y)
{ {
int32_t z; int32_t z;
#if defined(__GNUC__) && (defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__)) #if defined(__GNUC__) && (defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__))
__asm__ __volatile__( __asm__ __volatile__(" smulbb %[z],%[c],%[y];\n"
" smulbb %[z],%[a],%[b];\n"
" qadd %[z],%[z],%[z];\n" " qadd %[z],%[z],%[z];\n"
: [z] "=r" (z) : [z] "=r" (z)
: [a] "r" (a), [b] "r" (b) : [x] "r" (x), [y] "r" (y));
); /* The qadd added one to the shift of 15 */
return (int16_t) (z >> 16); return (int16_t) (z >> 16);
#else #else
z = (int32_t) a*b; z = (int32_t) x*y;
if (z == 0x40000000) if (z == 0x40000000)
return INT16_MAX; return INT16_MAX;
/*endif*/ /*endif*/
@ -383,20 +346,18 @@ static __inline__ int16_t saturated_mul16(int16_t a, int16_t b)
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
static __inline__ int32_t saturated_mul16_32(int16_t a, int16_t b) static __inline__ int32_t sat_mul32_16(int16_t x, int16_t y)
{ {
int32_t z; int32_t z;
#if defined(__GNUC__) && (defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__)) #if defined(__GNUC__) && (defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__))
__asm__ __volatile__( __asm__ __volatile__(" smulbb %[z],%[x],%[y];\n"
" smulbb %[z],%[a],%[b];\n"
" qadd %[z],%[z],%[z];\n" " qadd %[z],%[z],%[z];\n"
: [z] "=r" (z) : [z] "=r" (z)
: [a] "r" (a), [b] "r" (b) : [x] "r" (x), [y] "r" (y));
);
return z; return z;
#else #else
z = (int32_t) a*b; z = (int32_t) x*y;
if (z == 0x40000000) if (z == 0x40000000)
return INT32_MAX; return INT32_MAX;
return z << 1; return z << 1;
@ -404,45 +365,51 @@ static __inline__ int32_t saturated_mul16_32(int16_t a, int16_t b)
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
static __inline__ int32_t saturated_mac16_32(int32_t z, int16_t a, int16_t b) static __inline__ int32_t sat_mac32_16(int32_t z, int16_t x, int16_t y)
{ {
#if defined(__GNUC__) && (defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__)) #if defined(__GNUC__) && (defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__))
int32_t product; int32_t product;
__asm__ __volatile__( __asm__ __volatile__(" smulbb %[p],%[x],%[y];\n"
" smulbb %[p],%[a],%[b];\n"
" qdadd %[z],%[z],%[p];\n" " qdadd %[z],%[z],%[p];\n"
: [z] "=r" (z) : [z] "+r" (z)
: "[z]" (z), [a] "r" (a), [b] "r" (b), [p] "r"(product) : [x] "r" (x), [y] "r" (y), [p] "r" (product));
);
return z; return z;
#else #else
return saturated_add32(z, saturated_mul16_32(a, b)); return sat_add32(z, sat_mul32_16(x, y));
#endif #endif
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
static __inline__ int32_t saturated_msu16_32(int32_t z, int16_t a, int16_t b) static __inline__ int32_t sat_msu32_16(int32_t z, int16_t x, int16_t y)
{ {
#if defined(__GNUC__) && (defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__)) #if defined(__GNUC__) && (defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7A__))
int32_t product; int32_t product;
__asm__ __volatile__( __asm__ __volatile__(" smulbb %[p],%[x],%[y];\n"
" smulbb %[p],%[a],%[b];\n"
" qdsub %[z],%[z],%[p];\n" " qdsub %[z],%[z],%[p];\n"
: [z] "=r" (z) : [z] "+r" (z)
: "[z]" (z), [a] "r" (a), [b] "r" (b), [p] "r" (product) : [x] "r" (x), [y] "r" (y), [p] "r" (product));
);
return z; return z;
#else #else
return saturated_sub32(z, saturated_mul16_32(a, b)); return sat_sub32(z, sat_mul32_16(x, y));
#endif #endif
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
static __inline__ int16_t saturated_abs16(int16_t a) static __inline__ int16_t sat_abs16(int16_t x)
{ {
return (a == INT16_MIN) ? INT16_MAX : (int16_t) abs(a); if (x == INT16_MIN)
return INT16_MAX;
return (int16_t) abs(x);
}
/*- End of function --------------------------------------------------------*/
static __inline__ int32_t sat_abs32(int32_t x)
{
if (x == INT32_MIN)
return INT32_MAX;
return abs(x);
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/

View File

@ -46,6 +46,10 @@
#define SPAN_DECLARE_DATA /**/ #define SPAN_DECLARE_DATA /**/
#endif #endif
#define span_container_of(ptr, type, member) ({ \
const typeof(((type *) 0)->member) *__mptr = (ptr); \
(type *) ((char *) __mptr - offsetof(type, member));})
#define SAMPLE_RATE 8000 #define SAMPLE_RATE 8000
/* This is based on A-law, but u-law is only 0.03dB different */ /* This is based on A-law, but u-law is only 0.03dB different */
@ -70,36 +74,57 @@ typedef int (*span_tx_handler_t)(void *s, int16_t amp[], int max_len);
#define ms_to_samples(t) ((t)*(SAMPLE_RATE/1000)) #define ms_to_samples(t) ((t)*(SAMPLE_RATE/1000))
#define us_to_samples(t) ((t)/(1000000/SAMPLE_RATE)) #define us_to_samples(t) ((t)/(1000000/SAMPLE_RATE))
/* Fixed point constant macros */ /* Fixed point constant macros for 16 bit values */
#define FP_Q_9_7(x) ((int16_t) (128.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q16_0(x) ((int16_t) (1.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q_8_8(x) ((int16_t) (256.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q15_1(x) ((int16_t) (2.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q_7_9(x) ((int16_t) (512.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q14_2(x) ((int16_t) (4.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q_6_10(x) ((int16_t) (1024.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q13_3(x) ((int16_t) (8.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q_5_11(x) ((int16_t) (2048.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q12_4(x) ((int16_t) (16.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q_4_12(x) ((int16_t) (4096.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q11_5(x) ((int16_t) (32.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q_3_13(x) ((int16_t) (8192.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q10_6(x) ((int16_t) (64.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q_2_14(x) ((int16_t) (16384.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q9_7(x) ((int16_t) (128.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q_1_15(x) ((int16_t) (32768.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q8_8(x) ((int16_t) (256.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q7_9(x) ((int16_t) (512.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q6_10(x) ((int16_t) (1024.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q5_11(x) ((int16_t) (2048.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q4_12(x) ((int16_t) (4096.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q3_13(x) ((int16_t) (8192.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q2_14(x) ((int16_t) (16384.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q1_15(x) ((int16_t) (32768.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q_9_7_32(x) ((int32_t) (128.0*x + ((x >= 0.0) ? 0.5 : -0.5))) /* Fixed point constant macros for 32 bit values */
#define FP_Q_8_8_32(x) ((int32_t) (256.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q32_0(x) ((int32_t) (1.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q_7_9_32(x) ((int32_t) (512.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q31_1(x) ((int32_t) (2.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q_6_10_32(x) ((int32_t) (1024.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q30_2(x) ((int32_t) (4.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q_5_11_32(x) ((int32_t) (2048.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q29_3(x) ((int32_t) (8.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q_4_12_32(x) ((int32_t) (4096.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q28_4(x) ((int32_t) (16.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q_3_13_32(x) ((int32_t) (8192.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q27_5(x) ((int32_t) (32.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q_2_14_32(x) ((int32_t) (16384.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q26_6(x) ((int32_t) (64.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q_1_15_32(x) ((int32_t) (32768.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q25_7(x) ((int32_t) (128.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q24_8(x) ((int32_t) (256.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q_9_23(x) ((int32_t) (65536.0*128.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q23_9(x) ((int32_t) (512.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q_8_24(x) ((int32_t) (65536.0*256.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q22_10(x) ((int32_t) (1024.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q_7_25(x) ((int32_t) (65536.0*512.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q21_11(x) ((int32_t) (2048.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q_6_26(x) ((int32_t) (65536.0*1024.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q20_12(x) ((int32_t) (4096.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q_5_27(x) ((int32_t) (65536.0*2048.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q19_13(x) ((int32_t) (8192.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q_4_28(x) ((int32_t) (65536.0*4096.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q18_14(x) ((int32_t) (16384.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q_3_29(x) ((int32_t) (65536.0*8192.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q17_15(x) ((int32_t) (32768.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q_2_30(x) ((int32_t) (65536.0*16384.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q16_16(x) ((int32_t) (65536.0*1.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q_1_31(x) ((int32_t) (65536.0*32768.0*x + ((x >= 0.0) ? 0.5 : -0.5))) #define FP_Q15_17(x) ((int32_t) (65536.0*2.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q14_18(x) ((int32_t) (65536.0*4.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q13_19(x) ((int32_t) (65536.0*8.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q12_20(x) ((int32_t) (65536.0*16.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q11_21(x) ((int32_t) (65536.0*32.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q10_22(x) ((int32_t) (65536.0*64.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q9_23(x) ((int32_t) (65536.0*128.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q8_24(x) ((int32_t) (65536.0*256.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q7_25(x) ((int32_t) (65536.0*512.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q6_26(x) ((int32_t) (65536.0*1024.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q5_27(x) ((int32_t) (65536.0*2048.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q4_28(x) ((int32_t) (65536.0*4096.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q3_29(x) ((int32_t) (65536.0*8192.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q2_30(x) ((int32_t) (65536.0*16384.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#define FP_Q1_31(x) ((int32_t) (65536.0*32768.0*x + ((x >= 0.0) ? 0.5 : -0.5)))
#if defined(__cplusplus) #if defined(__cplusplus)
/* C++ doesn't seem to have sane rounding functions/macros yet */ /* C++ doesn't seem to have sane rounding functions/macros yet */

View File

@ -239,7 +239,9 @@ SPAN_DECLARE(v17_rx_state_t *) v17_rx_init(v17_rx_state_t *s, int bit_rate, put_
\brief Reinitialise an existing V.17 modem receive context. \brief Reinitialise an existing V.17 modem receive context.
\param s The modem context. \param s The modem context.
\param bit_rate The bit rate of the modem. Valid values are 7200, 9600, 12000 and 14400. \param bit_rate The bit rate of the modem. Valid values are 7200, 9600, 12000 and 14400.
\param short_train True if a short training sequence is expected. \param short_train 0 if a long training sequence is expected.
1 if a short training sequence is expected.
2 if the expected training sequence is automatically selected.
\return 0 for OK, -1 for bad parameter */ \return 0 for OK, -1 for bad parameter */
SPAN_DECLARE(int) v17_rx_restart(v17_rx_state_t *s, int bit_rate, int short_train); SPAN_DECLARE(int) v17_rx_restart(v17_rx_state_t *s, int bit_rate, int short_train);

View File

@ -172,8 +172,9 @@ SPAN_DECLARE(int) v22bis_get_current_bit_rate(v22bis_state_t *s);
\param guard The guard tone option. 0 = none, 1 = 550Hz, 2 = 1800Hz. \param guard The guard tone option. 0 = none, 1 = 550Hz, 2 = 1800Hz.
\param calling_party True if this is the calling modem. \param calling_party True if this is the calling modem.
\param get_bit The callback routine used to get the data to be transmitted. \param get_bit The callback routine used to get the data to be transmitted.
\param put_bit The callback routine used to get the data to be transmitted. \param get_bit_user_data An opaque pointer, passed in calls to the get_bit routine.
\param user_data An opaque pointer, passed in calls to the get and put routines. \param put_bit The callback routine used to put the data received.
\param put_bit_user_data An opaque pointer, passed in calls to the put_bit routine.
\return A pointer to the modem context, or NULL if there was a problem. */ \return A pointer to the modem context, or NULL if there was a problem. */
SPAN_DECLARE(v22bis_state_t *) v22bis_init(v22bis_state_t *s, SPAN_DECLARE(v22bis_state_t *) v22bis_init(v22bis_state_t *s,
int bit_rate, int bit_rate,

View File

@ -267,7 +267,6 @@ static int extra_bits_in_stuffed_frame(const uint8_t buf[], int len)
int i; int i;
int j; int j;
bitstream = 0;
ones = 0; ones = 0;
stuffed = 0; stuffed = 0;
/* We should really append the CRC, and include the stuffed bits for that, to get /* We should really append the CRC, and include the stuffed bits for that, to get
@ -1100,7 +1099,6 @@ static int stream_hdlc(t31_state_t *s)
data_fields[0].field_len = i; data_fields[0].field_len = i;
/* Now see about the next HDLC frame. This will tell us whether to send FCS_OK or FCS_OK_SIG_END */ /* Now see about the next HDLC frame. This will tell us whether to send FCS_OK or FCS_OK_SIG_END */
previous = fe->current_tx_data_type;
s->hdlc_tx.ptr = 0; s->hdlc_tx.ptr = 0;
s->hdlc_tx.len = 0; s->hdlc_tx.len = 0;
if (front_end_status(s, T30_FRONT_END_SEND_STEP_COMPLETE) < 0) if (front_end_status(s, T30_FRONT_END_SEND_STEP_COMPLETE) < 0)
@ -2117,7 +2115,6 @@ static int restart_modem(t31_state_t *s, int new_modem)
{ {
s->t38_fe.next_tx_indicator = T38_IND_V21_PREAMBLE; s->t38_fe.next_tx_indicator = T38_IND_V21_PREAMBLE;
s->t38_fe.current_tx_data_type = T38_DATA_V21; s->t38_fe.current_tx_data_type = T38_DATA_V21;
use_hdlc = true;
s->t38_fe.timed_step = T38_TIMED_STEP_HDLC_MODEM; s->t38_fe.timed_step = T38_TIMED_STEP_HDLC_MODEM;
set_octets_per_data_packet(s, 300); set_octets_per_data_packet(s, 300);
} }
@ -2449,13 +2446,11 @@ static int process_class1_cmd(void *user_data, int direction, int operation, int
int new_transmit; int new_transmit;
int i; int i;
int len; int len;
int immediate_response;
t31_state_t *s; t31_state_t *s;
uint8_t msg[256]; uint8_t msg[256];
s = (t31_state_t *) user_data; s = (t31_state_t *) user_data;
new_transmit = direction; new_transmit = direction;
immediate_response = true;
switch (operation) switch (operation)
{ {
case 'S': case 'S':
@ -2489,7 +2484,6 @@ static int process_class1_cmd(void *user_data, int direction, int operation, int
/*endif*/ /*endif*/
} }
/*endif*/ /*endif*/
immediate_response = false;
span_log(&s->logging, SPAN_LOG_FLOW, "Silence %dms\n", val*10); span_log(&s->logging, SPAN_LOG_FLOW, "Silence %dms\n", val*10);
break; break;
case 'H': case 'H':
@ -2506,10 +2500,7 @@ static int process_class1_cmd(void *user_data, int direction, int operation, int
/*endswitch*/ /*endswitch*/
span_log(&s->logging, SPAN_LOG_FLOW, "HDLC\n"); span_log(&s->logging, SPAN_LOG_FLOW, "HDLC\n");
if (new_modem != s->modem) if (new_modem != s->modem)
{
restart_modem(s, new_modem); restart_modem(s, new_modem);
immediate_response = false;
}
/*endif*/ /*endif*/
s->at_state.transmit = new_transmit; s->at_state.transmit = new_transmit;
if (new_transmit) if (new_transmit)
@ -2561,7 +2552,6 @@ static int process_class1_cmd(void *user_data, int direction, int operation, int
while (msg[0] == AT_RESPONSE_CODE_CONNECT); while (msg[0] == AT_RESPONSE_CODE_CONNECT);
} }
/*endif*/ /*endif*/
immediate_response = false;
break; break;
default: default:
switch (val) switch (val)
@ -2666,11 +2656,10 @@ static int process_class1_cmd(void *user_data, int direction, int operation, int
} }
/*endif*/ /*endif*/
restart_modem(s, new_modem); restart_modem(s, new_modem);
immediate_response = false;
break; break;
} }
/*endswitch*/ /*endswitch*/
return immediate_response; return false;
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/

View File

@ -462,7 +462,6 @@ SPAN_DECLARE_NONSTD(int) t38_core_rx_ifp_stream(t38_core_state_t *s, const uint8
/* Do a dummy run through the fields to check we have a complete and uncorrupted packet. */ /* Do a dummy run through the fields to check we have a complete and uncorrupted packet. */
prev_ptr = ptr; prev_ptr = ptr;
other_half = false; other_half = false;
t30_field_type = 0;
for (i = 0; i < (int) count; i++) for (i = 0; i < (int) count; i++)
{ {
if (ptr >= pkt_len) if (ptr >= pkt_len)
@ -514,7 +513,7 @@ SPAN_DECLARE_NONSTD(int) t38_core_rx_ifp_stream(t38_core_state_t *s, const uint8
} }
else else
{ {
t30_field_type = (buf[ptr++] >> 3) & 0x7; ptr++;
} }
} }
/* Decode field_data */ /* Decode field_data */
@ -523,14 +522,8 @@ SPAN_DECLARE_NONSTD(int) t38_core_rx_ifp_stream(t38_core_state_t *s, const uint8
if ((ptr + 2) > pkt_len) if ((ptr + 2) > pkt_len)
return ret; return ret;
numocts = ((buf[ptr] << 8) | buf[ptr + 1]) + 1; numocts = ((buf[ptr] << 8) | buf[ptr + 1]) + 1;
msg = buf + ptr + 2;
ptr += numocts + 2; ptr += numocts + 2;
} }
else
{
numocts = 0;
msg = NULL;
}
if (ptr > pkt_len) if (ptr > pkt_len)
return ret; return ret;
} }
@ -766,7 +759,6 @@ static int t38_encode_data(t38_core_state_t *s, uint8_t buf[], int data_type, co
/* There seems no valid reason why a packet would ever be generated without a data field present */ /* There seems no valid reason why a packet would ever be generated without a data field present */
data_field_present = (fields > 0) ? 0x80 : 0x00; data_field_present = (fields > 0) ? 0x80 : 0x00;
data_field_no = 0;
/* Data field present */ /* Data field present */
/* Data packet */ /* Data packet */
/* Type of data */ /* Type of data */

View File

@ -1066,7 +1066,6 @@ static int process_rx_data(t38_core_state_t *t, void *user_data, int data_type,
if (len <= 0 || buf[0] != 0xFF) if (len <= 0 || buf[0] != 0xFF)
s->core.hdlc_to_modem.buf[s->core.hdlc_to_modem.in].flags |= HDLC_FLAG_MISSING_DATA; s->core.hdlc_to_modem.buf[s->core.hdlc_to_modem.in].flags |= HDLC_FLAG_MISSING_DATA;
/*endif*/ /*endif*/
hdlc_buf = &s->core.hdlc_to_modem.buf[s->core.hdlc_to_modem.in];
} }
/*endif*/ /*endif*/
if (len > 0) if (len > 0)
@ -1313,10 +1312,7 @@ static int process_rx_data(t38_core_state_t *t, void *user_data, int data_type,
xx->current_rx_field_class = T38_FIELD_CLASS_NON_ECM; xx->current_rx_field_class = T38_FIELD_CLASS_NON_ECM;
hdlc_buf = &s->core.hdlc_to_modem.buf[s->core.hdlc_to_modem.in]; hdlc_buf = &s->core.hdlc_to_modem.buf[s->core.hdlc_to_modem.in];
if (hdlc_buf->contents != (data_type | FLAG_DATA)) if (hdlc_buf->contents != (data_type | FLAG_DATA))
{
queue_missing_indicator(s, data_type); queue_missing_indicator(s, data_type);
hdlc_buf = &s->core.hdlc_to_modem.buf[s->core.hdlc_to_modem.in];
}
/*endif*/ /*endif*/
if (len > 0) if (len > 0)
t38_non_ecm_buffer_inject(&s->core.non_ecm_to_modem, buf, len); t38_non_ecm_buffer_inject(&s->core.non_ecm_to_modem, buf, len);
@ -1349,10 +1345,7 @@ static int process_rx_data(t38_core_state_t *t, void *user_data, int data_type,
} }
/*endif*/ /*endif*/
if (hdlc_buf->contents != (data_type | FLAG_DATA)) if (hdlc_buf->contents != (data_type | FLAG_DATA))
{
queue_missing_indicator(s, data_type); queue_missing_indicator(s, data_type);
hdlc_buf = &s->core.hdlc_to_modem.buf[s->core.hdlc_to_modem.in];
}
/*endif*/ /*endif*/
/* Don't flow control the data any more. Just pump out the remainder as fast as we can. */ /* Don't flow control the data any more. Just pump out the remainder as fast as we can. */
t38_non_ecm_buffer_push(&s->core.non_ecm_to_modem); t38_non_ecm_buffer_push(&s->core.non_ecm_to_modem);
@ -1590,7 +1583,9 @@ static void non_ecm_push_residue(t38_gateway_state_t *t)
s->data[s->data_ptr++] = (uint8_t) (s->bit_stream << (8 - s->bit_no)); s->data[s->data_ptr++] = (uint8_t) (s->bit_stream << (8 - s->bit_no));
} }
/*endif*/ /*endif*/
t38_core_send_data(&t->t38x.t38, t->t38x.current_tx_data_type, T38_FIELD_T4_NON_ECM_SIG_END, s->data, s->data_ptr, T38_PACKET_CATEGORY_IMAGE_DATA_END); if (t38_core_send_data(&t->t38x.t38, t->t38x.current_tx_data_type, T38_FIELD_T4_NON_ECM_SIG_END, s->data, s->data_ptr, T38_PACKET_CATEGORY_IMAGE_DATA_END) < 0)
span_log(&t->logging, SPAN_LOG_WARNING, "T.38 send failed\n");
/*endif*/
s->in_bits += s->bits_absorbed; s->in_bits += s->bits_absorbed;
s->out_octets += s->data_ptr; s->out_octets += s->data_ptr;
s->data_ptr = 0; s->data_ptr = 0;
@ -1604,7 +1599,9 @@ static void non_ecm_push(t38_gateway_state_t *t)
s = &t->core.to_t38; s = &t->core.to_t38;
if (s->data_ptr) if (s->data_ptr)
{ {
t38_core_send_data(&t->t38x.t38, t->t38x.current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, s->data, s->data_ptr, T38_PACKET_CATEGORY_IMAGE_DATA); if (t38_core_send_data(&t->t38x.t38, t->t38x.current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, s->data, s->data_ptr, T38_PACKET_CATEGORY_IMAGE_DATA) < 0)
span_log(&t->logging, SPAN_LOG_WARNING, "T.38 send failed\n");
/*endif*/
s->in_bits += s->bits_absorbed; s->in_bits += s->bits_absorbed;
s->out_octets += s->data_ptr; s->out_octets += s->data_ptr;
s->bits_absorbed = 0; s->bits_absorbed = 0;
@ -1727,7 +1724,9 @@ static void hdlc_rx_status(hdlc_rx_state_t *t, int status)
if (t->framing_ok_announced) if (t->framing_ok_announced)
{ {
category = (s->t38x.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA_END : T38_PACKET_CATEGORY_IMAGE_DATA_END; category = (s->t38x.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA_END : T38_PACKET_CATEGORY_IMAGE_DATA_END;
t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_SIG_END, NULL, 0, category); if (t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_SIG_END, NULL, 0, category) < 0)
span_log(&s->logging, SPAN_LOG_WARNING, "T.38 send failed\n");
/*endif*/
t38_core_send_indicator(&s->t38x.t38, T38_IND_NO_SIGNAL); t38_core_send_indicator(&s->t38x.t38, T38_IND_NO_SIGNAL);
t->framing_ok_announced = false; t->framing_ok_announced = false;
} }
@ -1785,7 +1784,9 @@ static void rx_flag_or_abort(hdlc_rx_state_t *t)
if (u->data_ptr) if (u->data_ptr)
{ {
bit_reverse(u->data, t->buffer + t->len - 2 - u->data_ptr, u->data_ptr); bit_reverse(u->data, t->buffer + t->len - 2 - u->data_ptr, u->data_ptr);
t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_DATA, u->data, u->data_ptr, category); if (t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_DATA, u->data, u->data_ptr, category) < 0)
span_log(&s->logging, SPAN_LOG_WARNING, "T.38 send failed\n");
/*endif*/
} }
/*endif*/ /*endif*/
if (t->num_bits != 7) if (t->num_bits != 7)
@ -1795,7 +1796,11 @@ static void rx_flag_or_abort(hdlc_rx_state_t *t)
/* It seems some boxes may not like us sending a _SIG_END here, and then another /* It seems some boxes may not like us sending a _SIG_END here, and then another
when the carrier actually drops. Lets just send T38_FIELD_HDLC_FCS_OK here. */ when the carrier actually drops. Lets just send T38_FIELD_HDLC_FCS_OK here. */
if (t->len > 2) if (t->len > 2)
t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_FCS_BAD, NULL, 0, category); {
if (t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_FCS_BAD, NULL, 0, category) < 0)
span_log(&s->logging, SPAN_LOG_WARNING, "T.38 send failed\n");
/*endif*/
}
/*endif*/ /*endif*/
} }
else if ((u->crc & 0xFFFF) != 0xF0B8) else if ((u->crc & 0xFFFF) != 0xF0B8)
@ -1805,7 +1810,11 @@ static void rx_flag_or_abort(hdlc_rx_state_t *t)
/* It seems some boxes may not like us sending a _SIG_END here, and then another /* It seems some boxes may not like us sending a _SIG_END here, and then another
when the carrier actually drops. Lets just send T38_FIELD_HDLC_FCS_OK here. */ when the carrier actually drops. Lets just send T38_FIELD_HDLC_FCS_OK here. */
if (t->len > 2) if (t->len > 2)
t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_FCS_BAD, NULL, 0, category); {
if (t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_FCS_BAD, NULL, 0, category) < 0)
span_log(&s->logging, SPAN_LOG_WARNING, "T.38 send failed\n");
/*endif*/
}
/*endif*/ /*endif*/
} }
else else
@ -1830,7 +1839,9 @@ static void rx_flag_or_abort(hdlc_rx_state_t *t)
/*endif*/ /*endif*/
/* It seems some boxes may not like us sending a _SIG_END here, and then another /* It seems some boxes may not like us sending a _SIG_END here, and then another
when the carrier actually drops. Lets just send T38_FIELD_HDLC_FCS_OK here. */ when the carrier actually drops. Lets just send T38_FIELD_HDLC_FCS_OK here. */
t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_FCS_OK, NULL, 0, category); if (t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_FCS_OK, NULL, 0, category) < 0)
span_log(&s->logging, SPAN_LOG_WARNING, "T.38 send failed\n");
/*endif*/
} }
/*endif*/ /*endif*/
} }
@ -1936,7 +1947,9 @@ static void t38_hdlc_rx_put_bit(hdlc_rx_state_t *t, int new_bit)
{ {
bit_reverse(u->data, t->buffer + t->len - 2 - u->data_ptr, u->data_ptr); bit_reverse(u->data, t->buffer + t->len - 2 - u->data_ptr, u->data_ptr);
category = (s->t38x.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA : T38_PACKET_CATEGORY_IMAGE_DATA; category = (s->t38x.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA : T38_PACKET_CATEGORY_IMAGE_DATA;
t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_DATA, u->data, u->data_ptr, category); if (t38_core_send_data(&s->t38x.t38, s->t38x.current_tx_data_type, T38_FIELD_HDLC_DATA, u->data, u->data_ptr, category) < 0)
span_log(&s->logging, SPAN_LOG_WARNING, "T.38 send failed\n");
/*endif*/
/* Since we delay transmission by 2 octets, we should now have sent the last of the data octets when /* Since we delay transmission by 2 octets, we should now have sent the last of the data octets when
we have just received the last of the CRC octets. */ we have just received the last of the CRC octets. */
u->data_ptr = 0; u->data_ptr = 0;
@ -2107,7 +2120,6 @@ SPAN_DECLARE_NONSTD(int) t38_gateway_tx(t38_gateway_state_t *s, int16_t amp[], i
required_len = max_len; required_len = max_len;
#endif #endif
len = 0;
if ((len = s->audio.modems.tx_handler(s->audio.modems.tx_user_data, amp, max_len)) < max_len) if ((len = s->audio.modems.tx_handler(s->audio.modems.tx_user_data, amp, max_len)) < max_len)
{ {
if (set_next_tx_type(s)) if (set_next_tx_type(s))

View File

@ -167,7 +167,6 @@ static int extra_bits_in_stuffed_frame(const uint8_t buf[], int len)
int i; int i;
int j; int j;
bitstream = 0;
ones = 0; ones = 0;
stuffed = 0; stuffed = 0;
/* We should really append the CRC, and include the stuffed bits for that, to get /* We should really append the CRC, and include the stuffed bits for that, to get
@ -929,7 +928,6 @@ static int stream_hdlc(t38_terminal_state_t *s)
data_fields[0].field_len = i; data_fields[0].field_len = i;
/* Now see about the next HDLC frame. This will tell us whether to send FCS_OK or FCS_OK_SIG_END */ /* Now see about the next HDLC frame. This will tell us whether to send FCS_OK or FCS_OK_SIG_END */
previous = fe->current_tx_data_type;
fe->hdlc_tx.ptr = 0; fe->hdlc_tx.ptr = 0;
fe->hdlc_tx.len = 0; fe->hdlc_tx.len = 0;
if (front_end_status(s, T30_FRONT_END_SEND_STEP_COMPLETE) < 0) if (front_end_status(s, T30_FRONT_END_SEND_STEP_COMPLETE) < 0)

View File

@ -768,8 +768,6 @@ SPAN_DECLARE(int) t43_decode_put(t43_decode_state_t *s, const uint8_t data[], si
result = 0; result = 0;
while (s->current_bit_plane < s->t85.bit_planes) while (s->current_bit_plane < s->t85.bit_planes)
{ {
j = s->current_bit_plane;
result = t85_decode_put(&s->t85, data, len); result = t85_decode_put(&s->t85, data, len);
if (result != T4_DECODE_OK) if (result != T4_DECODE_OK)
{ {
@ -783,10 +781,10 @@ SPAN_DECLARE(int) t43_decode_put(t43_decode_state_t *s, const uint8_t data[], si
/* Start the next plane */ /* Start the next plane */
s->bit_plane_mask >>= 1; s->bit_plane_mask >>= 1;
s->current_bit_plane++;
s->ptr = 0; s->ptr = 0;
s->row = 0; s->row = 0;
s->plane_ptr = 0; s->plane_ptr = 0;
s->current_bit_plane++;
t85_decode_new_plane(&s->t85); t85_decode_new_plane(&s->t85);
} }
/* Apply the colour map, and produce the RGB data from the collected bit-planes */ /* Apply the colour map, and produce the RGB data from the collected bit-planes */

View File

@ -899,7 +899,6 @@ static int get_next_row(t4_t6_encode_state_t *s)
if (s->row_bits < 0 || s->row_read_handler == NULL) if (s->row_bits < 0 || s->row_read_handler == NULL)
return -1; return -1;
len = -1;
s->bitstream_iptr = 0; s->bitstream_iptr = 0;
s->bitstream_optr = 0; s->bitstream_optr = 0;
s->bit_pos = 7; s->bit_pos = 7;

View File

@ -202,7 +202,7 @@ SPAN_DECLARE(int) time_scale(time_scale_state_t *s, int16_t out[], int16_t in[],
{ {
while (s->lcp >= s->buf_len) while (s->lcp >= s->buf_len)
{ {
memcpy(out + out_len, s->buf, sizeof(int16_t)*s->buf_len); memcpy(&out[out_len], s->buf, sizeof(int16_t)*s->buf_len);
out_len += s->buf_len; out_len += s->buf_len;
if (len - in_len < s->buf_len) if (len - in_len < s->buf_len)
{ {
@ -218,7 +218,7 @@ SPAN_DECLARE(int) time_scale(time_scale_state_t *s, int16_t out[], int16_t in[],
} }
if (s->lcp > 0) if (s->lcp > 0)
{ {
memcpy(out + out_len, s->buf, sizeof(int16_t)*s->lcp); memcpy(&out[out_len], s->buf, sizeof(int16_t)*s->lcp);
out_len += s->lcp; out_len += s->lcp;
memcpy(s->buf, s->buf + s->lcp, sizeof(int16_t)*(s->buf_len - s->lcp)); memcpy(s->buf, s->buf + s->lcp, sizeof(int16_t)*(s->buf_len - s->lcp));
if (len - in_len < s->lcp) if (len - in_len < s->lcp)
@ -273,7 +273,7 @@ SPAN_DECLARE(int) time_scale(time_scale_state_t *s, int16_t out[], int16_t in[],
else else
{ {
/* Slow down - insert a chunk of data */ /* Slow down - insert a chunk of data */
memcpy(out + out_len, s->buf, sizeof(int16_t)*pitch); memcpy(&out[out_len], s->buf, sizeof(int16_t)*pitch);
out_len += pitch; out_len += pitch;
overlap_add(s->buf + pitch, s->buf, pitch); overlap_add(s->buf + pitch, s->buf, pitch);
} }

View File

@ -643,7 +643,6 @@ static int tzparse(const char *name, struct tz_state_s * const sp, const int las
} }
/* Initially we're assumed to be in standard time. */ /* Initially we're assumed to be in standard time. */
isdst = false; isdst = false;
theiroffset = theirstdoffset;
/* Now juggle transition times and types tracking offsets as you do. */ /* Now juggle transition times and types tracking offsets as you do. */
for (i = 0; i < sp->timecnt; i++) for (i = 0; i < sp->timecnt; i++)
{ {

View File

@ -73,7 +73,7 @@
#include "spandsp/private/v17rx.h" #include "spandsp/private/v17rx.h"
#if defined(SPANDSP_USE_FIXED_POINTx) #if defined(SPANDSP_USE_FIXED_POINTx)
#define FP_SCALE(x) FP_Q_6_10(x) #define FP_SCALE(x) FP_Q6_10(x)
#define FP_FACTOR 1024 #define FP_FACTOR 1024
#define FP_SHIFT_FACTOR 12 #define FP_SHIFT_FACTOR 12
#else #else
@ -81,8 +81,8 @@
#endif #endif
#if defined(SPANDSP_USE_FIXED_POINTx) #if defined(SPANDSP_USE_FIXED_POINTx)
#define FP_SYNC_SCALE(x) FP_Q_6_10(x) #define FP_SYNC_SCALE(x) FP_Q6_10(x)
#define FP_SYNC_SCALE_32(x) FP_Q_6_10_32(x) #define FP_SYNC_SCALE_32(x) FP_Q22_10(x)
#define FP_SYNC_SHIFT_FACTOR 10 #define FP_SYNC_SHIFT_FACTOR 10
#else #else
#define FP_SYNC_SCALE(x) (x) #define FP_SYNC_SCALE(x) (x)
@ -746,21 +746,22 @@ static void process_half_baud(v17_rx_state_t *s, const complexf_t *sample)
/* We should already know the accurate carrier frequency. All we need to sort /* We should already know the accurate carrier frequency. All we need to sort
out is the phase. */ out is the phase. */
/* Check if we just saw A or B */ /* Check if we just saw A or B */
/* atan(1/3) = 18.433 degrees */
if ((uint32_t) (angle - s->last_angles[0]) < 0x80000000U) if ((uint32_t) (angle - s->last_angles[0]) < 0x80000000U)
{ {
angle = s->last_angles[0]; angle = s->last_angles[0];
s->last_angles[0] = 0xC0000000 + 219937506; s->last_angles[0] = DDS_PHASE(270.0f + 18.433f);
s->last_angles[1] = 0x80000000 + 219937506; s->last_angles[1] = DDS_PHASE(180.0f + 18.433f);
} }
else else
{ {
s->last_angles[0] = 0x80000000 + 219937506; s->last_angles[0] = DDS_PHASE(180.0f + 18.433f);
s->last_angles[1] = 0xC0000000 + 219937506; s->last_angles[1] = DDS_PHASE(270.0f + 18.433f);
} }
/* Make a step shift in the phase, to pull it into line. We need to rotate the equalizer /* Make a step shift in the phase, to pull it into line. We need to rotate the equalizer
buffer, as well as the carrier phase, for this to play out nicely. */ buffer, as well as the carrier phase, for this to play out nicely. */
/* angle is now the difference between where A is, and where it should be */ /* angle is now the difference between where A is, and where it should be */
phase_step = 0x80000000 + angle - 219937506; phase_step = angle - DDS_PHASE(180.0f + 18.433f);
#if defined(SPANDSP_USE_FIXED_POINTx) #if defined(SPANDSP_USE_FIXED_POINTx)
ip = phase_step >> 16; ip = phase_step >> 16;
span_log(&s->logging, SPAN_LOG_FLOW, "Spin (short) by %d\n", ip); span_log(&s->logging, SPAN_LOG_FLOW, "Spin (short) by %d\n", ip);
@ -769,7 +770,7 @@ static void process_half_baud(v17_rx_state_t *s, const complexf_t *sample)
s->eq_buf[i] = complex_mul_q1_15(&s->eq_buf[i], &z16); s->eq_buf[i] = complex_mul_q1_15(&s->eq_buf[i], &z16);
s->carrier_track_p = 500000; s->carrier_track_p = 500000;
#else #else
p = phase_step*2.0f*3.14159f/(65536.0f*65536.0f); p = dds_phase_to_radians(phase_step);
span_log(&s->logging, SPAN_LOG_FLOW, "Spin (short) by %.5f rads\n", p); span_log(&s->logging, SPAN_LOG_FLOW, "Spin (short) by %.5f rads\n", p);
zz = complex_setf(cosf(p), -sinf(p)); zz = complex_setf(cosf(p), -sinf(p));
for (i = 0; i < V17_EQUALIZER_LEN; i++) for (i = 0; i < V17_EQUALIZER_LEN; i++)
@ -828,7 +829,7 @@ static void process_half_baud(v17_rx_state_t *s, const complexf_t *sample)
/* Make a step shift in the phase, to pull it into line. We need to rotate the equalizer buffer, /* Make a step shift in the phase, to pull it into line. We need to rotate the equalizer buffer,
as well as the carrier phase, for this to play out nicely. */ as well as the carrier phase, for this to play out nicely. */
/* angle is now the difference between where C is, and where it should be */ /* angle is now the difference between where C is, and where it should be */
phase_step = angle - 219937506; phase_step = angle - DDS_PHASE(18.433f);
#if defined(SPANDSP_USE_FIXED_POINTx) #if defined(SPANDSP_USE_FIXED_POINTx)
ip = phase_step >> 16; ip = phase_step >> 16;
span_log(&s->logging, SPAN_LOG_FLOW, "Spin (long) by %d\n", ip); span_log(&s->logging, SPAN_LOG_FLOW, "Spin (long) by %d\n", ip);
@ -836,7 +837,7 @@ static void process_half_baud(v17_rx_state_t *s, const complexf_t *sample)
for (i = 0; i < V17_EQUALIZER_LEN; i++) for (i = 0; i < V17_EQUALIZER_LEN; i++)
s->eq_buf[i] = complex_mul_q1_15(&s->eq_buf[i], &z16); s->eq_buf[i] = complex_mul_q1_15(&s->eq_buf[i], &z16);
#else #else
p = phase_step*2.0f*3.14159f/(65536.0f*65536.0f); p = dds_phase_to_radians(phase_step);
span_log(&s->logging, SPAN_LOG_FLOW, "Spin (long) by %.5f rads\n", p); span_log(&s->logging, SPAN_LOG_FLOW, "Spin (long) by %.5f rads\n", p);
zz = complex_setf(cosf(p), -sinf(p)); zz = complex_setf(cosf(p), -sinf(p));
for (i = 0; i < V17_EQUALIZER_LEN; i++) for (i = 0; i < V17_EQUALIZER_LEN; i++)
@ -1179,7 +1180,7 @@ static __inline__ int signal_detect(v17_rx_state_t *s, int16_t amp)
/* There could be overflow here, but it isn't a problem in practice */ /* There could be overflow here, but it isn't a problem in practice */
diff = x - s->last_sample; diff = x - s->last_sample;
s->last_sample = x; s->last_sample = x;
power = power_meter_update(&(s->power), diff); power = power_meter_update(&s->power, diff);
#if defined(IAXMODEM_STUFF) #if defined(IAXMODEM_STUFF)
/* Quick power drop fudge */ /* Quick power drop fudge */
diff = abs(diff); diff = abs(diff);

View File

@ -110,6 +110,8 @@ static __inline__ int scramble(v17_tx_state_t *s, int in_bit)
{ {
int out_bit; int out_bit;
/* One of the scrambler taps is a variable, so it can be adjusted for caller or answerer operation
when used for V.32bis. */
out_bit = (in_bit ^ (s->scramble_reg >> s->scrambler_tap) ^ (s->scramble_reg >> (23 - 1))) & 1; out_bit = (in_bit ^ (s->scramble_reg >> s->scrambler_tap) ^ (s->scramble_reg >> (23 - 1))) & 1;
s->scramble_reg = (s->scramble_reg << 1) | out_bit; s->scramble_reg = (s->scramble_reg << 1) | out_bit;
return out_bit; return out_bit;

View File

@ -898,7 +898,6 @@ static int decode_dtmf(v18_state_t *s, char msg[], const char dtmf[])
if (ss) if (ss)
{ {
len = strlen(ss->dtmf); len = strlen(ss->dtmf);
t += len;
*u++ = ss->ascii; *u++ = ss->ascii;
return len; return len;
} }

View File

@ -79,7 +79,7 @@
#include "spandsp/private/v22bis.h" #include "spandsp/private/v22bis.h"
#if defined(SPANDSP_USE_FIXED_POINT) #if defined(SPANDSP_USE_FIXED_POINT)
#define FP_SCALE(x) FP_Q_6_10(x) #define FP_SCALE(x) FP_Q6_10(x)
#define FP_SHIFT_FACTOR 10 #define FP_SHIFT_FACTOR 10
#else #else
#define FP_SCALE(x) (x) #define FP_SCALE(x) (x)
@ -185,7 +185,7 @@ void v22bis_equalizer_coefficient_reset(v22bis_state_t *s)
{ {
/* Start with an equalizer based on everything being perfect */ /* Start with an equalizer based on everything being perfect */
#if defined(SPANDSP_USE_FIXED_POINT) #if defined(SPANDSP_USE_FIXED_POINT)
static const complexi16_t x = {FP_Q_6_10(3.0f), FP_Q_6_10(0.0f)}; static const complexi16_t x = {FP_Q6_10(3.0f), FP_Q6_10(0.0f)};
cvec_zeroi16(s->rx.eq_coeff, V22BIS_EQUALIZER_LEN); cvec_zeroi16(s->rx.eq_coeff, V22BIS_EQUALIZER_LEN);
s->rx.eq_coeff[V22BIS_EQUALIZER_PRE_LEN] = x; s->rx.eq_coeff[V22BIS_EQUALIZER_PRE_LEN] = x;
@ -378,7 +378,7 @@ static __inline__ void symbol_sync(v22bis_state_t *s)
complexi16_t a; complexi16_t a;
complexi16_t b; complexi16_t b;
complexi16_t c; complexi16_t c;
static const complexi16_t x = {FP_Q_1_15(0.894427f), FP_Q_1_15(0.44721f)}; static const complexi16_t x = {FP_Q1_15(0.894427f), FP_Q1_15(0.44721f)};
#else #else
float p; float p;
float q; float q;
@ -453,7 +453,7 @@ static __inline__ void process_half_baud(v22bis_state_t *s, const complexf_t *sa
complexi16_t z; complexi16_t z;
complexi16_t zz; complexi16_t zz;
const complexi16_t *target; const complexi16_t *target;
static const complexi16_t x = {FP_Q_1_15(0.894427f), FP_Q_1_15(0.44721f)}; static const complexi16_t x = {FP_Q1_15(0.894427f), FP_Q1_15(0.44721f)};
#else #else
complexf_t z; complexf_t z;
complexf_t zz; complexf_t zz;
@ -487,8 +487,8 @@ static __inline__ void process_half_baud(v22bis_state_t *s, const complexf_t *sa
if (s->rx.sixteen_way_decisions) if (s->rx.sixteen_way_decisions)
{ {
#if defined(SPANDSP_USE_FIXED_POINT) #if defined(SPANDSP_USE_FIXED_POINT)
re = (z.re + FP_Q_6_10(3.0f)) >> FP_SHIFT_FACTOR; re = (z.re + FP_Q6_10(3.0f)) >> FP_SHIFT_FACTOR;
im = (z.im + FP_Q_6_10(3.0f)) >> FP_SHIFT_FACTOR; im = (z.im + FP_Q6_10(3.0f)) >> FP_SHIFT_FACTOR;
#else #else
re = (int) (z.re + 3.0f); re = (int) (z.re + 3.0f);
im = (int) (z.im + 3.0f); im = (int) (z.im + 3.0f);

View File

@ -70,7 +70,7 @@
#include "spandsp/private/v22bis.h" #include "spandsp/private/v22bis.h"
#if defined(SPANDSP_USE_FIXED_POINT) #if defined(SPANDSP_USE_FIXED_POINT)
#define FP_SCALE(x) FP_Q_6_10(x) #define FP_SCALE(x) FP_Q6_10(x)
#else #else
#define FP_SCALE(x) (x) #define FP_SCALE(x) (x)
#endif #endif

View File

@ -72,7 +72,7 @@
#include "spandsp/private/v27ter_rx.h" #include "spandsp/private/v27ter_rx.h"
#if defined(SPANDSP_USE_FIXED_POINT) #if defined(SPANDSP_USE_FIXED_POINT)
#define FP_SCALE(x) FP_Q_6_10(x) #define FP_SCALE(x) FP_Q6_10(x)
#define FP_FACTOR 4096 #define FP_FACTOR 4096
#define FP_SHIFT_FACTOR 12 #define FP_SHIFT_FACTOR 12
#else #else
@ -553,7 +553,6 @@ static __inline__ void process_half_baud(v27ter_rx_state_t *s, const complexf_t
z = equalizer_get(s); z = equalizer_get(s);
//span_log(&s->logging, SPAN_LOG_FLOW, "Equalized symbol - %15.5f %15.5f\n", z.re, z.im); //span_log(&s->logging, SPAN_LOG_FLOW, "Equalized symbol - %15.5f %15.5f\n", z.re, z.im);
constellation_state = s->constellation_state;
switch (s->training_stage) switch (s->training_stage)
{ {
case TRAINING_STAGE_NORMAL_OPERATION: case TRAINING_STAGE_NORMAL_OPERATION:
@ -625,13 +624,13 @@ static __inline__ void process_half_baud(v27ter_rx_state_t *s, const complexf_t
/* Make a step shift in the phase, to pull it into line. We need to rotate the equalizer /* Make a step shift in the phase, to pull it into line. We need to rotate the equalizer
buffer, as well as the carrier phase, for this to play out nicely. */ buffer, as well as the carrier phase, for this to play out nicely. */
angle += 0x80000000; angle += DDS_PHASE(180.0f);
#if defined(SPANDSP_USE_FIXED_POINT) #if defined(SPANDSP_USE_FIXED_POINT)
z16 = complex_seti16(fixed_cos(angle >> 16), -fixed_sin(angle >> 16)); z16 = complex_seti16(fixed_cos(angle >> 16), -fixed_sin(angle >> 16));
for (i = 0; i < V27TER_EQUALIZER_LEN; i++) for (i = 0; i < V27TER_EQUALIZER_LEN; i++)
s->eq_buf[i] = complex_mul_q1_15(&s->eq_buf[i], &z16); s->eq_buf[i] = complex_mul_q1_15(&s->eq_buf[i], &z16);
#else #else
p = angle*2.0f*3.14159f/(65536.0f*65536.0f); p = dds_phase_to_radians(angle);
zz = complex_setf(cosf(p), -sinf(p)); zz = complex_setf(cosf(p), -sinf(p));
for (i = 0; i < V27TER_EQUALIZER_LEN; i++) for (i = 0; i < V27TER_EQUALIZER_LEN; i++)
s->eq_buf[i] = complex_mulf(&s->eq_buf[i], &zz); s->eq_buf[i] = complex_mulf(&s->eq_buf[i], &zz);
@ -643,9 +642,8 @@ static __inline__ void process_half_baud(v27ter_rx_state_t *s, const complexf_t
s->training_bc ^= descramble(s, 1); s->training_bc ^= descramble(s, 1);
descramble(s, 1); descramble(s, 1);
descramble(s, 1); descramble(s, 1);
constellation_state =
s->constellation_state = abab_pos[s->training_bc]; s->constellation_state = abab_pos[s->training_bc];
target = &v27ter_constellation[constellation_state]; target = &v27ter_constellation[s->constellation_state];
s->training_count = 1; s->training_count = 1;
s->training_stage = TRAINING_STAGE_TRAIN_ON_ABAB; s->training_stage = TRAINING_STAGE_TRAIN_ON_ABAB;
report_status_change(s, SIG_STATUS_TRAINING_IN_PROGRESS); report_status_change(s, SIG_STATUS_TRAINING_IN_PROGRESS);
@ -665,9 +663,8 @@ static __inline__ void process_half_baud(v27ter_rx_state_t *s, const complexf_t
s->training_bc ^= descramble(s, 1); s->training_bc ^= descramble(s, 1);
descramble(s, 1); descramble(s, 1);
descramble(s, 1); descramble(s, 1);
constellation_state =
s->constellation_state = abab_pos[s->training_bc]; s->constellation_state = abab_pos[s->training_bc];
target = &v27ter_constellation[constellation_state]; target = &v27ter_constellation[s->constellation_state];
track_carrier(s, &z, target); track_carrier(s, &z, target);
tune_equalizer(s, &z, target); tune_equalizer(s, &z, target);
@ -680,7 +677,6 @@ static __inline__ void process_half_baud(v27ter_rx_state_t *s, const complexf_t
#endif #endif
if (++s->training_count >= V27TER_TRAINING_SEG_5_LEN) if (++s->training_count >= V27TER_TRAINING_SEG_5_LEN)
{ {
constellation_state = 4;
s->constellation_state = (s->bit_rate == 4800) ? 4 : 2; s->constellation_state = (s->bit_rate == 4800) ? 4 : 2;
s->training_count = 0; s->training_count = 0;
s->training_stage = TRAINING_STAGE_TEST_ONES; s->training_stage = TRAINING_STAGE_TEST_ONES;
@ -743,7 +739,20 @@ static __inline__ void process_half_baud(v27ter_rx_state_t *s, const complexf_t
break; break;
} }
if (s->qam_report) if (s->qam_report)
{
#if defined(SPANDSP_USE_FIXED_POINT)
complexi16_t zi;
complexi16_t targeti;
zi.re = z.re*1024.0f;
zi.im = z.im*1024.0f;
targeti.re = target->re*1024.0f;
targeti.im = target->im*1024.0f;
s->qam_report(s->qam_user_data, &zi, &targeti, s->constellation_state);
#else
s->qam_report(s->qam_user_data, &z, target, s->constellation_state); s->qam_report(s->qam_user_data, &z, target, s->constellation_state);
#endif
}
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/

View File

@ -65,7 +65,7 @@
#include "spandsp/private/v27ter_tx.h" #include "spandsp/private/v27ter_tx.h"
#if defined(SPANDSP_USE_FIXED_POINT) #if defined(SPANDSP_USE_FIXED_POINT)
#define FP_SCALE FP_Q_6_10 #define FP_SCALE FP_Q6_10
#else #else
#define FP_SCALE(x) (x) #define FP_SCALE(x) (x)
#endif #endif

View File

@ -71,7 +71,7 @@
#include "spandsp/private/v29rx.h" #include "spandsp/private/v29rx.h"
#if defined(SPANDSP_USE_FIXED_POINT) #if defined(SPANDSP_USE_FIXED_POINT)
#define FP_SCALE(x) FP_Q_4_12(x) #define FP_SCALE(x) FP_Q4_12(x)
#define FP_FACTOR 4096 #define FP_FACTOR 4096
#define FP_SHIFT_FACTOR 12 #define FP_SHIFT_FACTOR 12
#else #else
@ -79,8 +79,8 @@
#endif #endif
#if defined(SPANDSP_USE_FIXED_POINT) #if defined(SPANDSP_USE_FIXED_POINT)
#define FP_SYNC_SCALE(x) FP_Q_6_10(x) #define FP_SYNC_SCALE(x) FP_Q6_10(x)
#define FP_SYNC_SCALE_32(x) FP_Q_6_10_32(x) #define FP_SYNC_SCALE_32(x) FP_Q22_10(x)
#define FP_SYNC_SHIFT_FACTOR 10 #define FP_SYNC_SHIFT_FACTOR 10
#else #else
#define FP_SYNC_SCALE(x) (x) #define FP_SYNC_SCALE(x) (x)
@ -206,8 +206,13 @@ SPAN_DECLARE(int) v29_rx_equalizer_state(v29_rx_state_t *s, complexi16_t **coeff
SPAN_DECLARE(int) v29_rx_equalizer_state(v29_rx_state_t *s, complexf_t **coeffs) SPAN_DECLARE(int) v29_rx_equalizer_state(v29_rx_state_t *s, complexf_t **coeffs)
#endif #endif
{ {
#if defined(SPANDSP_USE_FIXED_POINT)
*coeffs = NULL;
return 0;
#else
*coeffs = s->eq_coeff; *coeffs = s->eq_coeff;
return V29_EQUALIZER_LEN; return V29_EQUALIZER_LEN;
#endif
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
@ -539,7 +544,6 @@ static __inline__ void symbol_sync(v29_rx_state_t *s)
i = (v > FP_SYNC_SCALE_32(1000.0f)) ? 5 : 1; i = (v > FP_SYNC_SCALE_32(1000.0f)) ? 5 : 1;
if (s->baud_phase < FP_SYNC_SCALE_32(0.0f)) if (s->baud_phase < FP_SYNC_SCALE_32(0.0f))
i = -i; i = -i;
//printf("v = %10.5f %5d - %f %f %d\n", v, i, p, s->baud_phase, s->total_baud_timing_correction);
s->eq_put_step += i; s->eq_put_step += i;
s->total_baud_timing_correction += i; s->total_baud_timing_correction += i;
} }
@ -674,7 +678,7 @@ static void process_half_baud(v29_rx_state_t *s, complexf_t *sample)
for (i = 0; i < V29_EQUALIZER_LEN; i++) for (i = 0; i < V29_EQUALIZER_LEN; i++)
s->eq_buf[i] = complex_mul_q1_15(&s->eq_buf[i], &z16); s->eq_buf[i] = complex_mul_q1_15(&s->eq_buf[i], &z16);
#else #else
p = angle*2.0f*3.14159f/(65536.0f*65536.0f); p = dds_phase_to_radians(angle);
span_log(&s->logging, SPAN_LOG_FLOW, "Spin by %.5f rads\n", p); span_log(&s->logging, SPAN_LOG_FLOW, "Spin by %.5f rads\n", p);
zz = complex_setf(cosf(p), -sinf(p)); zz = complex_setf(cosf(p), -sinf(p));
for (i = 0; i < V29_EQUALIZER_LEN; i++) for (i = 0; i < V29_EQUALIZER_LEN; i++)
@ -817,7 +821,20 @@ static void process_half_baud(v29_rx_state_t *s, complexf_t *sample)
break; break;
} }
if (s->qam_report) if (s->qam_report)
{
#if defined(SPANDSP_USE_FIXED_POINT)
complexi16_t zi;
complexi16_t targeti;
zi.re = z.re*1024.0f;
zi.im = z.im*1024.0f;
targeti.re = target->re*1024.0f;
targeti.im = target->im*1024.0f;
s->qam_report(s->qam_user_data, &zi, &targeti, s->constellation_state);
#else
s->qam_report(s->qam_user_data, &z, target, s->constellation_state); s->qam_report(s->qam_user_data, &z, target, s->constellation_state);
#endif
}
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/

View File

@ -273,13 +273,13 @@ static void set_working_gain(v29_tx_state_t *s)
switch (s->bit_rate) switch (s->bit_rate)
{ {
case 9600: case 9600:
s->gain = ((int32_t) FP_Q_4_12(0.387f)*s->base_gain) >> 12; s->gain = ((int32_t) FP_Q4_12(0.387f)*s->base_gain) >> 12;
break; break;
case 7200: case 7200:
s->gain = ((int32_t) FP_Q_4_12(0.605f)*s->base_gain) >> 12; s->gain = ((int32_t) FP_Q4_12(0.605f)*s->base_gain) >> 12;
break; break;
case 4800: case 4800:
s->gain = ((int32_t) FP_Q_4_12(0.470f)*s->base_gain) >> 12; s->gain = ((int32_t) FP_Q4_12(0.470f)*s->base_gain) >> 12;
break; break;
default: default:
break; break;

View File

@ -314,6 +314,7 @@ static int receive_xid(v42_state_t *ss, const uint8_t *frame, int len)
switch (param_id) switch (param_id)
{ {
case PI_HDLC_OPTIONAL_FUNCTIONS: case PI_HDLC_OPTIONAL_FUNCTIONS:
/* TODO: param_val is never used right now. */
param_val = pack_value(buf, param_len); param_val = pack_value(buf, param_len);
break; break;
case PI_TX_INFO_MAXSIZE: case PI_TX_INFO_MAXSIZE:

View File

@ -495,7 +495,7 @@ int main(int argc, char *argv[])
{ {
len = my_mf_generate(amp, ALL_POSSIBLE_DIGITS); len = my_mf_generate(amp, ALL_POSSIBLE_DIGITS);
for (sample = 0; sample < len; sample++) for (sample = 0; sample < len; sample++)
amp[sample] = saturate(amp[sample] + awgn(&noise_source)); amp[sample] = sat_add16(amp[sample], awgn(&noise_source));
codec_munge(amp, len); codec_munge(amp, len);
bell_mf_rx(mf_state, amp, len); bell_mf_rx(mf_state, amp, len);
if (bell_mf_rx_get(mf_state, buf, 128) != 15) if (bell_mf_rx_get(mf_state, buf, 128) != 15)

View File

@ -596,7 +596,7 @@ static void mitel_cm7291_side_1_tests(void)
// TODO: Clip // TODO: Clip
for (sample = 0; sample < len; sample++) for (sample = 0; sample < len; sample++)
amp[sample] = saturate(amp[sample] + awgn(&noise_source)); amp[sample] = sat_add16(amp[sample], awgn(&noise_source));
codec_munge(munge, amp, len); codec_munge(munge, amp, len);
dtmf_rx(dtmf_state, amp, len); dtmf_rx(dtmf_state, amp, len);
@ -722,7 +722,7 @@ static void dial_tone_tolerance_tests(void)
tone_gen(&dial_tone, amp2, len); tone_gen(&dial_tone, amp2, len);
for (sample = 0; sample < len; sample++) for (sample = 0; sample < len; sample++)
amp[sample] = saturate(amp[sample] + amp2[sample]); amp[sample] = sat_add16(amp[sample], amp2[sample]);
codec_munge(munge, amp, len); codec_munge(munge, amp, len);
dtmf_rx(dtmf_state, amp, len); dtmf_rx(dtmf_state, amp, len);

View File

@ -463,7 +463,7 @@ static int16_t channel_model(channel_model_state_t *chan, int16_t rout, int16_t
the G.168 spec. However, there will generally be near end and far end analogue/echoey the G.168 spec. However, there will generally be near end and far end analogue/echoey
segments in the real world, unless an end is purely digital. */ segments in the real world, unless an end is purely digital. */
echo = fir32(&chan->impulse, rout*chan->gain); echo = fir32(&chan->impulse, rout*chan->gain);
sin = saturate(echo + sgen); sin = sat_add16(echo, sgen);
/* This mixed echo and far end signal will have been through codec munging /* This mixed echo and far end signal will have been through codec munging
when it came back into the digital network. */ when it came back into the digital network. */
@ -617,7 +617,7 @@ static void run_test(echo_can_state_t *ctx, int16_t (*tx_source)(void), int16_t
static void print_test_title(const char *title) static void print_test_title(const char *title)
{ {
if (quiet == false) if (quiet == false)
printf(title); printf("%s", title);
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/

View File

@ -554,7 +554,7 @@ faxtester_state_t *faxtester_init(faxtester_state_t *s, int calling_party)
span_log_set_protocol(&s->logging, "TST"); span_log_set_protocol(&s->logging, "TST");
fax_modems_init(&s->modems, fax_modems_init(&s->modems,
false, false,
NULL, hdlc_accept,
hdlc_underflow_handler, hdlc_underflow_handler,
non_ecm_put_bit, non_ecm_put_bit,
t38_non_ecm_buffer_get_bit, t38_non_ecm_buffer_get_bit,

View File

@ -94,32 +94,32 @@ LOCALTESTS_DIR=../test-data/local
TIFFCMP=tiffcmp TIFFCMP=tiffcmp
# Colour/gray -> bilevel by not allowing ECM # Colour/gray -> bilevel by not allowing ECM
for OPTS in "-p AA" "-p TT" "-p GG" "-p TG" "-p GT" #for OPTS in "-p AA" "-p TT" "-p GG" "-p TG" "-p GT"
do #do
IN_FILE="${LOCALTESTS_DIR}/lenna-colour.tif" # IN_FILE="${LOCALTESTS_DIR}/lenna-colour.tif"
OUT_FILE="${LOCALTESTS_DIR}/lenna-colour-bilevel.tif" # OUT_FILE="${LOCALTESTS_DIR}/lenna-colour-bilevel.tif"
run_colour_fax_test # run_colour_fax_test
IN_FILE="${LOCALTESTS_DIR}/lenna-bw.tif" # IN_FILE="${LOCALTESTS_DIR}/lenna-bw.tif"
OUT_FILE="${LOCALTESTS_DIR}/lenna-bw-bilevel.tif" # OUT_FILE="${LOCALTESTS_DIR}/lenna-bw-bilevel.tif"
run_colour_fax_test # run_colour_fax_test
IN_FILE="${TIFFFX_DIR}/c03x_02x.tif" # IN_FILE="${TIFFFX_DIR}/c03x_02x.tif"
OUT_FILE="${TIFFFX_DIR}/c03x_02x-bilevel.tif" # OUT_FILE="${TIFFFX_DIR}/c03x_02x-bilevel.tif"
run_colour_fax_test # run_colour_fax_test
IN_FILE="${TIFFFX_DIR}/l02x_02x.tif" # IN_FILE="${TIFFFX_DIR}/l02x_02x.tif"
OUT_FILE="${TIFFFX_DIR}/l02x_02x-bilevel.tif" # OUT_FILE="${TIFFFX_DIR}/l02x_02x-bilevel.tif"
run_colour_fax_test # run_colour_fax_test
IN_FILE="${TIFFFX_DIR}/l04x_02x.tif" # IN_FILE="${TIFFFX_DIR}/l04x_02x.tif"
OUT_FILE="${TIFFFX_DIR}/l04x_02x-bilevel.tif" # OUT_FILE="${TIFFFX_DIR}/l04x_02x-bilevel.tif"
run_colour_fax_test # run_colour_fax_test
done #done
# Colour/gray -> colour/gray # Colour/gray -> colour/gray
for OPTS in "-p AA -C -e" "-p TT -C -e" "-p GG -C -e" "-p TG -C -e" "-p GT -C -e" #for OPTS in "-p AA -C -e" "-p TT -C -e" "-p GG -C -e" "-p TG -C -e" "-p GT -C -e"
do #do
# IN_FILE="${LOCALTESTS_DIR}/lenna-colour.tif" # IN_FILE="${LOCALTESTS_DIR}/lenna-colour.tif"
# OUT_FILE="${LOCALTESTS_DIR}/lenna-colour-out.tif" # OUT_FILE="${LOCALTESTS_DIR}/lenna-colour-out.tif"
# run_colour_fax_test # run_colour_fax_test
@ -132,14 +132,14 @@ do
# OUT_FILE="${TIFFFX_DIR}/c03x_02x-out.tif" # OUT_FILE="${TIFFFX_DIR}/c03x_02x-out.tif"
# run_colour_fax_test # run_colour_fax_test
IN_FILE="${TIFFFX_DIR}/l02x_02x.tif" # IN_FILE="${TIFFFX_DIR}/l02x_02x.tif"
OUT_FILE="${TIFFFX_DIR}/l02x_02x.tif" # OUT_FILE="${TIFFFX_DIR}/l02x_02x.tif"
run_colour_fax_test # run_colour_fax_test
# IN_FILE="${TIFFFX_DIR}/l04x_02x.tif" # IN_FILE="${TIFFFX_DIR}/l04x_02x.tif"
# OUT_FILE="${TIFFFX_DIR}/l04x_02x.tif" # OUT_FILE="${TIFFFX_DIR}/l04x_02x.tif"
# run_colour_fax_test # run_colour_fax_test
done #done
# Bi-level tests with image squashing # Bi-level tests with image squashing
for OPTS in "-p AA" "-p AA -e" "-p TT" "-p TT -e" "-p GG" "-p GG -e" "-p TG" "-p TG -e" "-p GT" "-p GT -e" for OPTS in "-p AA" "-p AA -e" "-p TT" "-p TT -e" "-p GG" "-p GG -e" "-p TG" "-p TG -e" "-p GT" "-p GT -e"
@ -398,3 +398,4 @@ done
echo echo
echo All fax tests successfully completed echo All fax tests successfully completed

View File

@ -556,6 +556,7 @@ int main(int argc, char *argv[])
fprintf(stderr, " Unexpected number of channels in audio file '%s'\n", in_file); fprintf(stderr, " Unexpected number of channels in audio file '%s'\n", in_file);
exit(2); exit(2);
} }
enc_state = g722_encode_init(NULL, bit_rate, G722_PACKED | G722_SAMPLE_RATE_8000);
} }
else else
{ {
@ -574,12 +575,9 @@ int main(int argc, char *argv[])
fprintf(stderr, " Unexpected number of channels in audio file '%s'\n", in_file); fprintf(stderr, " Unexpected number of channels in audio file '%s'\n", in_file);
exit(2); exit(2);
} }
}
if (eight_k_in)
enc_state = g722_encode_init(NULL, bit_rate, G722_PACKED | G722_SAMPLE_RATE_8000);
else
enc_state = g722_encode_init(NULL, bit_rate, G722_PACKED); enc_state = g722_encode_init(NULL, bit_rate, G722_PACKED);
} }
}
else else
{ {
if ((file = open(in_file, O_RDONLY)) < 0) if ((file = open(in_file, O_RDONLY)) < 0)

View File

@ -518,7 +518,7 @@ static int test_a_tone_set(int fwd)
{ {
len = my_mf_generate(amp, digit); len = my_mf_generate(amp, digit);
for (sample = 0; sample < len; sample++) for (sample = 0; sample < len; sample++)
amp[sample] = saturate(amp[sample] + awgn(noise_source)); amp[sample] = sat_add16(amp[sample], awgn(noise_source));
codec_munge(amp, len); codec_munge(amp, len);
r2_mf_rx(mf_state, amp, len); r2_mf_rx(mf_state, amp, len);
if (r2_mf_rx_get(mf_state) != digit) if (r2_mf_rx_get(mf_state) != digit)
@ -550,13 +550,13 @@ static int test_a_tone_set(int fwd)
digit = *s++; digit = *s++;
len = my_mf_generate(amp, digit); len = my_mf_generate(amp, digit);
for (sample = 0; sample < len; sample++) for (sample = 0; sample < len; sample++)
amp[sample] = saturate(amp[sample] + awgn(noise_source)); amp[sample] = sat_add16(amp[sample], awgn(noise_source));
codec_munge(amp, len); codec_munge(amp, len);
r2_mf_rx(mf_state, amp, len); r2_mf_rx(mf_state, amp, len);
len = 160; len = 160;
memset(amp, '\0', len*sizeof(int16_t)); memset(amp, '\0', len*sizeof(int16_t));
for (sample = 0; sample < len; sample++) for (sample = 0; sample < len; sample++)
amp[sample] = saturate(amp[sample] + awgn(noise_source)); amp[sample] = sat_add16(amp[sample], awgn(noise_source));
codec_munge(amp, len); codec_munge(amp, len);
r2_mf_rx(mf_state, amp, len); r2_mf_rx(mf_state, amp, len);
} }

View File

@ -197,141 +197,149 @@ int main(int argc, char *argv[])
exit(2); exit(2);
} }
printf("Testing 16 bit add\n"); printf("Testing 16 bit add\n");
if (saturated_add16(10000, 10000) != 20000) if (sat_add16(10000, 10000) != 20000
printf("aaa1 %d\n", saturated_add16(10000, 10000)); ||
if (saturated_add16(10000, -10000) != 0) sat_add16(10000, -10000) != 0
printf("aaa2 %d\n", saturated_add16(10000, -10000)); ||
if (saturated_add16(-10000, 10000) != 0) sat_add16(-10000, 10000) != 0
printf("aaa3 %d\n", saturated_add16(-10000, 10000)); ||
if (saturated_add16(-10000, -10000) != -20000) sat_add16(-10000, -10000) != -20000
printf("aaa4 %d\n", saturated_add16(-10000, -10000)); ||
if (saturated_add16(-30000, -30000) != INT16_MIN) sat_add16(-30000, -30000) != INT16_MIN
printf("aaa5 %d\n", saturated_add16(-30000, -30000)); ||
if (saturated_add16(30000, 30000) != INT16_MAX) sat_add16(30000, 30000) != INT16_MAX
||
sat_add16(-32768, -32768) != INT16_MIN
||
sat_add16(32767, 32767) != INT16_MAX)
{ {
printf("Test failed.\n"); printf("Test failed.\n");
exit(2); exit(2);
} }
printf("Testing 32 bit add\n"); printf("Testing 32 bit add\n");
if (saturated_add32(10000, 10000) != 20000 if (sat_add32(10000, 10000) != 20000
|| ||
saturated_add32(10000, -10000) != 0 sat_add32(10000, -10000) != 0
|| ||
saturated_add32(-10000, 10000) != 0 sat_add32(-10000, 10000) != 0
|| ||
saturated_add32(-10000, -10000) != -20000 sat_add32(-10000, -10000) != -20000
|| ||
saturated_add32(-2000000000, -2000000000) != INT32_MIN sat_add32(-2000000000, -2000000000) != INT32_MIN
|| ||
saturated_add32(2000000000, 2000000000) != INT32_MAX) sat_add32(2000000000, 2000000000) != INT32_MAX)
{ {
printf("Test failed.\n"); printf("Test failed.\n");
exit(2); exit(2);
} }
printf("Testing 16 bit subtract\n"); printf("Testing 16 bit subtract\n");
if (saturated_sub16(10000, 10000) != 0 if (sat_sub16(10000, 10000) != 0
|| ||
saturated_sub16(10000, -10000) != 20000 sat_sub16(10000, -10000) != 20000
|| ||
saturated_sub16(-10000, 10000) != -20000 sat_sub16(-10000, 10000) != -20000
|| ||
saturated_sub16(-10000, -10000) != 0 sat_sub16(-10000, -10000) != 0
|| ||
saturated_sub16(-30000, 30000) != INT16_MIN sat_sub16(-30000, 30000) != INT16_MIN
|| ||
saturated_sub16(30000, -30000) != INT16_MAX) sat_sub16(30000, -30000) != INT16_MAX
||
sat_sub16(-32768, 32767) != INT16_MIN
||
sat_sub16(32767, -32768) != INT16_MAX)
{ {
printf("Test failed.\n"); printf("Test failed.\n");
exit(2); exit(2);
} }
printf("Testing 32 bit subtract\n"); printf("Testing 32 bit subtract\n");
if (saturated_sub32(10000, 10000) != 0 if (sat_sub32(10000, 10000) != 0
|| ||
saturated_sub32(10000, -10000) != 20000 sat_sub32(10000, -10000) != 20000
|| ||
saturated_sub32(-10000, 10000) != -20000 sat_sub32(-10000, 10000) != -20000
|| ||
saturated_sub32(-10000, -10000) != 0 sat_sub32(-10000, -10000) != 0
|| ||
saturated_sub32(-2000000000, 2000000000) != INT32_MIN sat_sub32(-2000000000, 2000000000) != INT32_MIN
|| ||
saturated_sub32(2000000000, -2000000000) != INT32_MAX) sat_sub32(2000000000, -2000000000) != INT32_MAX)
{ {
printf("Test failed.\n"); printf("Test failed.\n");
exit(2); exit(2);
} }
printf("Testing 16 x 16 => 16 bit multiply\n"); printf("Testing 16 x 16 => 16 bit multiply\n");
if (saturated_mul16(100, 100) != 0 if (sat_mul16(100, 100) != 0
|| ||
saturated_mul16(255, 255) != 1 sat_mul16(255, 255) != 1
|| ||
saturated_mul16(32767, -32768) != -32767 sat_mul16(32767, -32768) != -32767
|| ||
saturated_mul16(-32768, 32767) != -32767 sat_mul16(-32768, 32767) != -32767
|| ||
saturated_mul16(32767, 32767) != 32766 sat_mul16(32767, 32767) != 32766
|| ||
saturated_mul16(-32768, -32768) != 32767) sat_mul16(-32768, -32768) != 32767)
{ {
printf("Test failed.\n"); printf("Test failed.\n");
exit(2); exit(2);
} }
printf("Testing 16 x 16 => 32 bit multiply\n"); printf("Testing 16 x 16 => 32 bit multiply\n");
if (saturated_mul16_32(100, 100) != 20000 if (sat_mul32_16(100, 100) != 20000
|| ||
saturated_mul16_32(-100, 100) != -20000 sat_mul32_16(-100, 100) != -20000
|| ||
saturated_mul16_32(32767, -32768) != -2147418112 sat_mul32_16(32767, -32768) != -2147418112
|| ||
saturated_mul16_32(-32768, 32767) != -2147418112 sat_mul32_16(-32768, 32767) != -2147418112
|| ||
saturated_mul16_32(32767, 32767) != 2147352578 sat_mul32_16(32767, 32767) != 2147352578
|| ||
saturated_mul16_32(-32768, -32768) != INT32_MAX) sat_mul32_16(-32768, -32768) != INT32_MAX)
{ {
printf("Test failed.\n"); printf("Test failed.\n");
exit(2); exit(2);
} }
printf("Testing 32 + 16 x 16 => 32 bit MAC\n"); printf("Testing 32 + 16 x 16 => 32 bit MAC\n");
if (saturated_mac16_32(123, 100, 100) != 123 + 20000 if (sat_mac32_16(123, 100, 100) != 123 + 20000
|| ||
saturated_mac16_32(123, -100, 100) != 123 - 20000 sat_mac32_16(123, -100, 100) != 123 - 20000
|| ||
saturated_mac16_32(123, 32767, -32768) != 123 - 2147418112 sat_mac32_16(123, 32767, -32768) != 123 - 2147418112
|| ||
saturated_mac16_32(123, -32768, 32767) != 123 - 2147418112 sat_mac32_16(123, -32768, 32767) != 123 - 2147418112
|| ||
saturated_mac16_32(123, 32767, 32767) != 123 + 2147352578 sat_mac32_16(123, 32767, 32767) != 123 + 2147352578
|| ||
saturated_mac16_32(123, -32768, -32768) != INT32_MAX) sat_mac32_16(123, -32768, -32768) != INT32_MAX)
{ {
printf("Test failed.\n"); printf("Test failed.\n");
exit(2); exit(2);
} }
printf("Testing 32 - 16 x 16 => 32 bit MSU\n"); printf("Testing 32 - 16 x 16 => 32 bit MSU\n");
if (saturated_msu16_32(123, 100, 100) != 123 - 20000 if (sat_msu32_16(123, 100, 100) != 123 - 20000
|| ||
saturated_msu16_32(123, -100, 100) != 123 + 20000 sat_msu32_16(123, -100, 100) != 123 + 20000
|| ||
saturated_msu16_32(123, 32767, -32768) != 123 + 2147418112 sat_msu32_16(123, 32767, -32768) != 123 + 2147418112
|| ||
saturated_msu16_32(123, -32768, 32767) != 123 + 2147418112 sat_msu32_16(123, -32768, 32767) != 123 + 2147418112
|| ||
saturated_msu16_32(123, 32767, 32767) != 123 - 2147352578 sat_msu32_16(123, 32767, 32767) != 123 - 2147352578
|| ||
saturated_msu16_32(123, -32768, -32768) != 123 - INT32_MAX) sat_msu32_16(123, -32768, -32768) != 123 - INT32_MAX)
{ {
printf("Test failed.\n"); printf("Test failed.\n");
exit(2); exit(2);
} }
printf("Testing 16 bit absolute\n"); printf("Testing 16 bit absolute\n");
if (saturated_abs16(10000) != 10000 if (sat_abs16(10000) != 10000
|| ||
saturated_abs16(-10000) != 10000 sat_abs16(-10000) != 10000
|| ||
saturated_abs16(32767) != 32767 sat_abs16(32767) != 32767
|| ||
saturated_abs16(-32768) != 32767) sat_abs16(-32768) != 32767)
{ {
printf("Test failed.\n"); printf("Test failed.\n");
exit(2); exit(2);

View File

@ -33,6 +33,7 @@
#include "config.h" #include "config.h"
#endif #endif
#include <inttypes.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <fcntl.h> #include <fcntl.h>
@ -450,7 +451,7 @@ static int file_decode_tests(super_tone_rx_state_t *super, const char *file_name
{ {
/* Add some noise to the signal for a more meaningful test. */ /* Add some noise to the signal for a more meaningful test. */
//for (sample = 0; sample < frames; sample++) //for (sample = 0; sample < frames; sample++)
// amp[sample] += saturate(amp[sample] + awgn (&noise_source)); // amp[sample] += sat_add16(amp[sample], awgn (&noise_source));
for (sample = 0; sample < frames; ) for (sample = 0; sample < frames; )
{ {
x = super_tone_rx(super, amp + sample, frames - sample); x = super_tone_rx(super, amp + sample, frames - sample);

View File

@ -460,6 +460,8 @@ int main(int argc, char *argv[])
printf("Failed to convert to ITULAB\n"); printf("Failed to convert to ITULAB\n");
return 1; return 1;
} }
#else
outptr = 0;
#endif #endif
free(data); free(data);
data = (uint8_t *) outptr; data = (uint8_t *) outptr;

View File

@ -1174,6 +1174,8 @@ int main(int argc, char *argv[])
printf("Failed to convert to ITULAB (C).\n"); printf("Failed to convert to ITULAB (C).\n");
return 1; return 1;
} }
#else
outsize = 0;
#endif #endif
free(data); free(data);
data = (uint8_t *) outptr; data = (uint8_t *) outptr;

View File

@ -220,6 +220,7 @@ int udptl_rx_packet(udptl_state_t *s, const uint8_t buf[], int len)
/* Save the new packet. Pure redundancy mode won't use this, but some systems will switch /* Save the new packet. Pure redundancy mode won't use this, but some systems will switch
into FEC mode after sending some redundant packets. */ into FEC mode after sending some redundant packets. */
x = seq_no & UDPTL_BUF_MASK; x = seq_no & UDPTL_BUF_MASK;
if (msg_len > 0)
memcpy(s->rx[x].buf, msg, msg_len); memcpy(s->rx[x].buf, msg, msg_len);
s->rx[x].buf_len = msg_len; s->rx[x].buf_len = msg_len;
s->rx[x].fec_len[0] = 0; s->rx[x].fec_len[0] = 0;
@ -312,6 +313,7 @@ int udptl_rx_packet(udptl_state_t *s, const uint8_t buf[], int len)
return -1; return -1;
/* Save the new FEC data */ /* Save the new FEC data */
if (s->rx[x].fec_len[i])
memcpy(s->rx[x].fec[i], data, s->rx[x].fec_len[i]); memcpy(s->rx[x].fec[i], data, s->rx[x].fec_len[i]);
#if 0 #if 0
fprintf(stderr, "FEC: "); fprintf(stderr, "FEC: ");

View File

@ -208,11 +208,8 @@ static int v8_calls_v8_tests(SNDFILE *outhandle)
v8_call_parms.pstn_access = 0; v8_call_parms.pstn_access = 0;
v8_call_parms.nsf = -1; v8_call_parms.nsf = -1;
v8_call_parms.t66 = -1; v8_call_parms.t66 = -1;
v8_caller = v8_init(NULL, v8_caller = v8_init(NULL, true, &v8_call_parms, handler, (void *) "caller");
true,
&v8_call_parms,
handler,
(void *) "caller");
v8_answer_parms.modem_connect_tone = MODEM_CONNECT_TONES_ANSAM_PR; v8_answer_parms.modem_connect_tone = MODEM_CONNECT_TONES_ANSAM_PR;
v8_answer_parms.send_ci = true; v8_answer_parms.send_ci = true;
v8_answer_parms.v92 = -1; v8_answer_parms.v92 = -1;
@ -223,11 +220,8 @@ static int v8_calls_v8_tests(SNDFILE *outhandle)
v8_answer_parms.pstn_access = 0; v8_answer_parms.pstn_access = 0;
v8_answer_parms.nsf = -1; v8_answer_parms.nsf = -1;
v8_answer_parms.t66 = -1; v8_answer_parms.t66 = -1;
v8_answerer = v8_init(NULL, v8_answerer = v8_init(NULL, false, &v8_answer_parms, handler, (void *) "answerer");
false,
&v8_answer_parms,
handler,
(void *) "answerer");
caller_logging = v8_get_logging_state(v8_caller); caller_logging = v8_get_logging_state(v8_caller);
span_log_set_level(caller_logging, SPAN_LOG_FLOW | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME); span_log_set_level(caller_logging, SPAN_LOG_FLOW | SPAN_LOG_SHOW_TAG | SPAN_LOG_SHOW_SAMPLE_TIME);
span_log_set_tag(caller_logging, "caller"); span_log_set_tag(caller_logging, "caller");
@ -239,6 +233,7 @@ static int v8_calls_v8_tests(SNDFILE *outhandle)
samples = v8_tx(v8_caller, amp, SAMPLES_PER_CHUNK); samples = v8_tx(v8_caller, amp, SAMPLES_PER_CHUNK);
if (samples < SAMPLES_PER_CHUNK) if (samples < SAMPLES_PER_CHUNK)
{ {
printf("Caller silence %d\n", SAMPLES_PER_CHUNK - samples);
vec_zeroi16(amp + samples, SAMPLES_PER_CHUNK - samples); vec_zeroi16(amp + samples, SAMPLES_PER_CHUNK - samples);
samples = SAMPLES_PER_CHUNK; samples = SAMPLES_PER_CHUNK;
} }
@ -252,6 +247,7 @@ static int v8_calls_v8_tests(SNDFILE *outhandle)
samples = v8_tx(v8_answerer, amp, SAMPLES_PER_CHUNK); samples = v8_tx(v8_answerer, amp, SAMPLES_PER_CHUNK);
if (samples < SAMPLES_PER_CHUNK) if (samples < SAMPLES_PER_CHUNK)
{ {
printf("Answerer silence %d\n", SAMPLES_PER_CHUNK - samples);
vec_zeroi16(amp + samples, SAMPLES_PER_CHUNK - samples); vec_zeroi16(amp + samples, SAMPLES_PER_CHUNK - samples);
samples = SAMPLES_PER_CHUNK; samples = SAMPLES_PER_CHUNK;
} }