static void _process_msg ( timeshift_t *ts, streaming_message_t *sm, int *run ) { int err; timeshift_file_t *tsf; /* Process */ switch (sm->sm_type) { /* Terminate */ case SMT_EXIT: if (run) *run = 0; break; case SMT_STOP: if (sm->sm_code == 0 && run) *run = 0; break; /* Timeshifting */ case SMT_SKIP: case SMT_SPEED: break; /* Status */ case SMT_GRACE: case SMT_NOSTART: case SMT_NOSTART_WARN: case SMT_SERVICE_STATUS: case SMT_TIMESHIFT_STATUS: break; /* Store */ case SMT_SIGNAL_STATUS: case SMT_START: case SMT_MPEGTS: case SMT_PACKET: pthread_mutex_lock(&ts->rdwr_mutex); if ((tsf = timeshift_filemgr_get(ts, 1)) && (tsf->wfd >= 0 || tsf->ram)) { if ((err = _process_msg0(ts, tsf, &sm)) < 0) { timeshift_filemgr_close(tsf); tsf->bad = 1; ts->full = 1; ///< Stop any more writing } tsf->refcount--; } pthread_mutex_unlock(&ts->rdwr_mutex); break; } /* Next */ if (sm) streaming_msg_free(sm); }
static void _process_msg ( timeshift_t *ts, streaming_message_t *sm, int *run ) { int err; timeshift_file_t *tsf; /* Process */ switch (sm->sm_type) { /* Terminate */ case SMT_EXIT: if (run) *run = 0; break; case SMT_STOP: if (sm->sm_code != SM_CODE_SOURCE_RECONFIGURED && run) *run = 0; goto live; /* Timeshifting */ case SMT_SKIP: case SMT_SPEED: break; /* Status */ case SMT_GRACE: case SMT_NOSTART: case SMT_NOSTART_WARN: case SMT_SERVICE_STATUS: case SMT_TIMESHIFT_STATUS: case SMT_DESCRAMBLE_INFO: goto live; /* Store */ case SMT_SIGNAL_STATUS: case SMT_START: case SMT_MPEGTS: case SMT_PACKET: pthread_mutex_lock(&ts->state_mutex); ts->buf_time = sm->sm_time; if (ts->state == TS_LIVE) { streaming_target_deliver2(ts->output, streaming_msg_clone(sm)); if (sm->sm_type == SMT_PACKET) timeshift_packet_log("liv", ts, sm); } if (sm->sm_type == SMT_START) _update_smt_start(ts, (streaming_start_t *)sm->sm_data); if (ts->dobuf) { if ((tsf = timeshift_filemgr_get(ts, sm->sm_time)) != NULL) { if (tsf->wfd >= 0 || tsf->ram) { if ((err = _process_msg0(ts, tsf, sm)) < 0) { timeshift_filemgr_close(tsf); tsf->bad = 1; ts->full = 1; ///< Stop any more writing } else { timeshift_packet_log("sav", ts, sm); } } timeshift_file_put(tsf); } } pthread_mutex_unlock(&ts->state_mutex); break; } /* Next */ streaming_msg_free(sm); return; live: pthread_mutex_lock(&ts->state_mutex); if (ts->state == TS_LIVE) streaming_target_deliver2(ts->output, sm); else streaming_msg_free(sm); pthread_mutex_unlock(&ts->state_mutex); }