void State_Manager::create_state(unsigned int id) { if(id == game_state::menu) { std::unique_ptr<Menu_State> menu_state(new Menu_State(m_asset_manager)); m_all_states.push_front(std::move(menu_state)); } else if(id == game_state::play) { std::unique_ptr<Play_State> play_state(new Play_State(m_world, m_asset_manager)); m_all_states.push_front(std::move(play_state)); } else if(id == game_state::pause_state) { std::unique_ptr<Pause_State> pause_state(new Pause_State(m_asset_manager)); m_all_states.push_front(std::move(pause_state)); } else if(id == game_state::game_over) { std::unique_ptr<Game_Over_State> game_over_state(new Game_Over_State(m_asset_manager)); m_all_states.push_front(std::move(game_over_state)); } else if(id == game_state::level_win) { std::unique_ptr<Level_Win_State> level_win_state(new Level_Win_State(m_asset_manager)); m_all_states.push_front(std::move(level_win_state)); } else std::cout << "request to create undefined state"; }
static int play_thread( void *arg) { struct snd_pcm_substream *substream = (struct snd_pcm_substream *)arg; struct snd_pcm_runtime *runtime = substream->runtime; struct pcm_runtime_data *prtd = substream->runtime->private_data; struct snd_pcm *pcm = substream->pcm; struct tegra_audio_data *ptscx = tegra_snd_cx[pcm->device]; int offset = 0; int rtbuffersize = 0; int buffer_to_prime = 0, buffer_in_queue = 0; NvAudioFxState state = NVALSA_INVALID_STATE; wait_for_completion(&prtd->thread_comp); rtbuffersize = frames_to_bytes(runtime, runtime->buffer_size); buffer_to_prime = (rtbuffersize / TEGRA_DEFAULT_BUFFER_SIZE); if (runtime->control->appl_ptr) for (;;) { state = play_state(ptscx, prtd, state); if (state == SNDRV_PCM_TRIGGER_STOP) buffer_in_queue = 0; if (kthread_should_stop()) return 0; if ((prtd->audiofx_frames < runtime->control->appl_ptr) && (state != NvAudioFxState_Stop)) { offset = queue_next_buffer(substream, offset); buffer_in_queue++; } if (buffer_in_queue == 0) { DEFINE_WAIT(wq); prepare_to_wait(&prtd->buf_wait, &wq, TASK_INTERRUPTIBLE); schedule(); finish_wait(&prtd->buf_wait, &wq); continue; } if ((buffer_to_prime == buffer_in_queue) || (prtd->audiofx_frames >= runtime->control->appl_ptr)) { play_buffer_done(substream); buffer_in_queue--; } } for (;;) { state = play_state(ptscx, prtd, state); if (state == SNDRV_PCM_TRIGGER_STOP) buffer_in_queue = 0; if (kthread_should_stop()) break; if ((prtd->state != SNDRV_PCM_TRIGGER_STOP) && (runtime->status->state != SNDRV_PCM_STATE_DRAINING)) { offset = queue_next_buffer(substream, offset); buffer_in_queue++; } if (buffer_in_queue == 0) { DEFINE_WAIT(wq); prepare_to_wait(&prtd->buf_wait, &wq, TASK_INTERRUPTIBLE); schedule(); finish_wait(&prtd->buf_wait, &wq); continue; } if ((buffer_to_prime == buffer_in_queue) && (prtd->state != SNDRV_PCM_TRIGGER_STOP)) { play_buffer_done(substream); buffer_in_queue--; } } return 0; }