void spinUp() { g_print("Spinning up Drive...\n"); cdrom_set_speed(&cd, 1); cdrom_read(&cd, 0, 1000); cdrom_clear_cache(&cd); }
void timedRead(void *ptr) { struct timedReadParams *params = ptr; //g_print("\treading %d sectors from offset sector %d\n", (*params).count, (*params).sector); cdrom_read(&cd, (*params).sector, (*params).count); }
void speedTest() { int i; struct timedReadParams params; for(i = 1; i <= 52; i *= 2) { g_print("Spinning up Drive to %dx...\n", i); cdrom_set_speed(&cd, i); cdrom_read(&cd, 0, 1000); cdrom_clear_cache(&cd); params.sector = 0; params.count = 1000; g_print("\ttime: %f\n", stopwatch(timedRead, ¶ms)); } }
static ssize_t cdrom_devfs_read(devfs_dev_t *devfs,void *buf,size_t count,off_t offset) { struct cdrom_device *dev = devfs->user_data; size_t lba = offset/dev->block_size; size_t off = offset%dev->block_size; size_t count_rem = count; while (count_rem>0) { size_t count_cur = off+count_rem>dev->block_size?dev->block_size-off:count_rem; void *cdrom_buf = cdrom_read(dev,lba,1); memcpy(buf,cdrom_buf+off,count_cur); off = 0; lba++; count_rem -= count_cur; buf += count_cur; } return count; }