static void setup_stream(APEG_LAYER *layer) { // Set quality level layer->quality = quality; layer->multiple = 1.0f; // Set stream type check_stream_type(layer); // No frames decoded, frame not updated layer->stream.frame = 0; layer->stream.frame_updated = -1; _apeg_start_audio(layer, TRUE); if((layer->stream.flags&APEG_HAS_VIDEO)) { if(layer->system_stream_flag != OGG_SYSTEM) { if(apeg_get_header(layer) != 1) apeg_error_jump("No video in stream"); // Initialize the stream initialize_stream(layer); // Decode the first frame(doesn't display!) apeg_get_frame(layer); } // Start the timer if(layer->stream.frame_rate <= 0.0) apeg_error_jump("Illegal frame rate in stream"); install_param_int_ex(timer_proc, (void*)&(layer->stream.timer), FPS_TO_TIMER(layer->stream.frame_rate)); // Reset the timer and return the stream layer->stream.timer = -1; } }
void apeg_set_stream_rate(APEG_STREAM *stream, float multiple) { if(multiple < 0.0f) return; if((stream->flags&APEG_HAS_AUDIO)) _apeg_audio_set_speed_multiple((APEG_LAYER*)stream, multiple); if((stream->flags&APEG_HAS_VIDEO)) { // Make sure the multiple is large enough float fps = stream->frame_rate * multiple; if(fps > 0.0f) install_param_int_ex(timer_proc, (void*)&(stream->timer), FPS_TO_TIMER(fps)); else remove_param_int(timer_proc, (void*)&(stream->timer)); } ((APEG_LAYER*)stream)->multiple = multiple; }
void Timer::start() { install_param_int_ex( Timer::tick, this, BPS_TO_TIMER( frequency ) ); }