1 /*
2  * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
3  * Copyright (C) 2005-2014, Anthony Minessale II <anthm@freeswitch.org>
4  *
5  * Version: MPL 1.1
6  *
7  * The contents of this file are subject to the Mozilla Public License Version
8  * 1.1 (the "License"); you may not use this file except in compliance with
9  * the License. You may obtain a copy of the License at
10  * http://www.mozilla.org/MPL/
11  *
12  * Software distributed under the License is distributed on an "AS IS" basis,
13  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
14  * for the specific language governing rights and limitations under the
15  * License.
16  *
17  * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
18  *
19  * The Initial Developer of the Original Code is
20  * Anthony Minessale II <anthm@freeswitch.org>
21  * Portions created by the Initial Developer are Copyright (C)
22  * the Initial Developer. All Rights Reserved.
23  *
24  * Contributor(s):
25  *
26  * Anthony Minessale II <anthm@freeswitch.org>
27  *
28  *
29  * switch_caller.h -- Caller Identification
30  *
31  */
32 /*! \file switch_resample.h
33     \brief Audio Resample Code
34 
35 	This module implements a generic interface for doing audio resampling it currently uses libresample but can be ported to
36 	any resample library with a little effort.  I decided against making this interface pluggable because there are not many
37 	options in terms of resample libraries so it seemed like a waste but I did opt to frontend the interface in case a better
38 	way comes along some day. =D
39 
40 */
41 #define switch_normalize_volume(x) if (x > 4) x = 4; if (x < -4) x = -4;
42 #define switch_normalize_volume_granular(x) if (x > 13) x = 13; if (x < -13) x = -13;
43 
44 #ifndef SWITCH_RESAMPLE_H
45 #define SWITCH_RESAMPLE_H
46 #define SWITCH_RESAMPLE_QUALITY 2
47 #include <switch.h>
48 SWITCH_BEGIN_EXTERN_C
49 /*!
50   \defgroup resamp Audio Resample Functions
51   \ingroup core1
52   \{
53 */
54 /*! \brief An audio resampling handle */
55 	typedef struct {
56 	/*! a pointer to store the resampler object */
57 	void *resampler;
58 	/*! the rate to resample from in hz */
59 	int from_rate;
60 	/*! the rate to resample to in hz */
61 	int to_rate;
62 	/*! the factor to resample by (from / to) */
63 	double factor;
64 	double rfactor;
65 	int16_t *to;
66 	/*! the size of the to buffer used */
67 	uint32_t to_len;
68 	/*! the total size of the to buffer */
69 	uint32_t to_size;
70 	/*! the number of channels */
71 	int channels;
72 
73 } switch_audio_resampler_t;
74 
75 /*!
76   \brief Prepare a new resampler handle
77   \param new_resampler NULL pointer to aim at the new handle
78   \param from_rate the rate to transfer from in hz
79   \param to_rate the rate to transfer to in hz
80   \param quality the quality desired
81   \return SWITCH_STATUS_SUCCESS if the handle was created
82  */
83 SWITCH_DECLARE(switch_status_t) switch_resample_perform_create(switch_audio_resampler_t **new_resampler,
84 															   uint32_t from_rate, uint32_t to_rate, uint32_t to_size,
85 															   int quality, uint32_t channels, const char *file, const char *func, int line);
86 
87 
88 #define switch_resample_create(_n, _fr, _tr, _ts, _q, _c) switch_resample_perform_create(_n, _fr, _tr, _ts, _q, _c, __FILE__, __SWITCH_FUNC__, __LINE__)
89 
90 /*!
91   \brief Destroy an existing resampler handle
92   \param resampler the resampler handle to destroy
93  */
94 SWITCH_DECLARE(void) switch_resample_destroy(switch_audio_resampler_t **resampler);
95 
96 /*!
97   \brief Resample one float buffer into another using specifications of a given handle
98   \param resampler the resample handle
99   \param src the source data
100   \param srclen the length of the source data
101   \return the used size of dst
102  */
103 SWITCH_DECLARE(uint32_t) switch_resample_process(switch_audio_resampler_t *resampler, int16_t *src, uint32_t srclen);
104 
105 
106 /*!
107   \brief Convert an array of floats to an array of shorts
108   \param f the float buffer
109   \param s the short buffer
110   \param len the length of the buffers
111   \return the size of the converted buffer
112  */
113 SWITCH_DECLARE(switch_size_t) switch_float_to_short(float *f, short *s, switch_size_t len);
114 
115 /*!
116   \brief Convert an array of chars to an array of floats
117   \param c the char buffer
118   \param f the float buffer
119   \param len the length of the buffers
120   \return the size of the converted buffer
121  */
122 SWITCH_DECLARE(int) switch_char_to_float(char *c, float *f, int len);
123 
124 /*!
125   \brief Convert an array of floats to an array of chars
126   \param f an array of floats
127   \param c an array of chars
128   \param len the length of the buffers
129   \return the size of the converted buffer
130  */
131 SWITCH_DECLARE(int) switch_float_to_char(float *f, char *c, int len);
132 
133 /*!
134   \brief Convert an array of shorts to an array of floats
135   \param s an array of shorts
136   \param f an array of floats
137   \param len the size of the buffers
138   \return the size of the converted buffer
139  */
140 SWITCH_DECLARE(int) switch_short_to_float(short *s, float *f, int len);
141 
142 /*!
143   \brief Perform a byteswap on a buffer of 16 bit samples
144   \param buf an array of samples
145   \param len the size of the array
146  */
147 SWITCH_DECLARE(void) switch_swap_linear(int16_t *buf, int len);
148 
149 /*!
150   \brief Generate static noise
151   \param data the audio data buffer
152   \param samples the number of 2 byte samples
153   \param divisor the volume factor
154  */
155 SWITCH_DECLARE(void) switch_generate_sln_silence(int16_t *data, uint32_t samples, uint32_t channels, uint32_t divisor);
156 
157 /*!
158   \brief Change the volume of a signed linear audio frame
159   \param data the audio data
160   \param samples the number of 2 byte samples
161   \param vol the volume factor -4 -> 4
162  */
163 SWITCH_DECLARE(void) switch_change_sln_volume(int16_t *data, uint32_t samples, int32_t vol);
164 
165 /*!
166   \brief Change the volume of a signed linear audio frame with more granularity
167   \param data the audio data
168   \param samples the number of 2 byte samples
169   \param vol the volume factor -12 -> 12
170  */
171 SWITCH_DECLARE(void) switch_change_sln_volume_granular(int16_t *data, uint32_t samples, int32_t vol);
172 ///\}
173 
174 SWITCH_DECLARE(uint32_t) switch_merge_sln(int16_t *data, uint32_t samples, int16_t *other_data, uint32_t other_samples, int channels);
175 SWITCH_DECLARE(uint32_t) switch_unmerge_sln(int16_t *data, uint32_t samples, int16_t *other_data, uint32_t other_samples, int channels);
176 SWITCH_DECLARE(void) switch_mux_channels(int16_t *data, switch_size_t samples, uint32_t orig_channels, uint32_t channels);
177 
178 #define switch_resample_calc_buffer_size(_to, _from, _srclen) ((uint32_t)(((float)_to / (float)_from) * (float)_srclen) * 2)
179 
180 SWITCH_DECLARE(void) switch_agc_set(switch_agc_t *agc, uint32_t energy_avg,
181 									uint32_t low_energy_point, uint32_t margin, uint32_t change_factor, uint32_t period_len);
182 SWITCH_DECLARE(switch_status_t) switch_agc_create(switch_agc_t **agcP, uint32_t energy_avg,
183 												  uint32_t low_energy_point, uint32_t margin, uint32_t change_factor, uint32_t period_len);
184 SWITCH_DECLARE(void) switch_agc_destroy(switch_agc_t **agcP);
185 SWITCH_DECLARE(switch_status_t) switch_agc_feed(switch_agc_t *agc, int16_t *data, uint32_t samples, uint32_t channels);
186 SWITCH_DECLARE(void) switch_agc_set_energy_avg(switch_agc_t *agc, uint32_t energy_avg);
187 SWITCH_DECLARE(void) switch_agc_set_energy_low(switch_agc_t *agc, uint32_t low_energy_point);
188 SWITCH_DECLARE(void) switch_agc_set_token(switch_agc_t *agc, const char *token);
189 SWITCH_END_EXTERN_C
190 #endif
191 /* For Emacs:
192  * Local Variables:
193  * mode:c
194  * indent-tabs-mode:t
195  * tab-width:4
196  * c-basic-offset:4
197  * End:
198  * For VIM:
199  * vim:set softtabstop=4 shiftwidth=4 tabstop=4 noet:
200  */
201