libcdio-help
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Libcdio-help] Custom read_audio function


From: Bastiaan Timmer
Subject: Re: [Libcdio-help] Custom read_audio function
Date: Tue, 22 Nov 2011 07:20:59 -0800 (PST)

Thanks for the quick reply!

--- On Tue, 11/22/11, Rocky Bernstein <address@hidden> wrote:
paranoia_read() is from Monty/Xiph's paranoia;  thus it follows that API, which as you have noted is not to return NULL on error.  I don't see why it couldn't  do so, but that would be changing the paranoia API. So it would be best to get it changed both in paranoia as well as libcdio's use of it.
Right, that would seem like a good idea, but it is a long-term solution (especially considering the slow changes to Xiph's paranoia). Also, not returning NULL is only part of the problem (see below).
The way paranoia expects a program to handle errors is via that callback. You note that you did get an error through the callback. The part that is tricky here is that with all this indirection, I'm not sure how the callback can actually get the error parameter. But we could make sure there is some way.
Well I'm not completely sure having the error parameter in the callback would help that much, because the callback can't make read_paranoia() return, right? As I said, the problem is not so much that paranoia_read() does not return NULL (which would help me decide to break out of the reading-loop), the big problem is is that paranoia_read() doesn't return at all! And as far as I can tell there nothing I can do (returning something, setting some variable) in functions accessible to me (the callback and the read function) that will force paranoia_read to return.
As for the multiple level of error messages, well that is all under your control. The low-level libcdio error messages can be turned off by setting the log level.  And then there is the std::cout you added. And finally there is the error message in the callback. Choose however many or which you want to see.
Yes, I knew all that, my program accepts a verbosity option which I had cranked up to get this output (plus the added std::cout). The logging options in libcdio are nice and much appreciated.
As for the question of at what point you should bread from the read loop on an error depends on you. Probably if you get a BAD_PARAMETER_OP, that's probably not going to change so you could bail immediately. Other errors may require more discrimination. The whole idea of cd-paranoia though is to tolerate errors on the hope that some of them are transient. But with that flexibility comes the responsibility of the program to make the determination.
So, the only solution I have thought of until now, is to have read_audio(), when it fails, not _return_ the error code but _throw_ it. Then I can just catch it right outside of the read_paranoia() loop, and inform the user of the problem. But indeed, I'm wondering if I should throw on all possible errors. Looking at the list in device.h, I guess the program might as well exit on DRIVER_OP_BAD_PARAMETER, BAD_POINTER, UNSUPPORTED and NOT_PERMITTED. I suppose I could fix the problems indicated by UNINT and NO_DRIVER (after breaking the loop of course). I am not sure about DRIVER_OP_ERROR and MMC_SENSE_DATA because I really don't know what they mean. Any thoughts?

Also, please let me know if you have any other solution than throwing, I have actually managed to never write throwing functions up til now, so now I think I have to read up on C++ exception handling. Also, C programmers in my situation wouldn't have this luxury.

By the way, when I made the typo in the mmc_read command that resulted in this issue, the typo had the effect of passing a NULL pointer as 2nd parameter ('Place to store data.'). Shouldn't it have returned DRIVER_OP_BAD_POINTER instead of BAD_PARAMETER?

Thanks again!
Bas Timmer

reply via email to

[Prev in Thread] Current Thread [Next in Thread]