FS#7879 - Anti-skip buffer doesn't work correctly on read errors
I use my iHP-120 harddisk player with rockbox while jogging regularly, but sometimes the track just stops and the player instantly skips to the next track, presumably due to a read error.
I have the anti-skip buffer set to 10 minutes already, but I doubt it has actually been trying to read for that long because it can switch to the next track so fast.
In the rockbox code, I found out that when the buffer runs out, audio_read_file in playback.c is called. For disk access it calls read() and if that fails it seems to skip to the next track (the log it does is “File ended %ldB early”)
In ata.c I found that the read is performed by ata_read_sectors, which does indeed have some mechanism to retry on errors, but only for READ_TIMEOUT time, which is only 5 seconds. After that an error is returned, and from what I understand, no retry is attempted after that, even though there may still be 9 minutes and 55 seconds left in the buffer.
I think playback.c should know what was the cause of the read error to decide if it should try again or indeed skip to the next file.
Loading...
Available keyboard shortcuts
- Alt + ⇧ Shift + l Login Dialog / Logout
- Alt + ⇧ Shift + a Add new task
- Alt + ⇧ Shift + m My searches
- Alt + ⇧ Shift + t focus taskid search
Tasklist
- o open selected task
- j move cursor down
- k move cursor up
Task Details
- n Next task
- p Previous task
- Alt + ⇧ Shift + e ↵ Enter Edit this task
- Alt + ⇧ Shift + w watch task
- Alt + ⇧ Shift + y Close Task
Task Editing
- Alt + ⇧ Shift + s save task
tip 1: DO NOT USE A HARDDISK BASED PLAYER FOR SPORTS like jogging. Seriously. Get a flash based player for that stuff….
I still think that rockbox should play the entire buffer before skipping to the next file.
I've been using it for 3 years while jogging now, and the hard disk is still perfectly fine without bad sectors.
My ipod4g has been my jogging companion. It is rocking the country just fine.
READ_TIMEOUT in firmware/drivers/ata.c is always 5 seconds. If a read operation cannot succeed in 5 seconds, no further retries are made and failure is reported. The anti-skip buffer only helps if operations keep succeeding but are slow.