From a6535bdb97fb8191677588dbffa089c4ee3ac2c0 Mon Sep 17 00:00:00 2001 From: Dmytro Bogovych Date: Fri, 13 Jul 2018 14:26:53 +0300 Subject: [PATCH] - new sync primitive - memory blocks queue - better audio buffer management in AQuA wrapper --- src/engine/helper/HL_Sync.cpp | 10 +++++--- src/engine/media/MT_SevanaMos.cpp | 10 ++++---- src/engine/media/MT_SevanaMos.h | 39 +++++++++++++++++++++++++++---- 3 files changed, 47 insertions(+), 12 deletions(-) diff --git a/src/engine/helper/HL_Sync.cpp b/src/engine/helper/HL_Sync.cpp index e2d5634b..4bb1d608 100644 --- a/src/engine/helper/HL_Sync.cpp +++ b/src/engine/helper/HL_Sync.cpp @@ -104,19 +104,23 @@ void BufferQueue::push(const void* data, int bytes) b->resize(bytes); memcpy(b->data(), data, bytes); mBlockList.push_back(b); + mSignal.notify_all(); } BufferQueue::Block BufferQueue::pull(std::chrono::milliseconds timeout) { std::unique_lock l(mMutex); - std::cv_status status = std::cv_status::no_timeout; + std::cv_status status = mBlockList.empty() ? std::cv_status::timeout : std::cv_status::no_timeout; - while (mBlockList.empty() && status == std::cv_status::no_timeout) + while (mBlockList.empty() && status == std::cv_status::timeout) status = mSignal.wait_for(l, timeout); Block r; if (status == std::cv_status::no_timeout) - r = mBlockList.front(); mBlockList.erase(mBlockList.begin()); + { + r = mBlockList.front(); + mBlockList.erase(mBlockList.begin()); + } return r; } diff --git a/src/engine/media/MT_SevanaMos.cpp b/src/engine/media/MT_SevanaMos.cpp index 6994c08f..3cc3bd54 100644 --- a/src/engine/media/MT_SevanaMos.cpp +++ b/src/engine/media/MT_SevanaMos.cpp @@ -669,20 +669,20 @@ SevanaAqua::CompareResult SevanaAqua::compare(AudioBuffer& reference, AudioBuffe std::unique_lock l(mMutex); - if (!mContext) + if (!mContext || !reference.isInitialized() || !test.isInitialized()) return r; // Make analysis TSSA_AQuA_AudioData aad; aad.dSrcData.dNChannels = reference.mChannels; aad.dSrcData.dSampleRate = reference.mRate; - aad.dSrcData.pSamples = (short*)reference.mData; - aad.dSrcData.dNSamples = (long)reference.mSize / 2 / reference.mChannels; + aad.dSrcData.pSamples = (short*)reference.mData->data(); + aad.dSrcData.dNSamples = (long)reference.mData->size() / 2 / reference.mChannels; aad.dTstData.dNChannels = test.mChannels; aad.dTstData.dSampleRate = test.mRate; - aad.dTstData.pSamples = (short*)test.mData; - aad.dTstData.dNSamples = (long)test.mSize / 2 / test.mChannels; + aad.dTstData.pSamples = (short*)test.mData->data(); + aad.dTstData.dNSamples = (long)test.mData->size() / 2 / test.mChannels; int rescode; rescode = SSA_OnTestAudioData(mContext, &aad); diff --git a/src/engine/media/MT_SevanaMos.h b/src/engine/media/MT_SevanaMos.h index c83f43b6..dd66620b 100644 --- a/src/engine/media/MT_SevanaMos.h +++ b/src/engine/media/MT_SevanaMos.h @@ -164,10 +164,41 @@ namespace MT // Report is returned in JSON format struct AudioBuffer { - int mRate = 8000; - int mChannels = 1; - void* mData = nullptr; - int mSize = 0; // In bytes + AudioBuffer() + {} + + AudioBuffer(int size) + { + mData = std::make_shared>(); + mData->resize(size); + } + + AudioBuffer(const void* data, int size) + { + mData = std::make_shared>(); + mData->resize(size); + memcpy(mData->data(), data, size); + } + + void* data() + { + return mData ? mData->data() : nullptr; + } + + const void* data() const + { + return mData ? mData->data() : nullptr; + } + + int size() const + { + return mData ? mData->size() : 0; + } + + int mRate = 8000; + int mChannels = 1; + std::shared_ptr> mData; + bool isInitialized() const { return mRate > 0 && mChannels > 0 && mData; } };