void adc_process(void) { static adc_request_t * current_request = NULL; static adc_state_t current_state = ADC_STATE_IDLE; static uint8_t current_channel = ~0; switch (current_state) { case ADC_STATE_IDLE: if ( msg_queue_get( (void **)¤t_request) ) { current_request->state = ADC_REQUEST_STATE_ACTIVE; if (current_request->channel != current_channel) { current_channel = current_request->channel; adc_atmega_set_channel(current_request->channel); current_state = ADC_STATE_WAIT_CHANNEL; } else { adc_atmega_start_conversion(); current_state = ADC_STATE_WAIT_COMPLETE; } } break; case ADC_STATE_WAIT_CHANNEL: if ( adc_atmega_channel_ready() ) { adc_atmega_start_conversion(); current_state = ADC_STATE_WAIT_COMPLETE; } break; case ADC_STATE_WAIT_COMPLETE: if ( adc_atmega_conversion_complete() ) { current_request->data = adc_atmega_conversion_data(); current_request->state = ADC_REQUEST_STATE_COMPLETE; current_request = NULL; current_state = ADC_STATE_IDLE; } break; default: current_request = NULL; current_state = ADC_STATE_IDLE; break; } }
int ijkmp_get_msg(IjkMediaPlayer *mp, AVMessage *msg, int block) { assert(mp); while (1) { int continue_wait_next_msg = 0; int retval = msg_queue_get(&mp->ffplayer->msg_queue, msg, block); if (retval <= 0) return retval; switch (msg->what) { case FFP_MSG_PREPARED: MPTRACE("ijkmp_get_msg: FFP_MSG_PREPARED\n"); pthread_mutex_lock(&mp->mutex); if (mp->mp_state == MP_STATE_ASYNC_PREPARING) { ijkmp_change_state_l(mp, MP_STATE_PREPARED); } else { // FIXME: 1: onError() ? ALOGE("FFP_MSG_PREPARED: expecting mp_state==MP_STATE_ASYNC_PREPARING\n"); } pthread_mutex_unlock(&mp->mutex); break; case FFP_MSG_COMPLETED: MPTRACE("ijkmp_get_msg: FFP_MSG_COMPLETED\n"); pthread_mutex_lock(&mp->mutex); mp->restart_from_beginning = 1; ijkmp_change_state_l(mp, MP_STATE_COMPLETED); pthread_mutex_unlock(&mp->mutex); break; case FFP_MSG_SEEK_COMPLETE: MPTRACE("ijkmp_get_msg: FFP_MSG_SEEK_COMPLETE\n"); pthread_mutex_lock(&mp->mutex); mp->seek_req = 0; mp->seek_msec = 0; pthread_mutex_unlock(&mp->mutex); break; case FFP_REQ_START: MPTRACE("ijkmp_get_msg: FFP_REQ_START\n"); continue_wait_next_msg = 1; pthread_mutex_lock(&mp->mutex); if (0 == ikjmp_chkst_start_l(mp->mp_state)) { // FIXME: 8 check seekable if (mp->mp_state == MP_STATE_COMPLETED) { if (mp->restart_from_beginning) { ALOGD("ijkmp_get_msg: FFP_REQ_START: restart from beginning\n"); retval = ffp_start_from_l(mp->ffplayer, 0); if (retval == 0) ijkmp_change_state_l(mp, MP_STATE_STARTED); } else { ALOGD("ijkmp_get_msg: FFP_REQ_START: restart from seek pos\n"); retval = ffp_start_l(mp->ffplayer); if (retval == 0) ijkmp_change_state_l(mp, MP_STATE_STARTED); } mp->restart_from_beginning = 0; } else { ALOGD("ijkmp_get_msg: FFP_REQ_START: start on fly\n"); retval = ffp_start_l(mp->ffplayer); if (retval == 0) ijkmp_change_state_l(mp, MP_STATE_STARTED); } } pthread_mutex_unlock(&mp->mutex); break; case FFP_REQ_PAUSE: MPTRACE("ijkmp_get_msg: FFP_REQ_PAUSE\n"); continue_wait_next_msg = 1; pthread_mutex_lock(&mp->mutex); if (0 == ikjmp_chkst_pause_l(mp->mp_state)) { int pause_ret = ffp_pause_l(mp->ffplayer); if (pause_ret == 0) ijkmp_change_state_l(mp, MP_STATE_PAUSED); } pthread_mutex_unlock(&mp->mutex); break; case FFP_REQ_SEEK: MPTRACE("ijkmp_get_msg: FFP_REQ_SEEK\n"); continue_wait_next_msg = 1; pthread_mutex_lock(&mp->mutex); if (0 == ikjmp_chkst_seek_l(mp->mp_state)) { if (0 == ffp_seek_to_l(mp->ffplayer, msg->arg1)) { ALOGD("ijkmp_get_msg: FFP_REQ_SEEK: seek to %d\n", (int)msg->arg1); mp->restart_from_beginning = 0; } } pthread_mutex_unlock(&mp->mutex); break; } if (continue_wait_next_msg) continue; return retval; } return -1; }