- new sync primitive - memory blocks queue
- better audio buffer management in AQuA wrapper
This commit is contained in:
parent
b6400b6f81
commit
a6535bdb97
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue