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
27namespace 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).
31static const size_t kMaxMonoDataSizeSamples = 1920;
32
33// VolumeControl
34enum { kMinVolumeLevel = 0 };
35enum { kMaxVolumeLevel = 255 };
36// Min scale factor for per-channel volume scaling
37const float kMinOutputVolumeScaling = 0.0f;
38// Max scale factor for per-channel volume scaling
39const float kMaxOutputVolumeScaling = 10.0f;
40// Min scale factor for output volume panning
41const float kMinOutputVolumePanning = 0.0f;
42// Max scale factor for output volume panning
43const float kMaxOutputVolumePanning = 1.0f;
44
45// DTMF
46enum { kMinDtmfEventCode = 0 };         // DTMF digit "0"
47enum { kMaxDtmfEventCode = 15 };        // DTMF digit "D"
48enum { kMinTelephoneEventCode = 0 };    // RFC4733 (Section 2.3.1)
49enum { kMaxTelephoneEventCode = 255 };  // RFC4733 (Section 2.3.1)
50enum { kMinTelephoneEventDuration = 100 };
51enum { kMaxTelephoneEventDuration = 60000 };       // Actual limit is 2^16
52enum { kMinTelephoneEventAttenuation = 0 };        // 0 dBm0
53enum { kMaxTelephoneEventAttenuation = 36 };       // -36 dBm0
54enum { kMinTelephoneEventSeparationMs = 100 };     // Min delta time between two
55                                                   // telephone events
56enum { kVoiceEngineMaxIpPacketSizeBytes = 1500 };  // assumes Ethernet
57
58enum { kVoiceEngineMaxModuleVersionSize = 960 };
59
60// Audio processing
61const NoiseSuppression::Level kDefaultNsMode = NoiseSuppression::kModerate;
62const GainControl::Mode kDefaultAgcMode =
63#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
64    GainControl::kAdaptiveDigital;
65#else
66    GainControl::kAdaptiveAnalog;
67#endif
68const bool kDefaultAgcState =
69#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
70    false;
71#else
72    true;
73#endif
74const GainControl::Mode kDefaultRxAgcMode = GainControl::kAdaptiveDigital;
75
76// Codec
77// Min init target rate for iSAC-wb
78enum { kVoiceEngineMinIsacInitTargetRateBpsWb = 10000 };
79// Max init target rate for iSAC-wb
80enum { kVoiceEngineMaxIsacInitTargetRateBpsWb = 32000 };
81// Min init target rate for iSAC-swb
82enum { kVoiceEngineMinIsacInitTargetRateBpsSwb = 10000 };
83// Max init target rate for iSAC-swb
84enum { kVoiceEngineMaxIsacInitTargetRateBpsSwb = 56000 };
85// Lowest max rate for iSAC-wb
86enum { kVoiceEngineMinIsacMaxRateBpsWb = 32000 };
87// Highest max rate for iSAC-wb
88enum { kVoiceEngineMaxIsacMaxRateBpsWb = 53400 };
89// Lowest max rate for iSAC-swb
90enum { kVoiceEngineMinIsacMaxRateBpsSwb = 32000 };
91// Highest max rate for iSAC-swb
92enum { kVoiceEngineMaxIsacMaxRateBpsSwb = 107000 };
93// Lowest max payload size for iSAC-wb
94enum { kVoiceEngineMinIsacMaxPayloadSizeBytesWb = 120 };
95// Highest max payload size for iSAC-wb
96enum { kVoiceEngineMaxIsacMaxPayloadSizeBytesWb = 400 };
97// Lowest max payload size for iSAC-swb
98enum { kVoiceEngineMinIsacMaxPayloadSizeBytesSwb = 120 };
99// Highest max payload size for iSAC-swb
100enum { kVoiceEngineMaxIsacMaxPayloadSizeBytesSwb = 600 };
101
102// VideoSync
103// Lowest minimum playout delay
104enum { kVoiceEngineMinMinPlayoutDelayMs = 0 };
105// Highest minimum playout delay
106enum { kVoiceEngineMaxMinPlayoutDelayMs = 10000 };
107
108// Network
109// Min packet-timeout time for received RTP packets
110enum { kVoiceEngineMinPacketTimeoutSec = 1 };
111// Max packet-timeout time for received RTP packets
112enum { kVoiceEngineMaxPacketTimeoutSec = 150 };
113// Min sample time for dead-or-alive detection
114enum { kVoiceEngineMinSampleTimeSec = 1 };
115// Max sample time for dead-or-alive detection
116enum { kVoiceEngineMaxSampleTimeSec = 150 };
117
118// RTP/RTCP
119// Min 4-bit ID for RTP extension (see section 4.2 in RFC 5285)
120enum { kVoiceEngineMinRtpExtensionId = 1 };
121// Max 4-bit ID for RTP extension
122enum { 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
157namespace webrtc {
158
159inline 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
167inline int VoEModuleId(int veId, int chId) {
168  return (int)((veId << 16) + chId);
169}
170
171// Convert module ID to internal VoE channel ID
172inline 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