static int win_pvr_detach_proc() { char rec_vol[16]; if (system_state != SYS_STATE_USB_PVR) { return 0; } rec_vol[0] = 0; pvr_get_cur_mode(rec_vol, NULL); if (rec_vol[0] == 0) { DM_DEBUG("disk detach in PVR record manager, enter main menu\n"); // Alert here:Clear all menus may cuase unpredictable result,must be tested api_osd_mode_change(OSD_NO_SHOW); ap_clear_all_menus(); //clear all menu & Hidden osd show menu_stack_pop_all(); if(api_get_usb_unmount_flag()==0) //-a by wangyang 2011-12-26 image_restore_vpo_rect(); api_set_usb_unmount_flag(0); ap_clear_all_message(); system_state = SYS_STATE_NORMAL; api_pvr_set_back2menu_flag(FALSE); ap_send_msg(CTRL_MSG_SUBTYPE_CMD_ENTER_ROOT,(UINT32)&g_win_mainmenu, FALSE); } }
UINT32 win_disk_operate_open(UINT8 type, UINT8 *operate_result) { CONTAINER* win; PRESULT ret = PROC_LOOP; UINT32 hkey; TEXT_FIELD* txt; UINT16 strID; MULTISEL *msel; char str[30]; char rec_disk[16], tms_disk[16]; operate_type = type; disk_operate_ok = 0; txt = &disk_operate_title; switch(type) { case 0: sprintf(str, "%s", "Format"); mode_select = 0; disk_format_mode_num = get_fsystem_installed(disk_mode, 8); if(!disk_format_mode_num) return 0xFF; break; case 1: sprintf(str, "%s", "DVR Set"); dvr_select_type = 0; #ifdef PVR3_SUPPORT dvr_type_num = 3; #else dvr_type_num = 1;//3; #endif break; case 2: //partition_select = 0; partition_num = init_valid_partition(disk_partition, 64); if(!partition_num) return 0xFF; if(partition_num > 2) { qsort(disk_partition, partition_num, 16, _partition_compare); } if(partition_select >= partition_num) partition_select = 0; pvr_get_cur_mode(rec_disk, tms_disk); //sprintf(str, "%s", (rec_disk[5] == 'h') ? "Copy: HDD to USB" : "Copy: USB to HDD"); sprintf(str, "%s", "Copy to Other Device"); break; default: break; } ComAscStr2Uni(str, display_strs[2]); /* set title */ win = &g_win_disk_operate; OSD_SetContainerFocus(win, MENU_DISK_FORMAT); OSD_ObjOpen((POBJECT_HEAD)win, 0); disk_operate_opened = 1; BOOL old_value = ap_enable_key_task_get_key(TRUE); while(ret != PROC_LEAVE) { hkey = ap_get_key_msg(); if(hkey == INVALID_HK || hkey == INVALID_MSG) continue; ret = OSD_ObjProc((POBJECT_HEAD)win, (MSG_TYPE_KEY<<16),hkey, 0); } ap_enable_key_task_get_key(old_value); switch(type) { case 0: *operate_result = mode_select; break; case 1: *operate_result = dvr_select_type; break; case 2: *operate_result = partition_select; break; default: break; } disk_operate_opened = 0; return disk_operate_ok; }
static void win_miscset_save_setting(void) { MULTISEL *msel; SYSTEM_DATA* sys_data; UINT32 val; sys_data = sys_data_get(); #ifndef NEW_DEMO_FRAME struct nim_lnb_info lnb_info; for(i=0;i<2;i++) { lib_nimg_get_lnb_info(i+1,&lnb_info); if(LNB_POWER_OFF == sys_data->bLNB_power) lnb_info.lnb_power_off = 1; else lnb_info.lnb_power_off = 0; lib_nimg_set_lnb_info(i+1,&lnb_info); } #else struct nim_config lnb_info; struct nim_device *nim; UINT16 i; for(i=0;i<2;i++) { nim = (struct nim_device *)dev_get_by_id(HLD_DEV_TYPE_NIM, i); dev_get_nim_config(nim,FRONTEND_TYPE,&lnb_info); if(LNB_POWER_OFF == sys_data->bLNB_power) lnb_info.antenna.antenna_enable = /*0*/1; //Seiya fix BUG37540: else lnb_info.antenna.antenna_enable = 1; dev_set_nim_config(nim, FRONTEND_TYPE, &lnb_info); } #endif msel =&miscset_sel1; val = OSD_GetMultiselSel(msel); sys_data->chan_sw = val; msel =&miscset_sel2; val = OSD_GetMultiselSel(msel); sys_data->chchgvideo_type = val; #ifdef CHANCHG_VIDEOTYPE_SUPPORT #ifndef NEW_DEMO_FRAME UIChChgSetVideoType(sys_data->chchgvideo_type); #endif #endif msel =&miscset_sel3; val = OSD_GetMultiselSel(msel); sys_data->install_beep = val; msel =&miscset_sel4; val = OSD_GetMultiselSel(msel); sys_data->auto_standby_en= val; #ifdef ORDER_GZ1207009 msel =&miscset_sel6; val = OSD_GetMultiselSel(msel); sys_data->standbymode= val; #endif #ifdef RAM_TMS_TEST msel =&miscset_sel5; val = OSD_GetMultiselSel(msel); char rec_part[16]; char tms_part[16]; if (sys_data->ram_tms_en != val) // detach tms part { rec_part[0] = tms_part[0] = 0; pvr_get_cur_mode(rec_part, tms_part); if (tms_part[0] != 0) { if (STRCMP(rec_part, tms_part) == 0) pvr_set_disk_use(PVR_REC_ONLY_DISK, rec_part); else pvr_detach_part(tms_part, PVR_TMS_ONLY_DISK); api_pvr_adjust_tms_space(); } } if (sys_data->ram_tms_en == 0 && val == 1) // enable RAM disk timeshift { UINT32 ram_len = RAM_DISK_SIZE; UINT32 ram_addr = (void *)(RAM_DISK_ADDR & 0x0fffffff | 0x80000000); ramdisk_create((UINT32)ram_addr, ram_len); struct pvr_register_info pvr_reg_info; MEMSET(&pvr_reg_info, 0, sizeof(struct pvr_register_info)); STRCPY(pvr_reg_info.mount_name, "/mnt/rda1"); pvr_reg_info.disk_usage = PVR_TMS_ONLY_DISK; pvr_reg_info.sync = 1; pvr_reg_info.init_list = 0; pvr_reg_info.check_speed = 0; pvr_register((UINT32)&pvr_reg_info, 0); } else if (sys_data->ram_tms_en == 1 && val == 0) // disable RAM disk timeshift { ramdisk_delete(); } if (sys_data->ram_tms_en != val) { if (val == 0) // disable RAM disk timeshift, select PVR partition again { UINT8 back_saved; rec_part[0] = tms_part[0] = 0; pvr_select_part(rec_part, tms_part); if (rec_part[0] != 0 || tms_part[0] != 0) { win_compopup_init(WIN_POPUP_TYPE_SMSG); win_compopup_set_msg_ext("Init PVR partitions, please wait...", NULL, 0); win_compopup_open_ext(&back_saved); if (STRCMP(rec_part, tms_part) == 0) { pvr_change_part(rec_part, PVR_REC_AND_TMS_DISK); } else { pvr_change_part(rec_part, PVR_REC_ONLY_DISK); pvr_change_part(tms_part, PVR_TMS_ONLY_DISK); } win_compopup_smsg_restoreback(); } } struct dvr_HDD_info hdd_info; pvr_get_HDD_info(&hdd_info); api_pvr_check_level(&hdd_info); if (pvr_get_cur_mode(NULL, NULL) == PVR_DISK_INVALID) { api_pvr_clear_up_all(); } } sys_data->ram_tms_en = val; #endif sys_data_save(1); }
/* Register volume for PVR record or timeshift. * 1. it should be call when volume mounted * @b_force: force to select volumes for pvr, don't wait other devices */ static int pvr_disk_attach_proc(BOOL b_force) { SYSTEM_DATA *sys_data = sys_data_get();; enum PVR_DISKMODE pvr_mode; char rec_vol[16], tms_vol[16]; struct statvfs buf; struct pvr_register_info pvr_reg_info; BOOL b_wait = TRUE; if (pvr_part_init_task_id != OSAL_INVALID_ID) { DM_DEBUG("pvr partition %s is initializing to %d\n", l_pvr_reg_info.mount_name, l_pvr_reg_info.disk_usage); return 0; } DM_DEBUG("Enter %s(%d) ...\n", __FUNCTION__, b_force); pvr_mode = pvr_get_cur_mode(rec_vol, tms_vol); switch (pvr_mode) { case PVR_DISK_REC_AND_TMS: case PVR_DISK_REC_WITH_TMS: DM_DEBUG("pvr partition already init (%s, %s)\n", rec_vol, tms_vol); return 0; case PVR_DISK_ONLY_REC: /* check if tms volume valid */ DM_DEBUG("pvr rec partition already init (%s, %s)\n", rec_vol, tms_vol); if ((tms_vol[0] == 0) && (STRLEN(sys_data->tms_disk) > 0) && (fs_statvfs(sys_data->tms_disk, &buf) >= 0)) { MEMSET(&pvr_reg_info, 0, sizeof(struct pvr_register_info)); STRCPY(pvr_reg_info.mount_name, sys_data->tms_disk); pvr_reg_info.disk_usage = PVR_TMS_ONLY_DISK; pvr_reg_info.sync = 1; pvr_reg_info.init_list = 0; #ifndef PVR_SPEED_PRETEST_DISABLE /* --doy, 2011-3-21*/ pvr_reg_info.check_speed = 1; #endif pvr_part_init_task_create(&pvr_reg_info); } return 0; case PVR_DISK_ONLY_TMS: /* check if rec volume valid */ DM_DEBUG("pvr tms partition already init (%s, %s)\n", rec_vol, tms_vol); if ((rec_vol[0] == 0) && (STRLEN(sys_data->rec_disk) > 0) && (fs_statvfs(sys_data->rec_disk, &buf) >= 0)) { MEMSET(&pvr_reg_info, 0, sizeof(struct pvr_register_info)); STRCPY(pvr_reg_info.mount_name, sys_data->rec_disk); pvr_reg_info.disk_usage = PVR_REC_ONLY_DISK; pvr_reg_info.sync = 1; pvr_reg_info.init_list = 1; #ifndef PVR_SPEED_PRETEST_DISABLE /* --doy, 2011-3-21*/ pvr_reg_info.check_speed = 1; #endif pvr_part_init_task_create(&pvr_reg_info); } return 0; default: DM_DEBUG("pvr partition not init\n"); break; } STRCPY(rec_vol, sys_data->rec_disk); STRCPY(tms_vol, sys_data->tms_disk); rec_vol[1] = tms_vol[1] = 'd'; rec_vol[2] = tms_vol[2] = 'e'; rec_vol[3] = tms_vol[3] = 'v'; rec_vol[8] = tms_vol[8] = '\0'; // temp for disk path, eg. "/dev/uda" if ((rec_vol[0] == 0 && tms_vol[0] == 0) || (tms_vol[0] == 0 && fs_statvfs(rec_vol, &buf) >= 0) || (rec_vol[0] == 0 && fs_statvfs(tms_vol, &buf) >= 0) || (fs_statvfs(rec_vol, &buf) >= 0 && fs_statvfs(tms_vol, &buf) >= 0)) { b_wait = FALSE; } if (b_force || !b_wait) { // register rec and tms partition dm_pvr_timer_stop(); DM_DEBUG("To register volume for PVR ...\n"); pvr_select_part(rec_vol, tms_vol); if (STRLEN(tms_vol) > 0 && STRCMP(rec_vol, tms_vol) != 0) { MEMSET(&pvr_reg_info, 0, sizeof(struct pvr_register_info)); STRCPY(pvr_reg_info.mount_name, tms_vol); pvr_reg_info.disk_usage = PVR_TMS_ONLY_DISK; pvr_reg_info.init_list = 0; #ifndef PVR_SPEED_PRETEST_DISABLE /* --doy, 2011-3-21*/ pvr_reg_info.check_speed = 1; #endif if (STRLEN(rec_vol) > 0) { // init partition takes no time when (sync == 0), call pvr_register() directly pvr_reg_info.sync = 0; pvr_register((UINT32)&pvr_reg_info, 0); } else { pvr_reg_info.sync = 1; pvr_part_init_task_create(&pvr_reg_info); } } if (STRLEN(rec_vol) > 0) { MEMSET(&pvr_reg_info, 0, sizeof(struct pvr_register_info)); STRCPY(pvr_reg_info.mount_name, rec_vol); pvr_reg_info.disk_usage = (!STRCMP(rec_vol, tms_vol)) ? PVR_REC_AND_TMS_DISK : PVR_REC_ONLY_DISK; pvr_reg_info.sync = 1; pvr_reg_info.init_list = 1; #ifndef PVR_SPEED_PRETEST_DISABLE /* --doy, 2011-3-21*/ pvr_reg_info.check_speed = 1; #endif pvr_part_init_task_create(&pvr_reg_info); } if (rec_vol) STRCPY(sys_data->rec_disk, rec_vol); if (tms_vol) STRCPY(sys_data->tms_disk, tms_vol); sys_data_save(0); } else /* we need to wait default disk ready */ { dm_pvr_timer_start(5000); } return 0; }
/* change partition @part_path to @part_mode, for pvr */ int pvr_change_part(const char *part_path, UINT8 part_mode) { struct dvr_HDD_info hdd_info; struct pvr_register_info pvr_reg_info; char rec_part[16], tms_part[16]; enum PVR_DISKMODE cur_pvr_mode; SYSTEM_DATA *sys_data; BOOL register_part = FALSE; int ret = 0; if (part_path == NULL || part_path[0] == 0) return -1; DM_DEBUG("%s() change %s to %d\n", __FUNCTION__, part_path, part_mode); sys_data = sys_data_get(); cur_pvr_mode = pvr_get_cur_mode(rec_part, tms_part); MEMSET(&pvr_reg_info, 0, sizeof(struct pvr_register_info)); STRCPY(pvr_reg_info.mount_name, part_path); pvr_reg_info.disk_usage = part_mode; pvr_reg_info.sync = 1; switch (part_mode) { case PVR_REC_AND_TMS_DISK: if (cur_pvr_mode == PVR_DISK_REC_AND_TMS) { pvr_detach_part(rec_part, PVR_REC_AND_TMS_DISK); } else { pvr_detach_part(rec_part, PVR_REC_ONLY_DISK); pvr_detach_part(tms_part, PVR_TMS_ONLY_DISK); } pvr_reg_info.init_list = 1; #ifndef PVR_SPEED_PRETEST_DISABLE /* --doy, 2011-3-21*/ pvr_reg_info.check_speed = 1; #endif if (pvr_register((UINT32)&pvr_reg_info, 0) != SUCCESS) { api_pvr_clear_up_all(); ret = -1; } STRCPY(sys_data->rec_disk, part_path); STRCPY(sys_data->tms_disk, part_path); sys_data_save(0); break; case PVR_REC_ONLY_DISK: if ((STRLEN(rec_part) > 0) && (STRCMP(rec_part, part_path) == 0)) { // same partition if ((cur_pvr_mode == PVR_DISK_ONLY_REC) || (cur_pvr_mode == PVR_DISK_REC_WITH_TMS)) { break; } else if (cur_pvr_mode == PVR_DISK_REC_AND_TMS) { pvr_set_disk_use(PVR_REC_ONLY_DISK, part_path); } else { DM_DEBUG("rec_part: %s, mount_name: %s, mode: %d, %d\n", rec_part, part_path, cur_pvr_mode, part_mode); register_part = TRUE; //SDBBP(); } } else // diff partition { register_part = TRUE; if (cur_pvr_mode == PVR_DISK_REC_AND_TMS) { pvr_set_disk_use(PVR_TMS_ONLY_DISK, tms_part); } if ((cur_pvr_mode == PVR_DISK_ONLY_REC) || (cur_pvr_mode == PVR_DISK_REC_WITH_TMS)) { pvr_detach_part(rec_part, PVR_REC_ONLY_DISK); } if ((STRCMP(tms_part, part_path) == 0) && ((cur_pvr_mode == PVR_DISK_ONLY_TMS) || (cur_pvr_mode == PVR_DISK_REC_WITH_TMS))) { pvr_detach_part(tms_part, PVR_TMS_ONLY_DISK); } } if (register_part) { pvr_reg_info.init_list = (part_mode != PVR_TMS_ONLY_DISK); #ifndef PVR_SPEED_PRETEST_DISABLE /* --doy, 2011-3-21*/ pvr_reg_info.check_speed = 1; #endif //osal_task_sleep(1000); // wait for pvr cleanup finished if (pvr_register((UINT32)&pvr_reg_info, 0) != SUCCESS) { ret = -1; } } STRCPY(sys_data->rec_disk, part_path); if(!STRCMP(sys_data->tms_disk, part_path)) STRCPY(sys_data->tms_disk, ""); sys_data_save(0); break; case PVR_TMS_ONLY_DISK: if ((STRLEN(tms_part) > 0) && (STRCMP(tms_part, part_path) == 0)) { // same partition if ((cur_pvr_mode == PVR_DISK_ONLY_TMS) || (cur_pvr_mode == PVR_DISK_REC_WITH_TMS)) { break; } else if (cur_pvr_mode == PVR_DISK_REC_AND_TMS) { pvr_set_disk_use(PVR_TMS_ONLY_DISK, part_path); } else { DM_DEBUG("rec_part: %s, mount_name: %s, mode: %d, %d\n", rec_part, part_path, cur_pvr_mode, part_mode); register_part = TRUE; //SDBBP(); } } else // diff partition { register_part = TRUE; if (cur_pvr_mode == PVR_DISK_REC_AND_TMS) { pvr_set_disk_use(PVR_REC_ONLY_DISK, rec_part); } if ((cur_pvr_mode == PVR_DISK_ONLY_TMS) || (cur_pvr_mode == PVR_DISK_REC_WITH_TMS)) { pvr_detach_part(tms_part, PVR_TMS_ONLY_DISK); } if ((STRCMP(rec_part, part_path) == 0) && ((cur_pvr_mode == PVR_DISK_ONLY_REC) || (cur_pvr_mode == PVR_DISK_REC_WITH_TMS))) { pvr_detach_part(rec_part, PVR_REC_ONLY_DISK); } } if (register_part) { pvr_reg_info.init_list = (part_mode != PVR_TMS_ONLY_DISK); #ifndef PVR_SPEED_PRETEST_DISABLE /* --doy, 2011-3-21*/ pvr_reg_info.check_speed = 1; #endif //osal_task_sleep(1000); // wait for pvr cleanup finished if (pvr_register((UINT32)&pvr_reg_info, 0) != SUCCESS) { ret = -1; } } STRCPY(sys_data->tms_disk, part_path); if(!STRCMP(sys_data->rec_disk, part_path)) STRCPY(sys_data->rec_disk, ""); sys_data_save(0); break; default: break; } api_pvr_adjust_tms_space(); pvr_get_HDD_info(&hdd_info); api_pvr_check_level(&hdd_info); return ret; }
BOOL usb_remove_safely_by_hotkey() { int disk_num, tot_disk_num = 0; char disk_name[8]; int ret; UINT32 choice; UINT8 disk_sel; UINT8 back_saved; POBJECT_HEAD topmenu; ret = dm_ioctl(DM_CMD1_GET_DISK_NUM, DM_CMD_PARAM(MNT_TYPE_USB, 0, 0), &disk_num, sizeof(int)); if (ret == 0 && disk_num > 0) tot_disk_num += disk_num; ret = dm_ioctl(DM_CMD1_GET_DISK_NUM, DM_CMD_PARAM(MNT_TYPE_SD, 0, 0), &disk_num, sizeof(int)); if (ret == 0 && disk_num > 0) tot_disk_num += disk_num; ret = dm_ioctl(DM_CMD1_GET_DISK_NUM, DM_CMD_PARAM(MNT_TYPE_SATA, 0, 0), &disk_num, sizeof(int)); if (ret == 0 && disk_num > 0) tot_disk_num += disk_num; if (tot_disk_num <= 0) { return TRUE; } api_inc_wnd_count(); ID timer_id = win_compopup_start_send_key_timer(V_KEY_EXIT, 10000, TIMER_ALARM); // exit popup if no action in 5s choice = win_disk_operate_open(OPERATE_TYPE_DISK_REMOVE, &disk_sel); api_stop_timer(&timer_id); if ((topmenu = menu_stack_get_top()) != NULL) OSD_TrackObject(topmenu, C_DRAW_SIGN_EVN_FLG | C_UPDATE_ALL); if (!choice) { api_dec_wnd_count(); return TRUE; } else { win_removable_disk_get_name_str(disk_sel, disk_name); } #ifdef DVR_PVR_SUPPORT enum PVR_DISKMODE pvr_mode; char rec_vol[16], tms_vol[16]; struct statvfs buf; pvr_mode = pvr_get_cur_mode(rec_vol, tms_vol); if (api_pvr_is_record_active() && (STRLEN(rec_vol) == 9) && (strncmp(disk_name, &rec_vol[5], 3) == 0)) { win_compopup_init(WIN_POPUP_TYPE_OK); win_compopup_set_msg("USB safely remove error, please stop recording first!", NULL, 0); win_compopup_open_ext(&back_saved); api_dec_wnd_count(); return TRUE; } if (api_pvr_is_playing()) { BOOL b_can_remove = TRUE; if ((pvr_info.pvr_state == PVR_STATE_TMS_PLAY) && (STRLEN(tms_vol) == 9) && (strncmp(disk_name, &tms_vol[5], 3) == 0)) { b_can_remove = FALSE; } else if ((pvr_info.pvr_state != PVR_STATE_TMS_PLAY) && (STRLEN(rec_vol) == 9) && (strncmp(disk_name, &rec_vol[5], 3) == 0)) { b_can_remove = FALSE; } if (!b_can_remove) { win_compopup_init(WIN_POPUP_TYPE_OK); win_compopup_set_msg("USB safely remove error, please stop playing first!", NULL, 0); win_compopup_open_ext(&back_saved); api_dec_wnd_count(); return TRUE; } } if (pvr_info.pvr_state == PVR_STATE_TMS) { api_pvr_tms_proc(FALSE); fs_sync(tms_vol); } #endif #ifdef USB_SUPPORT_HUB /* remove disk */ int disk_type = diskNamePrefix2Type(disk_name); if (disk_type == MNT_TYPE_USB) { char dev_path[16]; int node_id, fd; sprintf(dev_path, "/dev/%s", disk_name); fd = fs_open(dev_path, O_RDONLY, 0); ret = fs_ioctl(fd, IOCTL_GET_NODEID, &node_id, sizeof(int)); fs_close(fd); if (ret == 0) usbd_safely_remove_ex(node_id); } #ifdef SDIO_SUPPORT else if (disk_type == MNT_TYPE_SD) { sd_notify(0); } #endif #ifdef SATA_SUPPORT else if (disk_type == MNT_TYPE_SATA) { sata_notify(0, 0); } #endif #else usbd_safely_remove(); #endif api_dec_wnd_count(); return TRUE; }
/* Un-register pvr volume if necessary * 1. it should be call when disk detach */ static int pvr_disk_detach_proc() { struct statvfs buf; enum PVR_DISKMODE pvr_mode; char rec_vol[16], tms_vol[16], initing_vol[16]; UINT8 initing_vol_usage = 0; BOOL b_pvr_part_detached = FALSE; DM_DEBUG("Enter %s() ...\n", __FUNCTION__); if (pvr_part_init_task_id != OSAL_INVALID_ID) { DM_DEBUG("pvr partition %s is initializing to %d\n", l_pvr_reg_info.mount_name, l_pvr_reg_info.disk_usage); STRCPY(initing_vol, l_pvr_reg_info.mount_name); initing_vol_usage = l_pvr_reg_info.disk_usage; } else { initing_vol[0] = 0; } pvr_mode = pvr_get_cur_mode(rec_vol, tms_vol); BOOL rec_vol_detach = ((rec_vol[0] != 0) && (fs_statvfs(rec_vol, &buf) < 0)); BOOL tms_vol_detach = ((tms_vol[0] != 0) && (fs_statvfs(tms_vol, &buf) < 0)); if ((initing_vol[0] != 0) && (fs_statvfs(initing_vol, &buf) < 0)) { if (STRCMP(initing_vol, rec_vol) != 0) { DM_DEBUG("pvr detach initializing volume %s\n", initing_vol); pvr_detach_part(initing_vol, initing_vol_usage); b_pvr_part_detached = TRUE; } initing_vol[0] = 0; } if (rec_vol_detach || tms_vol_detach) { /* a disk that used by pvr is detached */ if (STRCMP(rec_vol, tms_vol) == 0) { DM_DEBUG("pvr detach %s\n", rec_vol); pvr_detach_part(rec_vol, PVR_REC_AND_TMS_DISK); b_pvr_part_detached = TRUE; } else { if (rec_vol_detach) { DM_DEBUG("pvr detach %s\n", rec_vol); pvr_detach_part(rec_vol, PVR_REC_ONLY_DISK); b_pvr_part_detached = TRUE; } if (tms_vol_detach) { DM_DEBUG("pvr detach %s\n", tms_vol); pvr_detach_part(tms_vol, PVR_TMS_ONLY_DISK); b_pvr_part_detached = TRUE; } } } if ((pvr_get_cur_mode(rec_vol, tms_vol) == PVR_DISK_INVALID) && (initing_vol[0] == 0)) { DM_DEBUG("pvr detach all volume, do clean up!\n"); api_pvr_clear_up_all(); } if (b_pvr_part_detached) { struct dvr_HDD_info hdd_info; pvr_get_HDD_info(&hdd_info); api_pvr_check_level(&hdd_info); } return 0; }