33 : defaultRingBuffer_(createRingBuffer(DEFAULT_ID))
38 readBindingsMap_.clear();
39 defaultRingBuffer_.reset();
43 for (
const auto&
item : ringBufferMap_) {
44 const auto& weak =
item.second;
45 if (
not weak.expired())
53 std::lock_guard
lk(stateLock_);
64 std::lock_guard
lk(stateLock_);
66 if (format != internalAudioFormat_) {
68 internalAudioFormat_ = format;
69 for (
auto&
wrb : ringBufferMap_)
70 if (
auto rb =
wrb.second.lock())
71 rb->setFormat(internalAudioFormat_);
75std::shared_ptr<RingBuffer>
78 std::lock_guard
lk(stateLock_);
80 const auto&
it = ringBufferMap_.find(
id);
81 if (
it != ringBufferMap_.cend()) {
82 if (
const auto&
sptr =
it->second.lock())
84 ringBufferMap_.erase(
it);
90std::shared_ptr<RingBuffer>
93 std::lock_guard
lk(stateLock_);
95 const auto&
it = ringBufferMap_.find(
id);
96 if (
it != ringBufferMap_.cend())
97 return it->second.lock();
102std::shared_ptr<RingBuffer>
105 std::lock_guard
lk(stateLock_);
109 JAMI_DEBUG(
"Ringbuffer already exists for id '{}'",
id);
114 ringBufferMap_.emplace(
id, std::weak_ptr<RingBuffer>(
rbuf));
118const RingBufferPool::ReadBindings*
119RingBufferPool::getReadBindings(
const std::string&
ringbufferId)
const
122 return iter != readBindingsMap_.cend() ? &
iter->second :
nullptr;
125RingBufferPool::ReadBindings*
126RingBufferPool::getReadBindings(
const std::string&
ringbufferId)
129 return iter != readBindingsMap_.cend() ? &
iter->second :
nullptr;
133RingBufferPool::removeReadBindings(
const std::string&
ringbufferId)
140RingBufferPool::addReaderToRingBuffer(
const std::shared_ptr<RingBuffer> &
sourceBuffer,
150RingBufferPool::removeReaderFromRingBuffer(
const std::shared_ptr<RingBuffer> &
sourceBuffer,
178 std::lock_guard
lk(stateLock_);
190 std::lock_guard
lk(stateLock_);
214 std::lock_guard
lk(stateLock_);
223 std::lock_guard
lk(stateLock_);
236 std::lock_guard
lk(stateLock_);
242 removeReaderFromRingBuffer(
rb,
rbuf->getId());
248 std::lock_guard
lk(stateLock_);
266 std::lock_guard
lk(stateLock_);
275 removeReaderFromRingBuffer(
rb,
rbuf->getId());
279std::shared_ptr<AudioFrame>
282 std::lock_guard
lk(stateLock_);
292 auto mixBuffer = std::make_shared<AudioFrame>(internalAudioFormat_);
309 const std::chrono::microseconds&
max_wait)
const
311 std::unique_lock<std::recursive_mutex>
lk(stateLock_);
330std::shared_ptr<AudioFrame>
333 std::lock_guard
lk(stateLock_);
352 auto buf = std::make_shared<AudioFrame>(internalAudioFormat_);
358 buf->has_voice |=
b->has_voice;
368 std::lock_guard
lk(stateLock_);
393 std::lock_guard
lk(stateLock_);
408 std::lock_guard
lk(stateLock_);
421 std::lock_guard
lk(stateLock_);
423 for (
auto item = ringBufferMap_.begin();
item != ringBufferMap_.end();) {
424 if (
const auto rb =
item->second.lock()) {
437 std::lock_guard
lk(stateLock_);
440 return rb->isAudioMeterActive();
443 for (
auto item = ringBufferMap_.begin();
item != ringBufferMap_.end(); ++
item) {
444 if (
const auto rb =
item->second.lock()) {
445 if (
rb->isAudioMeterActive()) {
457 std::lock_guard
lk(stateLock_);
460 rb->setAudioMeterState(state);
463 for (
auto item = ringBufferMap_.begin();
item != ringBufferMap_.end(); ++
item) {
464 if (
const auto rb =
item->second.lock()) {
465 rb->setAudioMeterState(state);
std::shared_ptr< RingBuffer > createRingBuffer(const std::string &id)
Create a new ringbuffer with a default readoffset.
std::shared_ptr< RingBuffer > getRingBuffer(const std::string &id)
Obtain a shared pointer on a RingBuffer given by its ID.
size_t availableForGet(const std::string &ringbufferId) const
void unBindAllHalfDuplexIn(const std::string &sourceBufferId)
Detaches a source from all its readers.
size_t discard(size_t toDiscard, const std::string &ringbufferId)
bool waitForDataAvailable(const std::string &ringbufferId, const std::chrono::microseconds &max_wait) const
void setAudioMeterState(const std::string &id, bool state)
void bindHalfDuplexOut(const std::string &readerBufferId, const std::string &sourceBufferId)
Attaches a reader the specified source.
std::shared_ptr< AudioFrame > getAvailableData(const std::string &ringbufferId)
void unBindAllHalfDuplexOut(const std::string &ringbufferId)
Detaches a reader from all his sources.
void setInternalSamplingRate(unsigned sr)
bool isAudioMeterActive(const std::string &id)
void bindRingBuffers(const std::string &ringbufferId1, const std::string &ringbufferId2)
Bind two RingBuffer together (full duplex).
std::shared_ptr< AudioFrame > getData(const std::string &ringbufferId)
static const char *const DEFAULT_ID
void unbindRingBuffers(const std::string &ringbufferId1, const std::string &ringbufferId2)
Unbind two RingBuffer (full duplex).
void unBindAll(const std::string &ringbufferId)
void flush(const std::string &ringbufferId)
void unBindHalfDuplexOut(const std::string &readerBufferId, const std::string &sourceBufferId)
Detaches a reader from the specified source.
void setInternalAudioFormat(AudioFormat format)
A ring buffer for mutichannel audio samples.
#define JAMI_ERROR(formatstr,...)
#define JAMI_DEBUG(formatstr,...)
#define JAMI_WARNING(formatstr,...)
#define JAMI_LOG(formatstr,...)
void emitSignal(Args... args)
static constexpr size_t SIZEBUF