RTS API Documentation  1.10.11
Data Structures | Macros | Functions
Audio Resample Functions
+ Collaboration diagram for Audio Resample Functions:

Data Structures

struct  switch_audio_resampler_t
 An audio resampling handle. More...
 

Macros

#define switch_resample_create(_n, _fr, _tr, _ts, _q, _c)   switch_resample_perform_create(_n, _fr, _tr, _ts, _q, _c, __FILE__, __SWITCH_FUNC__, __LINE__)
 

Functions

switch_status_t switch_resample_perform_create (switch_audio_resampler_t **new_resampler, uint32_t from_rate, uint32_t to_rate, uint32_t to_size, int quality, uint32_t channels, const char *file, const char *func, int line)
 Prepare a new resampler handle. More...
 
void switch_resample_destroy (switch_audio_resampler_t **resampler)
 Destroy an existing resampler handle. More...
 
uint32_t switch_resample_process (switch_audio_resampler_t *resampler, int16_t *src, uint32_t srclen)
 Resample one float buffer into another using specifications of a given handle. More...
 
switch_size_t switch_float_to_short (float *f, short *s, switch_size_t len)
 Convert an array of floats to an array of shorts. More...
 
int switch_char_to_float (char *c, float *f, int len)
 Convert an array of chars to an array of floats. More...
 
int switch_float_to_char (float *f, char *c, int len)
 Convert an array of floats to an array of chars. More...
 
int switch_short_to_float (short *s, float *f, int len)
 Convert an array of shorts to an array of floats. More...
 
void switch_swap_linear (int16_t *buf, int len)
 Perform a byteswap on a buffer of 16 bit samples. More...
 
void switch_generate_sln_silence (int16_t *data, uint32_t samples, uint32_t channels, uint32_t divisor)
 Generate static noise. More...
 
void switch_change_sln_volume (int16_t *data, uint32_t samples, int32_t vol)
 Change the volume of a signed linear audio frame. More...
 
void switch_change_sln_volume_granular (int16_t *data, uint32_t samples, int32_t vol)
 Change the volume of a signed linear audio frame with more granularity. More...
 

Detailed Description

Macro Definition Documentation

◆ switch_resample_create

#define switch_resample_create (   _n,
  _fr,
  _tr,
  _ts,
  _q,
  _c 
)    switch_resample_perform_create(_n, _fr, _tr, _ts, _q, _c, __FILE__, __SWITCH_FUNC__, __LINE__)

Function Documentation

◆ switch_change_sln_volume()

void switch_change_sln_volume ( int16_t *  data,
uint32_t  samples,
int32_t  vol 
)

Change the volume of a signed linear audio frame.

Parameters
datathe audio data
samplesthe number of 2 byte samples
volthe volume factor -4 -> 4

Definition at line 398 of file switch_resample.c.

References switch_assert, switch_normalize_to_16bit, and switch_normalize_volume.

Referenced by session_audio_callback(), and switch_ivr_play_file().

399 {
400  double newrate = 0;
401  double pos[4] = {1.3, 2.3, 3.3, 4.3};
402  double neg[4] = {.80, .60, .40, .20};
403  double *chart;
404  uint32_t i;
405 
406  if (vol == 0) return;
407 
409 
410  if (vol > 0) {
411  chart = pos;
412  } else {
413  chart = neg;
414  }
415 
416  i = abs(vol) - 1;
417 
418  switch_assert(i < 4);
419 
420  newrate = chart[i];
421 
422  if (newrate) {
423  int32_t tmp;
424  uint32_t x;
425  int16_t *fp = data;
426 
427  for (x = 0; x < samples; x++) {
428  tmp = (int32_t) (fp[x] * newrate);
430  fp[x] = (int16_t) tmp;
431  }
432  }
433 }
#define switch_normalize_volume(x)
#define switch_normalize_to_16bit(n)
Definition: switch_utils.h:292
#define switch_assert(expr)

◆ switch_change_sln_volume_granular()

void switch_change_sln_volume_granular ( int16_t *  data,
uint32_t  samples,
int32_t  vol 
)

Change the volume of a signed linear audio frame with more granularity.

Parameters
datathe audio data
samplesthe number of 2 byte samples
volthe volume factor -12 -> 12

Definition at line 345 of file switch_resample.c.

References memset(), switch_assert, SWITCH_GRANULAR_VOLUME_MAX, switch_normalize_to_16bit, and switch_normalize_volume_granular.

Referenced by switch_agc_feed(), and switch_ivr_play_file().

346 {
347  double newrate = 0;
348  // change in dB mapped to ratio for output sample
349  // computed as (powf(10.0f, (float)(change_in_dB) / 20.0f))
350  static const double pos[SWITCH_GRANULAR_VOLUME_MAX] = {
351  1.122018, 1.258925, 1.412538, 1.584893, 1.778279, 1.995262, 2.238721, 2.511887, 2.818383, 3.162278,
352  3.548134, 3.981072, 4.466835, 5.011872, 5.623413, 6.309574, 7.079458, 7.943282, 8.912509, 10.000000,
353  11.220183, 12.589254, 14.125375, 15.848933, 17.782795, 19.952621, 22.387213, 25.118862, 28.183832, 31.622776,
354  35.481335, 39.810719, 44.668358, 50.118729, 56.234131, 63.095726, 70.794586, 79.432816, 89.125107, 100.000000,
355  112.201836, 125.892517, 141.253784, 158.489334, 177.827942, 199.526215, 223.872070, 251.188705, 281.838318, 316.227753
356  };
357  static const double neg[SWITCH_GRANULAR_VOLUME_MAX] = {
358  0.891251, 0.794328, 0.707946, 0.630957, 0.562341, 0.501187, 0.446684, 0.398107, 0.354813, 0.316228,
359  0.281838, 0.251189, 0.223872, 0.199526, 0.177828, 0.158489, 0.141254, 0.125893, 0.112202, 0.100000,
360  0.089125, 0.079433, 0.070795, 0.063096, 0.056234, 0.050119, 0.044668, 0.039811, 0.035481, 0.031623,
361  0.028184, 0.025119, 0.022387, 0.019953, 0.017783, 0.015849, 0.014125, 0.012589, 0.011220, 0.010000,
362  0.008913, 0.007943, 0.007079, 0.006310, 0.005623, 0.005012, 0.004467, 0.003981, 0.003548, 0.000000 // NOTE mapped -50 dB ratio to total silence instead of 0.003162
363  };
364  const double *chart;
365  uint32_t i;
366 
367  if (vol == 0) return;
368 
370 
371  if (vol > 0) {
372  chart = pos;
373  } else {
374  chart = neg;
375  }
376 
377  i = abs(vol) - 1;
378 
380 
381  newrate = chart[i];
382 
383  if (newrate) {
384  int32_t tmp;
385  uint32_t x;
386  int16_t *fp = data;
387 
388  for (x = 0; x < samples; x++) {
389  tmp = (int32_t) (fp[x] * newrate);
391  fp[x] = (int16_t) tmp;
392  }
393  } else {
394  memset(data, 0, samples * 2);
395  }
396 }
#define SWITCH_GRANULAR_VOLUME_MAX
#define switch_normalize_volume_granular(x)
#define switch_normalize_to_16bit(n)
Definition: switch_utils.h:292
#define switch_assert(expr)
memset(buf, 0, buflen)

◆ switch_char_to_float()

int switch_char_to_float ( char *  c,
float *  f,
int  len 
)

Convert an array of chars to an array of floats.

Parameters
cthe char buffer
fthe float buffer
lenthe length of the buffers
Returns
the size of the converted buffer

Definition at line 140 of file switch_resample.c.

References MAXSAMPLE, and NORMFACT.

141 {
142  int i;
143 
144  if (len % 2) {
145  return (-1);
146  }
147 
148  for (i = 1; i < len; i += 2) {
149  f[(int) (i / 2)] = (float) (((c[i]) * 0x100) + c[i - 1]);
150  f[(int) (i / 2)] /= NORMFACT;
151  if (f[(int) (i / 2)] > MAXSAMPLE)
152  f[(int) (i / 2)] = MAXSAMPLE;
153  if (f[(int) (i / 2)] < -MAXSAMPLE)
154  f[(int) (i / 2)] = -MAXSAMPLE;
155  }
156  return len / 2;
157 }
#define MAXSAMPLE
#define NORMFACT

◆ switch_float_to_char()

int switch_float_to_char ( float *  f,
char *  c,
int  len 
)

Convert an array of floats to an array of chars.

Parameters
fan array of floats
can array of chars
lenthe length of the buffers
Returns
the size of the converted buffer

Definition at line 159 of file switch_resample.c.

References NORMFACT.

160 {
161  int i;
162  float ft;
163  long l;
164  for (i = 0; i < len; i++) {
165  ft = f[i] * NORMFACT;
166  if (ft >= 0) {
167  l = (long) (ft + 0.5);
168  } else {
169  l = (long) (ft - 0.5);
170  }
171  c[i * 2] = (unsigned char) ((l) & 0xff);
172  c[i * 2 + 1] = (unsigned char) (((l) >> 8) & 0xff);
173  }
174  return len * 2;
175 }
#define NORMFACT

◆ switch_float_to_short()

switch_size_t switch_float_to_short ( float *  f,
short *  s,
switch_size_t  len 
)

Convert an array of floats to an array of shorts.

Parameters
fthe float buffer
sthe short buffer
lenthe length of the buffers
Returns
the size of the converted buffer

Definition at line 121 of file switch_resample.c.

References MAXSAMPLE, and NORMFACT.

122 {
123  switch_size_t i;
124  float ft;
125  for (i = 0; i < len; i++) {
126  ft = f[i] * NORMFACT;
127  if (ft >= 0) {
128  s[i] = (short) (ft + 0.5);
129  } else {
130  s[i] = (short) (ft - 0.5);
131  }
132  if ((float) s[i] > MAXSAMPLE)
133  s[i] = (short) MAXSAMPLE / 2;
134  if (s[i] < (short) -MAXSAMPLE)
135  s[i] = (short) -MAXSAMPLE / 2;
136  }
137  return len;
138 }
#define MAXSAMPLE
#define NORMFACT
uintptr_t switch_size_t

◆ switch_generate_sln_silence()

void switch_generate_sln_silence ( int16_t *  data,
uint32_t  samples,
uint32_t  channels,
uint32_t  divisor 
)

Generate static noise.

Parameters
datathe audio data buffer
samplesthe number of 2 byte samples
divisorthe volume factor

Definition at line 198 of file switch_resample.c.

References memset(), and switch_micro_time_now().

Referenced by audio_bridge_thread(), session_audio_callback(), switch_ivr_collect_digits_count(), switch_ivr_originate(), switch_ivr_park(), switch_ivr_record_file_event(), switch_ivr_sleep(), and switch_ivr_wait_for_answer().

199 {
200  int16_t s;
201  uint32_t x, i, j;
202  int sum_rnd = 0;
203  int16_t rnd2 = (int16_t) switch_micro_time_now() + (int16_t) (intptr_t) data;
204 
205  if (channels == 0) channels = 1;
206 
207  assert(divisor);
208 
209  if (divisor == (uint32_t)-1) {
210  memset(data, 0, samples * 2);
211  return;
212  }
213 
214  for (i = 0; i < samples; i++, sum_rnd = 0) {
215  for (x = 0; x < 6; x++) {
216  rnd2 = rnd2 * 31821U + 13849U;
217  sum_rnd += rnd2;
218  }
219 
220  s = (int16_t) ((int16_t) sum_rnd / (int) divisor);
221 
222  for (j = 0; j < channels; j++) {
223  *data = s;
224  data++;
225  }
226 
227 
228  }
229 }
switch_time_t switch_micro_time_now(void)
Get the current epoch time in microseconds.
Definition: switch_time.c:311
memset(buf, 0, buflen)

◆ switch_resample_destroy()

void switch_resample_destroy ( switch_audio_resampler_t **  resampler)

Destroy an existing resampler handle.

Parameters
resamplerthe resampler handle to destroy

Definition at line 108 of file switch_resample.c.

Referenced by switch_core_asr_close(), switch_core_file_close(), switch_core_session_read_frame(), switch_core_session_reset(), switch_core_session_write_frame(), and switch_core_speech_close().

109 {
110 
111  if (resampler && *resampler) {
112  if ((*resampler)->resampler) {
113  speex_resampler_destroy((*resampler)->resampler);
114  }
115  free((*resampler)->to);
116  free(*resampler);
117  *resampler = NULL;
118  }
119 }

◆ switch_resample_perform_create()

switch_status_t switch_resample_perform_create ( switch_audio_resampler_t **  new_resampler,
uint32_t  from_rate,
uint32_t  to_rate,
uint32_t  to_size,
int  quality,
uint32_t  channels,
const char *  file,
const char *  func,
int  line 
)

Prepare a new resampler handle.

Parameters
new_resamplerNULL pointer to aim at the new handle
from_ratethe rate to transfer from in hz
to_ratethe rate to transfer to in hz
qualitythe quality desired
Returns
SWITCH_STATUS_SUCCESS if the handle was created

Definition at line 55 of file switch_resample.c.

References switch_audio_resampler_t::channels, switch_audio_resampler_t::factor, switch_audio_resampler_t::from_rate, switch_audio_resampler_t::resampler, switch_audio_resampler_t::rfactor, switch_assert, switch_resample_calc_buffer_size, SWITCH_STATUS_GENERR, SWITCH_STATUS_SUCCESS, switch_zmalloc, switch_audio_resampler_t::to, switch_audio_resampler_t::to_rate, and switch_audio_resampler_t::to_size.

59 {
60  int err = 0;
61  switch_audio_resampler_t *resampler;
62  double lto_rate, lfrom_rate;
63 
64  switch_zmalloc(resampler, sizeof(*resampler));
65 
66  if (!channels) channels = 1;
67 
68  resampler->resampler = speex_resampler_init(channels, from_rate, to_rate, quality, &err);
69 
70  if (!resampler->resampler) {
71  free(resampler);
72  return SWITCH_STATUS_GENERR;
73  }
74 
75  *new_resampler = resampler;
76  lto_rate = (double) resampler->to_rate;
77  lfrom_rate = (double) resampler->from_rate;
78  resampler->from_rate = from_rate;
79  resampler->to_rate = to_rate;
80  resampler->factor = (lto_rate / lfrom_rate);
81  resampler->rfactor = (lfrom_rate / lto_rate);
82  resampler->channels = channels;
83 
84  //resampler->to_size = resample_buffer(to_rate, from_rate, (uint32_t) to_size);
85 
86  resampler->to_size = switch_resample_calc_buffer_size(resampler->to_rate, resampler->from_rate, to_size) / 2;
87  resampler->to = malloc(resampler->to_size * sizeof(int16_t) * resampler->channels);
88  switch_assert(resampler->to);
89 
90  return SWITCH_STATUS_SUCCESS;
91 }
#define switch_resample_calc_buffer_size(_to, _from, _srclen)
#define switch_zmalloc(ptr, len)
An audio resampling handle.
#define switch_assert(expr)

◆ switch_resample_process()

uint32_t switch_resample_process ( switch_audio_resampler_t resampler,
int16_t *  src,
uint32_t  srclen 
)

Resample one float buffer into another using specifications of a given handle.

Parameters
resamplerthe resample handle
srcthe source data
srclenthe length of the source data
Returns
the used size of dst

Definition at line 93 of file switch_resample.c.

References switch_audio_resampler_t::channels, switch_audio_resampler_t::from_rate, switch_audio_resampler_t::resampler, switch_assert, switch_resample_calc_buffer_size, switch_audio_resampler_t::to, switch_audio_resampler_t::to_len, switch_audio_resampler_t::to_rate, and switch_audio_resampler_t::to_size.

Referenced by switch_core_asr_feed(), switch_core_file_read(), switch_core_file_write(), switch_core_session_read_frame(), switch_core_session_write_frame(), and switch_core_speech_read_tts().

94 {
95  int to_size = switch_resample_calc_buffer_size(resampler->to_rate, resampler->from_rate, srclen) / 2;
96 
97  if (to_size > resampler->to_size) {
98  resampler->to_size = to_size;
99  resampler->to = realloc(resampler->to, resampler->to_size * sizeof(int16_t) * resampler->channels);
100  switch_assert(resampler->to);
101  }
102 
103  resampler->to_len = resampler->to_size;
104  speex_resampler_process_interleaved_int(resampler->resampler, src, &srclen, resampler->to, &resampler->to_len);
105  return resampler->to_len;
106 }
#define switch_resample_calc_buffer_size(_to, _from, _srclen)
#define switch_assert(expr)

◆ switch_short_to_float()

int switch_short_to_float ( short *  s,
float *  f,
int  len 
)

Convert an array of shorts to an array of floats.

Parameters
san array of shorts
fan array of floats
lenthe size of the buffers
Returns
the size of the converted buffer

Definition at line 177 of file switch_resample.c.

References NORMFACT.

178 {
179  int i;
180 
181  for (i = 0; i < len; i++) {
182  f[i] = (float) (s[i]) / NORMFACT;
183  /* f[i] = (float) s[i]; */
184  }
185  return len;
186 }
#define NORMFACT

◆ switch_swap_linear()

void switch_swap_linear ( int16_t *  buf,
int  len 
)

Perform a byteswap on a buffer of 16 bit samples.

Parameters
bufan array of samples
lenthe size of the array

Definition at line 189 of file switch_resample.c.

Referenced by read_rtp_packet(), rtp_common_write(), and switch_ivr_play_file().

190 {
191  int i;
192  for (i = 0; i < len; i++) {
193  buf[i] = ((buf[i] >> 8) & 0x00ff) | ((buf[i] << 8) & 0xff00);
194  }
195 }
switch_byte_t switch_byte_t * buf