forked from len0rd/rockbox
uses the new timer registration of the plugin API, no hardware banging any more
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4564 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
68002763a7
commit
664959aed4
1 changed files with 8 additions and 38 deletions
|
|
@ -34,8 +34,6 @@
|
||||||
|
|
||||||
/****************** constants ******************/
|
/****************** constants ******************/
|
||||||
|
|
||||||
#define IMIA4 (*((volatile unsigned long*)0x09000180)) // timer 4
|
|
||||||
|
|
||||||
#define INT_MAX ((int)(~(unsigned)0 >> 1))
|
#define INT_MAX ((int)(~(unsigned)0 >> 1))
|
||||||
#define INT_MIN (-INT_MAX-1)
|
#define INT_MIN (-INT_MAX-1)
|
||||||
|
|
||||||
|
|
@ -51,8 +49,7 @@
|
||||||
|
|
||||||
|
|
||||||
/****************** prototypes ******************/
|
/****************** prototypes ******************/
|
||||||
void timer_set(unsigned period); // setup ISR and timer registers
|
void timer4_isr(void); // IMIA4 ISR
|
||||||
void timer4_isr(void) __attribute__((interrupt_handler)); // IMIA4 ISR
|
|
||||||
int check_button(void); // determine next relative frame
|
int check_button(void); // determine next relative frame
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -63,7 +60,6 @@ int check_button(void); // determine next relative frame
|
||||||
#define HEADER_MAGIC 0x52564668 // "RVFh" at file start
|
#define HEADER_MAGIC 0x52564668 // "RVFh" at file start
|
||||||
#define AUDIO_MAGIC 0x41756446 // "AudF" for each audio block
|
#define AUDIO_MAGIC 0x41756446 // "AudF" for each audio block
|
||||||
#define FILEVERSION 100 // 1.00
|
#define FILEVERSION 100 // 1.00
|
||||||
#define CLOCK 11059200 // SH CPU clock
|
|
||||||
|
|
||||||
// format type definitions
|
// format type definitions
|
||||||
#define VIDEOFORMAT_NO_VIDEO 0
|
#define VIDEOFORMAT_NO_VIDEO 0
|
||||||
|
|
@ -298,35 +294,8 @@ void SyncVideo(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// setup ISR and timer registers
|
|
||||||
void timer_set(unsigned period)
|
|
||||||
{
|
|
||||||
if (period)
|
|
||||||
{
|
|
||||||
and_b(~0x10, &TSTR); // Stop the timer 4
|
|
||||||
and_b(~0x10, &TSNC); // No synchronization
|
|
||||||
and_b(~0x10, &TMDR); // Operate normally
|
|
||||||
|
|
||||||
IMIA4 = (unsigned long)timer4_isr; // install ISR
|
|
||||||
|
|
||||||
TSR4 &= ~0x01;
|
|
||||||
TIER4 = 0xF9; // Enable GRA match interrupt
|
|
||||||
|
|
||||||
GRA4 = (unsigned short)(period/4 - 1);
|
|
||||||
TCR4 = 0x22; // clear at GRA match, sysclock/4
|
|
||||||
IPRD = (IPRD & 0xFF0F) | 0x0010; // interrupt priority 1 (lowest)
|
|
||||||
or_b(0x10, &TSTR); // start timer 4
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
and_b(~0x10, &TSTR); // stop the timer 4
|
|
||||||
IPRD = (IPRD & 0xFF0F); // disable interrupt
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// timer interrupt handler to display a frame
|
// timer interrupt handler to display a frame
|
||||||
void timer4_isr(void) // IMIA4
|
void timer4_isr(void)
|
||||||
{
|
{
|
||||||
int available;
|
int available;
|
||||||
tAudioFrameHeader* pAudioBuf;
|
tAudioFrameHeader* pAudioBuf;
|
||||||
|
|
@ -379,7 +348,7 @@ void timer4_isr(void) // IMIA4
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gPlay.bVideoUnderrun = true;
|
gPlay.bVideoUnderrun = true;
|
||||||
timer_set(0); // disable ourselves
|
rb->plugin_unregister_timer(); // disable ourselves
|
||||||
return; // no data available
|
return; // no data available
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -480,7 +449,7 @@ int SeekTo(int fd, int nPos)
|
||||||
if (gPlay.bHasAudio)
|
if (gPlay.bHasAudio)
|
||||||
rb->mp3_play_stop(); // stop audio ISR
|
rb->mp3_play_stop(); // stop audio ISR
|
||||||
if (gPlay.bHasVideo)
|
if (gPlay.bHasVideo)
|
||||||
timer_set(0); // stop the timer 4
|
rb->plugin_unregister_timer(); // stop the timer
|
||||||
|
|
||||||
rb->lseek(fd, nPos, SEEK_SET);
|
rb->lseek(fd, nPos, SEEK_SET);
|
||||||
|
|
||||||
|
|
@ -526,7 +495,8 @@ int SeekTo(int fd, int nPos)
|
||||||
if (gPlay.bHasVideo)
|
if (gPlay.bHasVideo)
|
||||||
{
|
{
|
||||||
gPlay.bVideoUnderrun = false;
|
gPlay.bVideoUnderrun = false;
|
||||||
timer_set(gFileHdr.video_frametime); // start display interrupt
|
// start display interrupt
|
||||||
|
rb->plugin_register_timer(gFileHdr.video_frametime, 1, timer4_isr);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -805,7 +775,7 @@ int main(char* filename)
|
||||||
gFileHdr.video_format = VIDEOFORMAT_RAW;
|
gFileHdr.video_format = VIDEOFORMAT_RAW;
|
||||||
gFileHdr.video_width = LCD_WIDTH;
|
gFileHdr.video_width = LCD_WIDTH;
|
||||||
gFileHdr.video_height = LCD_HEIGHT;
|
gFileHdr.video_height = LCD_HEIGHT;
|
||||||
gFileHdr.video_frametime = CLOCK / FPS;
|
gFileHdr.video_frametime = FREQ / FPS;
|
||||||
gFileHdr.bps_peak = gFileHdr.bps_average = LCD_WIDTH * LCD_HEIGHT * FPS;
|
gFileHdr.bps_peak = gFileHdr.bps_average = LCD_WIDTH * LCD_HEIGHT * FPS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -855,7 +825,7 @@ int main(char* filename)
|
||||||
rb->close(fd); // close the file
|
rb->close(fd); // close the file
|
||||||
|
|
||||||
if (gPlay.bHasVideo)
|
if (gPlay.bHasVideo)
|
||||||
timer_set(0); // stop video ISR, now I can use the display again
|
rb->plugin_unregister_timer(); // stop video ISR, now I can use the display again
|
||||||
|
|
||||||
if (gPlay.bHasAudio)
|
if (gPlay.bHasAudio)
|
||||||
rb->mp3_play_stop(); // stop audio ISR
|
rb->mp3_play_stop(); // stop audio ISR
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue