- new sync primitive - memory blocks queue

- better audio buffer management in AQuA wrapper
This commit is contained in:
Dmytro Bogovych 2018-07-13 14:26:53 +03:00
parent b6400b6f81
commit a6535bdb97
3 changed files with 47 additions and 12 deletions

View File

@ -104,19 +104,23 @@ void BufferQueue::push(const void* data, int bytes)
b->resize(bytes); b->resize(bytes);
memcpy(b->data(), data, bytes); memcpy(b->data(), data, bytes);
mBlockList.push_back(b); mBlockList.push_back(b);
mSignal.notify_all();
} }
BufferQueue::Block BufferQueue::pull(std::chrono::milliseconds timeout) BufferQueue::Block BufferQueue::pull(std::chrono::milliseconds timeout)
{ {
std::unique_lock<std::mutex> l(mMutex); std::unique_lock<std::mutex> 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); status = mSignal.wait_for(l, timeout);
Block r; Block r;
if (status == std::cv_status::no_timeout) if (status == std::cv_status::no_timeout)
r = mBlockList.front(); mBlockList.erase(mBlockList.begin()); {
r = mBlockList.front();
mBlockList.erase(mBlockList.begin());
}
return r; return r;
} }

View File

@ -669,20 +669,20 @@ SevanaAqua::CompareResult SevanaAqua::compare(AudioBuffer& reference, AudioBuffe
std::unique_lock<std::mutex> l(mMutex); std::unique_lock<std::mutex> l(mMutex);
if (!mContext) if (!mContext || !reference.isInitialized() || !test.isInitialized())
return r; return r;
// Make analysis // Make analysis
TSSA_AQuA_AudioData aad; TSSA_AQuA_AudioData aad;
aad.dSrcData.dNChannels = reference.mChannels; aad.dSrcData.dNChannels = reference.mChannels;
aad.dSrcData.dSampleRate = reference.mRate; aad.dSrcData.dSampleRate = reference.mRate;
aad.dSrcData.pSamples = (short*)reference.mData; aad.dSrcData.pSamples = (short*)reference.mData->data();
aad.dSrcData.dNSamples = (long)reference.mSize / 2 / reference.mChannels; aad.dSrcData.dNSamples = (long)reference.mData->size() / 2 / reference.mChannels;
aad.dTstData.dNChannels = test.mChannels; aad.dTstData.dNChannels = test.mChannels;
aad.dTstData.dSampleRate = test.mRate; aad.dTstData.dSampleRate = test.mRate;
aad.dTstData.pSamples = (short*)test.mData; aad.dTstData.pSamples = (short*)test.mData->data();
aad.dTstData.dNSamples = (long)test.mSize / 2 / test.mChannels; aad.dTstData.dNSamples = (long)test.mData->size() / 2 / test.mChannels;
int rescode; int rescode;
rescode = SSA_OnTestAudioData(mContext, &aad); rescode = SSA_OnTestAudioData(mContext, &aad);

View File

@ -164,10 +164,41 @@ namespace MT
// Report is returned in JSON format // Report is returned in JSON format
struct AudioBuffer struct AudioBuffer
{ {
int mRate = 8000; AudioBuffer()
int mChannels = 1; {}
void* mData = nullptr;
int mSize = 0; // In bytes AudioBuffer(int size)
{
mData = std::make_shared<std::vector<unsigned char>>();
mData->resize(size);
}
AudioBuffer(const void* data, int size)
{
mData = std::make_shared<std::vector<unsigned char>>();
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<std::vector<unsigned char>> mData;
bool isInitialized() const { return mRate > 0 && mChannels > 0 && mData; }
}; };