blob: f7cf5f4dac89fff3beb0d8f8540d8ab30545a85c [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
2 * Copyright (c) 2011 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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef VOICE_ENGINE_CHANNEL_MANAGER_H_
12#define VOICE_ENGINE_CHANNEL_MANAGER_H_
niklase@google.com470e71d2011-07-07 08:21:25 +000013
kwibergb7f89d62016-02-17 10:04:18 -080014#include <memory>
pbos@webrtc.org676ff1e2013-08-07 17:57:36 +000015#include <vector>
16
Niels Möllerf92d8712017-10-23 14:26:10 +020017#include "api/refcountedbase.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "rtc_base/constructormagic.h"
19#include "rtc_base/criticalsection.h"
20#include "rtc_base/random.h"
21#include "rtc_base/scoped_ref_ptr.h"
22#include "system_wrappers/include/atomic32.h"
Mirko Bonadei71207422017-09-15 13:58:09 +020023#include "typedefs.h" // NOLINT(build/include)
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020024#include "voice_engine/include/voe_base.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000025
pbos@webrtc.org676ff1e2013-08-07 17:57:36 +000026namespace webrtc {
minyue@webrtc.orge509f942013-09-12 17:03:00 +000027
ossu5f7cfa52016-05-30 08:11:28 -070028class AudioDecoderFactory;
minyue@webrtc.orge509f942013-09-12 17:03:00 +000029
pbos@webrtc.org676ff1e2013-08-07 17:57:36 +000030namespace voe {
niklase@google.com470e71d2011-07-07 08:21:25 +000031
niklase@google.com470e71d2011-07-07 08:21:25 +000032class Channel;
33
pbos@webrtc.org676ff1e2013-08-07 17:57:36 +000034// Shared-pointer implementation for keeping track of Channels. The underlying
35// shared instance will be dropped when no more ChannelOwners point to it.
36//
37// One common source of ChannelOwner instances are
38// ChannelManager::CreateChannel() and ChannelManager::GetChannel(...).
39// It has a similar use case to shared_ptr in C++11. Should this move to C++11
40// in the future, this class should be replaced by exactly that.
41//
42// To access the underlying Channel, use .channel().
43// IsValid() implements a convenience method as an alternative for checking
44// whether the underlying pointer is NULL or not.
45//
46// Channel channel_owner = channel_manager.GetChannel(channel_id);
47// if (channel_owner.IsValid())
48// channel_owner.channel()->...;
49//
50class ChannelOwner {
51 public:
52 explicit ChannelOwner(Channel* channel);
Niels Möllerf92d8712017-10-23 14:26:10 +020053 ChannelOwner(const ChannelOwner& channel_owner) = default;
niklase@google.com470e71d2011-07-07 08:21:25 +000054
Niels Möllerf92d8712017-10-23 14:26:10 +020055 ~ChannelOwner() = default;
niklase@google.com470e71d2011-07-07 08:21:25 +000056
Niels Möllerf92d8712017-10-23 14:26:10 +020057 ChannelOwner& operator=(const ChannelOwner& other) = default;
niklase@google.com470e71d2011-07-07 08:21:25 +000058
Minyue2013aec2015-05-13 14:14:42 +020059 Channel* channel() const { return channel_ref_->channel.get(); }
pbos@webrtc.org676ff1e2013-08-07 17:57:36 +000060 bool IsValid() { return channel_ref_->channel.get() != NULL; }
61 private:
62 // Shared instance of a Channel. Copying ChannelOwners increase the reference
63 // count and destroying ChannelOwners decrease references. Channels are
64 // deleted when no references to them are held.
Niels Möllerf92d8712017-10-23 14:26:10 +020065 struct ChannelRef : public rtc::RefCountedBase {
pbos@webrtc.org676ff1e2013-08-07 17:57:36 +000066 ChannelRef(Channel* channel);
kwibergb7f89d62016-02-17 10:04:18 -080067 const std::unique_ptr<Channel> channel;
pbos@webrtc.org676ff1e2013-08-07 17:57:36 +000068 };
niklase@google.com470e71d2011-07-07 08:21:25 +000069
Niels Möllerf92d8712017-10-23 14:26:10 +020070 rtc::scoped_refptr<ChannelRef> channel_ref_;
niklase@google.com470e71d2011-07-07 08:21:25 +000071};
72
pbos@webrtc.org676ff1e2013-08-07 17:57:36 +000073class ChannelManager {
74 public:
solenberg88499ec2016-09-07 07:34:41 -070075 ChannelManager(uint32_t instance_id);
niklase@google.com470e71d2011-07-07 08:21:25 +000076
pbos@webrtc.org676ff1e2013-08-07 17:57:36 +000077 // Upon construction of an Iterator it will grab a copy of the channel list of
78 // the ChannelManager. The iteration will then occur over this state, not the
79 // current one of the ChannelManager. As the Iterator holds its own references
80 // to the Channels, they will remain valid even if they are removed from the
81 // ChannelManager.
82 class Iterator {
83 public:
84 explicit Iterator(ChannelManager* channel_manager);
niklase@google.com470e71d2011-07-07 08:21:25 +000085
pbos@webrtc.org676ff1e2013-08-07 17:57:36 +000086 Channel* GetChannel();
87 bool IsValid();
niklase@google.com470e71d2011-07-07 08:21:25 +000088
pbos@webrtc.org676ff1e2013-08-07 17:57:36 +000089 void Increment();
niklase@google.com470e71d2011-07-07 08:21:25 +000090
pbos@webrtc.org676ff1e2013-08-07 17:57:36 +000091 private:
92 size_t iterator_pos_;
93 std::vector<ChannelOwner> channels_;
niklase@google.com470e71d2011-07-07 08:21:25 +000094
henrikg3c089d72015-09-16 05:37:44 -070095 RTC_DISALLOW_COPY_AND_ASSIGN(Iterator);
pbos@webrtc.org676ff1e2013-08-07 17:57:36 +000096 };
97
solenberg88499ec2016-09-07 07:34:41 -070098 // CreateChannel will always return a valid ChannelOwner instance.
99 ChannelOwner CreateChannel(const VoEBase::ChannelConfig& config);
pbos@webrtc.org676ff1e2013-08-07 17:57:36 +0000100
101 // ChannelOwner.channel() will be NULL if channel_id is invalid or no longer
102 // exists. This should be checked with ChannelOwner::IsValid().
103 ChannelOwner GetChannel(int32_t channel_id);
104 void GetAllChannels(std::vector<ChannelOwner>* channels);
105
106 void DestroyChannel(int32_t channel_id);
107 void DestroyAllChannels();
108
109 size_t NumOfChannels() const;
110
111 private:
112 uint32_t instance_id_;
113
114 Atomic32 last_channel_id_;
115
pbosd8de1152016-02-01 09:00:51 -0800116 rtc::CriticalSection lock_;
pbos@webrtc.org676ff1e2013-08-07 17:57:36 +0000117 std::vector<ChannelOwner> channels_;
118
nisse7d59f6b2017-02-21 03:40:24 -0800119 // For generation of random ssrc:s.
120 webrtc::Random random_;
121
henrikg3c089d72015-09-16 05:37:44 -0700122 RTC_DISALLOW_COPY_AND_ASSIGN(ChannelManager);
niklase@google.com470e71d2011-07-07 08:21:25 +0000123};
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +0000124} // namespace voe
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +0000125} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +0000126
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200127#endif // VOICE_ENGINE_CHANNEL_MANAGER_H_