/* * set playing position (some media doesn't support this, they must * return zero. */ int callc fennec_plugin_setposition(unsigned long id, unsigned long ptype, void* pos) { if(id >= pstreams_count)return 0; if(!pstreams[id].initialized)return 0; while(plugin_busy) sys_pass(); plugin_busy = 1; switch(ptype) { case fennec_input_position_32ms: decoder_seek(id, ((double)*((unsigned long*)pos)) / ((double)(pstreams[id].duration * 1000))); break; case fennec_input_position_fraction: decoder_seek(id, *((double*)pos)); break; default: plugin_busy = 0; return 0; } plugin_busy = 0; return 1; }
int callc fennec_plugin_setposition(unsigned long id, unsigned long ptype, void* pos) { double dpos; if(id >= pstreams_count)return 0; if(!pstreams[id].initialized)return 0; while(plugin_busy)return 0; /* just return */ plugin_busy = 1; switch(ptype) { case fennec_input_position_32ms: decoder_seek(id, ((double)(*(DWORD*)pos)) / decoder_getduration_ms(id)); break; case fennec_input_position_fraction: dpos = *(double*)pos; if(dpos > 1 || dpos < 0)return 0; decoder_seek(id, dpos); break; case fennec_input_position_percent: decoder_seek(id, ((double)(*(DWORD*)pos)) / 100.0f); break; default: plugin_busy = 0; return 0; } plugin_busy = 0; return 1; }
/* callback for seeking */ static void seek_cb(AppData *appdata, int seconds) { decoder_seek(appdata->decoder, seconds * 1000); decoder_play(appdata->decoder); gui_set_paused(appdata->gui, FALSE); }
/* callback for control buttons */ static void control_cb(AppData *appdata, int command) { switch (command) { case (PLAY): if (decoder_is_playing(appdata->decoder)) { decoder_stop(appdata->decoder); gui_set_paused(appdata->gui, TRUE); } else { decoder_play(appdata->decoder); gui_set_paused(appdata->gui, FALSE); } break; case (STOP): decoder_stop(appdata->decoder); decoder_seek(appdata->decoder, 0); appdata->current_position = decoder_get_position(appdata->decoder); gui_set_time(appdata->gui, 0, decoder_get_total(appdata->decoder)); gui_set_paused(appdata->gui, FALSE); break; case (PREVIOUS): playlist_previous(appdata->playlist); break; case (NEXT): decoder_stop(appdata->decoder); playlist_next(appdata->playlist); break; case (CLEAR): playlist_clear(appdata->playlist); default: break; } }
void on_position_hscale_value_changed(GtkRange * range, gpointer user_data) { decoder_seek(gtk_range_get_value(range)); update_ui_position(app); }