📄 mpflowgraphtest.cpp
字号:
// buffer on input port 3 will be discarded to make way for a new buffer.
MpFlowGraphBase* pFlowGraph = 0;
MpTestResource* pResource1 = 0;
MpTestResource* pResource2 = 0;
OsStatus res;
mpStartUp(8000, 80, 6*10, 0);
pFlowGraph = new MpFlowGraphBase(80, 8000);
pResource1 = new MpTestResource("resource1", 4, 4, 4, 4);
pResource2 = new MpTestResource("resource2", 4, 4, 4, 4);
res = pFlowGraph->addResource(*pResource1);
CPPUNIT_ASSERT(res == OS_SUCCESS);
res = pFlowGraph->addResource(*pResource2);
CPPUNIT_ASSERT(res == OS_SUCCESS);
res = pFlowGraph->addLink(*pResource1, 0, *pResource2, 0);
CPPUNIT_ASSERT(res == OS_SUCCESS);
res = pFlowGraph->addLink(*pResource1, 1, *pResource2, 1);
CPPUNIT_ASSERT(res == OS_SUCCESS);
res = pFlowGraph->addLink(*pResource1, 2, *pResource2, 2);
CPPUNIT_ASSERT(res == OS_SUCCESS);
res = pFlowGraph->addLink(*pResource1, 3, *pResource2, 3);
CPPUNIT_ASSERT(res == OS_SUCCESS);
// For resource1, create new buffers on output ports 0, 2 and 3 and
// ignore all input buffers (Note: there shouldn't be any)
pResource1->setGenOutBufMask(0xd);
pResource1->setProcessInBufMask(0x0);
// For resource2, process input buffers that arrive input ports 0, 1 and 2.
pResource2->setGenOutBufMask(0x0);
pResource2->setProcessInBufMask(0x7);
CPPUNIT_ASSERT(pResource1->numFramesProcessed() == 0);
CPPUNIT_ASSERT(pResource2->numFramesProcessed() == 0);
// Enable the flow graph
res = pFlowGraph->enable();
CPPUNIT_ASSERT(res == OS_SUCCESS);
// Start the flow graph
res = pFlowGraph->start();
CPPUNIT_ASSERT(res == OS_SUCCESS);
// Process two frames
res = pFlowGraph->processNextFrame();
CPPUNIT_ASSERT(res == OS_SUCCESS);
res = pFlowGraph->processNextFrame();
CPPUNIT_ASSERT(res == OS_SUCCESS);
for (int i = 0; i < 3; i++)
{
CPPUNIT_ASSERT((pResource1->mLastDoProcessArgs.inBufs[i] == NULL) &&
(pResource1->mLastDoProcessArgs.outBufs[i] == NULL) &&
(pResource2->mLastDoProcessArgs.inBufs[i] == NULL) &&
(pResource2->mLastDoProcessArgs.outBufs[i] == NULL));
}
CPPUNIT_ASSERT((pResource1->numFramesProcessed() == 2) &&
(pResource1->mLastDoProcessArgs.inBufsSize == 4) &&
(pResource1->mLastDoProcessArgs.outBufsSize == 4) &&
(pResource2->numFramesProcessed() == 2));
// Stop the flow graph
res = pFlowGraph->stop();
CPPUNIT_ASSERT(res == OS_SUCCESS);
// Request processing of another frame so that the STOP_FLOWGRAPH
// message gets handled
res = pFlowGraph->processNextFrame();
CPPUNIT_ASSERT(res == OS_SUCCESS);
delete pFlowGraph;
}
void testSamplesPerFrameAndSec()
{
MpFlowGraphBase* pFlowGraph = 0;
MpTestResource* pResource1 = 0;
OsStatus res;
pFlowGraph = new MpFlowGraphBase(80, 8000);
pResource1 = new MpTestResource("test1", 2, 2, 2, 2);
CPPUNIT_ASSERT_EQUAL(80, pFlowGraph->getSamplesPerFrame());
CPPUNIT_ASSERT_EQUAL(8000, pFlowGraph->getSamplesPerSec());
res = pFlowGraph->addResource(*pResource1);
CPPUNIT_ASSERT(res == OS_SUCCESS);
// Call processFrame() on the resource and look at the initial settings
pResource1->processFrame();
CPPUNIT_ASSERT_EQUAL(80, pResource1->mLastDoProcessArgs.samplesPerFrame);
CPPUNIT_ASSERT_EQUAL(8000, pResource1->mLastDoProcessArgs.samplesPerSecond);
res = pFlowGraph->setSamplesPerFrame(160);
CPPUNIT_ASSERT(res == OS_SUCCESS);
res = pFlowGraph->setSamplesPerSec(32000);
CPPUNIT_ASSERT(res == OS_SUCCESS);
CPPUNIT_ASSERT_EQUAL(160, pFlowGraph->getSamplesPerFrame());
CPPUNIT_ASSERT_EQUAL(32000, pFlowGraph->getSamplesPerSec());
// Call processFrame() on the resource and look at the revised settings
pResource1->processFrame();
CPPUNIT_ASSERT_EQUAL(160, pResource1->mLastDoProcessArgs.samplesPerFrame);
CPPUNIT_ASSERT_EQUAL(32000, pResource1->mLastDoProcessArgs.samplesPerSecond);
delete pFlowGraph;
}
void testStartAndStop()
{
MpFlowGraphBase* pFlowGraph = 0;
OsStatus res;
pFlowGraph = new MpFlowGraphBase(80, 8000);
CPPUNIT_ASSERT(!pFlowGraph->isStarted()); // verify the flow graph is not STARTED
CPPUNIT_ASSERT(MpFlowGraphBase::STOPPED == pFlowGraph->getState());
res = pFlowGraph->start(); // now start it
CPPUNIT_ASSERT(res == OS_SUCCESS);
res = pFlowGraph->processNextFrame();
CPPUNIT_ASSERT((res == OS_SUCCESS) && pFlowGraph->isStarted());
CPPUNIT_ASSERT(MpFlowGraphBase::STARTED == pFlowGraph->getState());
res = pFlowGraph->stop(); // now stop it again
CPPUNIT_ASSERT(res == OS_SUCCESS);
res = pFlowGraph->processNextFrame();
CPPUNIT_ASSERT((res == OS_SUCCESS) && !pFlowGraph->isStarted());
CPPUNIT_ASSERT(MpFlowGraphBase::STOPPED == pFlowGraph->getState());
delete pFlowGraph;
}
// lookupResource(), numLinks(), numFramesProcessed() and numResources()
void testAccessors()
{
MpFlowGraphBase* pFlowGraph = 0;
MpTestResource* pResource1 = 0;
MpTestResource* pResource2 = 0;
MpResource* pLookupRes = 0;
OsStatus res;
pFlowGraph = new MpFlowGraphBase(80, 8000);
CPPUNIT_ASSERT(pFlowGraph->numResources() == 0);
CPPUNIT_ASSERT(pFlowGraph->numLinks() == 0);
CPPUNIT_ASSERT(pFlowGraph->numFramesProcessed() == 0);
pResource1 = new MpTestResource("resource1", 4, 4, 4, 4);
pResource2 = new MpTestResource("resource2", 4, 4, 4, 4);
res = pFlowGraph->addResource(*pResource1);
CPPUNIT_ASSERT((res == OS_SUCCESS) && (pFlowGraph->numResources() == 1));
res = pFlowGraph->addResource(*pResource2);
CPPUNIT_ASSERT((res == OS_SUCCESS) && (pFlowGraph->numResources() == 2));
res = pFlowGraph->lookupResource("resource1", pLookupRes);
CPPUNIT_ASSERT((res == OS_SUCCESS) && (pLookupRes == pResource1));
res = pFlowGraph->lookupResource("resource2", pLookupRes);
CPPUNIT_ASSERT((res == OS_SUCCESS) && (pLookupRes == pResource2));
res = pFlowGraph->lookupResource("unknown", pLookupRes);
CPPUNIT_ASSERT(res == OS_NOT_FOUND);
res = pFlowGraph->addLink(*pResource1, 0, *pResource2, 0);
CPPUNIT_ASSERT((res == OS_SUCCESS) && (pFlowGraph->numLinks() == 1));
res = pFlowGraph->addLink(*pResource1, 1, *pResource2, 1);
CPPUNIT_ASSERT((res == OS_SUCCESS) && (pFlowGraph->numLinks() == 2));
res = pFlowGraph->processNextFrame();
CPPUNIT_ASSERT((res == OS_SUCCESS) && (pFlowGraph->numFramesProcessed() == 1));
res = pFlowGraph->processNextFrame();
CPPUNIT_ASSERT((res == OS_SUCCESS) && (pFlowGraph->numFramesProcessed() == 2));
res = pFlowGraph->removeLink(*pResource1, 0);
CPPUNIT_ASSERT((res == OS_SUCCESS) && (pFlowGraph->numLinks() == 1));
res = pFlowGraph->removeLink(*pResource1, 1);
CPPUNIT_ASSERT((res == OS_SUCCESS) && (pFlowGraph->numLinks() == 0));
res = pFlowGraph->removeResource(*pResource2);
CPPUNIT_ASSERT((res == OS_SUCCESS) && (pFlowGraph->numResources() == 1));
res = pFlowGraph->removeResource(*pResource1);
CPPUNIT_ASSERT((res == OS_SUCCESS) && (pFlowGraph->numResources() == 0));
delete pResource1;
delete pResource2;
delete pFlowGraph;
}
};
CPPUNIT_TEST_SUITE_REGISTRATION(MpFlowGraphTest);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -