winecoreaudio: For waveOut, don't use STOPPED state; it's redundant.
The distinction between PLAYING and STOPPED has always been whether lpPlayPtr is NULL, so just use that instead of two states.
This commit is contained in:
parent
06d705e7df
commit
5c4ed3bcce
|
@ -87,22 +87,21 @@ AudioUnitRender( AudioUnit ci,
|
||||||
* +---------+-------------+---------------+---------------------------------+
|
* +---------+-------------+---------------+---------------------------------+
|
||||||
* | state | function | event | new state |
|
* | state | function | event | new state |
|
||||||
* +---------+-------------+---------------+---------------------------------+
|
* +---------+-------------+---------------+---------------------------------+
|
||||||
* | | open() | | STOPPED |
|
* | | open() | | PLAYING |
|
||||||
* | PAUSED | write() | | PAUSED |
|
* | PAUSED | write() | | PAUSED |
|
||||||
* | STOPPED | write() | <thrd create> | PLAYING |
|
|
||||||
* | PLAYING | write() | HEADER | PLAYING |
|
* | PLAYING | write() | HEADER | PLAYING |
|
||||||
* | (other) | write() | <error> | |
|
* | (other) | write() | <error> | |
|
||||||
* | (any) | pause() | PAUSING | PAUSED |
|
* | (any) | pause() | PAUSING | PAUSED |
|
||||||
* | PAUSED | restart() | RESTARTING | PLAYING (if no thrd => STOPPED) |
|
* | PAUSED | restart() | RESTARTING | PLAYING |
|
||||||
* | (any) | reset() | RESETTING | STOPPED |
|
* | (any) | reset() | RESETTING | PLAYING |
|
||||||
* | (any) | close() | CLOSING | CLOSED |
|
* | (any) | close() | CLOSING | CLOSED |
|
||||||
* +---------+-------------+---------------+---------------------------------+
|
* +---------+-------------+---------------+---------------------------------+
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* states of the playing device */
|
/* states of the playing device */
|
||||||
#define WINE_WS_PLAYING 0
|
#define WINE_WS_PLAYING 0 /* for waveOut: lpPlayPtr == NULL -> stopped */
|
||||||
#define WINE_WS_PAUSED 1
|
#define WINE_WS_PAUSED 1
|
||||||
#define WINE_WS_STOPPED 2
|
#define WINE_WS_STOPPED 2 /* Not used for waveOut */
|
||||||
#define WINE_WS_CLOSED 3
|
#define WINE_WS_CLOSED 3
|
||||||
#define WINE_WS_OPENING 4
|
#define WINE_WS_OPENING 4
|
||||||
#define WINE_WS_CLOSING 5
|
#define WINE_WS_CLOSING 5
|
||||||
|
@ -888,7 +887,7 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
|
||||||
wwo->audioUnit = audioUnit;
|
wwo->audioUnit = audioUnit;
|
||||||
wwo->streamDescription = streamFormat;
|
wwo->streamDescription = streamFormat;
|
||||||
|
|
||||||
wwo->state = WINE_WS_STOPPED;
|
wwo->state = WINE_WS_PLAYING;
|
||||||
|
|
||||||
wwo->wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
|
wwo->wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
|
||||||
|
|
||||||
|
@ -1101,9 +1100,7 @@ static void wodHelper_PlayPtrNext(WINE_WAVEOUT* wwo)
|
||||||
/* We didn't loop back. Advance to the next wave header */
|
/* We didn't loop back. Advance to the next wave header */
|
||||||
wwo->lpPlayPtr = wwo->lpPlayPtr->lpNext;
|
wwo->lpPlayPtr = wwo->lpPlayPtr->lpNext;
|
||||||
|
|
||||||
if (!wwo->lpPlayPtr)
|
if (wwo->lpPlayPtr)
|
||||||
wwo->state = WINE_WS_STOPPED;
|
|
||||||
else
|
|
||||||
wodHelper_CheckForLoopBegin(wwo);
|
wodHelper_CheckForLoopBegin(wwo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1228,9 +1225,6 @@ static DWORD wodWrite(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
|
||||||
{
|
{
|
||||||
wwo->lpPlayPtr = lpWaveHdr;
|
wwo->lpPlayPtr = lpWaveHdr;
|
||||||
|
|
||||||
if (wwo->state == WINE_WS_STOPPED)
|
|
||||||
wwo->state = WINE_WS_PLAYING;
|
|
||||||
|
|
||||||
wodHelper_CheckForLoopBegin(wwo);
|
wodHelper_CheckForLoopBegin(wwo);
|
||||||
|
|
||||||
wwo->dwPartialOffset = 0;
|
wwo->dwPartialOffset = 0;
|
||||||
|
@ -1259,9 +1253,9 @@ static DWORD wodPause(WORD wDevID)
|
||||||
* the mutex while we make an Audio Unit call. Stop the Audio Unit before
|
* the mutex while we make an Audio Unit call. Stop the Audio Unit before
|
||||||
* setting the PAUSED state. In wodRestart, the order is reversed. This
|
* setting the PAUSED state. In wodRestart, the order is reversed. This
|
||||||
* guarantees that we can't get into a situation where the state is
|
* guarantees that we can't get into a situation where the state is
|
||||||
* PLAYING or STOPPED but the Audio Unit isn't running. Although we can
|
* PLAYING but the Audio Unit isn't running. Although we can be in PAUSED
|
||||||
* be in PAUSED state with the Audio Unit still running, that's harmless
|
* state with the Audio Unit still running, that's harmless because the
|
||||||
* because the render callback will just produce silence.
|
* render callback will just produce silence.
|
||||||
*/
|
*/
|
||||||
status = AudioOutputUnitStop(WOutDev[wDevID].audioUnit);
|
status = AudioOutputUnitStop(WOutDev[wDevID].audioUnit);
|
||||||
if (status) {
|
if (status) {
|
||||||
|
@ -1270,7 +1264,7 @@ static DWORD wodPause(WORD wDevID)
|
||||||
}
|
}
|
||||||
|
|
||||||
OSSpinLockLock(&WOutDev[wDevID].lock);
|
OSSpinLockLock(&WOutDev[wDevID].lock);
|
||||||
if (WOutDev[wDevID].state == WINE_WS_PLAYING || WOutDev[wDevID].state == WINE_WS_STOPPED)
|
if (WOutDev[wDevID].state == WINE_WS_PLAYING)
|
||||||
WOutDev[wDevID].state = WINE_WS_PAUSED;
|
WOutDev[wDevID].state = WINE_WS_PAUSED;
|
||||||
OSSpinLockUnlock(&WOutDev[wDevID].lock);
|
OSSpinLockUnlock(&WOutDev[wDevID].lock);
|
||||||
|
|
||||||
|
@ -1293,21 +1287,16 @@ static DWORD wodRestart(WORD wDevID)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The order of the following operations is important since we can't hold
|
/* The order of the following operations is important since we can't hold
|
||||||
* the mutex while we make an Audio Unit call. Set the PLAYING/STOPPED
|
* the mutex while we make an Audio Unit call. Set the PLAYING
|
||||||
* state before starting the Audio Unit. In wodPause, the order is
|
* state before starting the Audio Unit. In wodPause, the order is
|
||||||
* reversed. This guarantees that we can't get into a situation where
|
* reversed. This guarantees that we can't get into a situation where
|
||||||
* the state is PLAYING or STOPPED but the Audio Unit isn't running.
|
* the state is PLAYING but the Audio Unit isn't running.
|
||||||
* Although we can be in PAUSED state with the Audio Unit still running,
|
* Although we can be in PAUSED state with the Audio Unit still running,
|
||||||
* that's harmless because the render callback will just produce silence.
|
* that's harmless because the render callback will just produce silence.
|
||||||
*/
|
*/
|
||||||
OSSpinLockLock(&WOutDev[wDevID].lock);
|
OSSpinLockLock(&WOutDev[wDevID].lock);
|
||||||
if (WOutDev[wDevID].state == WINE_WS_PAUSED)
|
if (WOutDev[wDevID].state == WINE_WS_PAUSED)
|
||||||
{
|
WOutDev[wDevID].state = WINE_WS_PLAYING;
|
||||||
if (WOutDev[wDevID].lpPlayPtr)
|
|
||||||
WOutDev[wDevID].state = WINE_WS_PLAYING;
|
|
||||||
else
|
|
||||||
WOutDev[wDevID].state = WINE_WS_STOPPED;
|
|
||||||
}
|
|
||||||
OSSpinLockUnlock(&WOutDev[wDevID].lock);
|
OSSpinLockUnlock(&WOutDev[wDevID].lock);
|
||||||
|
|
||||||
status = AudioOutputUnitStart(WOutDev[wDevID].audioUnit);
|
status = AudioOutputUnitStart(WOutDev[wDevID].audioUnit);
|
||||||
|
@ -1351,7 +1340,7 @@ static DWORD wodReset(WORD wDevID)
|
||||||
|
|
||||||
lpSavedQueuePtr = wwo->lpQueuePtr;
|
lpSavedQueuePtr = wwo->lpQueuePtr;
|
||||||
wwo->lpPlayPtr = wwo->lpQueuePtr = wwo->lpLoopPtr = NULL;
|
wwo->lpPlayPtr = wwo->lpQueuePtr = wwo->lpLoopPtr = NULL;
|
||||||
wwo->state = WINE_WS_STOPPED;
|
wwo->state = WINE_WS_PLAYING;
|
||||||
wwo->dwPlayedTotal = wwo->dwWrittenTotal = 0;
|
wwo->dwPlayedTotal = wwo->dwWrittenTotal = 0;
|
||||||
|
|
||||||
wwo->dwPartialOffset = 0; /* Clear partial wavehdr */
|
wwo->dwPartialOffset = 0; /* Clear partial wavehdr */
|
||||||
|
|
Loading…
Reference in New Issue