Order of setting audio Play/Pause state and device opening

Joerg-Cyril.Hoehle at t-systems.com Joerg-Cyril.Hoehle at t-systems.com
Thu Oct 29 09:18:50 CDT 2009


Ken,

I was please to see your recent changes to winecoreaudio.  In my
quest for audio bugs, when I reviewed the code, I found the
following which I believe is wrong or I don't understand.
Maybe you could look at it?

BTW, the code and comments are the same in both wineoss.drv and
winecoreaudio.drv.

In audio.c/wodPause:
     /* The order of the following operations is important since we
can't hold
      * the mutex while we make an Audio Unit call.  Stop the Audio Unit
before
      * setting the PAUSED state.
That's indeed what the code below does.

      * Although we can be in PAUSED
      * state with the Audio Unit still running,
Quite to the contrary, PAUSED state is only set after the unit stopped.

      * that's harmless because the
      * render callback will just produce silence.
I can't comment on that.

The code is (error checking not shown):
     status = AudioOutputUnitStop(wwo->audioUnit);
     OSSpinLockLock(&wwo->lock);
     if (wwo->state == WINE_WS_PLAYING)
         wwo->state = WINE_WS_PAUSED;
     OSSpinLockUnlock(&wwo->lock);


In audio.c/wodRestart:
      * In wodRestart, the order is reversed.
Indeed.

      * This guarantees that we can't get into a situation where the
state is
      * PLAYING but the Audio Unit isn't running.
Quite to the contrary, PLAYING state is reached yet
AudioOutputUnitStart is only called a few instructions afterwards.
Likewise above, it's stopped and PLAYING state is only unset afterwards.

     OSSpinLockLock(&wwo->lock);
     if (wwo->state == WINE_WS_PAUSED)
         wwo->state = WINE_WS_PLAYING;
     OSSpinLockUnlock(&wwo->lock);
     status = AudioOutputUnitStart(wwo->audioUnit);

Is my understanding wrong?
Does the code need be changed to reflect the comments?
Do the comments need correction?

Thanks,
	Jorg Hohle



More information about the wine-devel mailing list