MyHandler.h中RTSP流的连接

  MyHandler向外部提供了一个接口connect来完成RTSP流的连接。
  下面贴出安卓N版本MyHandler::connect原文:
  

    void connect() { 
        //下面是注册两个handler,mConn(sp<ARTSPConnection>)和mRTPConn(sp<ARTPConnection>)
        //注册后mConn这个handler与looper()得到的looper绑定在一起
        //mRTPConn这个handler与mNetLooper这个looper绑定在一起
        looper()->registerHandler(mConn);
        (1 ? mNetLooper : looper())->registerHandler(mRTPConn);

        //新建立一个通知消息notify作为参数传递给observeBinaryData函数
        //注意:notify消息创建传递的handler是this,也就是MyHandler,那么对消息名为'biny'的消息notify的处理在MyHandler::onMessageReceived的case 'biny'处理分支里
        //mConn->observeBinaryData(notify)函数的功能在下文介绍
        sp<AMessage> notify = new AMessage('biny', this);
        mConn->observeBinaryData(notify);

        //新建一个应答消息,消息名为'conn',消息的处理者为this,也即MyHandler
        //相应的对消息名为'conn'的消息reply处理就会在MyHandler::onMessageReceived的case 'conn'分支里
        //mOriginalSessionURL.c_str()为会话的url,也就是需要连接的RTSP源的地址
        //将参数mOriginalSessionURL.c_str()和reply传递给mConn(sp<ARTSPConnection>)的connect函数来完成RTSP流的连接
        //mConn(sp<ARTSPConnection>)的connect函数后续的文章向大家介绍
        sp<AMessage> reply = new AMessage('conn', this);
        mConn->connect(mOriginalSessionURL.c_str(), reply);
    }

  下面贴出安卓N版本mConn->observeBinaryData(notify)的调用流程:
  

==>
mConn->observeBinaryData(notify)

==>
void ARTSPConnection::observeBinaryData(const sp<AMessage> &reply) {
    //新建消息msg,消息名为kWhatObserveBinaryData,消息的处理者为this。也即ARTSPConnection
    //则对消息名为kWhatObserveBinaryData的消息msg的处理就是在ARTSPConnection::onMessageReceived的case kWhatObserveBinaryData处理分支
    //将传递来的参数即消息reply的引用设置到"reply"字段中
    sp<AMessage> msg = new AMessage(kWhatObserveBinaryData, this);
    msg->setMessage("reply", reply);
    msg->post();
} 

==>
void ARTSPConnection::onMessageReceived(const sp<AMessage> &msg) {
    switch (msg->what()) {
        case kWhatConnect:
            onConnect(msg);
            break;

        case kWhatDisconnect:
            onDisconnect(msg);
            break;

        case kWhatCompleteConnection:
            onCompleteConnection(msg);
            break;

        case kWhatSendRequest:
            onSendRequest(msg);
            break;

        case kWhatReceiveResponse:
            onReceiveResponse();
            break;

        case kWhatObserveBinaryData:
        {
            //对消息名为kWhatObserveBinaryData的处理
            //从该消息的"reply"字段得到reply消息的引用
            CHECK(msg->findMessage("reply", &mObserveBinaryMessage));
            break;
        }

        default:
            TRESPASS();
            break;
    }
}

  小结:MyHandler函数提供的connect函数接口对RTSP流的连接是通过MyHandler应有的ARTSPConnection对象的引用mConn提供的connect函数来完成对RTSP流的连接的。
  在连接前设置了ARTSPConnection对象mConn的成员对象mObserveBinaryMessage,即完成这个消息引用的设置,消息名为’biny’,消息处理者为MyHandler,对这个消息的处理将会在MyHandler::onMessageReceived的case ‘biny’处理分支里。

void sendDriverCtrl( int & sendSocket, const double & simTime, const unsigned int & simFrame ) { Framework::RDBHandler myHandler; myHandler.initMsg(); RDB_DRIVER_CTRL_t *myDriver = ( RDB_DRIVER_CTRL_t* ) myHandler.addPackage( simTime, simFrame, RDB_PKG_ID_DRIVER_CTRL ); if ( !myDriver ) return; // do we have a valid nearest object? bool haveSensorObject = ( mNearestObject.base.id > 0 ); // sensor object must not be older than 1.0s double ownSpeed = sqrt( mOwnObject.ext.speed.x * mOwnObject.ext.speed.x + mOwnObject.ext.speed.y * mOwnObject.ext.speed.y ); double accelTgtDist = 0.0; double accelTgtSpeed = ( 30.0 - ownSpeed ) / 5.0; // default speed should be own preferred speed if ( haveSensorObject ) { // let's go for the same speed as preceding vehicle: if ( mNearestObject.ext.speed.x < -1.0e-3 ) accelTgtSpeed = 2.0 * mNearestObject.ext.speed.x / 5.0; else accelTgtSpeed = 0.0; // let's go for a 2s distance double tgtDist = ownSpeed * 2.0; if ( tgtDist < 10.0 ) // minimum distance to keep tgtDist = 10.0; accelTgtDist = ( mNearestObject.base.pos.x - tgtDist ) / 10.0; } fprintf( stderr, "sendDriverCtrl: accelDist = %.5lf, accelSpeed = %.5lf\n", accelTgtDist, accelTgtSpeed ); myDriver->playerId = 1; myDriver->accelTgt = accelTgtDist + accelTgtSpeed; myDriver->validityFlags = RDB_DRIVER_INPUT_VALIDITY_TGT_ACCEL | RDB_DRIVER_INPUT_VALIDITY_ADD_ON; int retVal = send( sendSocket, ( const char* ) ( myHandler.getMsg() ), myHandler.getMsgTotalSize(), 0 ); if ( !retVal ) fprintf( stderr, "sendDriverCtrl: could not send driver control\n" ); else fprintf( stderr, "sentDriverCtrl\n" ); }
最新发布
07-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值