// Handles the UNMANAGE message. // Returns TRUE if the message was handled, otherwise FALSE. UtlBoolean MpMediaTask::handleUnmanage(MpFlowGraphBase* pFlowGraph) { OsLock lock(mMutex); UtlBoolean found; OsStatus res; if (pFlowGraph == mpFocus) handleSetFocus(NULL); if (!isManagedFlowGraph(pFlowGraph)) { return FALSE; // flow graph is not presently managed, return FALSE } if (pFlowGraph->getState() != MpFlowGraphBase::STOPPED) { handleStop(pFlowGraph); // since we have "unmanaged" this flow graph, we need to coerce the // flow graph into processing its messages so that it gets the // indication that it has been stopped. res = pFlowGraph->processNextFrame(); assert(res == OS_SUCCESS); } UtlPtr<MpFlowGraphBase> ptr(pFlowGraph); // deletes the old UtlPtr we allocated earlier found = mManagedFlowGraphs.destroy(&ptr); return found; }
// Handle an incoming message // Return TRUE if the message was handled, otherwise FALSE. UtlBoolean MpMediaTask::handleMessage(OsMsg& rMsg) { UtlBoolean handled; MpFlowGraphBase* pFlowGraph; MpMediaTaskMsg* pMsg; if (rMsg.getMsgType() != OsMsg::MP_TASK_MSG) return FALSE; // the method only handles MP_TASK_MSG messages pMsg = (MpMediaTaskMsg*) &rMsg; pFlowGraph = (MpFlowGraphBase*) pMsg->getPtr1(); handled = TRUE; // until proven otherwise, assume we'll handle the msg switch (pMsg->getMsg()) { case MpMediaTaskMsg::MANAGE: { OsEvent* event = (OsEvent*)pMsg->getPtr2(); if (!handleManage(pFlowGraph)) mHandleMsgErrs++; if (event) event->signal(0); break; } case MpMediaTaskMsg::SET_FOCUS: if (!handleSetFocus(pFlowGraph)) mHandleMsgErrs++; break; case MpMediaTaskMsg::START: if (!handleStart(pFlowGraph)) mHandleMsgErrs++; break; case MpMediaTaskMsg::STOP: if (!handleStop(pFlowGraph)) mHandleMsgErrs++; break; case MpMediaTaskMsg::UNMANAGE: { OsEvent* event = (OsEvent*)pMsg->getPtr2(); if (!handleUnmanage(pFlowGraph)) mHandleMsgErrs++; if (event) event->signal(0); break; } case MpMediaTaskMsg::WAIT_FOR_SIGNAL: if (!handleWaitForSignal(pMsg)) mHandleMsgErrs++; break; default: handled = FALSE; // we didn't handle the message after all break; } return handled; }
// Handles the UNMANAGE message. // Returns TRUE if the message was handled, otherwise FALSE. UtlBoolean MpMediaTask::handleUnmanage(MpFlowGraphBase* pFlowGraph) { OsLock lock(mMutex); UtlBoolean found; int i; OsStatus res; if (pFlowGraph == mpFocus) handleSetFocus(NULL); if (!isManagedFlowGraph(pFlowGraph)) { return FALSE; // flow graph is not presently managed, return FALSE } if (pFlowGraph->getState() != MpFlowGraphBase::STOPPED) { handleStop(pFlowGraph); // since we have "unmanaged" this flow graph, we need to coerce the // flow graph into processing its messages so that it gets the // indication that it has been stopped. res = pFlowGraph->processNextFrame(); assert(res == OS_SUCCESS); } found = FALSE; for (i=0; i < mManagedCnt; i++) { if (found) { // compact the managed flow graphs array mManagedFGs[i-1] = mManagedFGs[i]; } if (mManagedFGs[i] == pFlowGraph) { // PRINTF("MpMediaTask::handleUnmanage: Removing flow graph # %d!\n", i, 0,0,0,0,0); found = TRUE; mManagedFGs[i] = NULL; } } if (!found) { // we aren't managing this flow graph, return FALSE; // return FALSE } mManagedCnt--; return TRUE; }
// Handles the STOP message. // Returns TRUE if the message was handled, otherwise FALSE. UtlBoolean MpMediaTask::handleStop(MpFlowGraphBase* pFlowGraph) { OsStatus res; if (pFlowGraph == mpFocus) handleSetFocus(NULL); if (!isManagedFlowGraph(pFlowGraph)) return FALSE; // flow graph is not presently managed, return FALSE if (pFlowGraph->getState() == MpFlowGraphBase::STOPPED) return FALSE; // if already stopped, return FALSE res = pFlowGraph->stop(); assert(res == OS_SUCCESS); mStartedCnt--; return TRUE; }
// Handle an incoming message // Return TRUE if the message was handled, otherwise FALSE. UtlBoolean MpMediaTask::handleMessage(OsMsg& rMsg) { UtlBoolean handled; MpFlowGraphBase* pFlowGraph; MpMediaTaskMsg* pMsg; if (rMsg.getMsgType() != OsMsg::MP_TASK_MSG) return FALSE; // the method only handles MP_TASK_MSG messages pMsg = (MpMediaTaskMsg*) &rMsg; pFlowGraph = (MpFlowGraphBase*) pMsg->getPtr1(); handled = TRUE; // until proven otherwise, assume we'll handle the msg #ifdef _PROFILE /* [ */ // Log the time it takes to handle messages other than WAIT_FOR_SIGNAL. long long start_time; if (pMsg->getMsg() != MpMediaTaskMsg::WAIT_FOR_SIGNAL) { timeval t; gettimeofday(&t, NULL); start_time = (t.tv_sec * 1000000) + t.tv_usec; } #endif /* _PROFILE ] */ if (getMessageQueue()->numMsgs() > 100) { OsSysLog::add(FAC_SIP, PRI_DEBUG, "MpMediaTask::handleMessage msgType = %d, " "queue length = %d", pMsg->getMsg(), getMessageQueue()->numMsgs()); } switch (pMsg->getMsg()) { case MpMediaTaskMsg::MANAGE: if (!handleManage(pFlowGraph)) mHandleMsgErrs++; break; case MpMediaTaskMsg::SET_FOCUS: if (!handleSetFocus(pFlowGraph)) mHandleMsgErrs++; break; case MpMediaTaskMsg::START: if (!handleStart(pFlowGraph)) mHandleMsgErrs++; break; case MpMediaTaskMsg::STOP: if (!handleStop(pFlowGraph)) mHandleMsgErrs++; break; case MpMediaTaskMsg::UNMANAGE: if (!handleUnmanage(pFlowGraph)) mHandleMsgErrs++; break; case MpMediaTaskMsg::WAIT_FOR_SIGNAL: if (!handleWaitForSignal(pMsg)) mHandleMsgErrs++; break; default: handled = FALSE; // we didn't handle the message after all break; } #ifdef _PROFILE /* [ */ // Log the time it takes to handle messages other than WAIT_FOR_SIGNAL. if (pMsg->getMsg() != MpMediaTaskMsg::WAIT_FOR_SIGNAL) { timeval t; gettimeofday(&t, NULL); long long end_time = (t.tv_sec * 1000000) + t.tv_usec; mOtherMessages.tally(end_time - start_time); } #endif /* _PROFILE ] */ return handled; }