29 : defaultRingBuffer_(createRingBuffer(DEFAULT_ID))
34 readBindingsMap_.clear();
35 defaultRingBuffer_.reset();
39 for (
const auto&
item : ringBufferMap_) {
40 const auto& weak =
item.second;
41 if (
not weak.expired())
49 std::lock_guard
lk(stateLock_);
52 flushAllBuffersLocked();
60 std::lock_guard
lk(stateLock_);
62 if (format != internalAudioFormat_) {
63 flushAllBuffersLocked();
64 internalAudioFormat_ = format;
65 for (
auto&
wrb : ringBufferMap_)
66 if (
auto rb =
wrb.second.lock())
67 rb->setFormat(internalAudioFormat_);
71std::shared_ptr<RingBuffer>
72RingBufferPool::getRingBufferLocked(
const std::string&
id)
74 const auto&
it = ringBufferMap_.find(
id);
75 if (
it != ringBufferMap_.cend()) {
76 if (
const auto&
sptr =
it->second.lock())
78 ringBufferMap_.erase(
it);
84std::shared_ptr<RingBuffer>
85RingBufferPool::getRingBufferLocked(
const std::string&
id)
const
87 const auto&
it = ringBufferMap_.find(
id);
88 if (
it != ringBufferMap_.cend())
89 return it->second.lock();
94std::shared_ptr<RingBuffer>
97 std::lock_guard
lk(stateLock_);
98 return getRingBufferLocked(
id);
101std::shared_ptr<RingBuffer>
104 std::lock_guard
lk(stateLock_);
105 return getRingBufferLocked(
id);
108std::shared_ptr<RingBuffer>
111 std::lock_guard
lk(stateLock_);
113 auto rbuf = getRingBufferLocked(
id);
115 JAMI_DEBUG(
"Ringbuffer already exists for id '{}'",
id);
120 ringBufferMap_.emplace(
id, std::weak_ptr<RingBuffer>(
rbuf));
124const RingBufferPool::ReadBindings*
125RingBufferPool::getReadBindings(
const std::string&
ringbufferId)
const
128 return iter != readBindingsMap_.cend() ? &
iter->second :
nullptr;
131RingBufferPool::ReadBindings*
132RingBufferPool::getReadBindings(
const std::string&
ringbufferId)
135 return iter != readBindingsMap_.cend() ? &
iter->second :
nullptr;
139RingBufferPool::removeReadBindings(
const std::string&
ringbufferId)
156RingBufferPool::removeReaderFromRingBuffer(
const std::shared_ptr<RingBuffer>&
sourceBuffer,
173 std::lock_guard
lk(stateLock_);
196 std::lock_guard
lk(stateLock_);
209 std::lock_guard
lk(stateLock_);
230 std::lock_guard
lk(stateLock_);
239 std::lock_guard
lk(stateLock_);
252 removeReaderFromRingBuffer(
rb,
rbuf->getId());
259 std::lock_guard
lk(stateLock_);
278 std::lock_guard
lk(stateLock_);
293 removeReaderFromRingBuffer(
rb,
rbuf->getId());
297std::shared_ptr<AudioFrame>
300 std::lock_guard
lk(stateLock_);
310 auto mixBuffer = std::make_shared<AudioFrame>(internalAudioFormat_);
334 std::unique_lock
lk(stateLock_);
348std::shared_ptr<AudioFrame>
351 std::lock_guard
lk(stateLock_);
370 auto buf = std::make_shared<AudioFrame>(internalAudioFormat_);
376 buf->has_voice |=
b->has_voice;
386 std::lock_guard
lk(stateLock_);
411 std::lock_guard
lk(stateLock_);
426 std::lock_guard
lk(stateLock_);
437RingBufferPool::flushAllBuffersLocked()
439 for (
auto item = ringBufferMap_.begin();
item != ringBufferMap_.end();) {
440 if (
const auto rb =
item->second.lock()) {
453 std::lock_guard
lk(stateLock_);
454 flushAllBuffersLocked();
460 std::lock_guard
lk(stateLock_);
462 if (
auto rb = getRingBufferLocked(
id)) {
463 return rb->isAudioMeterActive();
466 for (
auto item = ringBufferMap_.begin();
item != ringBufferMap_.end(); ++
item) {
467 if (
const auto rb =
item->second.lock()) {
468 if (
rb->isAudioMeterActive()) {
480 std::lock_guard
lk(stateLock_);
482 if (
auto rb = getRingBufferLocked(
id)) {
483 rb->setAudioMeterState(state);
486 for (
auto item = ringBufferMap_.begin();
item != ringBufferMap_.end(); ++
item) {
487 if (
const auto rb =
item->second.lock()) {
488 rb->setAudioMeterState(state);
clock::time_point time_point
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
bool waitForDataAvailable(const std::string &ringbufferId, const duration &max_wait) const
void unBindAllHalfDuplexIn(const std::string &sourceBufferId)
Detaches a source from all its readers.
size_t discard(size_t toDiscard, const std::string &ringbufferId)
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)