# 熱拔插示例-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 );
}