diff --git a/daemon/src/audio/Makefile.am b/daemon/src/audio/Makefile.am index 6dc37940aaba4c817066db363f1121fa1a2ba104..51400d2115991e5ee31e8a3a0010c09043d33ea4 100644 --- a/daemon/src/audio/Makefile.am +++ b/daemon/src/audio/Makefile.am @@ -29,7 +29,7 @@ libaudio_la_SOURCES = \ audiobuffer.cpp \ audioloop.cpp \ ringbuffer.cpp \ - mainbuffer.cpp \ + ringbufferpool.cpp \ audiorecord.cpp \ audiorecorder.cpp \ recordable.cpp \ @@ -42,7 +42,7 @@ noinst_HEADERS = \ audiobuffer.h \ audioloop.h \ ringbuffer.h \ - mainbuffer.h \ + ringbufferpool.h \ audiorecord.h \ audiorecorder.h \ audiolayer.h \ diff --git a/daemon/src/audio/alsa/alsalayer.cpp b/daemon/src/audio/alsa/alsalayer.cpp index af03a9504d99bc2512ac0316fac019334b334a49..5a62df201d94168fb35fa7f45bb6afec56e7d317 100644 --- a/daemon/src/audio/alsa/alsalayer.cpp +++ b/daemon/src/audio/alsa/alsalayer.cpp @@ -35,6 +35,7 @@ #include "manager.h" #include "noncopyable.h" #include "client/configurationmanager.h" +#include "audio/ringbufferpool.h" #include "audio/ringbuffer.h" #include <thread> @@ -158,7 +159,7 @@ AlsaLayer::AlsaLayer(const AudioPreference &pref) , is_playback_open_(false) , is_capture_open_(false) , audioThread_(nullptr) - , mainRingBuffer_(Manager::instance().getMainBuffer().getRingBuffer(MainBuffer::DEFAULT_ID)) + , mainRingBuffer_(Manager::instance().getRingBufferPool().getRingBuffer(RingBufferPool::DEFAULT_ID)) {} AlsaLayer::~AlsaLayer() @@ -674,7 +675,7 @@ AlsaLayer::getAudioDeviceName(int index, DeviceType type) const void AlsaLayer::capture() { - AudioFormat mainBufferFormat = Manager::instance().getMainBuffer().getInternalAudioFormat(); + AudioFormat mainBufferFormat = Manager::instance().getRingBufferPool().getInternalAudioFormat(); int toGetFrames = snd_pcm_avail_update(captureHandle_); @@ -713,7 +714,7 @@ void AlsaLayer::capture() void AlsaLayer::playback(int maxFrames) { - unsigned framesToGet = Manager::instance().getMainBuffer().availableForGet(MainBuffer::DEFAULT_ID); + unsigned framesToGet = Manager::instance().getRingBufferPool().availableForGet(RingBufferPool::DEFAULT_ID); // no audio available, play tone or silence if (framesToGet <= 0) { @@ -736,7 +737,7 @@ void AlsaLayer::playback(int maxFrames) write(playbackIBuff_.data(), playbackBuff_.frames(), playbackHandle_); } else { // play the regular sound samples - const AudioFormat mainBufferFormat = Manager::instance().getMainBuffer().getInternalAudioFormat(); + const AudioFormat mainBufferFormat = Manager::instance().getRingBufferPool().getInternalAudioFormat(); const bool resample = audioFormat_.sample_rate != mainBufferFormat.sample_rate; double resampleFactor = 1.0; @@ -752,7 +753,7 @@ void AlsaLayer::playback(int maxFrames) playbackBuff_.setFormat(mainBufferFormat); playbackBuff_.resize(framesToGet); - Manager::instance().getMainBuffer().getData(playbackBuff_, MainBuffer::DEFAULT_ID); + Manager::instance().getRingBufferPool().getData(playbackBuff_, RingBufferPool::DEFAULT_ID); playbackBuff_.applyGain(isPlaybackMuted_ ? 0.0 : playbackGain_); if (audioFormat_.nb_channels != mainBufferFormat.nb_channels) { @@ -785,19 +786,19 @@ void AlsaLayer::audioCallback() if (not safeUpdate(playbackHandle_, playbackAvailFrames)) return; - unsigned framesToGet = urgentRingBuffer_.availableForGet(MainBuffer::DEFAULT_ID); + unsigned framesToGet = urgentRingBuffer_.availableForGet(RingBufferPool::DEFAULT_ID); if (framesToGet > 0) { // Urgent data (dtmf, incoming call signal) come first. framesToGet = std::min(framesToGet, (unsigned)playbackAvailFrames); playbackBuff_.setFormat(audioFormat_); playbackBuff_.resize(framesToGet); - urgentRingBuffer_.get(playbackBuff_, MainBuffer::DEFAULT_ID); + urgentRingBuffer_.get(playbackBuff_, RingBufferPool::DEFAULT_ID); playbackBuff_.applyGain(isPlaybackMuted_ ? 0.0 : playbackGain_); playbackBuff_.interleave(playbackIBuff_); write(playbackIBuff_.data(), framesToGet, playbackHandle_); // Consume the regular one as well (same amount of frames) - Manager::instance().getMainBuffer().discard(framesToGet, MainBuffer::DEFAULT_ID); + Manager::instance().getRingBufferPool().discard(framesToGet, RingBufferPool::DEFAULT_ID); } else { // regular audio data playback(playbackAvailFrames); diff --git a/daemon/src/audio/audiolayer.cpp b/daemon/src/audio/audiolayer.cpp index 972cfbed78812d4d3dd005b6ed0bdb6ee4f0421a..9a3120951babe714a9e303c68a9d81fdbe9ac1f9 100644 --- a/daemon/src/audio/audiolayer.cpp +++ b/daemon/src/audio/audiolayer.cpp @@ -33,6 +33,7 @@ #include "audio/dcblocker.h" #include "logger.h" #include "manager.h" +#include "audio/ringbufferpool.h" #include <ctime> @@ -42,14 +43,14 @@ AudioLayer::AudioLayer(const AudioPreference &pref) , captureGain_(pref.getVolumemic()) , playbackGain_(pref.getVolumespkr()) , isStarted_(false) - , audioFormat_(Manager::instance().getMainBuffer().getInternalAudioFormat()) + , audioFormat_(Manager::instance().getRingBufferPool().getInternalAudioFormat()) , urgentRingBuffer_("urgentRingBuffer_id", SIZEBUF, audioFormat_) , mutex_() , dcblocker_() , resampler_(audioFormat_.sample_rate) , lastNotificationTime_(0) { - urgentRingBuffer_.createReadOffset(MainBuffer::DEFAULT_ID); + urgentRingBuffer_.createReadOffset(RingBufferPool::DEFAULT_ID); } AudioLayer::~AudioLayer() @@ -68,7 +69,7 @@ void AudioLayer::flushMain() { std::lock_guard<std::mutex> lock(mutex_); // should pass call id - Manager::instance().getMainBuffer().flushAllBuffers(); + Manager::instance().getRingBufferPool().flushAllBuffers(); } void AudioLayer::flushUrgent() diff --git a/daemon/src/audio/audiolayer.h b/daemon/src/audio/audiolayer.h index c0fb3533741b52500906c56dd3a3f1a1b9b2c12f..91259d546ed33e826f5b39ff93251b3d2dc629b2 100644 --- a/daemon/src/audio/audiolayer.h +++ b/daemon/src/audio/audiolayer.h @@ -49,7 +49,6 @@ * @brief Main sound class. Manages the data transfers between the application and the hardware. */ -class MainBuffer; class AudioPreference; namespace ost { diff --git a/daemon/src/audio/audiorecorder.cpp b/daemon/src/audio/audiorecorder.cpp index 0931e34cb30c1a124f126b7bcafdd30f5a4b05a2..cd051d69f7e16b13a8801eaa990ed445fd7c5d45 100644 --- a/daemon/src/audio/audiorecorder.cpp +++ b/daemon/src/audio/audiorecorder.cpp @@ -30,7 +30,7 @@ #include "audiorecorder.h" #include "audiorecord.h" -#include "mainbuffer.h" +#include "ringbufferpool.h" #include "logger.h" #include <chrono> @@ -39,8 +39,9 @@ int AudioRecorder::count_ = 0; -AudioRecorder::AudioRecorder(AudioRecord *arec, MainBuffer &mb) : - recorderId_(), mbuffer_(mb), arecord_(arec), running_(false), thread_() +AudioRecorder::AudioRecorder(AudioRecord *arec, RingBufferPool &rbp) + : recorderId_(), ringBufferPool_(rbp), arecord_(arec), running_(false) + , thread_() { ++count_; @@ -65,7 +66,7 @@ AudioRecorder::~AudioRecorder() void AudioRecorder::init() { if (!arecord_->isRecording()) { - arecord_->setSndFormat(mbuffer_.getInternalAudioFormat()); + arecord_->setSndFormat(ringBufferPool_.getInternalAudioFormat()); } } @@ -84,12 +85,12 @@ void AudioRecorder::run() static const size_t BUFFER_LENGTH = 10000; static const std::chrono::milliseconds SLEEP_TIME(20); // 20 ms - AudioBuffer buffer(BUFFER_LENGTH, mbuffer_.getInternalAudioFormat()); + AudioBuffer buffer(BUFFER_LENGTH, ringBufferPool_.getInternalAudioFormat()); while (running_) { - const size_t availableSamples = mbuffer_.availableForGet(recorderId_); + const size_t availableSamples = ringBufferPool_.availableForGet(recorderId_); buffer.resize(std::min(availableSamples, BUFFER_LENGTH)); - mbuffer_.getData(buffer, recorderId_); + ringBufferPool_.getData(buffer, recorderId_); if (availableSamples > 0) arecord_->recData(buffer); diff --git a/daemon/src/audio/audiorecorder.h b/daemon/src/audio/audiorecorder.h index dc9c27949e3289e4930ac051b821214a9ddb6cac..50e6b69fe36925a19822d6ad5b980d9ca3088331 100644 --- a/daemon/src/audio/audiorecorder.h +++ b/daemon/src/audio/audiorecorder.h @@ -37,13 +37,13 @@ #include <atomic> #include <string> -class MainBuffer; +class RingBufferPool; class AudioRecord; class AudioRecorder { public: - AudioRecorder(AudioRecord *arec, MainBuffer &mb); + AudioRecorder(AudioRecord *arec, RingBufferPool &rbp); ~AudioRecorder(); std::string getRecorderID() const { return recorderId_; @@ -66,7 +66,7 @@ class AudioRecorder { static int count_; std::string recorderId_; - MainBuffer &mbuffer_; + RingBufferPool &ringBufferPool_; AudioRecord *arecord_; std::atomic<bool> running_; std::thread thread_; diff --git a/daemon/src/audio/audiortp/audio_rtp_factory.h b/daemon/src/audio/audiortp/audio_rtp_factory.h index 59bd813542c0703fdc44452287f1e0c50eb918ea..437558ac2708004766550b01abf11bd9754affa3 100644 --- a/daemon/src/audio/audiortp/audio_rtp_factory.h +++ b/daemon/src/audio/audiortp/audio_rtp_factory.h @@ -133,9 +133,11 @@ class AudioRtpFactory { void setDtmfPayloadType(unsigned int); /** - * Send DTMF over RTP (RFC2833). The timestamp and sequence number must be - * incremented as if it was microphone audio. This function change the payload type of the rtp session, - * send the appropriate DTMF digit using this payload, discard coresponding data from mainbuffer and get + * Send DTMF over RTP (RFC2833). + * The timestamp and sequence number must be incremented + * as if it was microphone audio. This function change the payload type + * of the rtp session, send the appropriate DTMF digit using + * this payload, discard corresponding data from RingBufferPool and get * back the codec payload for further audio processing. */ void sendDtmfDigit(int digit); diff --git a/daemon/src/audio/audiortp/audio_rtp_session.h b/daemon/src/audio/audiortp/audio_rtp_session.h index d4033a2988f7b92e8552739325068eda4fda1942..ccdf15c5b57dfb92bfd537408fc0b37afedbb8a6 100644 --- a/daemon/src/audio/audiortp/audio_rtp_session.h +++ b/daemon/src/audio/audiortp/audio_rtp_session.h @@ -141,9 +141,11 @@ class AudioRtpSession { virtual void startRTPLoop() = 0; /** - * Send DTMF over RTP (RFC2833). The timestamp and sequence number must be - * incremented as if it was microphone audio. This function change the payload type of the rtp session, - * send the appropriate DTMF digit using this payload, discard coresponding data from mainbuffer and get + * Send DTMF over RTP (RFC2833). + * The timestamp and sequence number must be incremented + * as if it was microphone audio. This function change the payload type + * of the rtp session, send the appropriate DTMF digit using + * this payload, discard corresponding data from RingBufferPool and get * back the codec payload for further audio processing. */ void sendDtmfEvent(); diff --git a/daemon/src/audio/audiortp/audio_rtp_stream.cpp b/daemon/src/audio/audiortp/audio_rtp_stream.cpp index bfa89f2b847470863485840b08092f4a422f6592..1e64ee3440807854771cf3c44301721dbb1b99eb 100644 --- a/daemon/src/audio/audiortp/audio_rtp_stream.cpp +++ b/daemon/src/audio/audiortp/audio_rtp_stream.cpp @@ -36,6 +36,7 @@ #include "audio/audiolayer.h" #include "audio/resampler.h" +#include "audio/ringbufferpool.h" #include "audio/ringbuffer.h" #if HAVE_SPEEXDSP @@ -69,7 +70,7 @@ AudioRtpStream::AudioRtpStream(const std::string &id) : , plcPool_(nullptr) , plcDec_() { - ringbuffer_ = Manager::instance().getMainBuffer().createRingBuffer(id_); + ringbuffer_ = Manager::instance().getRingBufferPool().createRingBuffer(id_); pj_caching_pool_init(&plcCachePool_, &pj_pool_factory_default_policy, 0); plcPool_ = pj_pool_create(&plcCachePool_.factory, "plc", 64, 1024, nullptr); } @@ -131,7 +132,7 @@ bool AudioRtpStream::tryToSwitchDecoder(int newPt) for (unsigned i=0, n=audioCodecs_.size(); i<n; i++) { auto codec = audioCodecs_[i]; if (codec == nullptr || codec->getPayloadType() != newPt) continue; - AudioFormat f = Manager::instance().getMainBuffer().getInternalAudioFormat(); + AudioFormat f = Manager::instance().getRingBufferPool().getInternalAudioFormat(); codec->setOptimalFormat(f.sample_rate, f.nb_channels); decoder_.payloadType_ = codec->getPayloadType(); decoder_.frameSize_ = codec->getFrameSize(); @@ -250,7 +251,7 @@ void AudioRtpStream::setRtpMedia(const std::vector<AudioCodec*> &audioCodecs) currentEncoderIndex_ = currentDecoderIndex_ = 0; AudioCodec& codec = *audioCodecs[currentEncoderIndex_]; - AudioFormat f = Manager::instance().getMainBuffer().getInternalAudioFormat(); + AudioFormat f = Manager::instance().getRingBufferPool().getInternalAudioFormat(); codec.setOptimalFormat(f.sample_rate, f.nb_channels); const int pt = codec.getPayloadType(); @@ -288,7 +289,7 @@ void AudioRtpStream::resetDSP() bool AudioRtpStream::waitForDataEncode(const std::chrono::milliseconds& max_wait) const { - const auto &mainBuffer = Manager::instance().getMainBuffer(); + const auto &mainBuffer = Manager::instance().getRingBufferPool(); const AudioFormat mainBuffFormat = mainBuffer.getInternalAudioFormat(); const double resampleFactor = (double) mainBuffFormat.sample_rate / encoder_.format_.sample_rate; const size_t samplesToGet = resampleFactor * encoder_.frameSize_; @@ -301,22 +302,23 @@ size_t AudioRtpStream::processDataEncode() if (isDead()) return 0; - AudioFormat mainBuffFormat = Manager::instance().getMainBuffer().getInternalAudioFormat(); + AudioFormat mainBuffFormat = Manager::instance().getRingBufferPool().getInternalAudioFormat(); double resampleFactor = (double) mainBuffFormat.sample_rate / encoder_.format_.sample_rate; // compute nb of byte to get corresponding to 1 audio frame const size_t samplesToGet = resampleFactor * encoder_.frameSize_; - if (Manager::instance().getMainBuffer().availableForGet(id_) < samplesToGet) + if (Manager::instance().getRingBufferPool().availableForGet(id_) < samplesToGet) return 0; micData_.setFormat(mainBuffFormat); micData_.resize(samplesToGet); - const size_t samples = Manager::instance().getMainBuffer().getData(micData_, id_); + const size_t samples = Manager::instance().getRingBufferPool().getData(micData_, id_); if (samples != samplesToGet) { - ERROR("Asked for %d samples from mainbuffer, got %d", samplesToGet, samples); + ERROR("Asked for %d samples from bindings on call '%s', got %d", + samplesToGet, id_.c_str(), samples); return 0; } @@ -416,7 +418,7 @@ void AudioRtpStream::processDataDecode(unsigned char *spkrData, size_t size, int // test if resampling or up/down-mixing is required AudioBuffer *out = &rawBuffer_; AudioFormat decFormat = out->getFormat(); - AudioFormat mainBuffFormat = Manager::instance().getMainBuffer().getInternalAudioFormat(); + AudioFormat mainBuffFormat = Manager::instance().getRingBufferPool().getInternalAudioFormat(); if (decFormat.sample_rate != mainBuffFormat.sample_rate) { if (!decoder_.resampler_) { ERROR("Resampler already destroyed"); diff --git a/daemon/src/audio/audiortp/audio_rtp_stream.h b/daemon/src/audio/audiortp/audio_rtp_stream.h index b1db256f2a42089a7dfaad90ad517bb1555adda3..64fea6c5ac82cf1030bed0caa148bbf5bda271da 100644 --- a/daemon/src/audio/audiortp/audio_rtp_stream.h +++ b/daemon/src/audio/audiortp/audio_rtp_stream.h @@ -107,12 +107,12 @@ class AudioRtpStream { void processDataDecode(uint8_t *spkrData, size_t size, int payloadType); /** - * Wait for available data to be encoded from mainbuffer. + * Wait for available data to be encoded from RingBufferPool. */ bool waitForDataEncode(const std::chrono::milliseconds& max_wait) const; /** - * Encode audio data from mainbuffer + * Encode audio data from RingBufferPool * @return size of encoded data, in bytes. */ size_t processDataEncode(); diff --git a/daemon/src/audio/jack/jacklayer.cpp b/daemon/src/audio/jack/jacklayer.cpp index 97302bafdff85fc09bf48ed667103026226eb5e9..0ec4b2aafcc7cc6f137582a5fcb6265fe4e7761c 100644 --- a/daemon/src/audio/jack/jacklayer.cpp +++ b/daemon/src/audio/jack/jacklayer.cpp @@ -36,7 +36,7 @@ #include <cassert> #include <climits> #include "logger.h" -#include "audio/mainbuffer.h" +#include "audio/ringbufferpool.h" #include "audio/ringbuffer.h" #include "manager.h" #include "array_size.h" @@ -83,19 +83,19 @@ void JackLayer::fillWithUrgent(AudioBuffer &buffer, size_t samplesToGet) // Urgent data (dtmf, incoming call signal) come first. samplesToGet = std::min(samplesToGet, hardwareBufferSize_); buffer.resize(samplesToGet); - urgentRingBuffer_.get(buffer, MainBuffer::DEFAULT_ID); + urgentRingBuffer_.get(buffer, RingBufferPool::DEFAULT_ID); buffer.applyGain(isPlaybackMuted_ ? 0.0 : playbackGain_); // Consume the regular one as well (same amount of samples) - Manager::instance().getMainBuffer().discard(samplesToGet, MainBuffer::DEFAULT_ID); + Manager::instance().getRingBufferPool().discard(samplesToGet, RingBufferPool::DEFAULT_ID); } void JackLayer::fillWithVoice(AudioBuffer &buffer, size_t samplesAvail) { - MainBuffer &mainBuffer = Manager::instance().getMainBuffer(); + RingBufferPool &mainBuffer = Manager::instance().getRingBufferPool(); buffer.resize(samplesAvail); - mainBuffer.getData(buffer, MainBuffer::DEFAULT_ID); + mainBuffer.getData(buffer, RingBufferPool::DEFAULT_ID); buffer.applyGain(isPlaybackMuted_ ? 0.0 : playbackGain_); if (audioFormat_.sample_rate != (unsigned) mainBuffer.getInternalSamplingRate()) { @@ -129,8 +129,8 @@ JackLayer::playback() { notifyIncomingCall(); - const size_t samplesToGet = Manager::instance().getMainBuffer().availableForGet(MainBuffer::DEFAULT_ID); - const size_t urgentSamplesToGet = urgentRingBuffer_.availableForGet(MainBuffer::DEFAULT_ID); + const size_t samplesToGet = Manager::instance().getRingBufferPool().availableForGet(RingBufferPool::DEFAULT_ID); + const size_t urgentSamplesToGet = urgentRingBuffer_.availableForGet(RingBufferPool::DEFAULT_ID); if (urgentSamplesToGet > 0) { fillWithUrgent(playbackBuffer_, urgentSamplesToGet); @@ -152,7 +152,7 @@ JackLayer::capture() // get audio from jack ringbuffer read(captureBuffer_); - const AudioFormat mainBufferFormat = Manager::instance().getMainBuffer().getInternalAudioFormat(); + const AudioFormat mainBufferFormat = Manager::instance().getRingBufferPool().getInternalAudioFormat(); const bool resample = mainBufferFormat.sample_rate != audioFormat_.sample_rate; captureBuffer_.applyGain(isCaptureMuted_ ? 0.0 : captureGain_); @@ -326,7 +326,7 @@ JackLayer::JackLayer(const AudioPreference &p) : captureBuffer_(0, audioFormat_), captureFloatBuffer_(), hardwareBufferSize_(0), - mainRingBuffer_(Manager::instance().getMainBuffer().getRingBuffer(MainBuffer::DEFAULT_ID)) + mainRingBuffer_(Manager::instance().getRingBufferPool().getRingBuffer(RingBufferPool::DEFAULT_ID)) { playbackClient_ = jack_client_open(PACKAGE_NAME, (jack_options_t) (JackNullOption | JackNoStartServer), NULL); diff --git a/daemon/src/audio/opensl/opensllayer.cpp b/daemon/src/audio/opensl/opensllayer.cpp index 608ebd42231a7a0cd158f3fb9ebd01c05ac61cd7..7d5cd1336f96d4d7b9420f0228eb195330d191ba 100644 --- a/daemon/src/audio/opensl/opensllayer.cpp +++ b/daemon/src/audio/opensl/opensllayer.cpp @@ -33,7 +33,7 @@ #include "client/configurationmanager.h" #include "manager.h" -#include "audio/mainbuffer.h" +#include "audio/ringbufferpool.h" #include "audio/ringbuffer.h" #include "audio/dcblocker.h" #include "logger.h" @@ -77,7 +77,7 @@ OpenSLLayer::OpenSLLayer(const AudioPreference &pref) , hardwareBuffSize_(BUFFER_SIZE) , playbackBufferStack_(ANDROID_BUFFER_QUEUE_LENGTH, AudioBuffer(hardwareBuffSize_, AudioFormat::MONO())) , recordBufferStack_(ANDROID_BUFFER_QUEUE_LENGTH, AudioBuffer(hardwareBuffSize_, AudioFormat::MONO())) - , mainRingBuffer_(Manager::instance().getMainBuffer().getRingBuffer(MainBuffer::DEFAULT_ID)) + , mainRingBuffer_(Manager::instance().getRingBufferPool().getRingBuffer(RingBufferPool::DEFAULT_ID)) { } @@ -345,7 +345,7 @@ OpenSLLayer::initAudioCapture() const }; DEBUG("Capture-> Sampling Rate: %d", audioFormat_.sample_rate); - DEBUG("Capture-> getInternalSamplingRate: %d", Manager::instance().getMainBuffer().getInternalSamplingRate()); + DEBUG("Capture-> getInternalSamplingRate: %d", Manager::instance().getRingBufferPool().getInternalSamplingRate()); SLDataFormat_PCM audioFormat = {SL_DATAFORMAT_PCM, 1, audioFormat_.sample_rate * 1000, SL_PCMSAMPLEFORMAT_FIXED_16, @@ -638,13 +638,13 @@ OpenSLLayer::playback(SLAndroidSimpleBufferQueueItf queue) notifyIncomingCall(); AudioBuffer &buffer = getNextPlaybackBuffer(); - size_t urgentSamplesToGet = urgentRingBuffer_.availableForGet(MainBuffer::DEFAULT_ID); + size_t urgentSamplesToGet = urgentRingBuffer_.availableForGet(RingBufferPool::DEFAULT_ID); bufferIsFilled_ = false; if (urgentSamplesToGet > 0) { bufferIsFilled_ = audioPlaybackFillWithUrgent(buffer, std::min(urgentSamplesToGet, hardwareBuffSize_)); } else { - auto& main_buffer = Manager::instance().getMainBuffer(); + auto& main_buffer = Manager::instance().getRingBufferPool(); buffer.resize(hardwareBuffSize_); size_t samplesToGet = audioPlaybackFillWithVoice(buffer); if (samplesToGet == 0) { @@ -716,7 +716,7 @@ OpenSLLayer::updatePreference(AudioPreference &preference, int index, DeviceType void OpenSLLayer::audioCaptureFillBuffer(AudioBuffer &buffer) { - MainBuffer &mbuffer = Manager::instance().getMainBuffer(); + RingBufferPool &mbuffer = Manager::instance().getRingBufferPool(); //const unsigned mainBufferSampleRate = mbuffer.getInternalSamplingRate(); const AudioFormat mainBufferFormat = mbuffer.getInternalAudioFormat(); @@ -760,19 +760,19 @@ bool OpenSLLayer::audioPlaybackFillWithUrgent(AudioBuffer &buffer, size_t sample // Urgent data (dtmf, incoming call signal) come first. samplesToGet = std::min(samplesToGet, hardwareBuffSize_); buffer.resize(samplesToGet); - urgentRingBuffer_.get(buffer, MainBuffer::DEFAULT_ID); + urgentRingBuffer_.get(buffer, RingBufferPool::DEFAULT_ID); buffer.applyGain(isPlaybackMuted_ ? 0.0 : playbackGain_); // Consume the regular one as well (same amount of samples) - Manager::instance().getMainBuffer().discard(samplesToGet, MainBuffer::DEFAULT_ID); + Manager::instance().getRingBufferPool().discard(samplesToGet, RingBufferPool::DEFAULT_ID); return true; } size_t OpenSLLayer::audioPlaybackFillWithVoice(AudioBuffer &buffer) { - MainBuffer &mainBuffer = Manager::instance().getMainBuffer(); - size_t got = mainBuffer.getAvailableData(buffer, MainBuffer::DEFAULT_ID); + RingBufferPool &mainBuffer = Manager::instance().getRingBufferPool(); + size_t got = mainBuffer.getAvailableData(buffer, RingBufferPool::DEFAULT_ID); buffer.resize(got); buffer.applyGain(isPlaybackMuted_ ? 0.0 : playbackGain_); if (audioFormat_.sample_rate != mainBuffer.getInternalSamplingRate()) { diff --git a/daemon/src/audio/pulseaudio/pulselayer.cpp b/daemon/src/audio/pulseaudio/pulselayer.cpp index 24ceb6d976998848311d863962b7e7cfe9f81aa1..a1444bccd41c9beae13e1bc039546faf28c54256 100644 --- a/daemon/src/audio/pulseaudio/pulselayer.cpp +++ b/daemon/src/audio/pulseaudio/pulselayer.cpp @@ -38,6 +38,7 @@ #include "pulselayer.h" #include "audio/resampler.h" #include "audio/dcblocker.h" +#include "audio/ringbufferpool.h" #include "audio/ringbuffer.h" #include "logger.h" #include "manager.h" @@ -103,7 +104,7 @@ PulseLayer::PulseLayer(AudioPreference &pref) , enumeratingSinks_(false) , enumeratingSources_(false) , preference_(pref) - , mainRingBuffer_(Manager::instance().getMainBuffer().getRingBuffer(MainBuffer::DEFAULT_ID)) + , mainRingBuffer_(Manager::instance().getRingBufferPool().getRingBuffer(RingBufferPool::DEFAULT_ID)) { setCaptureGain(pref.getVolumemic()); setPlaybackGain(pref.getVolumespkr()); @@ -464,7 +465,7 @@ void PulseLayer::writeToSpeaker() notifyIncomingCall(); - size_t urgentSamples = urgentRingBuffer_.availableForGet(MainBuffer::DEFAULT_ID); + size_t urgentSamples = urgentRingBuffer_.availableForGet(RingBufferPool::DEFAULT_ID); size_t urgentBytes = urgentSamples * sample_size; if (urgentSamples > writableSamples) { @@ -477,12 +478,12 @@ void PulseLayer::writeToSpeaker() if (urgentBytes) { AudioBuffer linearbuff(urgentSamples, format); pa_stream_begin_write(s, (void**)&data, &urgentBytes); - urgentRingBuffer_.get(linearbuff, MainBuffer::DEFAULT_ID); // retrive only the first sample_spec->channels channels + urgentRingBuffer_.get(linearbuff, RingBufferPool::DEFAULT_ID); // retrive only the first sample_spec->channels channels linearbuff.applyGain(isPlaybackMuted_ ? 0.0 : playbackGain_); linearbuff.interleave(data); pa_stream_write(s, data, urgentBytes, nullptr, 0, PA_SEEK_RELATIVE); // Consume the regular one as well (same amount of samples) - Manager::instance().getMainBuffer().discard(urgentSamples, MainBuffer::DEFAULT_ID); + Manager::instance().getRingBufferPool().discard(urgentSamples, RingBufferPool::DEFAULT_ID); return; } @@ -504,7 +505,7 @@ void PulseLayer::writeToSpeaker() flushUrgent(); // flush remaining samples in _urgentRingBuffer - size_t availSamples = Manager::instance().getMainBuffer().availableForGet(MainBuffer::DEFAULT_ID); + size_t availSamples = Manager::instance().getRingBufferPool().availableForGet(RingBufferPool::DEFAULT_ID); if (availSamples == 0) { pa_stream_begin_write(s, (void**)&data, &writableBytes); @@ -518,7 +519,7 @@ void PulseLayer::writeToSpeaker() double resampleFactor = 1.; - AudioFormat mainBufferAudioFormat = Manager::instance().getMainBuffer().getInternalAudioFormat(); + AudioFormat mainBufferAudioFormat = Manager::instance().getRingBufferPool().getInternalAudioFormat(); bool resample = audioFormat_.sample_rate != mainBufferAudioFormat.sample_rate; if (resample) { @@ -533,7 +534,7 @@ void PulseLayer::writeToSpeaker() pa_stream_begin_write(s, (void**)&data, &resampledBytes); AudioBuffer linearbuff(readableSamples, format); - Manager::instance().getMainBuffer().getData(linearbuff, MainBuffer::DEFAULT_ID); + Manager::instance().getRingBufferPool().getData(linearbuff, RingBufferPool::DEFAULT_ID); if (resample) { AudioBuffer rsmpl_out(nResampled, format); @@ -569,7 +570,7 @@ void PulseLayer::readFromMic() AudioBuffer in(samples, format); in.deinterleave((SFLAudioSample*)data, samples, format.nb_channels); - unsigned int mainBufferSampleRate = Manager::instance().getMainBuffer().getInternalSamplingRate(); + unsigned int mainBufferSampleRate = Manager::instance().getRingBufferPool().getInternalSamplingRate(); bool resample = audioFormat_.sample_rate != mainBufferSampleRate; in.applyGain(isCaptureMuted_ ? 0.0 : captureGain_); diff --git a/daemon/src/audio/recordable.cpp b/daemon/src/audio/recordable.cpp index e89c97bcf6e927cd333f7164eb77590e538192b3..bfd7f9105ba1287191325aa4c88c80ab2e373d46 100644 --- a/daemon/src/audio/recordable.cpp +++ b/daemon/src/audio/recordable.cpp @@ -31,7 +31,7 @@ #include "manager.h" #include "logger.h" -Recordable::Recordable() : recAudio_(), recorder_(&recAudio_, Manager::instance().getMainBuffer()) +Recordable::Recordable() : recAudio_(), recorder_(&recAudio_, Manager::instance().getRingBufferPool()) { DEBUG("Set recording options: %s", Manager::instance().audioPreference.getRecordPath().c_str()); recAudio_.setRecordingOptions(AudioFormat::MONO(), Manager::instance().audioPreference.getRecordPath()); diff --git a/daemon/src/audio/mainbuffer.cpp b/daemon/src/audio/ringbufferpool.cpp similarity index 82% rename from daemon/src/audio/mainbuffer.cpp rename to daemon/src/audio/ringbufferpool.cpp index 38a7cabf086dc573b78576ddc8f0e9a189286d9d..0e4b1e4808cd327ba8b83e4dd532cc64d44b2f23 100644 --- a/daemon/src/audio/mainbuffer.cpp +++ b/daemon/src/audio/ringbufferpool.cpp @@ -1,6 +1,7 @@ /* * Copyright (C) 2004-2014 Savoir-Faire Linux Inc. - * Author : Alexandre Savard <alexandre.savard@savoirfairelinux.com> + * Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com> + * Author: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,7 +29,7 @@ * as that of the covered work. */ -#include "mainbuffer.h" +#include "ringbufferpool.h" #include "ringbuffer.h" #include "sfl_types.h" // for SIZEBUF #include "logger.h" @@ -37,12 +38,13 @@ #include <utility> // for std::pair #include <cstring> -const char * const MainBuffer::DEFAULT_ID = "audiolayer_id"; +const char * const RingBufferPool::DEFAULT_ID = "audiolayer_id"; -MainBuffer::MainBuffer() : defaultRingBuffer_(createRingBuffer(DEFAULT_ID)) +RingBufferPool::RingBufferPool() + : defaultRingBuffer_(createRingBuffer(DEFAULT_ID)) {} -MainBuffer::~MainBuffer() +RingBufferPool::~RingBufferPool() { readBindingsMap_.clear(); defaultRingBuffer_.reset(); @@ -57,7 +59,7 @@ MainBuffer::~MainBuffer() } void -MainBuffer::setInternalSamplingRate(unsigned sr) +RingBufferPool::setInternalSamplingRate(unsigned sr) { std::lock_guard<std::recursive_mutex> lk(stateLock_); @@ -68,7 +70,7 @@ MainBuffer::setInternalSamplingRate(unsigned sr) } void -MainBuffer::setInternalAudioFormat(AudioFormat format) +RingBufferPool::setInternalAudioFormat(AudioFormat format) { std::lock_guard<std::recursive_mutex> lk(stateLock_); @@ -79,7 +81,7 @@ MainBuffer::setInternalAudioFormat(AudioFormat format) } std::shared_ptr<RingBuffer> -MainBuffer::getRingBuffer(const std::string& id) +RingBufferPool::getRingBuffer(const std::string& id) { std::lock_guard<std::recursive_mutex> lk(stateLock_); @@ -94,7 +96,7 @@ MainBuffer::getRingBuffer(const std::string& id) } std::shared_ptr<RingBuffer> -MainBuffer::getRingBuffer(const std::string& id) const +RingBufferPool::getRingBuffer(const std::string& id) const { std::lock_guard<std::recursive_mutex> lk(stateLock_); @@ -106,7 +108,7 @@ MainBuffer::getRingBuffer(const std::string& id) const } std::shared_ptr<RingBuffer> -MainBuffer::createRingBuffer(const std::string& id) +RingBufferPool::createRingBuffer(const std::string& id) { std::lock_guard<std::recursive_mutex> lk(stateLock_); @@ -122,22 +124,22 @@ MainBuffer::createRingBuffer(const std::string& id) return rbuf; } -const MainBuffer::ReadBindings* -MainBuffer::getReadBindings(const std::string& call_id) const +const RingBufferPool::ReadBindings* +RingBufferPool::getReadBindings(const std::string& call_id) const { const auto& iter = readBindingsMap_.find(call_id); return iter != readBindingsMap_.cend() ? &iter->second : nullptr; } -MainBuffer::ReadBindings* -MainBuffer::getReadBindings(const std::string& call_id) +RingBufferPool::ReadBindings* +RingBufferPool::getReadBindings(const std::string& call_id) { const auto& iter = readBindingsMap_.find(call_id); return iter != readBindingsMap_.cend() ? &iter->second : nullptr; } void -MainBuffer::removeReadBindings(const std::string& call_id) +RingBufferPool::removeReadBindings(const std::string& call_id) { if (not readBindingsMap_.erase(call_id)) ERROR("CallID set %s does not exist!", call_id.c_str()); @@ -147,7 +149,7 @@ MainBuffer::removeReadBindings(const std::string& call_id) * Make given call ID a reader of given ring buffer */ void -MainBuffer::addReaderToRingBuffer(std::shared_ptr<RingBuffer> rbuf, +RingBufferPool::addReaderToRingBuffer(std::shared_ptr<RingBuffer> rbuf, const std::string& call_id) { if (call_id != DEFAULT_ID and rbuf->id == call_id) @@ -159,7 +161,7 @@ MainBuffer::addReaderToRingBuffer(std::shared_ptr<RingBuffer> rbuf, } void -MainBuffer::removeReaderFromRingBuffer(std::shared_ptr<RingBuffer> rbuf, +RingBufferPool::removeReaderFromRingBuffer(std::shared_ptr<RingBuffer> rbuf, const std::string& call_id) { if (auto bindings = getReadBindings(call_id)) { @@ -172,7 +174,8 @@ MainBuffer::removeReaderFromRingBuffer(std::shared_ptr<RingBuffer> rbuf, } void -MainBuffer::bindCallID(const std::string& call_id1, const std::string& call_id2) +RingBufferPool::bindCallID(const std::string& call_id1, + const std::string& call_id2) { const auto& rb_call1 = getRingBuffer(call_id1); if (not rb_call1) { @@ -193,7 +196,7 @@ MainBuffer::bindCallID(const std::string& call_id1, const std::string& call_id2) } void -MainBuffer::bindHalfDuplexOut(const std::string& process_id, +RingBufferPool::bindHalfDuplexOut(const std::string& process_id, const std::string& call_id) { /* This method is used only for active calls, if this call does not exist, @@ -206,7 +209,7 @@ MainBuffer::bindHalfDuplexOut(const std::string& process_id, } void -MainBuffer::unBindCallID(const std::string& call_id1, +RingBufferPool::unBindCallID(const std::string& call_id1, const std::string& call_id2) { const auto& rb_call1 = getRingBuffer(call_id1); @@ -228,7 +231,7 @@ MainBuffer::unBindCallID(const std::string& call_id1, } void -MainBuffer::unBindHalfDuplexOut(const std::string& process_id, +RingBufferPool::unBindHalfDuplexOut(const std::string& process_id, const std::string& call_id) { std::lock_guard<std::recursive_mutex> lk(stateLock_); @@ -238,7 +241,7 @@ MainBuffer::unBindHalfDuplexOut(const std::string& process_id, } void -MainBuffer::unBindAll(const std::string& call_id) +RingBufferPool::unBindAll(const std::string& call_id) { const auto& rb_call = getRingBuffer(call_id); if (not rb_call) { @@ -260,7 +263,7 @@ MainBuffer::unBindAll(const std::string& call_id) } size_t -MainBuffer::getData(AudioBuffer& buffer, const std::string& call_id) +RingBufferPool::getData(AudioBuffer& buffer, const std::string& call_id) { std::lock_guard<std::recursive_mutex> lk(stateLock_); @@ -289,9 +292,9 @@ MainBuffer::getData(AudioBuffer& buffer, const std::string& call_id) } bool -MainBuffer::waitForDataAvailable(const std::string& call_id, - size_t min_frames, - const std::chrono::microseconds& max_wait) const +RingBufferPool::waitForDataAvailable(const std::string& call_id, + size_t min_frames, + const std::chrono::microseconds& max_wait) const { std::unique_lock<std::recursive_mutex> lk(stateLock_); @@ -313,7 +316,7 @@ MainBuffer::waitForDataAvailable(const std::string& call_id, } size_t -MainBuffer::getAvailableData(AudioBuffer& buffer, const std::string& call_id) +RingBufferPool::getAvailableData(AudioBuffer& buffer, const std::string& call_id) { std::lock_guard<std::recursive_mutex> lk(stateLock_); @@ -329,7 +332,8 @@ MainBuffer::getAvailableData(AudioBuffer& buffer, const std::string& call_id) size_t availableSamples = std::numeric_limits<size_t>::max(); for (const auto& rbuf : *bindings) - availableSamples = std::min(availableSamples, rbuf->availableForGet(call_id)); + availableSamples = std::min(availableSamples, + rbuf->availableForGet(call_id)); if (availableSamples == std::numeric_limits<size_t>::max()) return 0; @@ -351,7 +355,7 @@ MainBuffer::getAvailableData(AudioBuffer& buffer, const std::string& call_id) } size_t -MainBuffer::availableForGet(const std::string& call_id) const +RingBufferPool::availableForGet(const std::string& call_id) const { std::lock_guard<std::recursive_mutex> lk(stateLock_); @@ -376,7 +380,7 @@ MainBuffer::availableForGet(const std::string& call_id) const } size_t -MainBuffer::discard(size_t toDiscard, const std::string& call_id) +RingBufferPool::discard(size_t toDiscard, const std::string& call_id) { std::lock_guard<std::recursive_mutex> lk(stateLock_); @@ -391,7 +395,7 @@ MainBuffer::discard(size_t toDiscard, const std::string& call_id) } void -MainBuffer::flush(const std::string& call_id) +RingBufferPool::flush(const std::string& call_id) { std::lock_guard<std::recursive_mutex> lk(stateLock_); @@ -404,7 +408,7 @@ MainBuffer::flush(const std::string& call_id) } void -MainBuffer::flushAllBuffers() +RingBufferPool::flushAllBuffers() { std::lock_guard<std::recursive_mutex> lk(stateLock_); diff --git a/daemon/src/audio/mainbuffer.h b/daemon/src/audio/ringbufferpool.h similarity index 91% rename from daemon/src/audio/mainbuffer.h rename to daemon/src/audio/ringbufferpool.h index 4f9b90fc506c5170eb5fd8b8b19621ec03119cb1..803606f0cd3797a6565cc3e1cd71dbaa8af86f99 100644 --- a/daemon/src/audio/mainbuffer.h +++ b/daemon/src/audio/ringbufferpool.h @@ -1,6 +1,7 @@ /* * Copyright (C) 2004-2014 Savoir-Faire Linux Inc. - * Author : Alexandre Savard <alexandre.savard@savoirfairelinux.com> + * Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com> + * Author: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,8 +29,8 @@ * as that of the covered work. */ -#ifndef MAIN_BUFFER_H_ -#define MAIN_BUFFER_H_ +#ifndef RING_BUFFER_POOL_H_ +#define RING_BUFFER_POOL_H_ #include "audiobuffer.h" #include "noncopyable.h" @@ -42,14 +43,14 @@ class RingBuffer; -class MainBuffer { +class RingBufferPool { public: static const char * const DEFAULT_ID; - MainBuffer(); + RingBufferPool(); - ~MainBuffer(); + ~RingBufferPool(); int getInternalSamplingRate() const { return internalAudioFormat_.sample_rate; @@ -129,16 +130,16 @@ class MainBuffer { std::shared_ptr<RingBuffer> getRingBuffer(const std::string& id) const; private: - NON_COPYABLE(MainBuffer); + NON_COPYABLE(RingBufferPool); // A set of RingBuffers readable by a call typedef std::set<std::shared_ptr<RingBuffer>, std::owner_less<std::shared_ptr<RingBuffer>> > ReadBindings; - const MainBuffer::ReadBindings* - getReadBindings(const std::string& call_id) const; + const RingBufferPool::ReadBindings* + getReadBindings(const std::string& call_id) const; - MainBuffer::ReadBindings* getReadBindings(const std::string& call_id); + RingBufferPool::ReadBindings* getReadBindings(const std::string& call_id); void removeReadBindings(const std::string& call_id); @@ -161,4 +162,4 @@ class MainBuffer { std::shared_ptr<RingBuffer> defaultRingBuffer_; }; -#endif // MainBuffer +#endif // RING_BUFFER_POOL_H_ diff --git a/daemon/src/call.cpp b/daemon/src/call.cpp index 584d9f6ef65ff6320958ca8e2d09ab650cdb9963..62c751206692f8cb6e39c94832297e6a5d0f4ee8 100644 --- a/daemon/src/call.cpp +++ b/daemon/src/call.cpp @@ -33,7 +33,7 @@ #include "call.h" #include "account.h" #include "manager.h" -#include "audio/mainbuffer.h" +#include "audio/ringbufferpool.h" #include "history/historyitem.h" #include "sip/sip_utils.h" @@ -210,17 +210,17 @@ bool Call::toggleRecording() { const bool startRecording = Recordable::toggleRecording(); - MainBuffer &mbuffer = Manager::instance().getMainBuffer(); + RingBufferPool &rbPool = Manager::instance().getRingBufferPool(); std::string process_id = Recordable::recorder_.getRecorderID(); if (startRecording) { - mbuffer.bindHalfDuplexOut(process_id, id_); - mbuffer.bindHalfDuplexOut(process_id, MainBuffer::DEFAULT_ID); + rbPool.bindHalfDuplexOut(process_id, id_); + rbPool.bindHalfDuplexOut(process_id, RingBufferPool::DEFAULT_ID); Recordable::recorder_.start(); } else { - mbuffer.unBindHalfDuplexOut(process_id, id_); - mbuffer.unBindHalfDuplexOut(process_id, MainBuffer::DEFAULT_ID); + rbPool.unBindHalfDuplexOut(process_id, id_); + rbPool.unBindHalfDuplexOut(process_id, RingBufferPool::DEFAULT_ID); } return startRecording; diff --git a/daemon/src/conference.cpp b/daemon/src/conference.cpp index b681e9b4d4ba769b3ad9a877f121ba11f973fe71..9fe09c6b32cfbbac613a4071162ee62c60c4216d 100644 --- a/daemon/src/conference.cpp +++ b/daemon/src/conference.cpp @@ -34,7 +34,7 @@ #include "conference.h" #include "manager.h" #include "audio/audiolayer.h" -#include "audio/mainbuffer.h" +#include "audio/ringbufferpool.h" #ifdef SFL_VIDEO #include "sip/sipcall.h" @@ -100,16 +100,16 @@ void Conference::remove(const std::string &participant_id) void Conference::bindParticipant(const std::string &participant_id) { - auto &mainBuffer = Manager::instance().getMainBuffer(); + auto &rbPool = Manager::instance().getRingBufferPool(); for (const auto &item : participants_) { if (participant_id != item) - mainBuffer.bindCallID(participant_id, item); - mainBuffer.flush(item); + rbPool.bindCallID(participant_id, item); + rbPool.flush(item); } - mainBuffer.bindCallID(participant_id, MainBuffer::DEFAULT_ID); - mainBuffer.flush(MainBuffer::DEFAULT_ID); + rbPool.bindCallID(participant_id, RingBufferPool::DEFAULT_ID); + rbPool.flush(RingBufferPool::DEFAULT_ID); } std::string Conference::getStateStr() const @@ -153,23 +153,23 @@ Conference::getDisplayNames() const bool Conference::toggleRecording() { const bool startRecording = Recordable::toggleRecording(); - MainBuffer &mbuffer = Manager::instance().getMainBuffer(); + auto& rbPool = Manager::instance().getRingBufferPool(); std::string process_id(Recordable::recorder_.getRecorderID()); // start recording if (startRecording) { for (const auto &item : participants_) - mbuffer.bindHalfDuplexOut(process_id, item); + rbPool.bindHalfDuplexOut(process_id, item); - mbuffer.bindHalfDuplexOut(process_id, MainBuffer::DEFAULT_ID); + rbPool.bindHalfDuplexOut(process_id, RingBufferPool::DEFAULT_ID); Recordable::recorder_.start(); } else { for (const auto &item : participants_) - mbuffer.unBindHalfDuplexOut(process_id, item); + rbPool.unBindHalfDuplexOut(process_id, item); - mbuffer.unBindHalfDuplexOut(process_id, MainBuffer::DEFAULT_ID); + rbPool.unBindHalfDuplexOut(process_id, RingBufferPool::DEFAULT_ID); } return startRecording; diff --git a/daemon/src/iax/iaxcall.cpp b/daemon/src/iax/iaxcall.cpp index c8b059ce496cda358c60a72414983ab6a5ca8ca6..9caa76da5fd7dd1d07fbec10fe7f96b5c23e4fce 100644 --- a/daemon/src/iax/iaxcall.cpp +++ b/daemon/src/iax/iaxcall.cpp @@ -40,6 +40,7 @@ #include "manager.h" #include "iaxaccount.h" #include "iaxvoiplink.h" +#include "audio/ringbufferpool.h" #include "audio/ringbuffer.h" #if HAVE_INSTANT_MESSAGING @@ -74,7 +75,7 @@ IAXCall::IAXCall(IAXAccount& account, const std::string& id, Call::CallType type format(0), session(NULL) { - ringbuffer_ = Manager::instance().getMainBuffer().createRingBuffer(getCallId()); + ringbuffer_ = Manager::instance().getRingBufferPool().createRingBuffer(getCallId()); } int IAXCall::getSupportedFormat(const std::string &accountID) const @@ -148,13 +149,13 @@ IAXCall::answer() setState(Call::ACTIVE); setConnectionState(Call::CONNECTED); - Manager::instance().getMainBuffer().flushAllBuffers(); + Manager::instance().getRingBufferPool().flushAllBuffers(); } void IAXCall::hangup(int reason UNUSED) { - Manager::instance().getMainBuffer().unBindAll(getCallId()); + Manager::instance().getRingBufferPool().unBindAll(getCallId()); std::lock_guard<std::mutex> lock(IAXVoIPLink::mutexIAX); iax_hangup(session, (char*) "Dumped Call"); @@ -192,7 +193,7 @@ IAXCall::attendedTransfer(const std::string& /*targetID*/) void IAXCall::onhold() { - Manager::instance().getMainBuffer().unBindAll(getCallId()); + Manager::instance().getRingBufferPool().unBindAll(getCallId()); { std::lock_guard<std::mutex> lock(IAXVoIPLink::mutexIAX); @@ -220,7 +221,7 @@ IAXCall::offhold() void IAXCall::peerHungup() { - Manager::instance().getMainBuffer().unBindAll(getCallId()); + Manager::instance().getRingBufferPool().unBindAll(getCallId()); session = nullptr; } diff --git a/daemon/src/iax/iaxvoiplink.cpp b/daemon/src/iax/iaxvoiplink.cpp index 51f3c44332493e18d4b4ebbad421b91aeb5d7bfa..364d8ac8678d8eecab48cadf4fdd92a7e137b35e 100644 --- a/daemon/src/iax/iaxvoiplink.cpp +++ b/daemon/src/iax/iaxvoiplink.cpp @@ -42,6 +42,7 @@ #include "hooks/urlhook.h" #include "audio/audiolayer.h" #include "audio/resampler.h" +#include "audio/ringbufferpool.h" #include "array_size.h" #include "map_utils.h" #include "call_factory.h" @@ -157,20 +158,20 @@ IAXVoIPLink::sendAudioFromMic() if (!audioCodec) continue; - Manager::instance().getMainBuffer().setInternalSamplingRate(audioCodec->getClockRate()); + Manager::instance().getRingBufferPool().setInternalSamplingRate(audioCodec->getClockRate()); - unsigned int mainBufferSampleRate = Manager::instance().getMainBuffer().getInternalSamplingRate(); + unsigned int mainBufferSampleRate = Manager::instance().getRingBufferPool().getInternalSamplingRate(); // we have to get 20ms of data from the mic *20/1000 = /50 // rate/50 shall be lower than IAX__20S_48KHZ_MAX size_t samples = mainBufferSampleRate * 20 / 1000; - if (Manager::instance().getMainBuffer().availableForGet(currentCall->getCallId()) < samples) + if (Manager::instance().getRingBufferPool().availableForGet(currentCall->getCallId()) < samples) continue; // Get bytes from micRingBuffer to data_from_mic rawBuffer_.resize(samples); - samples = Manager::instance().getMainBuffer().getData(rawBuffer_, currentCall->getCallId()); + samples = Manager::instance().getRingBufferPool().getData(rawBuffer_, currentCall->getCallId()); int compSize; unsigned int audioRate = audioCodec->getClockRate(); @@ -231,7 +232,7 @@ IAXVoIPLink::handleAnswerTransfer(iax_event* event, IAXCall& call) Manager::instance().addStream(id); Manager::instance().peerAnsweredCall(id); Manager::instance().startAudioDriverStream(); - Manager::instance().getMainBuffer().flushAllBuffers(); + Manager::instance().getRingBufferPool().flushAllBuffers(); } void @@ -333,8 +334,8 @@ IAXVoIPLink::iaxHandleVoiceEvent(iax_event* event, IAXCall& call) if (!audioCodec) return; - Manager::instance().getMainBuffer().setInternalSamplingRate(audioCodec->getClockRate()); - unsigned int mainBufferSampleRate = Manager::instance().getMainBuffer().getInternalSamplingRate(); + Manager::instance().getRingBufferPool().setInternalSamplingRate(audioCodec->getClockRate()); + unsigned int mainBufferSampleRate = Manager::instance().getRingBufferPool().getInternalSamplingRate(); if (event->subclass) call.format = event->subclass; diff --git a/daemon/src/managerimpl.cpp b/daemon/src/managerimpl.cpp index 672a6e43ab3e893360d977aa1d359673472130bf..5972f2f054f3cdffcfdf91657b7e402a0aa9f731 100644 --- a/daemon/src/managerimpl.cpp +++ b/daemon/src/managerimpl.cpp @@ -63,6 +63,7 @@ #include "audio/sound/tonelist.h" #include "audio/sound/audiofile.h" #include "audio/sound/dtmf.h" +#include "audio/ringbufferpool.h" #include "history/historynamecache.h" #include "history/history.h" #include "manager.h" @@ -127,8 +128,9 @@ ManagerImpl::ManagerImpl() : hasTriedToRegister_(false), audioCodecFactory(), client_(), currentCallMutex_(), dtmfKey_(), dtmfBuf_(0, AudioFormat::MONO()), toneMutex_(), telephoneTone_(), audiofile_(), audioLayerMutex_(), - waitingCalls_(), waitingCallsMutex_(), path_(), - mainBuffer_(), callFactory(), conferenceMap_(), history_(), + waitingCalls_(), waitingCallsMutex_(), path_() + , ringbufferpool_(new RingBufferPool) + , callFactory(), conferenceMap_(), history_(), finished_(false), accountFactory_() { // initialize random generator for call id @@ -209,7 +211,7 @@ ManagerImpl::init(const std::string &config_file) std::lock_guard<std::mutex> toneLock(toneMutex_); telephoneTone_.reset(new TelephoneTone(preferences.getZoneToneChoice(), audiodriver_->getSampleRate())); } - dtmfKey_.reset(new DTMF(getMainBuffer().getInternalSamplingRate())); + dtmfKey_.reset(new DTMF(getRingBufferPool().getInternalSamplingRate())); } } @@ -345,7 +347,7 @@ ManagerImpl::outgoingCall(const std::string& preferred_account_id, if (not isConference(current_call_id) and not isConferenceParticipant(current_call_id)) onHoldCall(current_call_id); else if (isConference(current_call_id) and not isConferenceParticipant(call_id)) - detachParticipant(MainBuffer::DEFAULT_ID); + detachParticipant(RingBufferPool::DEFAULT_ID); } try { @@ -405,7 +407,7 @@ ManagerImpl::answerCall(const std::string& call_id) } else if (isConference(current_call_id) and not isConferenceParticipant(call_id)) { // if we are talking to a conference and we are answering an incoming call DEBUG("Detach main participant from conference"); - detachParticipant(MainBuffer::DEFAULT_ID); + detachParticipant(RingBufferPool::DEFAULT_ID); } } @@ -573,7 +575,7 @@ ManagerImpl::offHoldCall(const std::string& callId) } else if (isConference(currentCallId) && callId != currentCallId) { holdConference(currentCallId); } else if (isConference(currentCallId) and not isConferenceParticipant(callId)) - detachParticipant(MainBuffer::DEFAULT_ID); + detachParticipant(RingBufferPool::DEFAULT_ID); } std::shared_ptr<Call> call; @@ -711,7 +713,7 @@ ManagerImpl::removeConference(const std::string& conference_id) // We now need to bind the audio to the remain participant // Unbind main participant audio from conference - getMainBuffer().unBindAll(MainBuffer::DEFAULT_ID); + getRingBufferPool().unBindAll(RingBufferPool::DEFAULT_ID); ParticipantSet participants(conf->getParticipantList()); @@ -719,7 +721,7 @@ ManagerImpl::removeConference(const std::string& conference_id) ParticipantSet::iterator iter_p = participants.begin(); if (iter_p != participants.end()) - getMainBuffer().bindCallID(*iter_p, MainBuffer::DEFAULT_ID); + getRingBufferPool().bindCallID(*iter_p, RingBufferPool::DEFAULT_ID); // Then remove the conference from the conference map if (conferenceMap_.erase(conference_id)) @@ -845,7 +847,7 @@ ManagerImpl::addParticipant(const std::string& callId, // detach from prior communication and switch to this conference if (current_call_id != callId) { if (isConference(current_call_id)) - detachParticipant(MainBuffer::DEFAULT_ID); + detachParticipant(RingBufferPool::DEFAULT_ID); else onHoldCall(current_call_id); } @@ -866,7 +868,7 @@ ManagerImpl::addParticipant(const std::string& callId, conf->add(callId); // Connect new audio streams together - getMainBuffer().unBindAll(callId); + getRingBufferPool().unBindAll(callId); std::map<std::string, std::string> callDetails(getCallDetails(callId)); std::string callState(callDetails.find("CALL_STATE")->second); @@ -897,7 +899,7 @@ ManagerImpl::addMainParticipant(const std::string& conference_id) std::string current_call_id(getCurrentCallId()); if (isConference(current_call_id)) - detachParticipant(MainBuffer::DEFAULT_ID); + detachParticipant(RingBufferPool::DEFAULT_ID); else onHoldCall(current_call_id); } @@ -915,12 +917,12 @@ ManagerImpl::addMainParticipant(const std::string& conference_id) ParticipantSet participants(conf->getParticipantList()); for (const auto &item_p : participants) { - getMainBuffer().bindCallID(item_p, MainBuffer::DEFAULT_ID); + getRingBufferPool().bindCallID(item_p, RingBufferPool::DEFAULT_ID); // Reset ringbuffer's readpointers - getMainBuffer().flush(item_p); + getRingBufferPool().flush(item_p); } - getMainBuffer().flush(MainBuffer::DEFAULT_ID); + getRingBufferPool().flush(RingBufferPool::DEFAULT_ID); if (conf->getState() == Conference::ACTIVE_DETACHED) conf->setState(Conference::ACTIVE_ATTACHED); @@ -981,7 +983,7 @@ ManagerImpl::joinParticipant(const std::string& callId1, if ((current_call_id != callId1) and (current_call_id != callId2)) { // If currently in a conference if (isConference(current_call_id)) - detachParticipant(MainBuffer::DEFAULT_ID); + detachParticipant(RingBufferPool::DEFAULT_ID); else onHoldCall(current_call_id); // currently in a call } @@ -990,10 +992,10 @@ ManagerImpl::joinParticipant(const std::string& callId1, auto conf = createConference(callId1, callId2); call1->setConfId(conf->getConfID()); - getMainBuffer().unBindAll(callId1); + getRingBufferPool().unBindAll(callId1); call2->setConfId(conf->getConfID()); - getMainBuffer().unBindAll(callId2); + getRingBufferPool().unBindAll(callId2); // Process call1 according to its state std::string call1_state_str(call1Details.find("CALL_STATE")->second); @@ -1036,7 +1038,7 @@ ManagerImpl::joinParticipant(const std::string& callId1, conf->setState(Conference::ACTIVE_ATTACHED); // set recording sampling rate - conf->setRecordingFormat(mainBuffer_.getInternalAudioFormat()); + conf->setRecordingFormat(ringbufferpool_->getInternalAudioFormat()); return true; } @@ -1082,7 +1084,7 @@ ManagerImpl::createConfFromParticipantList(const std::vector< std::string > &par if (successCounter >= 2) { conferenceMap_[conf->getConfID()] = conf; client_.getCallManager()->conferenceCreated(conf->getConfID()); - conf->setRecordingFormat(mainBuffer_.getInternalAudioFormat()); + conf->setRecordingFormat(ringbufferpool_->getInternalAudioFormat()); } } @@ -1091,7 +1093,7 @@ ManagerImpl::detachParticipant(const std::string& call_id) { const std::string current_call_id(getCurrentCallId()); - if (call_id != MainBuffer::DEFAULT_ID) { + if (call_id != RingBufferPool::DEFAULT_ID) { auto call = getCallFromCallID(call_id); if (!call) { ERROR("Could not find call %s", call_id.c_str()); @@ -1121,7 +1123,7 @@ ManagerImpl::detachParticipant(const std::string& call_id) } else { DEBUG("Unbind main participant from conference %d"); - getMainBuffer().unBindAll(MainBuffer::DEFAULT_ID); + getRingBufferPool().unBindAll(RingBufferPool::DEFAULT_ID); if (not isConference(current_call_id)) { ERROR("Current call id (%s) is not a conference", current_call_id.c_str()); @@ -1194,9 +1196,9 @@ ManagerImpl::processRemainingParticipants(Conference &conf) if (n > 1) { // Reset ringbuffer's readpointers for (const auto &p : participants) - getMainBuffer().flush(p); + getRingBufferPool().flush(p); - getMainBuffer().flush(MainBuffer::DEFAULT_ID); + getRingBufferPool().flush(RingBufferPool::DEFAULT_ID); } else if (n == 1) { // this call is the last participant, hence // the conference is over @@ -1264,7 +1266,7 @@ ManagerImpl::addStream(const std::string& call_id) DEBUG("Add stream to call"); // bind to main - getMainBuffer().bindCallID(call_id, MainBuffer::DEFAULT_ID); + getRingBufferPool().bindCallID(call_id, RingBufferPool::DEFAULT_ID); std::lock_guard<std::mutex> lock(audioLayerMutex_); audiodriver_->flushUrgent(); @@ -1276,7 +1278,7 @@ void ManagerImpl::removeStream(const std::string& call_id) { DEBUG("Remove audio stream %s", call_id.c_str()); - getMainBuffer().unBindAll(call_id); + getRingBufferPool().unBindAll(call_id); } void @@ -2252,7 +2254,7 @@ ManagerImpl::hardwareAudioFormatChanged(AudioFormat format) void ManagerImpl::audioFormatUsed(AudioFormat format) { - AudioFormat currentFormat = mainBuffer_.getInternalAudioFormat(); + AudioFormat currentFormat = ringbufferpool_->getInternalAudioFormat(); format.nb_channels = std::max(currentFormat.nb_channels, std::min(format.nb_channels, 2u)); // max 2 channels. format.sample_rate = std::max(currentFormat.sample_rate, format.sample_rate); @@ -2261,7 +2263,7 @@ ManagerImpl::audioFormatUsed(AudioFormat format) DEBUG("Audio format changed: %s -> %s", currentFormat.toString().c_str(), format.toString().c_str()); - mainBuffer_.setInternalAudioFormat(format); + ringbufferpool_->setInternalAudioFormat(format); { std::lock_guard<std::mutex> toneLock(toneMutex_); @@ -2707,12 +2709,6 @@ ManagerImpl::getAudioDriver() return audiodriver_; } -MainBuffer & -ManagerImpl::getMainBuffer() -{ - return mainBuffer_; -} - Client* ManagerImpl::getClient() { diff --git a/daemon/src/managerimpl.h b/daemon/src/managerimpl.h index b3ec3598d5ebe722ebdf8f1252535665fd97e511..2bdd17c7c75addff49806dc8a9d447132b117749 100644 --- a/daemon/src/managerimpl.h +++ b/daemon/src/managerimpl.h @@ -57,7 +57,6 @@ #include "audio/audiolayer.h" #include "audio/sound/tone.h" // for Tone::TONEID declaration #include "audio/codecs/audiocodecfactory.h" -#include "audio/mainbuffer.h" #include "preferences.h" #include "history/history.h" @@ -73,6 +72,7 @@ class AudioFile; class AudioLayer; class History; class TelephoneTone; +class RingBufferPool; /** To send multiple string */ typedef std::list<std::string> TokenList; @@ -84,6 +84,8 @@ typedef std::set<std::string> CallIDSet; static const char * const default_conf = "conf"; +typedef std::set<std::string> CallIDSet; + /** Manager (controller) of sflphone daemon */ class ManagerImpl { public: @@ -838,20 +840,20 @@ class ManagerImpl { int loadAccountMap(const YAML::Node &node); /** - * Instance of the MainBuffer for the whole application + * Instance of the RingBufferPool for the whole application * - * In order to send signal to other parts of the application, one must pass through the mainbuffer. - * Audio instances must be registered into the MainBuffer and bound together via the ManagerImpl. + * In order to send signal to other parts of the application, one must pass through the RingBufferMananger. + * Audio instances must be registered into the RingBufferMananger and bound together via the ManagerImpl. * */ - MainBuffer mainBuffer_; + std::unique_ptr<RingBufferPool> ringbufferpool_; public: /** - * Return a pointer to the instance of the mainbuffer + * Return a pointer to the instance of the RingBufferPool */ - MainBuffer &getMainBuffer(); + RingBufferPool& getRingBufferPool() { return *ringbufferpool_; } /** * Tell if there is a current call processed diff --git a/daemon/test/Makefile.am b/daemon/test/Makefile.am index 4186f0984c5e3b7a8a67fb0bb55e539ca8ca4470..094777e82fbb0ee8fff076df5ecc5ed407091c9a 100644 --- a/daemon/test/Makefile.am +++ b/daemon/test/Makefile.am @@ -34,8 +34,8 @@ test_SOURCES = constants.h \ siptest.cpp \ sdptest.h \ sdptest.cpp \ - mainbuffertest.h \ - mainbuffertest.cpp \ + ringbufferpooltest.h \ + ringbufferpooltest.cpp \ resamplertest.h \ resamplertest.cpp \ hooktest.h \ diff --git a/daemon/test/mainbuffertest.cpp b/daemon/test/mainbuffertest.cpp deleted file mode 100644 index 448b04e71b21b9014daf55ffa8af907e6a69f92e..0000000000000000000000000000000000000000 --- a/daemon/test/mainbuffertest.cpp +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright (C) 2004-2013 Savoir-Faire Linux Inc. - * Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Additional permission under GNU GPL version 3 section 7: - * - * If you modify this program, or any covered work, by linking or - * combining it with the OpenSSL project's OpenSSL library (or a - * modified version of that library), containing parts covered by the - * terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc. - * grants you additional permission to convey the resulting work. - * Corresponding Source for a non-source form of such a combination - * shall include the source code for the parts of OpenSSL used as well - * as that of the covered work. - */ - -#include <string> -#include <memory> - -#include "mainbuffertest.h" -#include "audio/mainbuffer.h" -#include "audio/ringbuffer.h" -#include "logger.h" -#include "test_utils.h" - -void MainBufferTest::testBindUnbindBuffer() -{ - TITLE(); - - std::string test_id1 = "bind unbind 1"; - std::string test_id2 = "bind unbind 2"; - - // bind test_id1 with MainBuffer::DEFAULT_ID (test_id1 not already created) - mainbuffer_->bindCallID(test_id1, MainBuffer::DEFAULT_ID); - - // unbind test_id1 with MainBuffer::DEFAULT_ID - mainbuffer_->unBindCallID(test_id1, MainBuffer::DEFAULT_ID); - - mainbuffer_->bindCallID(test_id1, MainBuffer::DEFAULT_ID); - mainbuffer_->bindCallID(test_id1, MainBuffer::DEFAULT_ID); - - mainbuffer_->bindCallID(test_id2, MainBuffer::DEFAULT_ID); - mainbuffer_->bindCallID(test_id2, MainBuffer::DEFAULT_ID); - - // bind test_id1 with test_id2 (both testid1 and test_id2 already created) - // calling it twice not supposed to break anything - mainbuffer_->bindCallID(test_id1, test_id2); - mainbuffer_->bindCallID(test_id1, test_id2); - - mainbuffer_->unBindCallID(test_id1, test_id2); - mainbuffer_->unBindCallID(test_id1, test_id2); - - mainbuffer_->unBindCallID(MainBuffer::DEFAULT_ID, test_id2); - mainbuffer_->unBindCallID(MainBuffer::DEFAULT_ID, test_id2); - - mainbuffer_->unBindCallID(MainBuffer::DEFAULT_ID, test_id1); - - // test unbind all function - mainbuffer_->bindCallID(MainBuffer::DEFAULT_ID, test_id1); - mainbuffer_->bindCallID(MainBuffer::DEFAULT_ID, test_id2); - mainbuffer_->bindCallID(test_id1, test_id2); - - mainbuffer_->unBindAll(test_id2); -} - -void MainBufferTest::testGetPutData() -{ - TITLE(); - - std::string test_id = "incoming rtp session"; - - auto mainRingBuffer = mainbuffer_->getRingBuffer(MainBuffer::DEFAULT_ID); - auto testRingBuffer = mainbuffer_->createRingBuffer(test_id); - - mainbuffer_->bindCallID(test_id, MainBuffer::DEFAULT_ID); - - SFLAudioSample test_sample1 = 12; - SFLAudioSample test_sample2 = 13; - - AudioBuffer test_input1(&test_sample1, 1, AudioFormat::MONO()); - AudioBuffer test_input2(&test_sample2, 1, AudioFormat::MONO()); - AudioBuffer test_output(100, AudioFormat::MONO()); - - // get by test_id without preleminary put - CPPUNIT_ASSERT(mainbuffer_->getData(test_output, test_id) == 0); - - // put by MainBuffer::DEFAULT_ID, get by test_id - mainRingBuffer->put(test_input1); - CPPUNIT_ASSERT(mainbuffer_->getData(test_output, test_id) == 1); - CPPUNIT_ASSERT(test_sample1 == (*test_output.getChannel(0))[0]); - - // get by MainBuffer::DEFAULT_ID without preleminary put - CPPUNIT_ASSERT(mainbuffer_->getData(test_output, MainBuffer::DEFAULT_ID) == 0); - - // put by test_id, get by MainBuffer::DEFAULT_ID - testRingBuffer->put(test_input2); - CPPUNIT_ASSERT(mainbuffer_->getData(test_output, MainBuffer::DEFAULT_ID) == 1); - CPPUNIT_ASSERT(test_sample2 == (*test_output.getChannel(0))[0]); - - mainbuffer_->unBindCallID(test_id, MainBuffer::DEFAULT_ID); -} - -void MainBufferTest::testGetAvailableData() -{ - TITLE(); - std::string test_id = "getData putData"; - std::string false_id = "false id"; - - auto mainRingBuffer = mainbuffer_->getRingBuffer(MainBuffer::DEFAULT_ID); - auto testRingBuffer = mainbuffer_->createRingBuffer(test_id); - - mainbuffer_->bindCallID(test_id, MainBuffer::DEFAULT_ID); - - SFLAudioSample test_sample1 = 12; - SFLAudioSample test_sample2 = 13; - - AudioBuffer test_input1(&test_sample1, 1, AudioFormat::MONO()); - AudioBuffer test_input2(&test_sample2, 1, AudioFormat::MONO()); - AudioBuffer test_output(1, AudioFormat::MONO()); - AudioBuffer test_output_large(100, AudioFormat::MONO()); - - // put by MainBuffer::DEFAULT_ID get by test_id without preleminary put - CPPUNIT_ASSERT(mainbuffer_->availableForGet(test_id) == 0); - CPPUNIT_ASSERT(mainbuffer_->getAvailableData(test_output, test_id) == 0); - - // put by MainBuffer::DEFAULT_ID, get by test_id - mainRingBuffer->put(test_input1); - CPPUNIT_ASSERT(mainbuffer_->availableForGet(test_id) == 1); - - // get by MainBuffer::DEFAULT_ID without preliminary input - CPPUNIT_ASSERT(mainbuffer_->availableForGet(test_id) == 0); - CPPUNIT_ASSERT(mainbuffer_->getData(test_output_large, test_id) == 0); - - // put by test_id get by test_id - testRingBuffer->put(test_input2); - CPPUNIT_ASSERT(mainbuffer_->availableForGet(test_id) == 1); - CPPUNIT_ASSERT(mainbuffer_->getData(test_output_large, test_id) == 1); - CPPUNIT_ASSERT(mainbuffer_->availableForGet(test_id) == 0); - CPPUNIT_ASSERT((*test_output_large.getChannel(0))[0] == test_sample2); - - // get by false id - CPPUNIT_ASSERT(mainbuffer_->getData(test_output_large, false_id) == 0); - - mainbuffer_->unBindCallID(test_id, MainBuffer::DEFAULT_ID); -} - -void MainBufferTest::testDiscardFlush() -{ - TITLE(); - std::string test_id = "flush discard"; - - auto mainRingBuffer = mainbuffer_->getRingBuffer(MainBuffer::DEFAULT_ID); - auto testRingBuffer = mainbuffer_->createRingBuffer(test_id); - - mainbuffer_->bindCallID(test_id, MainBuffer::DEFAULT_ID); - - SFLAudioSample test_sample1 = 12; - AudioBuffer test_input1(&test_sample1, 1, AudioFormat::MONO()); - - testRingBuffer->put(test_input1); - mainbuffer_->discard(1, MainBuffer::DEFAULT_ID); - - mainbuffer_->discard(1, test_id); - - mainRingBuffer->put(test_input1); - - mainbuffer_->discard(1, test_id); - - mainbuffer_->unBindCallID(test_id, MainBuffer::DEFAULT_ID); -} - -void MainBufferTest::testConference() -{ - TITLE(); - - std::string test_id1 = "participant A"; - std::string test_id2 = "participant B"; - - auto mainRingBuffer = mainbuffer_->getRingBuffer(MainBuffer::DEFAULT_ID); - auto testRingBuffer1 = mainbuffer_->createRingBuffer(test_id1); - auto testRingBuffer2 = mainbuffer_->createRingBuffer(test_id2); - - // test bind Participant A with default - mainbuffer_->bindCallID(test_id1, MainBuffer::DEFAULT_ID); - - // test bind Participant B with default - mainbuffer_->bindCallID(test_id2, MainBuffer::DEFAULT_ID); - - // test bind Participant A with Participant B - mainbuffer_->bindCallID(test_id1, test_id2); - - SFLAudioSample testint = 12; - AudioBuffer testbuf(&testint, 1, AudioFormat::MONO()); - - // put data test ring buffers - mainRingBuffer->put(testbuf); - - // put data test ring buffers - testRingBuffer1->put(testbuf); - testRingBuffer2->put(testbuf); -} - -MainBufferTest::MainBufferTest() : CppUnit::TestCase("Audio Layer Tests"), mainbuffer_(new MainBuffer) {} diff --git a/daemon/test/ringbufferpooltest.cpp b/daemon/test/ringbufferpooltest.cpp new file mode 100644 index 0000000000000000000000000000000000000000..94bc01057a2545c9db4109a5ecfbb79362ef1fe3 --- /dev/null +++ b/daemon/test/ringbufferpooltest.cpp @@ -0,0 +1,219 @@ +/* + * Copyright (C) 2004-2013 Savoir-Faire Linux Inc. + * Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Additional permission under GNU GPL version 3 section 7: + * + * If you modify this program, or any covered work, by linking or + * combining it with the OpenSSL project's OpenSSL library (or a + * modified version of that library), containing parts covered by the + * terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc. + * grants you additional permission to convey the resulting work. + * Corresponding Source for a non-source form of such a combination + * shall include the source code for the parts of OpenSSL used as well + * as that of the covered work. + */ + +#include <string> +#include <memory> + +#include "ringbufferpooltest.h" +#include "audio/ringbufferpool.h" +#include "audio/ringbuffer.h" +#include "logger.h" +#include "test_utils.h" + +void RingBufferPoolTest::testBindUnbindBuffer() +{ + TITLE(); + + std::string test_id1 = "bind unbind 1"; + std::string test_id2 = "bind unbind 2"; + + // bind test_id1 with RingBufferPool::DEFAULT_ID (test_id1 not already created) + rbPool_->bindCallID(test_id1, RingBufferPool::DEFAULT_ID); + + // unbind test_id1 with RingBufferPool::DEFAULT_ID + rbPool_->unBindCallID(test_id1, RingBufferPool::DEFAULT_ID); + + rbPool_->bindCallID(test_id1, RingBufferPool::DEFAULT_ID); + rbPool_->bindCallID(test_id1, RingBufferPool::DEFAULT_ID); + + rbPool_->bindCallID(test_id2, RingBufferPool::DEFAULT_ID); + rbPool_->bindCallID(test_id2, RingBufferPool::DEFAULT_ID); + + // bind test_id1 with test_id2 (both testid1 and test_id2 already created) + // calling it twice not supposed to break anything + rbPool_->bindCallID(test_id1, test_id2); + rbPool_->bindCallID(test_id1, test_id2); + + rbPool_->unBindCallID(test_id1, test_id2); + rbPool_->unBindCallID(test_id1, test_id2); + + rbPool_->unBindCallID(RingBufferPool::DEFAULT_ID, test_id2); + rbPool_->unBindCallID(RingBufferPool::DEFAULT_ID, test_id2); + + rbPool_->unBindCallID(RingBufferPool::DEFAULT_ID, test_id1); + + // test unbind all function + rbPool_->bindCallID(RingBufferPool::DEFAULT_ID, test_id1); + rbPool_->bindCallID(RingBufferPool::DEFAULT_ID, test_id2); + rbPool_->bindCallID(test_id1, test_id2); + + rbPool_->unBindAll(test_id2); +} + +void RingBufferPoolTest::testGetPutData() +{ + TITLE(); + + std::string test_id = "incoming rtp session"; + + auto mainRingBuffer = rbPool_->getRingBuffer(RingBufferPool::DEFAULT_ID); + auto testRingBuffer = rbPool_->createRingBuffer(test_id); + + rbPool_->bindCallID(test_id, RingBufferPool::DEFAULT_ID); + + SFLAudioSample test_sample1 = 12; + SFLAudioSample test_sample2 = 13; + + AudioBuffer test_input1(&test_sample1, 1, AudioFormat::MONO()); + AudioBuffer test_input2(&test_sample2, 1, AudioFormat::MONO()); + AudioBuffer test_output(100, AudioFormat::MONO()); + + // get by test_id without preleminary put + CPPUNIT_ASSERT(rbPool_->getData(test_output, test_id) == 0); + + // put by RingBufferPool::DEFAULT_ID, get by test_id + mainRingBuffer->put(test_input1); + CPPUNIT_ASSERT(rbPool_->getData(test_output, test_id) == 1); + CPPUNIT_ASSERT(test_sample1 == (*test_output.getChannel(0))[0]); + + // get by RingBufferPool::DEFAULT_ID without preleminary put + CPPUNIT_ASSERT(rbPool_->getData(test_output, RingBufferPool::DEFAULT_ID) == 0); + + // put by test_id, get by RingBufferPool::DEFAULT_ID + testRingBuffer->put(test_input2); + CPPUNIT_ASSERT(rbPool_->getData(test_output, RingBufferPool::DEFAULT_ID) == 1); + CPPUNIT_ASSERT(test_sample2 == (*test_output.getChannel(0))[0]); + + rbPool_->unBindCallID(test_id, RingBufferPool::DEFAULT_ID); +} + +void RingBufferPoolTest::testGetAvailableData() +{ + TITLE(); + std::string test_id = "getData putData"; + std::string false_id = "false id"; + + auto mainRingBuffer = rbPool_->getRingBuffer(RingBufferPool::DEFAULT_ID); + auto testRingBuffer = rbPool_->createRingBuffer(test_id); + + rbPool_->bindCallID(test_id, RingBufferPool::DEFAULT_ID); + + SFLAudioSample test_sample1 = 12; + SFLAudioSample test_sample2 = 13; + + AudioBuffer test_input1(&test_sample1, 1, AudioFormat::MONO()); + AudioBuffer test_input2(&test_sample2, 1, AudioFormat::MONO()); + AudioBuffer test_output(1, AudioFormat::MONO()); + AudioBuffer test_output_large(100, AudioFormat::MONO()); + + // put by RingBufferPool::DEFAULT_ID get by test_id without preleminary put + CPPUNIT_ASSERT(rbPool_->availableForGet(test_id) == 0); + CPPUNIT_ASSERT(rbPool_->getAvailableData(test_output, test_id) == 0); + + // put by RingBufferPool::DEFAULT_ID, get by test_id + mainRingBuffer->put(test_input1); + CPPUNIT_ASSERT(rbPool_->availableForGet(test_id) == 1); + + // get by RingBufferPool::DEFAULT_ID without preliminary input + CPPUNIT_ASSERT(rbPool_->availableForGet(test_id) == 0); + CPPUNIT_ASSERT(rbPool_->getData(test_output_large, test_id) == 0); + + // put by test_id get by test_id + testRingBuffer->put(test_input2); + CPPUNIT_ASSERT(rbPool_->availableForGet(test_id) == 1); + CPPUNIT_ASSERT(rbPool_->getData(test_output_large, test_id) == 1); + CPPUNIT_ASSERT(rbPool_->availableForGet(test_id) == 0); + CPPUNIT_ASSERT((*test_output_large.getChannel(0))[0] == test_sample2); + + // get by false id + CPPUNIT_ASSERT(rbPool_->getData(test_output_large, false_id) == 0); + + rbPool_->unBindCallID(test_id, RingBufferPool::DEFAULT_ID); +} + +void RingBufferPoolTest::testDiscardFlush() +{ + TITLE(); + std::string test_id = "flush discard"; + + auto mainRingBuffer = rbPool_->getRingBuffer(RingBufferPool::DEFAULT_ID); + auto testRingBuffer = rbPool_->createRingBuffer(test_id); + + rbPool_->bindCallID(test_id, RingBufferPool::DEFAULT_ID); + + SFLAudioSample test_sample1 = 12; + AudioBuffer test_input1(&test_sample1, 1, AudioFormat::MONO()); + + testRingBuffer->put(test_input1); + rbPool_->discard(1, RingBufferPool::DEFAULT_ID); + + rbPool_->discard(1, test_id); + + mainRingBuffer->put(test_input1); + + rbPool_->discard(1, test_id); + + rbPool_->unBindCallID(test_id, RingBufferPool::DEFAULT_ID); +} + +void RingBufferPoolTest::testConference() +{ + TITLE(); + + std::string test_id1 = "participant A"; + std::string test_id2 = "participant B"; + + auto mainRingBuffer = rbPool_->getRingBuffer(RingBufferPool::DEFAULT_ID); + auto testRingBuffer1 = rbPool_->createRingBuffer(test_id1); + auto testRingBuffer2 = rbPool_->createRingBuffer(test_id2); + + // test bind Participant A with default + rbPool_->bindCallID(test_id1, RingBufferPool::DEFAULT_ID); + + // test bind Participant B with default + rbPool_->bindCallID(test_id2, RingBufferPool::DEFAULT_ID); + + // test bind Participant A with Participant B + rbPool_->bindCallID(test_id1, test_id2); + + SFLAudioSample testint = 12; + AudioBuffer testbuf(&testint, 1, AudioFormat::MONO()); + + // put data test ring buffers + mainRingBuffer->put(testbuf); + + // put data test ring buffers + testRingBuffer1->put(testbuf); + testRingBuffer2->put(testbuf); +} + +RingBufferPoolTest::RingBufferPoolTest() + : CppUnit::TestCase("Audio Layer Tests") , rbPool_(new RingBufferPool) +{} diff --git a/daemon/test/mainbuffertest.h b/daemon/test/ringbufferpooltest.h similarity index 83% rename from daemon/test/mainbuffertest.h rename to daemon/test/ringbufferpooltest.h index ee342c118459e8493aa65993a94faae95ac1925f..68d798f5c2306fd6e6ca0fd4c05c8b2d9953d54e 100644 --- a/daemon/test/mainbuffertest.h +++ b/daemon/test/ringbufferpooltest.h @@ -28,8 +28,8 @@ * as that of the covered work. */ -#ifndef MAINBUFFER_TEST_ -#define MAINBUFFER_TEST_ +#ifndef RINGBUFFERPOOL_TEST_ +#define RINGBUFFERPOOL_TEST_ // Cppunit import #include <cppunit/extensions/HelperMacros.h> @@ -39,18 +39,19 @@ #include <memory> -class MainBuffer; +class RingBufferPool; + /* * @file audiorecorderTest.cpp * @brief Regroups unit tests related to the main buffer. */ -class MainBufferTest : public CppUnit::TestCase { +class RingBufferPoolTest : public CppUnit::TestCase { /* * Use cppunit library macros to add unit test the factory */ - CPPUNIT_TEST_SUITE(MainBufferTest); + CPPUNIT_TEST_SUITE(RingBufferPoolTest); CPPUNIT_TEST(testBindUnbindBuffer); CPPUNIT_TEST(testGetPutData); CPPUNIT_TEST(testDiscardFlush); @@ -59,7 +60,7 @@ class MainBufferTest : public CppUnit::TestCase { public: - MainBufferTest(); + RingBufferPoolTest(); void testBindUnbindBuffer(); @@ -73,11 +74,11 @@ class MainBufferTest : public CppUnit::TestCase { private: - std::unique_ptr<MainBuffer> mainbuffer_; + std::unique_ptr<RingBufferPool> rbPool_; }; /* Register our test module */ -CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(MainBufferTest, "MainBufferTest"); -CPPUNIT_TEST_SUITE_REGISTRATION(MainBufferTest); +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(RingBufferPoolTest, "RingBufferPoolTest"); +CPPUNIT_TEST_SUITE_REGISTRATION(RingBufferPoolTest); -#endif // MAINBUFFER_TEST_ +#endif // RINGBUFFERPOOL_TEST_