views:

107

answers:

3

I'm working through a chapter about iPhone audio and have come across a section of code that I can't make sense of:

while (aqc.playPtr < aqc.sampleLen) 
{
    select(NULL, NULL, NULL, NULL, 1.0);
}

(Full code sample is on pages 163-166). From what I understand of the code the audio is being processed on another thread and the while loop is just there to prevent the main thread from terminating while audio is still being processed.

What I don't understand is why select() is being used instead of sleep().

From what I've read select() is used to monitor changes in I/O and passing it NULLs doesn't do anything meaningful. I've ran the code using sleep() and it works as expected. (My knowledge of low level POSIX is almost non-existant.)

+2  A: 

Using select() with NULL rfds, wfds and efds is an idiomatic way of portably sleeping with subsecond resolution.

ninjalj
But isn't `timeout` (the 5th argument) supposed to be a (possibly NULL) pointer to a `struct timeval`?
Matthew Flaschen
@Matthew yes, correct.
ninjalj
A: 

There's no reason to do it. There's no reason ever to Sleep() either. One should always be expecting at least one event - program shutdown request.

Pavel Radzivilovsky
I don't see what that has to do with anything. A shutdown request will cause a `SIGTERM` which is handled by a signal handler, default or otherwise.
Matthew Flaschen
That neither answers the question, nor makes much sense... there's plenty of good reasons to sleep, especially on embedded platforms (which half-includes the iPhone, I guess)
Steven Schlansker
+5  A: 

Select allow for accurate sub second wait, and is more portable than sleep. There are other ways to wait, see this question.

But the timeout parameter of select should not be a float but a pointer to struct timeval. I'm surprised the code you show even compiles. More : this strange conditional select is followed by an unconditionnal sleep(1). Looks pointless to me.

kriss