/***************************************************************************** * Close : Close the device *****************************************************************************/ static void Close( vlc_object_t *p_this ) { access_t *p_access = (access_t*)p_this; access_sys_t *p_sys = p_access->p_sys; FilterUnset( p_access, MAX_DEMUX ); DVRClose( p_this, &p_sys->dvb ); FrontendClose( p_this, &p_sys->dvb ); scan_Destroy( p_sys->scan ); free( p_sys ); }
NTSTATUS FrontendSetState( IN PXENVBD_FRONTEND Frontend, IN XENVBD_STATE State ) { NTSTATUS Status; const ULONG TargetId = Frontend->TargetId; BOOLEAN Failed = FALSE; LogTrace("Target[%d] @ (%d) =====>\n", TargetId, KeGetCurrentIrql()); LogVerbose("Target[%d] : %s ----> %s\n", TargetId, __XenvbdStateName(Frontend->State), __XenvbdStateName(State)); while (!Failed && Frontend->State != State) { switch (Frontend->State) { case XENVBD_INITIALIZED: switch (State) { case XENVBD_CLOSED: case XENVBD_PREPARED: case XENVBD_CONNECTED: case XENVBD_ENABLED: Status = FrontendClose(Frontend); if (NT_SUCCESS(Status)) { Frontend->State = XENVBD_CLOSED; } else { Failed = TRUE; } break; default: Failed = TRUE; break; } break; case XENVBD_CLOSED: switch (State) { case XENVBD_PREPARED: case XENVBD_CONNECTED: case XENVBD_ENABLED: Status = FrontendPrepare(Frontend); if (NT_SUCCESS(Status)) { Frontend->State = XENVBD_PREPARED; } else { Status = FrontendClose(Frontend); if (NT_SUCCESS(Status)) Frontend->State = XENVBD_CLOSED; else Frontend->State = XENVBD_STATE_INVALID; Failed = TRUE; } break; default: Failed = TRUE; break; } break; case XENVBD_PREPARED: switch (State) { case XENVBD_CONNECTED: case XENVBD_ENABLED: Status = FrontendConnect(Frontend); if (NT_SUCCESS(Status)) { Frontend->State = XENVBD_CONNECTED; } else { Status = FrontendClose(Frontend); if (NT_SUCCESS(Status)) Frontend->State = XENVBD_CLOSED; else Frontend->State = XENVBD_STATE_INVALID; Failed = TRUE; } break; case XENVBD_CLOSED: Status = FrontendClose(Frontend); if (NT_SUCCESS(Status)) { Frontend->State = XENVBD_CLOSED; } else { Frontend->State = XENVBD_STATE_INVALID; Failed = TRUE; } break; default: Failed = TRUE; break; } break; case XENVBD_CONNECTED: switch (State) { case XENVBD_ENABLED: FrontendEnable(Frontend); Frontend->State = XENVBD_ENABLED; break; case XENVBD_CLOSED: case XENVBD_PREPARED: FrontendDisconnect(Frontend); Status = FrontendClose(Frontend); if (NT_SUCCESS(Status)) { Frontend->State = XENVBD_CLOSED; } else { Frontend->State = XENVBD_STATE_INVALID; Failed = TRUE; } break; default: Failed = TRUE; break; } break; case XENVBD_ENABLED: switch (State) { case XENVBD_CLOSED: case XENVBD_PREPARED: case XENVBD_CONNECTED: FrontendDisable(Frontend); Frontend->State = XENVBD_CONNECTED; break; default: Failed = TRUE; break; } break; default: Failed = TRUE; break; } LogVerbose("Target[%d] : in state %s\n", TargetId, __XenvbdStateName(Frontend->State)); } LogTrace("Target[%d] @ (%d) <===== (%s)\n", TargetId, KeGetCurrentIrql(), Failed ? "FAILED" : "SUCCEEDED"); return Failed ? STATUS_UNSUCCESSFUL : STATUS_SUCCESS; }
/***************************************************************************** * Open: open the frontend device *****************************************************************************/ static int Open( vlc_object_t *p_this ) { access_t *p_access = (access_t*)p_this; access_sys_t *p_sys; if( p_access->b_preparsing ) return VLC_EGENERIC; p_access->p_sys = p_sys = calloc( 1, sizeof( access_sys_t ) ); if( !p_sys ) return VLC_ENOMEM; /* Create all variables */ VarInit( p_access ); /* Parse the command line */ if( ParseMRL( p_access ) ) { free( p_sys ); return VLC_EGENERIC; } bool b_scan_mode = var_GetInteger( p_access, "dvb-frequency" ) == 0; if( b_scan_mode ) { msg_Dbg( p_access, "DVB scan mode selected" ); p_access->pf_block = BlockScan; } else return VLC_EGENERIC; /* let the DTV plugin do the work */ /* Getting frontend info */ if( FrontendOpen( p_this, &p_sys->dvb, p_access->psz_name ) ) { free( p_sys ); return VLC_EGENERIC; } /* Opening DVR device */ if( DVROpen( p_this, &p_sys->dvb ) < 0 ) { FrontendClose( p_this, &p_sys->dvb ); free( p_sys ); return VLC_EGENERIC; } scan_parameter_t parameter; scan_t *p_scan; scan_parameter_Init( ¶meter ); parameter.b_use_nit = var_InheritBool( p_access, "dvb-scan-nit" ); if( FrontendFillScanParameter( p_this, &p_sys->dvb, ¶meter ) || (p_scan = scan_New( VLC_OBJECT(p_access), ¶meter, ScanFrontendTuningHandler, ScanStatsCallback, ScanFilterHandler, ScanReadCallback, p_access )) == NULL ) { scan_parameter_Clean( ¶meter ); Close( VLC_OBJECT(p_access) ); return VLC_EGENERIC; } scan_parameter_Clean( ¶meter ); p_sys->scan = p_scan; /* Set up access */ p_access->pf_control = Control; return VLC_SUCCESS; }