36 #include <switch_private.h> 38 #include <speex/speex_resampler.h> 40 #define NORMFACT (float)0x8000 41 #define MAXSAMPLE (float)0x7FFF 42 #define MAXSAMPLEC (char)0x7F 46 #define MIN(a,b) ((a) < (b) ? (a) : (b)) 50 #define MAX(a,b) ((a) > (b) ? (a) : (b)) 53 #define resample_buffer(a, b, c) a > b ? ((a / 1000) / 2) * c : ((b / 1000) / 2) * c 56 uint32_t from_rate, uint32_t to_rate,
58 int quality, uint32_t channels,
const char *file,
const char *func,
int line)
62 double lto_rate, lfrom_rate;
66 if (!channels) channels = 1;
68 resampler->
resampler = speex_resampler_init(channels, from_rate, to_rate, quality, &err);
75 *new_resampler = resampler;
76 lto_rate = (double) resampler->
to_rate;
77 lfrom_rate = (
double) resampler->
from_rate;
80 resampler->
factor = (lto_rate / lfrom_rate);
81 resampler->
rfactor = (lfrom_rate / lto_rate);
87 resampler->
to = malloc(resampler->
to_size *
sizeof(int16_t) * resampler->
channels);
97 if (to_size > resampler->
to_size) {
99 resampler->
to = realloc(resampler->
to, resampler->
to_size *
sizeof(int16_t) * resampler->
channels);
104 speex_resampler_process_interleaved_int(resampler->
resampler, src, &srclen, resampler->
to, &resampler->
to_len);
111 if (resampler && *resampler) {
112 if ((*resampler)->resampler) {
113 speex_resampler_destroy((*resampler)->resampler);
115 free((*resampler)->to);
125 for (i = 0; i < len; i++) {
128 s[i] = (short) (ft + 0.5);
130 s[i] = (short) (ft - 0.5);
148 for (i = 1; i < len; i += 2) {
149 f[(int) (i / 2)] = (float) (((c[i]) * 0x100) + c[i - 1]);
164 for (i = 0; i < len; i++) {
167 l = (long) (ft + 0.5);
169 l = (long) (ft - 0.5);
171 c[i * 2] = (
unsigned char) ((l) & 0xff);
172 c[i * 2 + 1] = (
unsigned char) (((l) >> 8) & 0xff);
181 for (i = 0; i < len; i++) {
192 for (i = 0; i < len; i++) {
193 buf[i] = ((buf[i] >> 8) & 0x00ff) | ((buf[i] << 8) & 0xff00);
205 if (channels == 0) channels = 1;
209 if (divisor == (uint32_t)-1) {
210 memset(data, 0, samples * 2);
214 for (i = 0; i < samples; i++, sum_rnd = 0) {
215 for (x = 0; x < 6; x++) {
216 rnd2 = rnd2 * 31821U + 13849U;
220 s = (int16_t) ((int16_t) sum_rnd / (int) divisor);
222 for (j = 0; j < channels; j++) {
236 if (channels == 0) channels = 1;
238 if (samples > other_samples) {
244 for (i = 0; i < x * channels; i++) {
245 z = data[i] + other_data[i];
247 data[i] = (int16_t) z;
259 if (channels == 0) channels = 1;
261 if (samples > other_samples) {
267 for (i = 0; i < x * channels; i++) {
268 data[i] -= other_data[i];
281 if (orig_channels > channels) {
283 for (i = 0; i < samples; i++) {
285 for (j = 0; j < orig_channels; j++) {
286 z += (int16_t) data[i * orig_channels + j];
289 data[i] = (int16_t) z;
291 }
else if (channels == 2) {
293 for (i = 0; i < samples; i++) {
294 int32_t z_left = 0, z_right = 0;
295 for (j = 0; j < orig_channels; j++) {
297 z_left += (int16_t) data[i * orig_channels + j];
299 z_right += (int16_t) data[i * orig_channels + j];
304 data[mark_buf++] = (int16_t) z_left;
306 data[mark_buf++] = (int16_t) z_right;
309 }
else if (orig_channels < channels) {
314 uint32_t k = 0, len = samples * orig_channels;
316 for (i = 0; i < len; i++) {
317 data[i+len] = data[i];
320 for (i = 0; i < samples; i++) {
321 for (j = 0; j < channels; j++) {
322 data[k++] = data[i + samples];
327 uint32_t k = 0, len = samples * 2 * orig_channels;
328 int16_t *orig = NULL;
331 memcpy(orig, data, len);
333 for (i = 0; i < samples; i++) {
334 for (j = 0; j < channels; j++) {
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
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
367 if (vol == 0)
return;
388 for (x = 0; x < samples; x++) {
389 tmp = (int32_t) (fp[x] * newrate);
391 fp[x] = (int16_t) tmp;
394 memset(data, 0, samples * 2);
401 double pos[4] = {1.3, 2.3, 3.3, 4.3};
402 double neg[4] = {.80, .60, .40, .20};
406 if (vol == 0)
return;
427 for (x = 0; x < samples; x++) {
428 tmp = (int32_t) (fp[x] * newrate);
430 fp[x] = (int16_t) tmp;
484 switch_agc_set(agc, energy_avg, low_energy_point, margin, change_factor, period_len);
532 if (!channels) channels = 1;
542 for (i = 0; i < samples * channels; i++) {
543 energy += abs(data[i]);
547 agc->
score = energy / samples * channels;
switch_time_t switch_micro_time_now(void)
Get the current epoch time in microseconds.
#define switch_core_new_memory_pool(p)
Create a new sub memory pool from the core's master pool.
#define SWITCH_CHANNEL_LOG
int switch_char_to_float(char *c, float *f, int len)
Convert an array of chars to an array of floats.
#define switch_core_strdup(_pool, _todup)
Copy a string using memory allocation from a given pool.
#define switch_core_destroy_memory_pool(p)
Returns a subpool back to the main pool.
void switch_generate_sln_silence(int16_t *data, uint32_t samples, uint32_t channels, uint32_t divisor)
Generate static noise.
void switch_agc_set_token(switch_agc_t *agc, const char *token)
#define SWITCH_GRANULAR_VOLUME_MAX
#define switch_resample_calc_buffer_size(_to, _from, _srclen)
void switch_resample_destroy(switch_audio_resampler_t **resampler)
Destroy an existing resampler handle.
int switch_snprintf(_Out_z_cap_(len) char *buf, _In_ switch_size_t len, _In_z_ _Printf_format_string_ const char *format,...)
void switch_change_sln_volume(int16_t *data, uint32_t samples, int32_t vol)
Change the volume of a signed linear audio frame.
switch_memory_pool_t * pool
#define switch_normalize_volume_granular(x)
switch_byte_t switch_byte_t * buf
#define switch_normalize_volume(x)
#define switch_core_alloc(_pool, _mem)
Allocate memory directly from a memory pool.
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.
#define switch_zmalloc(ptr, len)
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.
uint32_t switch_merge_sln(int16_t *data, uint32_t samples, int16_t *other_data, uint32_t other_samples, int channels)
int switch_short_to_float(short *s, float *f, int len)
Convert an array of shorts to an array of floats.
void switch_agc_set_energy_low(switch_agc_t *agc, uint32_t low_energy_point)
void switch_swap_linear(int16_t *buf, int len)
Perform a byteswap on a buffer of 16 bit samples.
uint32_t switch_unmerge_sln(int16_t *data, uint32_t samples, int16_t *other_data, uint32_t other_samples, int channels)
uint32_t low_energy_point
int switch_float_to_char(float *f, char *c, int len)
Convert an array of floats to an array of chars.
An audio resampling handle.
switch_status_t
Common return values.
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.
void switch_agc_set_energy_avg(switch_agc_t *agc, uint32_t energy_avg)
switch_status_t switch_agc_feed(switch_agc_t *agc, int16_t *data, uint32_t samples, uint32_t channels)
switch_status_t switch_agc_create(switch_agc_t **agcP, uint32_t energy_avg, uint32_t low_energy_point, uint32_t margin, uint32_t change_factor, uint32_t period_len)
void switch_log_printf(_In_ switch_text_channel_t channel, _In_z_ const char *file, _In_z_ const char *func, _In_ int line, _In_opt_z_ const char *userdata, _In_ switch_log_level_t level, _In_z_ _Printf_format_string_ const char *fmt,...) PRINTF_FUNCTION(7
Write log data to the logging engine.
#define switch_normalize_to_16bit(n)
struct fspr_pool_t switch_memory_pool_t
void switch_mux_channels(int16_t *data, switch_size_t samples, uint32_t orig_channels, uint32_t channels)
void switch_agc_destroy(switch_agc_t **agcP)
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.
void switch_agc_set(switch_agc_t *agc, uint32_t energy_avg, uint32_t low_energy_point, uint32_t margin, uint32_t change_factor, uint32_t period_len)