| /* | 
 |  *  Copyright (c) 2020 The WebRTC project authors. All Rights Reserved. | 
 |  * | 
 |  *  Use of this source code is governed by a BSD-style license | 
 |  *  that can be found in the LICENSE file in the root of the source | 
 |  *  tree. An additional intellectual property rights grant can be found | 
 |  *  in the file PATENTS.  All contributing project authors may | 
 |  *  be found in the AUTHORS file in the root of the source tree. | 
 |  */ | 
 |  | 
 | #ifndef API_VOIP_VOIP_BASE_H_ | 
 | #define API_VOIP_VOIP_BASE_H_ | 
 |  | 
 | #include "absl/base/attributes.h" | 
 | #include "absl/types/optional.h" | 
 |  | 
 | namespace webrtc { | 
 |  | 
 | class Transport; | 
 |  | 
 | // VoipBase interface | 
 | // | 
 | // VoipBase provides a management interface on a media session using a | 
 | // concept called 'channel'.  A channel represents an interface handle | 
 | // for application to request various media session operations.  This | 
 | // notion of channel is used throughout other interfaces as well. | 
 | // | 
 | // Underneath the interface, a channel id is mapped into an audio session | 
 | // object that is capable of sending and receiving a single RTP stream with | 
 | // another media endpoint.  It's possible to create and use multiple active | 
 | // channels simultaneously which would mean that particular application | 
 | // session has RTP streams with multiple remote endpoints. | 
 | // | 
 | // A typical example for the usage context is outlined in VoipEngine | 
 | // header file. | 
 |  | 
 | enum class ChannelId : int {}; | 
 |  | 
 | enum class ABSL_MUST_USE_RESULT VoipResult { | 
 |   // kOk indicates the function was successfully invoked with no error. | 
 |   kOk, | 
 |   // kInvalidArgument indicates the caller specified an invalid argument, such | 
 |   // as an invalid ChannelId. | 
 |   kInvalidArgument, | 
 |   // kFailedPrecondition indicates that the operation was failed due to not | 
 |   // satisfying prerequisite such as not setting codec type before sending. | 
 |   kFailedPrecondition, | 
 |   // kInternal is used to indicate various internal failures that are not the | 
 |   // caller's fault. Further detail is commented on each function that uses this | 
 |   // return value. | 
 |   kInternal, | 
 | }; | 
 |  | 
 | class VoipBase { | 
 |  public: | 
 |   // Creates a channel. | 
 |   // Each channel handle maps into one audio media session where each has | 
 |   // its own separate module for send/receive rtp packet with one peer. | 
 |   // Caller must set `transport`, webrtc::Transport callback pointer to | 
 |   // receive rtp/rtcp packets from corresponding media session in VoIP engine. | 
 |   // VoipEngine framework expects applications to handle network I/O directly | 
 |   // and injection for incoming RTP from remote endpoint is handled via | 
 |   // VoipNetwork interface. `local_ssrc` is optional and when local_ssrc is not | 
 |   // set, some random value will be used by voip engine. | 
 |   // Returns a ChannelId created for caller to handle subsequent Channel | 
 |   // operations. | 
 |   virtual ChannelId CreateChannel(Transport* transport, | 
 |                                   absl::optional<uint32_t> local_ssrc) = 0; | 
 |  | 
 |   // Releases `channel_id` that no longer has any use. | 
 |   // Returns following VoipResult; | 
 |   //  kOk - `channel_id` is released. | 
 |   //  kInvalidArgument - `channel_id` is invalid. | 
 |   //  kInternal - Fails to stop audio output device. | 
 |   virtual VoipResult ReleaseChannel(ChannelId channel_id) = 0; | 
 |  | 
 |   // Starts sending on `channel_id`. This starts microphone if not started yet. | 
 |   // Returns following VoipResult; | 
 |   //  kOk - Channel successfully started to send. | 
 |   //  kInvalidArgument - `channel_id` is invalid. | 
 |   //  kFailedPrecondition - Missing prerequisite on VoipCodec::SetSendCodec. | 
 |   //  kInternal - initialization has failed on selected microphone. | 
 |   virtual VoipResult StartSend(ChannelId channel_id) = 0; | 
 |  | 
 |   // Stops sending on `channel_id`. If this is the last active channel, it will | 
 |   // stop microphone input from underlying audio platform layer. | 
 |   // Returns following VoipResult; | 
 |   //  kOk - Channel successfully stopped to send. | 
 |   //  kInvalidArgument - `channel_id` is invalid. | 
 |   //  kInternal - Failed to stop the active microphone device. | 
 |   virtual VoipResult StopSend(ChannelId channel_id) = 0; | 
 |  | 
 |   // Starts playing on speaker device for `channel_id`. | 
 |   // This will start underlying platform speaker device if not started. | 
 |   // Returns following VoipResult; | 
 |   //  kOk - Channel successfully started to play out. | 
 |   //  kInvalidArgument - `channel_id` is invalid. | 
 |   //  kFailedPrecondition - Missing prerequisite on VoipCodec::SetReceiveCodecs. | 
 |   //  kInternal - Failed to initializate the selected speaker device. | 
 |   virtual VoipResult StartPlayout(ChannelId channel_id) = 0; | 
 |  | 
 |   // Stops playing on speaker device for `channel_id`. | 
 |   // Returns following VoipResult; | 
 |   //  kOk - Channel successfully stopped t play out. | 
 |   //  kInvalidArgument - `channel_id` is invalid. | 
 |   virtual VoipResult StopPlayout(ChannelId channel_id) = 0; | 
 |  | 
 |  protected: | 
 |   virtual ~VoipBase() = default; | 
 | }; | 
 |  | 
 | }  // namespace webrtc | 
 |  | 
 | #endif  // API_VOIP_VOIP_BASE_H_ |