193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org/*
293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *
493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *  Use of this source code is governed by a BSD-style license
593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *  that can be found in the LICENSE file in the root of the source
693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *  tree. An additional intellectual property rights grant can be found
793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *  in the file PATENTS.  All contributing project authors may
893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org *  be found in the AUTHORS file in the root of the source tree.
993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org */
1093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
1193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// This sub-API supports the following functionalities:
1293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//
1388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org//  - Enables full duplex VoIP sessions via RTP using G.711 (mu-Law or A-Law).
1493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//  - Initialization and termination.
1593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//  - Trace information on text files or via callbacks.
1693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//  - Multi-channel support (mixing, sending to multiple destinations etc.).
1793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//
1893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// To support other codecs than G.711, the VoECodec sub-API must be utilized.
1993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//
2093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// Usage example, omitting error checking:
2193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//
2293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//  using namespace webrtc;
2393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//  VoiceEngine* voe = VoiceEngine::Create();
2493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//  VoEBase* base = VoEBase::GetInterface(voe);
2593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//  base->Init();
2693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//  int ch = base->CreateChannel();
2793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//  base->StartPlayout(ch);
2893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//  ...
2993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//  base->DeleteChannel(ch);
3093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//  base->Terminate();
3193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//  base->Release();
3293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//  VoiceEngine::Delete(voe);
3393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//
3493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#ifndef WEBRTC_VOICE_ENGINE_VOE_BASE_H
3593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#define WEBRTC_VOICE_ENGINE_VOE_BASE_H
3693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
3793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "webrtc/common_types.h"
3893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
3993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgnamespace webrtc {
4093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
4193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgclass AudioDeviceModule;
42class AudioProcessing;
43class AudioTransport;
44class Config;
45
46const int kVoEDefault = -1;
47
48// VoiceEngineObserver
49class WEBRTC_DLLEXPORT VoiceEngineObserver
50{
51public:
52    // This method will be called after the occurrence of any runtime error
53    // code, or warning notification, when the observer interface has been
54    // installed using VoEBase::RegisterVoiceEngineObserver().
55    virtual void CallbackOnError(int channel, int errCode) = 0;
56
57protected:
58    virtual ~VoiceEngineObserver() {}
59};
60
61// VoiceEngine
62class WEBRTC_DLLEXPORT VoiceEngine
63{
64public:
65    // Creates a VoiceEngine object, which can then be used to acquire
66    // sub-APIs. Returns NULL on failure.
67    static VoiceEngine* Create();
68    static VoiceEngine* Create(const Config& config);
69
70    // Deletes a created VoiceEngine object and releases the utilized resources.
71    // Note that if there are outstanding references held via other interfaces,
72    // the voice engine instance will not actually be deleted until those
73    // references have been released.
74    static bool Delete(VoiceEngine*& voiceEngine);
75
76    // Specifies the amount and type of trace information which will be
77    // created by the VoiceEngine.
78    static int SetTraceFilter(unsigned int filter);
79
80    // Sets the name of the trace file and enables non-encrypted trace messages.
81    static int SetTraceFile(const char* fileNameUTF8,
82                            bool addFileCounter = false);
83
84    // Installs the TraceCallback implementation to ensure that the user
85    // receives callbacks for generated trace messages.
86    static int SetTraceCallback(TraceCallback* callback);
87
88#if !defined(WEBRTC_CHROMIUM_BUILD)
89    static int SetAndroidObjects(void* javaVM, void* env, void* context);
90#endif
91
92protected:
93    VoiceEngine() {}
94    ~VoiceEngine() {}
95};
96
97// VoEBase
98class WEBRTC_DLLEXPORT VoEBase
99{
100public:
101    // Factory for the VoEBase sub-API. Increases an internal reference
102    // counter if successful. Returns NULL if the API is not supported or if
103    // construction fails.
104    static VoEBase* GetInterface(VoiceEngine* voiceEngine);
105
106    // Releases the VoEBase sub-API and decreases an internal reference
107    // counter. Returns the new reference count. This value should be zero
108    // for all sub-APIs before the VoiceEngine object can be safely deleted.
109    virtual int Release() = 0;
110
111    // Installs the observer class to enable runtime error control and
112    // warning notifications.
113    virtual int RegisterVoiceEngineObserver(VoiceEngineObserver& observer) = 0;
114
115    // Removes and disables the observer class for runtime error control
116    // and warning notifications.
117    virtual int DeRegisterVoiceEngineObserver() = 0;
118
119    // Initializes all common parts of the VoiceEngine; e.g. all
120    // encoders/decoders, the sound card and core receiving components.
121    // This method also makes it possible to install some user-defined external
122    // modules:
123    // - The Audio Device Module (ADM) which implements all the audio layer
124    // functionality in a separate (reference counted) module.
125    // - The AudioProcessing module handles capture-side processing. VoiceEngine
126    // takes ownership of this object.
127    // If NULL is passed for any of these, VoiceEngine will create its own.
128    // TODO(ajm): Remove default NULLs.
129    virtual int Init(AudioDeviceModule* external_adm = NULL,
130                     AudioProcessing* audioproc = NULL) = 0;
131
132    // Returns NULL before Init() is called.
133    virtual AudioProcessing* audio_processing() = 0;
134
135    // Terminates all VoiceEngine functions and releses allocated resources.
136    virtual int Terminate() = 0;
137
138    // Creates a new channel and allocates the required resources for it.
139    // One can use |config| to configure the channel. Currently that is used for
140    // choosing between ACM1 and ACM2, when creating Audio Coding Module.
141    virtual int CreateChannel() = 0;
142    virtual int CreateChannel(const Config& config) = 0;
143
144    // Deletes an existing channel and releases the utilized resources.
145    virtual int DeleteChannel(int channel) = 0;
146
147    // Prepares and initiates the VoiceEngine for reception of
148    // incoming RTP/RTCP packets on the specified |channel|.
149    virtual int StartReceive(int channel) = 0;
150
151    // Stops receiving incoming RTP/RTCP packets on the specified |channel|.
152    virtual int StopReceive(int channel) = 0;
153
154    // Starts forwarding the packets to the mixer/soundcard for a
155    // specified |channel|.
156    virtual int StartPlayout(int channel) = 0;
157
158    // Stops forwarding the packets to the mixer/soundcard for a
159    // specified |channel|.
160    virtual int StopPlayout(int channel) = 0;
161
162    // Starts sending packets to an already specified IP address and
163    // port number for a specified |channel|.
164    virtual int StartSend(int channel) = 0;
165
166    // Stops sending packets from a specified |channel|.
167    virtual int StopSend(int channel) = 0;
168
169    // Gets the version information for VoiceEngine and its components.
170    virtual int GetVersion(char version[1024]) = 0;
171
172    // Gets the last VoiceEngine error code.
173    virtual int LastError() = 0;
174
175    // TODO(xians): Make the interface pure virtual after libjingle
176    // implements the interface in its FakeWebRtcVoiceEngine.
177    virtual AudioTransport* audio_transport() { return NULL; }
178
179    // To be removed. Don't use.
180    virtual int SetOnHoldStatus(int channel, bool enable,
181        OnHoldModes mode = kHoldSendAndPlay) { return -1; }
182    virtual int GetOnHoldStatus(int channel, bool& enabled,
183        OnHoldModes& mode) { return -1; }
184
185protected:
186    VoEBase() {}
187    virtual ~VoEBase() {}
188};
189
190}  // namespace webrtc
191
192#endif  //  WEBRTC_VOICE_ENGINE_VOE_BASE_H
193