static int change_sf(int drop) { int old_sf = buffer_sf; CHANNEL_MAP(old_channel_map); channel_map_copy(old_channel_map, buffer_channel_map); set_buffer_sf(); if (buffer_sf != old_sf || !channel_map_equal(buffer_channel_map, old_channel_map, sf_get_channels(buffer_sf))) { /* reopen */ int rc; if (drop) op_drop(); op_close(); rc = op_open(buffer_sf, buffer_channel_map); if (rc) { player_op_error(rc, "opening audio device"); __consumer_status_update(CS_STOPPED); __producer_stop(); return rc; } } else if (consumer_status == CS_PAUSED) { op_drop(); op_unpause(); } __consumer_status_update(CS_PLAYING); return 0; }
void player_play_file(struct track_info *ti) { player_lock(); __producer_set_file(ti); if (producer_status == PS_UNLOADED) { __consumer_stop(); goto out; } /* PS_STOPPED */ __producer_play(); /* PS_UNLOADED,PS_PLAYING */ if (producer_status == PS_UNLOADED) { __consumer_stop(); goto out; } /* PS_PLAYING */ if (consumer_status == CS_STOPPED) { __consumer_play(); if (consumer_status == CS_STOPPED) __producer_stop(); } else { op_drop(); change_sf(1); } out: __player_status_changed(); if (producer_status == PS_PLAYING) __prebuffer(); player_unlock(); }
static void __consumer_stop(void) { if (consumer_status == CS_PLAYING || consumer_status == CS_PAUSED) { op_drop(); op_close(); __consumer_status_update(CS_STOPPED); } }
/* * change output plugin without stopping playback */ void player_set_op(const char *name) { int rc; player_lock(); /* drop needed because close drains the buffer */ if (consumer_status == CS_PAUSED) op_drop(); if (consumer_status == CS_PLAYING || consumer_status == CS_PAUSED) op_close(); if (name) { d_print("setting op to '%s'\n", name); rc = op_select(name); } else { /* first initialized plugin */ d_print("selecting first initialized op\n"); rc = op_select_any(); } if (rc) { __consumer_status_update(CS_STOPPED); __producer_stop(); if (name) player_op_error(rc, "selecting output plugin '%s'", name); else player_op_error(rc, "selecting any output plugin"); player_unlock(); return; } if (consumer_status == CS_PLAYING || consumer_status == CS_PAUSED) { set_buffer_sf(); rc = op_open(buffer_sf, buffer_channel_map); if (rc) { __consumer_status_update(CS_STOPPED); __producer_stop(); player_op_error(rc, "opening audio device"); player_unlock(); return; } if (consumer_status == CS_PAUSED) op_pause(); } player_unlock(); }
static void __consumer_play(void) { if (consumer_status == CS_PLAYING) { op_drop(); } else if (consumer_status == CS_STOPPED) { int rc; set_buffer_sf(); rc = op_open(buffer_sf, buffer_channel_map); if (rc) { player_op_error(rc, "opening audio device"); } else { __consumer_status_update(CS_PLAYING); } } else if (consumer_status == CS_PAUSED) { op_unpause(); __consumer_status_update(CS_PLAYING); } }
/* * Worker thread. Executes random operations from the set of 6. */ static WT_THREAD_RET do_ops(void *args) { WT_RAND_STATE rnd; time_t now, start; __wt_random_init_seed(NULL, &rnd); (void)time(&start); (void)time(&now); while (difftime(now, start) < RUNTIME) { switch (__wt_random(&rnd) % 6) { case 0: op_bulk(args); break; case 1: op_create(args); break; case 2: op_cursor(args); break; case 3: op_drop(args); break; case 4: op_bulk_unique(args); break; case 5: op_create_unique(args); break; } (void)time(&now); } return (WT_THREAD_RET_VALUE); }
void player_seek(double offset, int relative, int start_playing) { int stopped = 0; player_lock(); if (consumer_status == CS_STOPPED) { stopped = 1; __producer_play(); if (producer_status == PS_PLAYING) { __consumer_play(); if (consumer_status != CS_PLAYING) { __producer_stop(); player_unlock(); return; } else __player_status_changed(); } } if (consumer_status == CS_PLAYING || consumer_status == CS_PAUSED) { double pos, duration, new_pos; int rc; pos = (double)consumer_pos / (double)buffer_second_size(); duration = ip_duration(ip); if (duration < 0) { /* can't seek */ d_print("can't seek\n"); player_unlock(); return; } if (relative) { new_pos = pos + offset; if (new_pos < 0.0) new_pos = 0.0; if (offset > 0.0) { /* seeking forward */ if (new_pos > duration - 5.0) new_pos = duration - 5.0; if (new_pos < 0.0) new_pos = 0.0; if (new_pos < pos - 0.5) { /* must seek at least 0.5s */ d_print("must seek at least 0.5s\n"); player_unlock(); return; } } } else { new_pos = offset; if (new_pos < 0.0) { d_print("seek offset negative\n"); player_unlock(); return; } if (new_pos > duration - 5.0) { new_pos = duration - 5.0; if (new_pos < 0.0) new_pos = 0.0; } } /* d_print("seeking %g/%g (%g from eof)\n", new_pos, duration, duration - new_pos); */ rc = ip_seek(ip, new_pos); if (rc == 0) { d_print("doing op_drop after seek\n"); op_drop(); reset_buffer(); consumer_pos = new_pos * buffer_second_size(); scale_pos = consumer_pos; __consumer_position_update(); if (stopped && !start_playing) { __producer_pause(); __consumer_pause(); __player_status_changed(); } } else { player_ip_error(rc, "seeking in file %s", ip_get_filename(ip)); d_print("error: ip_seek returned %d\n", rc); } } player_unlock(); }