Home | History | Annotate | Download | only in voice_engine
      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 
    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 
    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
    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