Line data Source code
1 : /*
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 :
11 : #ifndef WEBRTC_VOICE_ENGINE_CHANNEL_MANAGER_H
12 : #define WEBRTC_VOICE_ENGINE_CHANNEL_MANAGER_H
13 :
14 : #include <memory>
15 : #include <vector>
16 :
17 : #include "webrtc/base/constructormagic.h"
18 : #include "webrtc/base/criticalsection.h"
19 : #include "webrtc/base/scoped_ref_ptr.h"
20 : #include "webrtc/system_wrappers/include/atomic32.h"
21 : #include "webrtc/typedefs.h"
22 : #include "webrtc/voice_engine/include/voe_base.h"
23 :
24 : namespace webrtc {
25 :
26 : class AudioDecoderFactory;
27 :
28 : namespace voe {
29 :
30 : class Channel;
31 :
32 : // Shared-pointer implementation for keeping track of Channels. The underlying
33 : // shared instance will be dropped when no more ChannelOwners point to it.
34 : //
35 : // One common source of ChannelOwner instances are
36 : // ChannelManager::CreateChannel() and ChannelManager::GetChannel(...).
37 : // It has a similar use case to shared_ptr in C++11. Should this move to C++11
38 : // in the future, this class should be replaced by exactly that.
39 : //
40 : // To access the underlying Channel, use .channel().
41 : // IsValid() implements a convenience method as an alternative for checking
42 : // whether the underlying pointer is NULL or not.
43 : //
44 : // Channel channel_owner = channel_manager.GetChannel(channel_id);
45 : // if (channel_owner.IsValid())
46 : // channel_owner.channel()->...;
47 : //
48 : class ChannelOwner {
49 : public:
50 : explicit ChannelOwner(Channel* channel);
51 : ChannelOwner(const ChannelOwner& channel_owner);
52 :
53 : ~ChannelOwner();
54 :
55 : ChannelOwner& operator=(const ChannelOwner& other);
56 :
57 0 : Channel* channel() const { return channel_ref_->channel.get(); }
58 : bool IsValid() { return channel_ref_->channel.get() != NULL; }
59 : int use_count() const { return channel_ref_->ref_count.Value(); }
60 : private:
61 : // Shared instance of a Channel. Copying ChannelOwners increase the reference
62 : // count and destroying ChannelOwners decrease references. Channels are
63 : // deleted when no references to them are held.
64 0 : struct ChannelRef {
65 : ChannelRef(Channel* channel);
66 : const std::unique_ptr<Channel> channel;
67 : Atomic32 ref_count;
68 : };
69 :
70 : ChannelRef* channel_ref_;
71 : };
72 :
73 0 : class ChannelManager {
74 : public:
75 : ChannelManager(uint32_t instance_id);
76 :
77 : // 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 0 : class Iterator {
83 : public:
84 : explicit Iterator(ChannelManager* channel_manager);
85 :
86 : Channel* GetChannel();
87 : bool IsValid();
88 :
89 : void Increment();
90 :
91 : private:
92 : size_t iterator_pos_;
93 : std::vector<ChannelOwner> channels_;
94 :
95 : RTC_DISALLOW_COPY_AND_ASSIGN(Iterator);
96 : };
97 :
98 : // CreateChannel will always return a valid ChannelOwner instance.
99 : ChannelOwner CreateChannel(const VoEBase::ChannelConfig& config);
100 :
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 :
116 : rtc::CriticalSection lock_;
117 : std::vector<ChannelOwner> channels_;
118 :
119 : RTC_DISALLOW_COPY_AND_ASSIGN(ChannelManager);
120 : };
121 : } // namespace voe
122 : } // namespace webrtc
123 :
124 : #endif // WEBRTC_VOICE_ENGINE_CHANNEL_MANAGER_H
|