RM新时代网站

C 熱插拔示例代碼-Hot Plugin

# 熱拔插示例-HotPlugin

 

功能描述: 設備熱拔插監控,檢測到設備上線(xiàn)自動(dòng)連接設備打開(kāi)深度流,檢測到設備掉線(xiàn)自動(dòng)斷開(kāi)設備連接。,并通過(guò)ESC_KEY鍵退出程序

> 本示例基于C Low Level API進(jìn)行注冊設備上下線(xiàn)回調,基于High Level API進(jìn)行開(kāi)流取幀演示

 

創(chuàng )建設備連接處理函數,函數內創(chuàng )建pipeline并調用create_and_start_with_config開(kāi)啟彩色流和深度流。

//設備連接處理
void handle_device_connected(ob_device_list *connect_list) {
    ob_error *error = NULL;

    std::lock_guard<std::recursive_mutex> lk(pipeline_holder_mutex);
    uint32_t                              count = ob_device_list_device_count(connect_list, &error);
    check_error(error);
    printf("Device connect: %d\n", count);
    for(uint32_t i = 0; i < count; i++) {
        const char *uid = ob_device_list_get_device_uid(connect_list, i, &error);
        check_error(error);
        std::string str_uid = std::string(uid);
        auto        itr     = pipeline_holder_map.find(str_uid);
        if(itr != pipeline_holder_map.end()) {
            printf("Deveice connect, device already connection.");
            print_device_info(itr->second->device_info);
            printf("\n");
        }
        else {
            ob_device *device = ob_device_list_get_device(connect_list, i, &error);
            check_error(error);

            ob_pipeline *pipeline = ob_create_pipeline_with_device(device, &error);
            check_error(error);

            ob_device_info *device_info = ob_device_get_device_info(device, &error);
            check_error(error);

            std::shared_ptr<pipeline_holder> holder(new pipeline_holder{ device, device_info, pipeline, false, 0, 0, 0, 0, 0 });
            start_stream(holder);
            pipeline_holder_map.insert({ str_uid, holder });

            printf("Deveice connect, ");
            print_device_info(device_info);
            printf("\n");
        }
    }
}

 

創(chuàng )建設備斷開(kāi)處理函數,函數內將pipeline停止,并將退出pipeline標記isExit設為true

void handle_device_disconnected(ob_device_list *disconnect_list) {
    ob_error *error = NULL;

    std::lock_guard<std::recursive_mutex> lk(pipeline_holder_mutex);
    uint32_t                              count = ob_device_list_device_count(disconnect_list, &error);
    check_error(error);
    printf("Device disconnect: %d\n", count);

    for(uint32_t i = 0; i < count; i++) {
        const char *uid = ob_device_list_get_device_uid(disconnect_list, i, &error);
        check_error(error);
        std::string str_uid = std::string(uid);
        auto        itr     = pipeline_holder_map.find(str_uid);
        if(itr != pipeline_holder_map.end()) {
            auto holder = itr->second;
            stop_stream(holder);
            pipeline_holder_map.erase(str_uid);

            printf("Deveice discconnect, ");
            print_device_info(holder->device_info);
            printf("\n");

            delete_holder(holder);
        }
        else {
            const char *uid = ob_device_list_get_device_uid(disconnect_list, i, &error);
            check_error(error);
            printf("Device disconnect, Unsolve device, uid: %s\n", uid);
        }
    }
}

 

設備連接、斷開(kāi)處理函數將會(huì )在設備上下線(xiàn)回調函數內被調用

//設備狀態(tài)改變回調
void on_device_changed_callback(ob_device_list *removed, ob_device_list *added, void *user_data) {
    handle_device_disconnected(removed);
    handle_device_connected(added);

    ob_error *error = NULL;

    // Need to manually destroy the device list
    // destroy device list
    ob_delete_device_list(removed, &error);
    check_error(error);

    // destroy device list
    ob_delete_device_list(added, &error);
    check_error(error);
}

 

主函數main內,創(chuàng )建一個(gè)Context并注冊設備上下線(xiàn)回調

 //創(chuàng )建上下文
ob_context* ctx = ob_create_context( &error );

//注冊設備回調
ob_set_device_changed_callback( ctx, on_device_changed_callback, NULL, &error );

 

退出主循環(huán)后,需要將相關(guān)資源釋放

if ( pipeline ) {
    //停止pipeline
    ob_pipeline_stop( pipeline, &error );
    // 銷(xiāo)毀pipeline
    ob_delete_pipeline( pipeline, &error );
}
// 銷(xiāo)毀dev_list
if ( dev_list ) {
    ob_delete_device_list( dev_list, &error );
}
// 銷(xiāo)毀ctx
if ( ctx ) {
    ob_delete_context( ctx, &error );
}

 


RM新时代网站