diff options
author | andrew@webrtc.org <andrew@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d> | 2012-10-22 18:19:23 +0000 |
---|---|---|
committer | andrew@webrtc.org <andrew@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d> | 2012-10-22 18:19:23 +0000 |
commit | b015cbede88899f67a53fbbe581b02ce8e327949 (patch) | |
tree | 530a64a3cfdbbabacab974c183326517d49e761e /voice_engine/channel_manager_base.cc | |
download | webrtc-b015cbede88899f67a53fbbe581b02ce8e327949.tar.gz |
Move src/ -> webrtc/
TBR=niklas.enbom@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/915006
git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@2963 4adac7df-926f-26a2-2b94-8c16560cd09d
Diffstat (limited to 'voice_engine/channel_manager_base.cc')
-rw-r--r-- | voice_engine/channel_manager_base.cc | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/voice_engine/channel_manager_base.cc b/voice_engine/channel_manager_base.cc new file mode 100644 index 00000000..572720c9 --- /dev/null +++ b/voice_engine/channel_manager_base.cc @@ -0,0 +1,227 @@ +/* + * Copyright (c) 2012 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. + */ + +#include "channel_manager_base.h" + +#include "critical_section_wrapper.h" +#include "rw_lock_wrapper.h" +#include <cassert> + +namespace webrtc +{ + +namespace voe +{ + +ChannelManagerBase::ChannelManagerBase() : + _itemsCritSectPtr(CriticalSectionWrapper::CreateCriticalSection()), + _itemsRWLockPtr(RWLockWrapper::CreateRWLock()) +{ + for (int i = 0; i < KMaxNumberOfItems; i++) + { + _freeItemIds[i] = true; + } +} + +ChannelManagerBase::~ChannelManagerBase() +{ + if (_itemsRWLockPtr) + { + delete _itemsRWLockPtr; + _itemsRWLockPtr = NULL; + } + if (_itemsCritSectPtr) + { + delete _itemsCritSectPtr; + _itemsCritSectPtr = NULL; + } +} + +bool ChannelManagerBase::GetFreeItemId(WebRtc_Word32& itemId) +{ + CriticalSectionScoped cs(_itemsCritSectPtr); + WebRtc_Word32 i(0); + while (i < KMaxNumberOfItems) + { + if (_freeItemIds[i]) + { + itemId = i; + _freeItemIds[i] = false; + return true; + } + i++; + } + return false; +} + +void ChannelManagerBase::AddFreeItemId(WebRtc_Word32 itemId) +{ + assert(itemId < KMaxNumberOfItems); + _freeItemIds[itemId] = true; +} + +void ChannelManagerBase::RemoveFreeItemIds() +{ + for (int i = 0; i < KMaxNumberOfItems; i++) + { + _freeItemIds[i] = false; + } +} + +bool ChannelManagerBase::CreateItem(WebRtc_Word32& itemId) +{ + _itemsCritSectPtr->Enter(); + void* itemPtr; + itemId = -1; + const bool success = GetFreeItemId(itemId); + if (!success) + { + _itemsCritSectPtr->Leave(); + return false; + } + itemPtr = NewItem(itemId); + if (!itemPtr) + { + _itemsCritSectPtr->Leave(); + return false; + } + _itemsCritSectPtr->Leave(); + InsertItem(itemId, itemPtr); + + return true; +} + +void ChannelManagerBase::InsertItem(WebRtc_Word32 itemId, void* item) +{ + CriticalSectionScoped cs(_itemsCritSectPtr); + assert(!_items.Find(itemId)); + _items.Insert(itemId, item); +} + +void* +ChannelManagerBase::RemoveItem(WebRtc_Word32 itemId) +{ + CriticalSectionScoped cs(_itemsCritSectPtr); + WriteLockScoped wlock(*_itemsRWLockPtr); + MapItem* it = _items.Find(itemId); + if (!it) + { + return 0; + } + void* returnItem = it->GetItem(); + _items.Erase(it); + AddFreeItemId(itemId); + + return returnItem; +} + +void ChannelManagerBase::DestroyAllItems() +{ + CriticalSectionScoped cs(_itemsCritSectPtr); + MapItem* it = _items.First(); + while (it) + { + DeleteItem(it->GetItem()); + _items.Erase(it); + it = _items.First(); + } + RemoveFreeItemIds(); +} + +WebRtc_Word32 ChannelManagerBase::NumOfItems() const +{ + return _items.Size(); +} + +WebRtc_Word32 ChannelManagerBase::MaxNumOfItems() const +{ + return static_cast<WebRtc_Word32> (KMaxNumberOfItems); +} + +void* +ChannelManagerBase::GetItem(WebRtc_Word32 itemId) const +{ + CriticalSectionScoped cs(_itemsCritSectPtr); + MapItem* it = _items.Find(itemId); + if (!it) + { + return 0; + } + _itemsRWLockPtr->AcquireLockShared(); + return it->GetItem(); +} + +void* +ChannelManagerBase::GetFirstItem(void*& iterator) const +{ + CriticalSectionScoped cs(_itemsCritSectPtr); + MapItem* it = _items.First(); + iterator = (void*) it; + if (!it) + { + return 0; + } + return it->GetItem(); +} + +void* +ChannelManagerBase::GetNextItem(void*& iterator) const +{ + CriticalSectionScoped cs(_itemsCritSectPtr); + MapItem* it = (MapItem*) iterator; + if (!it) + { + iterator = 0; + return 0; + } + it = _items.Next(it); + iterator = (void*) it; + if (!it) + { + return 0; + } + return it->GetItem(); +} + +void ChannelManagerBase::ReleaseItem() +{ + _itemsRWLockPtr->ReleaseLockShared(); +} + +void ChannelManagerBase::GetItemIds(WebRtc_Word32* channelsArray, + WebRtc_Word32& numOfChannels) const +{ + MapItem* it = _items.First(); + numOfChannels = (numOfChannels <= _items.Size()) ? + numOfChannels : _items.Size(); + for (int i = 0; i < numOfChannels && it != NULL; i++) + { + channelsArray[i] = it->GetId(); + it = _items.Next(it); + } +} + +void ChannelManagerBase::GetChannels(MapWrapper& channels) const +{ + CriticalSectionScoped cs(_itemsCritSectPtr); + if (_items.Size() == 0) + { + return; + } + _itemsRWLockPtr->AcquireLockShared(); + for (MapItem* it = _items.First(); it != NULL; it = _items.Next(it)) + { + channels.Insert(it->GetId(), it->GetItem()); + } +} + +} // namespace voe + +} // namespace webrtc |