1 /*
2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 /*
12  *  This file contains common constants for VoiceEngine, as well as
13  *  platform specific settings and include files.
14  */
15 
16 #ifndef WEBRTC_VOICE_ENGINE_VOICE_ENGINE_DEFINES_H
17 #define WEBRTC_VOICE_ENGINE_VOICE_ENGINE_DEFINES_H
18 
19 #include "webrtc/common_types.h"
20 #include "webrtc/engine_configurations.h"
21 #include "webrtc/modules/audio_processing/include/audio_processing.h"
22 
23 // ----------------------------------------------------------------------------
24 //  Enumerators
25 // ----------------------------------------------------------------------------
26 
27 namespace webrtc {
28 
29 // Internal buffer size required for mono audio, based on the highest sample
30 // rate voice engine supports (10 ms of audio at 192 kHz).
31 static const size_t kMaxMonoDataSizeSamples = 1920;
32 
33 // VolumeControl
34 enum { kMinVolumeLevel = 0 };
35 enum { kMaxVolumeLevel = 255 };
36 // Min scale factor for per-channel volume scaling
37 const float kMinOutputVolumeScaling = 0.0f;
38 // Max scale factor for per-channel volume scaling
39 const float kMaxOutputVolumeScaling = 10.0f;
40 // Min scale factor for output volume panning
41 const float kMinOutputVolumePanning = 0.0f;
42 // Max scale factor for output volume panning
43 const float kMaxOutputVolumePanning = 1.0f;
44 
45 // DTMF
46 enum { kMinDtmfEventCode = 0 };         // DTMF digit "0"
47 enum { kMaxDtmfEventCode = 15 };        // DTMF digit "D"
48 enum { kMinTelephoneEventCode = 0 };    // RFC4733 (Section 2.3.1)
49 enum { kMaxTelephoneEventCode = 255 };  // RFC4733 (Section 2.3.1)
50 enum { kMinTelephoneEventDuration = 100 };
51 enum { kMaxTelephoneEventDuration = 60000 };       // Actual limit is 2^16
52 enum { kMinTelephoneEventAttenuation = 0 };        // 0 dBm0
53 enum { kMaxTelephoneEventAttenuation = 36 };       // -36 dBm0
54 enum { kMinTelephoneEventSeparationMs = 100 };     // Min delta time between two
55                                                    // telephone events
56 enum { kVoiceEngineMaxIpPacketSizeBytes = 1500 };  // assumes Ethernet
57 
58 enum { kVoiceEngineMaxModuleVersionSize = 960 };
59 
60 // Audio processing
61 const NoiseSuppression::Level kDefaultNsMode = NoiseSuppression::kModerate;
62 const GainControl::Mode kDefaultAgcMode =
63 #if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
64     GainControl::kAdaptiveDigital;
65 #else
66     GainControl::kAdaptiveAnalog;
67 #endif
68 const bool kDefaultAgcState =
69 #if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
70     false;
71 #else
72     true;
73 #endif
74 const GainControl::Mode kDefaultRxAgcMode = GainControl::kAdaptiveDigital;
75 
76 // Codec
77 // Min init target rate for iSAC-wb
78 enum { kVoiceEngineMinIsacInitTargetRateBpsWb = 10000 };
79 // Max init target rate for iSAC-wb
80 enum { kVoiceEngineMaxIsacInitTargetRateBpsWb = 32000 };
81 // Min init target rate for iSAC-swb
82 enum { kVoiceEngineMinIsacInitTargetRateBpsSwb = 10000 };
83 // Max init target rate for iSAC-swb
84 enum { kVoiceEngineMaxIsacInitTargetRateBpsSwb = 56000 };
85 // Lowest max rate for iSAC-wb
86 enum { kVoiceEngineMinIsacMaxRateBpsWb = 32000 };
87 // Highest max rate for iSAC-wb
88 enum { kVoiceEngineMaxIsacMaxRateBpsWb = 53400 };
89 // Lowest max rate for iSAC-swb
90 enum { kVoiceEngineMinIsacMaxRateBpsSwb = 32000 };
91 // Highest max rate for iSAC-swb
92 enum { kVoiceEngineMaxIsacMaxRateBpsSwb = 107000 };
93 // Lowest max payload size for iSAC-wb
94 enum { kVoiceEngineMinIsacMaxPayloadSizeBytesWb = 120 };
95 // Highest max payload size for iSAC-wb
96 enum { kVoiceEngineMaxIsacMaxPayloadSizeBytesWb = 400 };
97 // Lowest max payload size for iSAC-swb
98 enum { kVoiceEngineMinIsacMaxPayloadSizeBytesSwb = 120 };
99 // Highest max payload size for iSAC-swb
100 enum { kVoiceEngineMaxIsacMaxPayloadSizeBytesSwb = 600 };
101 
102 // VideoSync
103 // Lowest minimum playout delay
104 enum { kVoiceEngineMinMinPlayoutDelayMs = 0 };
105 // Highest minimum playout delay
106 enum { kVoiceEngineMaxMinPlayoutDelayMs = 10000 };
107 
108 // Network
109 // Min packet-timeout time for received RTP packets
110 enum { kVoiceEngineMinPacketTimeoutSec = 1 };
111 // Max packet-timeout time for received RTP packets
112 enum { kVoiceEngineMaxPacketTimeoutSec = 150 };
113 // Min sample time for dead-or-alive detection
114 enum { kVoiceEngineMinSampleTimeSec = 1 };
115 // Max sample time for dead-or-alive detection
116 enum { kVoiceEngineMaxSampleTimeSec = 150 };
117 
118 // RTP/RTCP
119 // Min 4-bit ID for RTP extension (see section 4.2 in RFC 5285)
120 enum { kVoiceEngineMinRtpExtensionId = 1 };
121 // Max 4-bit ID for RTP extension
122 enum { kVoiceEngineMaxRtpExtensionId = 14 };
123 
124 }  // namespace webrtc
125 
126 // ----------------------------------------------------------------------------
127 //  Macros
128 // ----------------------------------------------------------------------------
129 
130 #define NOT_SUPPORTED(stat)                 \
131   LOG_F(LS_ERROR) << "not supported";       \
132   stat.SetLastError(VE_FUNC_NOT_SUPPORTED); \
133   return -1;
134 
135 #if (!defined(NDEBUG) && defined(_WIN32) && (_MSC_VER >= 1400))
136 #include <windows.h>
137 #include <stdio.h>
138 #define DEBUG_PRINT(...)       \
139   {                            \
140     char msg[256];             \
141     sprintf(msg, __VA_ARGS__); \
142     OutputDebugStringA(msg);   \
143   }
144 #else
145 // special fix for visual 2003
146 #define DEBUG_PRINT(exp) ((void)0)
147 #endif  // !defined(NDEBUG) && defined(_WIN32)
148 
149 #define CHECK_CHANNEL(channel)     \
150   if (CheckChannel(channel) == -1) \
151     return -1;
152 
153 // ----------------------------------------------------------------------------
154 //  Inline functions
155 // ----------------------------------------------------------------------------
156 
157 namespace webrtc {
158 
VoEId(int veId,int chId)159 inline int VoEId(int veId, int chId) {
160   if (chId == -1) {
161     const int dummyChannel(99);
162     return (int)((veId << 16) + dummyChannel);
163   }
164   return (int)((veId << 16) + chId);
165 }
166 
VoEModuleId(int veId,int chId)167 inline int VoEModuleId(int veId, int chId) {
168   return (int)((veId << 16) + chId);
169 }
170 
171 // Convert module ID to internal VoE channel ID
VoEChannelId(int moduleId)172 inline int VoEChannelId(int moduleId) {
173   return (int)(moduleId & 0xffff);
174 }
175 
176 }  // namespace webrtc
177 
178 // ----------------------------------------------------------------------------
179 //  Platform settings
180 // ----------------------------------------------------------------------------
181 
182 // *** WINDOWS ***
183 
184 #if defined(_WIN32)
185 
186 #include <windows.h>
187 
188 #pragma comment(lib, "winmm.lib")
189 
190 #ifndef WEBRTC_EXTERNAL_TRANSPORT
191 #pragma comment(lib, "ws2_32.lib")
192 #endif
193 
194 // ----------------------------------------------------------------------------
195 //  Defines
196 // ----------------------------------------------------------------------------
197 
198 // Default device for Windows PC
199 #define WEBRTC_VOICE_ENGINE_DEFAULT_DEVICE \
200   AudioDeviceModule::kDefaultCommunicationDevice
201 
202 #endif  // #if (defined(_WIN32)
203 
204 // *** LINUX ***
205 
206 #ifdef WEBRTC_LINUX
207 
208 #include <arpa/inet.h>
209 #include <netinet/in.h>
210 #include <pthread.h>
211 #include <sys/socket.h>
212 #include <sys/types.h>
213 #ifndef QNX
214 #include <linux/net.h>
215 #ifndef ANDROID
216 #include <sys/soundcard.h>
217 #endif  // ANDROID
218 #endif  // QNX
219 #include <errno.h>
220 #include <fcntl.h>
221 #include <sched.h>
222 #include <stdio.h>
223 #include <stdlib.h>
224 #include <string.h>
225 #include <sys/ioctl.h>
226 #include <sys/stat.h>
227 #include <sys/time.h>
228 #include <time.h>
229 #include <unistd.h>
230 
231 #define DWORD unsigned long int
232 #define WINAPI
233 #define LPVOID void *
234 #define FALSE 0
235 #define TRUE 1
236 #define UINT unsigned int
237 #define UCHAR unsigned char
238 #define TCHAR char
239 #ifdef QNX
240 #define _stricmp stricmp
241 #else
242 #define _stricmp strcasecmp
243 #endif
244 #define GetLastError() errno
245 #define WSAGetLastError() errno
246 #define LPCTSTR const char *
247 #define LPCSTR const char *
248 #define wsprintf sprintf
249 #define TEXT(a) a
250 #define _ftprintf fprintf
251 #define _tcslen strlen
252 #define FAR
253 #define __cdecl
254 #define LPSOCKADDR struct sockaddr *
255 
256 // Default device for Linux and Android
257 #define WEBRTC_VOICE_ENGINE_DEFAULT_DEVICE 0
258 
259 #endif  // #ifdef WEBRTC_LINUX
260 
261 // *** WEBRTC_MAC ***
262 // including iPhone
263 
264 #ifdef WEBRTC_MAC
265 
266 #include <AudioUnit/AudioUnit.h>
267 #include <arpa/inet.h>
268 #include <errno.h>
269 #include <fcntl.h>
270 #include <netinet/in.h>
271 #include <pthread.h>
272 #include <sched.h>
273 #include <stdio.h>
274 #include <stdlib.h>
275 #include <string.h>
276 #include <sys/socket.h>
277 #include <sys/stat.h>
278 #include <sys/time.h>
279 #include <sys/types.h>
280 #include <time.h>
281 #include <unistd.h>
282 #if !defined(WEBRTC_IOS)
283 #include <CoreServices/CoreServices.h>
284 #include <CoreAudio/CoreAudio.h>
285 #include <AudioToolbox/DefaultAudioOutput.h>
286 #include <AudioToolbox/AudioConverter.h>
287 #include <CoreAudio/HostTime.h>
288 #endif
289 
290 #define DWORD unsigned long int
291 #define WINAPI
292 #define LPVOID void *
293 #define FALSE 0
294 #define TRUE 1
295 #define SOCKADDR_IN struct sockaddr_in
296 #define UINT unsigned int
297 #define UCHAR unsigned char
298 #define TCHAR char
299 #define _stricmp strcasecmp
300 #define GetLastError() errno
301 #define WSAGetLastError() errno
302 #define LPCTSTR const char *
303 #define wsprintf sprintf
304 #define TEXT(a) a
305 #define _ftprintf fprintf
306 #define _tcslen strlen
307 #define FAR
308 #define __cdecl
309 #define LPSOCKADDR struct sockaddr *
310 #define LPCSTR const char *
311 #define ULONG unsigned long
312 
313 // Default device for Mac and iPhone
314 #define WEBRTC_VOICE_ENGINE_DEFAULT_DEVICE 0
315 #endif  // #ifdef WEBRTC_MAC
316 
317 #endif  // WEBRTC_VOICE_ENGINE_VOICE_ENGINE_DEFINES_H
318