diff options
-rw-r--r-- | apps/plugins/video.c | 46 |
1 files changed, 8 insertions, 38 deletions
diff --git a/apps/plugins/video.c b/apps/plugins/video.c index c2117adab3..c7e893fccd 100644 --- a/apps/plugins/video.c +++ b/apps/plugins/video.c | |||
@@ -34,8 +34,6 @@ | |||
34 | 34 | ||
35 | /****************** constants ******************/ | 35 | /****************** constants ******************/ |
36 | 36 | ||
37 | #define IMIA4 (*((volatile unsigned long*)0x09000180)) // timer 4 | ||
38 | |||
39 | #define INT_MAX ((int)(~(unsigned)0 >> 1)) | 37 | #define INT_MAX ((int)(~(unsigned)0 >> 1)) |
40 | #define INT_MIN (-INT_MAX-1) | 38 | #define INT_MIN (-INT_MAX-1) |
41 | 39 | ||
@@ -51,8 +49,7 @@ | |||
51 | 49 | ||
52 | 50 | ||
53 | /****************** prototypes ******************/ | 51 | /****************** prototypes ******************/ |
54 | void timer_set(unsigned period); // setup ISR and timer registers | 52 | void timer4_isr(void); // IMIA4 ISR |
55 | void timer4_isr(void) __attribute__((interrupt_handler)); // IMIA4 ISR | ||
56 | int check_button(void); // determine next relative frame | 53 | int check_button(void); // determine next relative frame |
57 | 54 | ||
58 | 55 | ||
@@ -63,7 +60,6 @@ int check_button(void); // determine next relative frame | |||
63 | #define HEADER_MAGIC 0x52564668 // "RVFh" at file start | 60 | #define HEADER_MAGIC 0x52564668 // "RVFh" at file start |
64 | #define AUDIO_MAGIC 0x41756446 // "AudF" for each audio block | 61 | #define AUDIO_MAGIC 0x41756446 // "AudF" for each audio block |
65 | #define FILEVERSION 100 // 1.00 | 62 | #define FILEVERSION 100 // 1.00 |
66 | #define CLOCK 11059200 // SH CPU clock | ||
67 | 63 | ||
68 | // format type definitions | 64 | // format type definitions |
69 | #define VIDEOFORMAT_NO_VIDEO 0 | 65 | #define VIDEOFORMAT_NO_VIDEO 0 |
@@ -298,35 +294,8 @@ void SyncVideo(void) | |||
298 | } | 294 | } |
299 | 295 | ||
300 | 296 | ||
301 | // setup ISR and timer registers | ||
302 | void timer_set(unsigned period) | ||
303 | { | ||
304 | if (period) | ||
305 | { | ||
306 | and_b(~0x10, &TSTR); // Stop the timer 4 | ||
307 | and_b(~0x10, &TSNC); // No synchronization | ||
308 | and_b(~0x10, &TMDR); // Operate normally | ||
309 | |||
310 | IMIA4 = (unsigned long)timer4_isr; // install ISR | ||
311 | |||
312 | TSR4 &= ~0x01; | ||
313 | TIER4 = 0xF9; // Enable GRA match interrupt | ||
314 | |||
315 | GRA4 = (unsigned short)(period/4 - 1); | ||
316 | TCR4 = 0x22; // clear at GRA match, sysclock/4 | ||
317 | IPRD = (IPRD & 0xFF0F) | 0x0010; // interrupt priority 1 (lowest) | ||
318 | or_b(0x10, &TSTR); // start timer 4 | ||
319 | } | ||
320 | else | ||
321 | { | ||
322 | and_b(~0x10, &TSTR); // stop the timer 4 | ||
323 | IPRD = (IPRD & 0xFF0F); // disable interrupt | ||
324 | } | ||
325 | } | ||
326 | |||
327 | |||
328 | // timer interrupt handler to display a frame | 297 | // timer interrupt handler to display a frame |
329 | void timer4_isr(void) // IMIA4 | 298 | void timer4_isr(void) |
330 | { | 299 | { |
331 | int available; | 300 | int available; |
332 | tAudioFrameHeader* pAudioBuf; | 301 | tAudioFrameHeader* pAudioBuf; |
@@ -379,7 +348,7 @@ void timer4_isr(void) // IMIA4 | |||
379 | else | 348 | else |
380 | { | 349 | { |
381 | gPlay.bVideoUnderrun = true; | 350 | gPlay.bVideoUnderrun = true; |
382 | timer_set(0); // disable ourselves | 351 | rb->plugin_unregister_timer(); // disable ourselves |
383 | return; // no data available | 352 | return; // no data available |
384 | } | 353 | } |
385 | } | 354 | } |
@@ -480,7 +449,7 @@ int SeekTo(int fd, int nPos) | |||
480 | if (gPlay.bHasAudio) | 449 | if (gPlay.bHasAudio) |
481 | rb->mp3_play_stop(); // stop audio ISR | 450 | rb->mp3_play_stop(); // stop audio ISR |
482 | if (gPlay.bHasVideo) | 451 | if (gPlay.bHasVideo) |
483 | timer_set(0); // stop the timer 4 | 452 | rb->plugin_unregister_timer(); // stop the timer |
484 | 453 | ||
485 | rb->lseek(fd, nPos, SEEK_SET); | 454 | rb->lseek(fd, nPos, SEEK_SET); |
486 | 455 | ||
@@ -526,7 +495,8 @@ int SeekTo(int fd, int nPos) | |||
526 | if (gPlay.bHasVideo) | 495 | if (gPlay.bHasVideo) |
527 | { | 496 | { |
528 | gPlay.bVideoUnderrun = false; | 497 | gPlay.bVideoUnderrun = false; |
529 | timer_set(gFileHdr.video_frametime); // start display interrupt | 498 | // start display interrupt |
499 | rb->plugin_register_timer(gFileHdr.video_frametime, 1, timer4_isr); | ||
530 | } | 500 | } |
531 | 501 | ||
532 | return 0; | 502 | return 0; |
@@ -805,7 +775,7 @@ int main(char* filename) | |||
805 | gFileHdr.video_format = VIDEOFORMAT_RAW; | 775 | gFileHdr.video_format = VIDEOFORMAT_RAW; |
806 | gFileHdr.video_width = LCD_WIDTH; | 776 | gFileHdr.video_width = LCD_WIDTH; |
807 | gFileHdr.video_height = LCD_HEIGHT; | 777 | gFileHdr.video_height = LCD_HEIGHT; |
808 | gFileHdr.video_frametime = CLOCK / FPS; | 778 | gFileHdr.video_frametime = FREQ / FPS; |
809 | gFileHdr.bps_peak = gFileHdr.bps_average = LCD_WIDTH * LCD_HEIGHT * FPS; | 779 | gFileHdr.bps_peak = gFileHdr.bps_average = LCD_WIDTH * LCD_HEIGHT * FPS; |
810 | } | 780 | } |
811 | 781 | ||
@@ -855,7 +825,7 @@ int main(char* filename) | |||
855 | rb->close(fd); // close the file | 825 | rb->close(fd); // close the file |
856 | 826 | ||
857 | if (gPlay.bHasVideo) | 827 | if (gPlay.bHasVideo) |
858 | timer_set(0); // stop video ISR, now I can use the display again | 828 | rb->plugin_unregister_timer(); // stop video ISR, now I can use the display again |
859 | 829 | ||
860 | if (gPlay.bHasAudio) | 830 | if (gPlay.bHasAudio) |
861 | rb->mp3_play_stop(); // stop audio ISR | 831 | rb->mp3_play_stop(); // stop audio ISR |