PageRenderTime 48ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/webrtc/voice_engine/channel_manager_base.cc

https://github.com/rillian/webrtc
C++ | 227 lines | 193 code | 25 blank | 9 comment | 21 complexity | d283ad95ef31fe019edbedd9c13bea5c MD5 | raw file
Possible License(s): BSD-3-Clause, CC-BY-SA-3.0
  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. #include "channel_manager_base.h"
  11. #include "critical_section_wrapper.h"
  12. #include "rw_lock_wrapper.h"
  13. #include <cassert>
  14. namespace webrtc
  15. {
  16. namespace voe
  17. {
  18. ChannelManagerBase::ChannelManagerBase() :
  19. _itemsCritSectPtr(CriticalSectionWrapper::CreateCriticalSection()),
  20. _itemsRWLockPtr(RWLockWrapper::CreateRWLock())
  21. {
  22. for (int i = 0; i < kVoiceEngineMaxNumChannels; i++)
  23. {
  24. _freeItemIds[i] = true;
  25. }
  26. }
  27. ChannelManagerBase::~ChannelManagerBase()
  28. {
  29. if (_itemsRWLockPtr)
  30. {
  31. delete _itemsRWLockPtr;
  32. _itemsRWLockPtr = NULL;
  33. }
  34. if (_itemsCritSectPtr)
  35. {
  36. delete _itemsCritSectPtr;
  37. _itemsCritSectPtr = NULL;
  38. }
  39. }
  40. bool ChannelManagerBase::GetFreeItemId(int32_t& itemId)
  41. {
  42. CriticalSectionScoped cs(_itemsCritSectPtr);
  43. int32_t i(0);
  44. while (i < kVoiceEngineMaxNumChannels)
  45. {
  46. if (_freeItemIds[i])
  47. {
  48. itemId = i;
  49. _freeItemIds[i] = false;
  50. return true;
  51. }
  52. i++;
  53. }
  54. return false;
  55. }
  56. void ChannelManagerBase::AddFreeItemId(int32_t itemId)
  57. {
  58. assert(itemId < kVoiceEngineMaxNumChannels);
  59. _freeItemIds[itemId] = true;
  60. }
  61. void ChannelManagerBase::RemoveFreeItemIds()
  62. {
  63. for (int i = 0; i < kVoiceEngineMaxNumChannels; i++)
  64. {
  65. _freeItemIds[i] = false;
  66. }
  67. }
  68. bool ChannelManagerBase::CreateItem(int32_t& itemId)
  69. {
  70. _itemsCritSectPtr->Enter();
  71. void* itemPtr;
  72. itemId = -1;
  73. const bool success = GetFreeItemId(itemId);
  74. if (!success)
  75. {
  76. _itemsCritSectPtr->Leave();
  77. return false;
  78. }
  79. itemPtr = NewItem(itemId);
  80. if (!itemPtr)
  81. {
  82. _itemsCritSectPtr->Leave();
  83. return false;
  84. }
  85. _itemsCritSectPtr->Leave();
  86. InsertItem(itemId, itemPtr);
  87. return true;
  88. }
  89. void ChannelManagerBase::InsertItem(int32_t itemId, void* item)
  90. {
  91. CriticalSectionScoped cs(_itemsCritSectPtr);
  92. assert(!_items.Find(itemId));
  93. _items.Insert(itemId, item);
  94. }
  95. void*
  96. ChannelManagerBase::RemoveItem(int32_t itemId)
  97. {
  98. CriticalSectionScoped cs(_itemsCritSectPtr);
  99. WriteLockScoped wlock(*_itemsRWLockPtr);
  100. MapItem* it = _items.Find(itemId);
  101. if (!it)
  102. {
  103. return 0;
  104. }
  105. void* returnItem = it->GetItem();
  106. _items.Erase(it);
  107. AddFreeItemId(itemId);
  108. return returnItem;
  109. }
  110. void ChannelManagerBase::DestroyAllItems()
  111. {
  112. CriticalSectionScoped cs(_itemsCritSectPtr);
  113. MapItem* it = _items.First();
  114. while (it)
  115. {
  116. DeleteItem(it->GetItem());
  117. _items.Erase(it);
  118. it = _items.First();
  119. }
  120. RemoveFreeItemIds();
  121. }
  122. int32_t ChannelManagerBase::NumOfItems() const
  123. {
  124. return _items.Size();
  125. }
  126. int32_t ChannelManagerBase::MaxNumOfItems() const
  127. {
  128. return static_cast<int32_t> (kVoiceEngineMaxNumChannels);
  129. }
  130. void*
  131. ChannelManagerBase::GetItem(int32_t itemId) const
  132. {
  133. CriticalSectionScoped cs(_itemsCritSectPtr);
  134. MapItem* it = _items.Find(itemId);
  135. if (!it)
  136. {
  137. return 0;
  138. }
  139. _itemsRWLockPtr->AcquireLockShared();
  140. return it->GetItem();
  141. }
  142. void*
  143. ChannelManagerBase::GetFirstItem(void*& iterator) const
  144. {
  145. CriticalSectionScoped cs(_itemsCritSectPtr);
  146. MapItem* it = _items.First();
  147. iterator = (void*) it;
  148. if (!it)
  149. {
  150. return 0;
  151. }
  152. return it->GetItem();
  153. }
  154. void*
  155. ChannelManagerBase::GetNextItem(void*& iterator) const
  156. {
  157. CriticalSectionScoped cs(_itemsCritSectPtr);
  158. MapItem* it = (MapItem*) iterator;
  159. if (!it)
  160. {
  161. iterator = 0;
  162. return 0;
  163. }
  164. it = _items.Next(it);
  165. iterator = (void*) it;
  166. if (!it)
  167. {
  168. return 0;
  169. }
  170. return it->GetItem();
  171. }
  172. void ChannelManagerBase::ReleaseItem()
  173. {
  174. _itemsRWLockPtr->ReleaseLockShared();
  175. }
  176. void ChannelManagerBase::GetItemIds(int32_t* channelsArray,
  177. int32_t& numOfChannels) const
  178. {
  179. MapItem* it = _items.First();
  180. numOfChannels = (numOfChannels <= _items.Size()) ?
  181. numOfChannels : _items.Size();
  182. for (int i = 0; i < numOfChannels && it != NULL; i++)
  183. {
  184. channelsArray[i] = it->GetId();
  185. it = _items.Next(it);
  186. }
  187. }
  188. void ChannelManagerBase::GetChannels(MapWrapper& channels) const
  189. {
  190. CriticalSectionScoped cs(_itemsCritSectPtr);
  191. if (_items.Size() == 0)
  192. {
  193. return;
  194. }
  195. _itemsRWLockPtr->AcquireLockShared();
  196. for (MapItem* it = _items.First(); it != NULL; it = _items.Next(it))
  197. {
  198. channels.Insert(it->GetId(), it->GetItem());
  199. }
  200. }
  201. } // namespace voe
  202. } // namespace webrtc