Add read speed option for macOS and Linux - #60
Conversation
Bloomca
left a comment
There was a problem hiding this comment.
I think this API looks good! I left a few comments for the implementation, also there a few typos in the comments but we can fix it later.
I think we should an example of "slow_read_track" which would read the first track from the default drive at 10x.
@strict-flower One question I am curious about and forgot to ask in the issue. If custom multiplier does persist (we'll need to test it), do you think we should set speed back to optimal in the drive destructor?
|
@Bloomca Thanks for the quick review. I've fixed them. I'll write & testing the Linux implementation today.
I tested that. The DKIOCCDSETSPEED ioctl seems to set the drive speed until the disc is ejected. Below is my experiment summary.
... and the default state seems to be Optimal, but we can't confirm that because DKIOCCDGETSPEED only returns the current speed1, according to my experiments. Footnotes
|
|
I think it's difficult to restore the original state. At least, macOS doesn't seem to provide a way to get the original state. Moreover, we could get the read speed performance data of the drive, but we can't get the current speed policy of the drive. In other words, even if the current speed is 10x, we can't determine whether the value was set by another program, is the default value of the drive, or was selected automatically.
|
|
I wrote the implementation for Linux and tested. It seems to work correctly. Also I tested
Although I didn't eject the CD during the above procedure, the speed setting did not persist. On Linux, it seems to be reset on each Additionally, I tested this on an internal disc drive (ASUS BC-12D2HT). This drive seems to ignore the requested speed with the Thus, unlike my earlier comments, I think the best destructor behaviour may be OS-dependent. However, there is also the possibility that we don't need to restore the policy at all.
Footnotes
|
|
Thanks for the comprehensive testing! Alright, I believe it is easier to skip restoring and just document that the behavior is OS/drive dependent. I thought for a second to expose Can you please add a test where we read first track on ~10x speed, and then second track on optimal speed? After that I think we can just merge your PR and I will make a separate Windows PR.
|
I agree.
Should the test be deterministic? We can add a read example, but I think it's hard to make this a deterministic test because the actual behaviour depends on the hardware. (If you didn't mean an integration test, could you clarify what kind of test you had in mind?) I'll fix the conflicts and write the documentation in tomorrow. I've also changed the PR title. |
|
Oh, I apologize -- I meant an example. Something similar to https://github.com/Bloomca/rust-cd-da-reader/blob/main/examples/read_first_track.rs, but with the speed config. Tests are tricky exactly because the behaviour depends on the hardware. The library is not particularly well-tested because of that. I validate each release by myself by running all the examples mostly, and I have a CD ripper app which I run as well. |
|
@Bloomca Okay, I wrote an example and related documentation. Could you review it? |
Bloomca
left a comment
There was a problem hiding this comment.
I think it looks good! I ran the example, and it works well.
A few things:
- I think the formatter has some issues
- can you please add an empty implementation for windows? Just return
(), otherwise Windows build won't compile
Thanks again for working on this!
|
Thanks for the review! I've fixed that and I've added a stub implementation for Windows backend.
I've rerun |
|
Awesome, thanks! The clippy fails because of unused variables on Windows, but that's fine, I will open a PR ~tomorrow to add Windows support. After that I'll review all the Rustdocs and should make a 1.0 release this week, which will include this feature 🎉 |
|
Thanks! |
Description
Background discussion is #59
This PR will add the
ReadSpeedenum (src/data_reader/read_speed.rs) and related public API. The enum represents a request to the drive for a particular read speed.Limitation