# 熱拔插示例-HotPlugin
功能描述: 設備熱拔插監(jiān)控,檢測到設備上線自動連接設備打開深度流,檢測到設備掉線自動斷開設備連接。,并通過ESC_KEY鍵退出程序
> 本示例基于C Low Level API進行注冊設備上下線回調(diào),基于High Level API進行開流取幀演示
創(chuàng)建設備連接處理函數(shù),函數(shù)內(nèi)創(chuàng)建pipeline并調(diào)用create_and_start_with_config開啟彩色流和深度流。
//設備連接處理
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)建設備斷開處理函數(shù),函數(shù)內(nè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);
}
}
}
設備連接、斷開處理函數(shù)將會在設備上下線回調(diào)函數(shù)內(nèi)被調(diào)用
//設備狀態(tài)改變回調(diào)
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);
}
主函數(shù)main內(nèi),創(chuàng)建一個Context并注冊設備上下線回調(diào)
//創(chuàng)建上下文
ob_context* ctx = ob_create_context( &error );
//注冊設備回調(diào)
ob_set_device_changed_callback( ctx, on_device_changed_callback, NULL, &error );
退出主循環(huán)后,需要將相關資源釋放
if ( pipeline ) {
//停止pipeline
ob_pipeline_stop( pipeline, &error );
// 銷毀pipeline
ob_delete_pipeline( pipeline, &error );
}
// 銷毀dev_list
if ( dev_list ) {
ob_delete_device_list( dev_list, &error );
}
// 銷毀ctx
if ( ctx ) {
ob_delete_context( ctx, &error );
}