Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
5d8177c2
Commit
5d8177c2
authored
Oct 11, 2009
by
Ken Thomases
Committed by
Alexandre Julliard
Oct 12, 2009
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
winecoreaudio: Move instance-specific fields of WINE_WAVEOUT to sub-struct.
parent
b3ea0441
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
69 additions
and
64 deletions
+69
-64
audio.c
dlls/winecoreaudio.drv/audio.c
+69
-64
No files found.
dlls/winecoreaudio.drv/audio.c
View file @
5d8177c2
...
@@ -144,30 +144,35 @@ static CoreAudio_Device CoreAudio_DefaultDevice;
...
@@ -144,30 +144,35 @@ static CoreAudio_Device CoreAudio_DefaultDevice;
typedef
struct
{
typedef
struct
{
volatile
int
state
;
/* one of the WINE_WS_ manifest constants */
volatile
int
state
;
/* one of the WINE_WS_ manifest constants */
CoreAudio_Device
*
cadev
;
WAVEOPENDESC
waveDesc
;
WAVEOPENDESC
waveDesc
;
WORD
wFlags
;
WORD
wFlags
;
PCMWAVEFORMAT
format
;
PCMWAVEFORMAT
format
;
DWORD
woID
;
DWORD
woID
;
AudioUnit
audioUnit
;
AudioUnit
audioUnit
;
AudioStreamBasicDescription
streamDescription
;
AudioStreamBasicDescription
streamDescription
;
WAVEOUTCAPSW
caps
;
LPWAVEHDR
lpQueuePtr
;
/* start of queued WAVEHDRs (waiting to be notified) */
char
interface_name
[
32
];
LPWAVEHDR
lpPlayPtr
;
/* start of not yet fully played buffers */
LPWAVEHDR
lpQueuePtr
;
/* start of queued WAVEHDRs (waiting to be notified) */
DWORD
dwPartialOffset
;
/* Offset of not yet written bytes in lpPlayPtr */
LPWAVEHDR
lpPlayPtr
;
/* start of not yet fully played buffers */
DWORD
dwPartialOffset
;
/* Offset of not yet written bytes in lpPlayPtr */
LPWAVEHDR
lpLoopPtr
;
/* pointer of first buffer in loop, if any */
DWORD
dwLoops
;
/* private copy of loop counter */
LPWAVEHDR
lpLoopPtr
;
/* pointer of first buffer in loop, if any */
DWORD
dwLoops
;
/* private copy of loop counter */
DWORD
dwPlayedTotal
;
/* number of bytes actually played since opening */
DWORD
dwPlayedTotal
;
/* number of bytes actually played since opening */
OSSpinLock
lock
;
/* synchronization stuff */
OSSpinLock
lock
;
/* synchronization stuff */
}
WINE_WAVEOUT_INSTANCE
;
typedef
struct
{
CoreAudio_Device
*
cadev
;
WAVEOUTCAPSW
caps
;
char
interface_name
[
32
];
BOOL
trace_on
;
BOOL
trace_on
;
BOOL
warn_on
;
BOOL
warn_on
;
BOOL
err_on
;
BOOL
err_on
;
WINE_WAVEOUT_INSTANCE
instance
;
}
WINE_WAVEOUT
;
}
WINE_WAVEOUT
;
typedef
struct
{
typedef
struct
{
...
@@ -215,9 +220,9 @@ static WINE_WAVEIN WInDev [MAX_WAVEINDRV];
...
@@ -215,9 +220,9 @@ static WINE_WAVEIN WInDev [MAX_WAVEINDRV];
static
HANDLE
hThread
=
NULL
;
/* Track the thread we create so we can clean it up later */
static
HANDLE
hThread
=
NULL
;
/* Track the thread we create so we can clean it up later */
static
CFMessagePortRef
Port_SendToMessageThread
;
static
CFMessagePortRef
Port_SendToMessageThread
;
static
void
wodHelper_PlayPtrNext
(
WINE_WAVEOUT
*
wwo
);
static
void
wodHelper_PlayPtrNext
(
WINE_WAVEOUT
_INSTANCE
*
wwo
);
static
void
wodHelper_NotifyDoneForList
(
WINE_WAVEOUT
*
wwo
,
LPWAVEHDR
lpWaveHdr
);
static
void
wodHelper_NotifyDoneForList
(
WINE_WAVEOUT
_INSTANCE
*
wwo
,
LPWAVEHDR
lpWaveHdr
);
static
void
wodHelper_NotifyCompletions
(
WINE_WAVEOUT
*
wwo
,
BOOL
force
);
static
void
wodHelper_NotifyCompletions
(
WINE_WAVEOUT
_INSTANCE
*
wwo
,
BOOL
force
);
static
void
widHelper_NotifyCompletions
(
WINE_WAVEIN
*
wwi
);
static
void
widHelper_NotifyCompletions
(
WINE_WAVEIN
*
wwi
);
extern
int
AudioUnit_CreateDefaultAudioUnit
(
void
*
wwo
,
AudioUnit
*
au
);
extern
int
AudioUnit_CreateDefaultAudioUnit
(
void
*
wwo
,
AudioUnit
*
au
);
...
@@ -313,7 +318,7 @@ static CFDataRef wodMessageHandler(CFMessagePortRef port_ReceiveInMessageThread,
...
@@ -313,7 +318,7 @@ static CFDataRef wodMessageHandler(CFMessagePortRef port_ReceiveInMessageThread,
{
{
case
kWaveOutNotifyCompletionsMessage
:
case
kWaveOutNotifyCompletionsMessage
:
buffer
=
(
UInt32
*
)
CFDataGetBytePtr
(
data
);
buffer
=
(
UInt32
*
)
CFDataGetBytePtr
(
data
);
wodHelper_NotifyCompletions
(
&
WOutDev
[
buffer
[
0
]],
FALSE
);
wodHelper_NotifyCompletions
(
&
WOutDev
[
buffer
[
0
]]
.
instance
,
FALSE
);
break
;
break
;
case
kWaveInNotifyCompletionsMessage
:
case
kWaveInNotifyCompletionsMessage
:
buffer
=
(
UInt32
*
)
CFDataGetBytePtr
(
data
);
buffer
=
(
UInt32
*
)
CFDataGetBytePtr
(
data
);
...
@@ -348,7 +353,7 @@ static DWORD WINAPI messageThread(LPVOID p)
...
@@ -348,7 +353,7 @@ static DWORD WINAPI messageThread(LPVOID p)
* wodSendNotifyCompletionsMessage [internal]
* wodSendNotifyCompletionsMessage [internal]
* Call from AudioUnit IO thread can't use Wine debug channels.
* Call from AudioUnit IO thread can't use Wine debug channels.
*/
*/
static
void
wodSendNotifyCompletionsMessage
(
WINE_WAVEOUT
*
wwo
)
static
void
wodSendNotifyCompletionsMessage
(
WINE_WAVEOUT
_INSTANCE
*
wwo
)
{
{
CFDataRef
data
;
CFDataRef
data
;
UInt32
buffer
;
UInt32
buffer
;
...
@@ -577,9 +582,9 @@ LONG CoreAudio_WaveInit(void)
...
@@ -577,9 +582,9 @@ LONG CoreAudio_WaveInit(void)
static
const
WCHAR
wszWaveOutFormat
[]
=
static
const
WCHAR
wszWaveOutFormat
[]
=
{
'C'
,
'o'
,
'r'
,
'e'
,
'A'
,
'u'
,
'd'
,
'i'
,
'o'
,
' '
,
'W'
,
'a'
,
'v'
,
'e'
,
'O'
,
'u'
,
't'
,
' '
,
'%'
,
'd'
,
0
};
{
'C'
,
'o'
,
'r'
,
'e'
,
'A'
,
'u'
,
'd'
,
'i'
,
'o'
,
' '
,
'W'
,
'a'
,
'v'
,
'e'
,
'O'
,
'u'
,
't'
,
' '
,
'%'
,
'd'
,
0
};
WOutDev
[
i
].
state
=
WINE_WS_CLOSED
;
WOutDev
[
i
].
instance
.
state
=
WINE_WS_CLOSED
;
WOutDev
[
i
].
cadev
=
&
CoreAudio_DefaultDevice
;
WOutDev
[
i
].
cadev
=
&
CoreAudio_DefaultDevice
;
WOutDev
[
i
].
woID
=
i
;
WOutDev
[
i
].
instance
.
woID
=
i
;
memset
(
&
WOutDev
[
i
].
caps
,
0
,
sizeof
(
WOutDev
[
i
].
caps
));
memset
(
&
WOutDev
[
i
].
caps
,
0
,
sizeof
(
WOutDev
[
i
].
caps
));
...
@@ -616,7 +621,7 @@ LONG CoreAudio_WaveInit(void)
...
@@ -616,7 +621,7 @@ LONG CoreAudio_WaveInit(void)
WOutDev
[
i
].
caps
.
dwFormats
|=
WAVE_FORMAT_1M16
;
WOutDev
[
i
].
caps
.
dwFormats
|=
WAVE_FORMAT_1M16
;
WOutDev
[
i
].
caps
.
dwFormats
|=
WAVE_FORMAT_1S16
;
WOutDev
[
i
].
caps
.
dwFormats
|=
WAVE_FORMAT_1S16
;
WOutDev
[
i
].
lock
=
0
;
/* initialize the mutex */
WOutDev
[
i
].
instance
.
lock
=
0
;
/* initialize the mutex */
}
}
/* FIXME: implement sample rate conversion on input */
/* FIXME: implement sample rate conversion on input */
...
@@ -757,7 +762,7 @@ void CoreAudio_WaveRelease(void)
...
@@ -757,7 +762,7 @@ void CoreAudio_WaveRelease(void)
/**************************************************************************
/**************************************************************************
* wodNotifyClient [internal]
* wodNotifyClient [internal]
*/
*/
static
DWORD
wodNotifyClient
(
WINE_WAVEOUT
*
wwo
,
WORD
wMsg
,
DWORD
dwParam1
,
DWORD
dwParam2
)
static
DWORD
wodNotifyClient
(
WINE_WAVEOUT
_INSTANCE
*
wwo
,
WORD
wMsg
,
DWORD
dwParam1
,
DWORD
dwParam2
)
{
{
TRACE_
(
coreaudio
)(
"wMsg = 0x%04x dwParm1 = %04x dwParam2 = %04x
\n
"
,
wMsg
,
dwParam1
,
dwParam2
);
TRACE_
(
coreaudio
)(
"wMsg = 0x%04x dwParm1 = %04x dwParam2 = %04x
\n
"
,
wMsg
,
dwParam1
,
dwParam2
);
...
@@ -807,7 +812,7 @@ static DWORD wodGetDevCaps(WORD wDevID, LPWAVEOUTCAPSW lpCaps, DWORD dwSize)
...
@@ -807,7 +812,7 @@ static DWORD wodGetDevCaps(WORD wDevID, LPWAVEOUTCAPSW lpCaps, DWORD dwSize)
*/
*/
static
DWORD
wodOpen
(
WORD
wDevID
,
LPWAVEOPENDESC
lpDesc
,
DWORD
dwFlags
)
static
DWORD
wodOpen
(
WORD
wDevID
,
LPWAVEOPENDESC
lpDesc
,
DWORD
dwFlags
)
{
{
WINE_WAVEOUT
*
wwo
;
WINE_WAVEOUT
_INSTANCE
*
wwo
;
DWORD
ret
;
DWORD
ret
;
AudioStreamBasicDescription
streamFormat
;
AudioStreamBasicDescription
streamFormat
;
AudioUnit
audioUnit
=
NULL
;
AudioUnit
audioUnit
=
NULL
;
...
@@ -862,7 +867,7 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
...
@@ -862,7 +867,7 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
* mark the device as ready.
* mark the device as ready.
* Otherwise, clean up and mark the device as available.
* Otherwise, clean up and mark the device as available.
*/
*/
wwo
=
&
WOutDev
[
wDevID
];
wwo
=
&
WOutDev
[
wDevID
]
.
instance
;
if
(
!
OSSpinLockTry
(
&
wwo
->
lock
))
if
(
!
OSSpinLockTry
(
&
wwo
->
lock
))
return
MMSYSERR_ALLOCATED
;
return
MMSYSERR_ALLOCATED
;
...
@@ -938,9 +943,9 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
...
@@ -938,9 +943,9 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
wwo
->
dwPlayedTotal
=
0
;
wwo
->
dwPlayedTotal
=
0
;
wwo
->
trace_on
=
TRACE_ON
(
wave
);
WOutDev
[
wDevID
].
trace_on
=
TRACE_ON
(
wave
);
wwo
->
warn_on
=
WARN_ON
(
wave
);
WOutDev
[
wDevID
].
warn_on
=
WARN_ON
(
wave
);
wwo
->
err_on
=
ERR_ON
(
wave
);
WOutDev
[
wDevID
].
err_on
=
ERR_ON
(
wave
);
OSSpinLockUnlock
(
&
wwo
->
lock
);
OSSpinLockUnlock
(
&
wwo
->
lock
);
...
@@ -970,7 +975,7 @@ error:
...
@@ -970,7 +975,7 @@ error:
static
DWORD
wodClose
(
WORD
wDevID
)
static
DWORD
wodClose
(
WORD
wDevID
)
{
{
DWORD
ret
=
MMSYSERR_NOERROR
;
DWORD
ret
=
MMSYSERR_NOERROR
;
WINE_WAVEOUT
*
wwo
;
WINE_WAVEOUT
_INSTANCE
*
wwo
;
TRACE
(
"(%u);
\n
"
,
wDevID
);
TRACE
(
"(%u);
\n
"
,
wDevID
);
...
@@ -980,7 +985,7 @@ static DWORD wodClose(WORD wDevID)
...
@@ -980,7 +985,7 @@ static DWORD wodClose(WORD wDevID)
return
MMSYSERR_BADDEVICEID
;
return
MMSYSERR_BADDEVICEID
;
}
}
wwo
=
&
WOutDev
[
wDevID
];
wwo
=
&
WOutDev
[
wDevID
]
.
instance
;
OSSpinLockLock
(
&
wwo
->
lock
);
OSSpinLockLock
(
&
wwo
->
lock
);
if
(
wwo
->
lpQueuePtr
)
if
(
wwo
->
lpQueuePtr
)
{
{
...
@@ -1071,10 +1076,10 @@ static DWORD wodUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
...
@@ -1071,10 +1076,10 @@ static DWORD wodUnprepare(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
*
*
* Check if the new waveheader is the beginning of a loop, and set up
* Check if the new waveheader is the beginning of a loop, and set up
* state if so.
* state if so.
* This is called with the WAVEOUT lock held.
* This is called with the WAVEOUT
_INSTANCE
lock held.
* Call from AudioUnit IO thread can't use Wine debug channels.
* Call from AudioUnit IO thread can't use Wine debug channels.
*/
*/
static
void
wodHelper_CheckForLoopBegin
(
WINE_WAVEOUT
*
wwo
)
static
void
wodHelper_CheckForLoopBegin
(
WINE_WAVEOUT
_INSTANCE
*
wwo
)
{
{
LPWAVEHDR
lpWaveHdr
=
wwo
->
lpPlayPtr
;
LPWAVEHDR
lpWaveHdr
=
wwo
->
lpPlayPtr
;
...
@@ -1082,12 +1087,12 @@ static void wodHelper_CheckForLoopBegin(WINE_WAVEOUT* wwo)
...
@@ -1082,12 +1087,12 @@ static void wodHelper_CheckForLoopBegin(WINE_WAVEOUT* wwo)
{
{
if
(
wwo
->
lpLoopPtr
)
if
(
wwo
->
lpLoopPtr
)
{
{
if
(
wwo
->
warn_on
)
if
(
WOutDev
[
wwo
->
woID
].
warn_on
)
fprintf
(
stderr
,
"warn:winecoreaudio:wodHelper_CheckForLoopBegin Already in a loop. Discarding loop on this header (%p)
\n
"
,
lpWaveHdr
);
fprintf
(
stderr
,
"warn:winecoreaudio:wodHelper_CheckForLoopBegin Already in a loop. Discarding loop on this header (%p)
\n
"
,
lpWaveHdr
);
}
}
else
else
{
{
if
(
wwo
->
trace_on
)
if
(
WOutDev
[
wwo
->
woID
].
trace_on
)
fprintf
(
stderr
,
"trace:winecoreaudio:wodHelper_CheckForLoopBegin Starting loop (%dx) with %p
\n
"
,
lpWaveHdr
->
dwLoops
,
lpWaveHdr
);
fprintf
(
stderr
,
"trace:winecoreaudio:wodHelper_CheckForLoopBegin Starting loop (%dx) with %p
\n
"
,
lpWaveHdr
->
dwLoops
,
lpWaveHdr
);
wwo
->
lpLoopPtr
=
lpWaveHdr
;
wwo
->
lpLoopPtr
=
lpWaveHdr
;
...
@@ -1103,10 +1108,10 @@ static void wodHelper_CheckForLoopBegin(WINE_WAVEOUT* wwo)
...
@@ -1103,10 +1108,10 @@ static void wodHelper_CheckForLoopBegin(WINE_WAVEOUT* wwo)
* wodHelper_PlayPtrNext [internal]
* wodHelper_PlayPtrNext [internal]
*
*
* Advance the play pointer to the next waveheader, looping if required.
* Advance the play pointer to the next waveheader, looping if required.
* This is called with the WAVEOUT lock held.
* This is called with the WAVEOUT
_INSTANCE
lock held.
* Call from AudioUnit IO thread can't use Wine debug channels.
* Call from AudioUnit IO thread can't use Wine debug channels.
*/
*/
static
void
wodHelper_PlayPtrNext
(
WINE_WAVEOUT
*
wwo
)
static
void
wodHelper_PlayPtrNext
(
WINE_WAVEOUT
_INSTANCE
*
wwo
)
{
{
BOOL
didLoopBack
=
FALSE
;
BOOL
didLoopBack
=
FALSE
;
...
@@ -1136,13 +1141,13 @@ static void wodHelper_PlayPtrNext(WINE_WAVEOUT* wwo)
...
@@ -1136,13 +1141,13 @@ static void wodHelper_PlayPtrNext(WINE_WAVEOUT* wwo)
}
}
/* Send the "done" notification for each WAVEHDR in a list. The list must be
/* Send the "done" notification for each WAVEHDR in a list. The list must be
* free-standing. It should not be part of a device's queue.
* free-standing. It should not be part of a device
instance
's queue.
* This function must be called with the WAVEOUT
lock *not* held. Furthermore,
* This function must be called with the WAVEOUT
_INSTANCE lock *not* held.
*
it does not lock it, itself. That's because the callback to the application
*
Furthermore, it does not lock it, itself. That's because the callback to the
*
may prompt the application to operate on the device, and we don't want to
*
application may prompt the application to operate on the device, and we don't
* deadlock.
*
want to
deadlock.
*/
*/
static
void
wodHelper_NotifyDoneForList
(
WINE_WAVEOUT
*
wwo
,
LPWAVEHDR
lpWaveHdr
)
static
void
wodHelper_NotifyDoneForList
(
WINE_WAVEOUT
_INSTANCE
*
wwo
,
LPWAVEHDR
lpWaveHdr
)
{
{
while
(
lpWaveHdr
)
while
(
lpWaveHdr
)
{
{
...
@@ -1159,7 +1164,7 @@ static void wodHelper_NotifyDoneForList(WINE_WAVEOUT* wwo, LPWAVEHDR lpWaveHdr)
...
@@ -1159,7 +1164,7 @@ static void wodHelper_NotifyDoneForList(WINE_WAVEOUT* wwo, LPWAVEHDR lpWaveHdr)
/* if force is TRUE then notify the client that all the headers were completed
/* if force is TRUE then notify the client that all the headers were completed
*/
*/
static
void
wodHelper_NotifyCompletions
(
WINE_WAVEOUT
*
wwo
,
BOOL
force
)
static
void
wodHelper_NotifyCompletions
(
WINE_WAVEOUT
_INSTANCE
*
wwo
,
BOOL
force
)
{
{
LPWAVEHDR
lpFirstDoneWaveHdr
=
NULL
;
LPWAVEHDR
lpFirstDoneWaveHdr
=
NULL
;
...
@@ -1216,7 +1221,7 @@ static void wodHelper_NotifyCompletions(WINE_WAVEOUT* wwo, BOOL force)
...
@@ -1216,7 +1221,7 @@ static void wodHelper_NotifyCompletions(WINE_WAVEOUT* wwo, BOOL force)
static
DWORD
wodWrite
(
WORD
wDevID
,
LPWAVEHDR
lpWaveHdr
,
DWORD
dwSize
)
static
DWORD
wodWrite
(
WORD
wDevID
,
LPWAVEHDR
lpWaveHdr
,
DWORD
dwSize
)
{
{
LPWAVEHDR
*
wh
;
LPWAVEHDR
*
wh
;
WINE_WAVEOUT
*
wwo
;
WINE_WAVEOUT
_INSTANCE
*
wwo
;
TRACE
(
"(%u, %p, %lu, %08X);
\n
"
,
wDevID
,
lpWaveHdr
,
(
unsigned
long
)
lpWaveHdr
->
dwBufferLength
,
dwSize
);
TRACE
(
"(%u, %p, %lu, %08X);
\n
"
,
wDevID
,
lpWaveHdr
,
(
unsigned
long
)
lpWaveHdr
->
dwBufferLength
,
dwSize
);
...
@@ -1227,7 +1232,7 @@ static DWORD wodWrite(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
...
@@ -1227,7 +1232,7 @@ static DWORD wodWrite(WORD wDevID, LPWAVEHDR lpWaveHdr, DWORD dwSize)
return
MMSYSERR_BADDEVICEID
;
return
MMSYSERR_BADDEVICEID
;
}
}
wwo
=
&
WOutDev
[
wDevID
];
wwo
=
&
WOutDev
[
wDevID
]
.
instance
;
if
(
lpWaveHdr
->
lpData
==
NULL
||
!
(
lpWaveHdr
->
dwFlags
&
WHDR_PREPARED
))
if
(
lpWaveHdr
->
lpData
==
NULL
||
!
(
lpWaveHdr
->
dwFlags
&
WHDR_PREPARED
))
{
{
...
@@ -1287,14 +1292,14 @@ static DWORD wodPause(WORD wDevID)
...
@@ -1287,14 +1292,14 @@ static DWORD wodPause(WORD wDevID)
* state with the Audio Unit still running, that's harmless because the
* state with the Audio Unit still running, that's harmless because the
* render callback will just produce silence.
* render callback will just produce silence.
*/
*/
status
=
AudioOutputUnitStop
(
WOutDev
[
wDevID
].
audioUnit
);
status
=
AudioOutputUnitStop
(
WOutDev
[
wDevID
].
instance
.
audioUnit
);
if
(
status
)
if
(
status
)
WARN
(
"AudioOutputUnitStop return %s
\n
"
,
wine_dbgstr_fourcc
(
status
));
WARN
(
"AudioOutputUnitStop return %s
\n
"
,
wine_dbgstr_fourcc
(
status
));
OSSpinLockLock
(
&
WOutDev
[
wDevID
].
lock
);
OSSpinLockLock
(
&
WOutDev
[
wDevID
].
instance
.
lock
);
if
(
WOutDev
[
wDevID
].
state
==
WINE_WS_PLAYING
)
if
(
WOutDev
[
wDevID
].
instance
.
state
==
WINE_WS_PLAYING
)
WOutDev
[
wDevID
].
state
=
WINE_WS_PAUSED
;
WOutDev
[
wDevID
].
instance
.
state
=
WINE_WS_PAUSED
;
OSSpinLockUnlock
(
&
WOutDev
[
wDevID
].
lock
);
OSSpinLockUnlock
(
&
WOutDev
[
wDevID
].
instance
.
lock
);
return
MMSYSERR_NOERROR
;
return
MMSYSERR_NOERROR
;
}
}
...
@@ -1322,12 +1327,12 @@ static DWORD wodRestart(WORD wDevID)
...
@@ -1322,12 +1327,12 @@ static DWORD wodRestart(WORD wDevID)
* 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
].
instance
.
lock
);
if
(
WOutDev
[
wDevID
].
state
==
WINE_WS_PAUSED
)
if
(
WOutDev
[
wDevID
].
instance
.
state
==
WINE_WS_PAUSED
)
WOutDev
[
wDevID
].
state
=
WINE_WS_PLAYING
;
WOutDev
[
wDevID
].
instance
.
state
=
WINE_WS_PLAYING
;
OSSpinLockUnlock
(
&
WOutDev
[
wDevID
].
lock
);
OSSpinLockUnlock
(
&
WOutDev
[
wDevID
].
instance
.
lock
);
status
=
AudioOutputUnitStart
(
WOutDev
[
wDevID
].
audioUnit
);
status
=
AudioOutputUnitStart
(
WOutDev
[
wDevID
].
instance
.
audioUnit
);
if
(
status
)
{
if
(
status
)
{
ERR
(
"AudioOutputUnitStart return %s
\n
"
,
wine_dbgstr_fourcc
(
status
));
ERR
(
"AudioOutputUnitStart return %s
\n
"
,
wine_dbgstr_fourcc
(
status
));
return
MMSYSERR_ERROR
;
/* FIXME return an error based on the OSStatus */
return
MMSYSERR_ERROR
;
/* FIXME return an error based on the OSStatus */
...
@@ -1341,7 +1346,7 @@ static DWORD wodRestart(WORD wDevID)
...
@@ -1341,7 +1346,7 @@ static DWORD wodRestart(WORD wDevID)
*/
*/
static
DWORD
wodReset
(
WORD
wDevID
)
static
DWORD
wodReset
(
WORD
wDevID
)
{
{
WINE_WAVEOUT
*
wwo
;
WINE_WAVEOUT
_INSTANCE
*
wwo
;
OSStatus
status
;
OSStatus
status
;
LPWAVEHDR
lpSavedQueuePtr
;
LPWAVEHDR
lpSavedQueuePtr
;
...
@@ -1353,7 +1358,7 @@ static DWORD wodReset(WORD wDevID)
...
@@ -1353,7 +1358,7 @@ static DWORD wodReset(WORD wDevID)
return
MMSYSERR_BADDEVICEID
;
return
MMSYSERR_BADDEVICEID
;
}
}
wwo
=
&
WOutDev
[
wDevID
];
wwo
=
&
WOutDev
[
wDevID
]
.
instance
;
OSSpinLockLock
(
&
wwo
->
lock
);
OSSpinLockLock
(
&
wwo
->
lock
);
...
@@ -1394,7 +1399,7 @@ static DWORD wodReset(WORD wDevID)
...
@@ -1394,7 +1399,7 @@ static DWORD wodReset(WORD wDevID)
*/
*/
static
DWORD
wodBreakLoop
(
WORD
wDevID
)
static
DWORD
wodBreakLoop
(
WORD
wDevID
)
{
{
WINE_WAVEOUT
*
wwo
;
WINE_WAVEOUT
_INSTANCE
*
wwo
;
TRACE
(
"(%u);
\n
"
,
wDevID
);
TRACE
(
"(%u);
\n
"
,
wDevID
);
...
@@ -1404,7 +1409,7 @@ static DWORD wodBreakLoop(WORD wDevID)
...
@@ -1404,7 +1409,7 @@ static DWORD wodBreakLoop(WORD wDevID)
return
MMSYSERR_BADDEVICEID
;
return
MMSYSERR_BADDEVICEID
;
}
}
wwo
=
&
WOutDev
[
wDevID
];
wwo
=
&
WOutDev
[
wDevID
]
.
instance
;
OSSpinLockLock
(
&
wwo
->
lock
);
OSSpinLockLock
(
&
wwo
->
lock
);
...
@@ -1425,7 +1430,7 @@ static DWORD wodBreakLoop(WORD wDevID)
...
@@ -1425,7 +1430,7 @@ static DWORD wodBreakLoop(WORD wDevID)
static
DWORD
wodGetPosition
(
WORD
wDevID
,
LPMMTIME
lpTime
,
DWORD
uSize
)
static
DWORD
wodGetPosition
(
WORD
wDevID
,
LPMMTIME
lpTime
,
DWORD
uSize
)
{
{
DWORD
val
;
DWORD
val
;
WINE_WAVEOUT
*
wwo
;
WINE_WAVEOUT
_INSTANCE
*
wwo
;
TRACE
(
"(%u, %p, %u);
\n
"
,
wDevID
,
lpTime
,
uSize
);
TRACE
(
"(%u, %p, %u);
\n
"
,
wDevID
,
lpTime
,
uSize
);
...
@@ -1438,11 +1443,11 @@ static DWORD wodGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
...
@@ -1438,11 +1443,11 @@ static DWORD wodGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
/* if null pointer to time structure return error */
/* if null pointer to time structure return error */
if
(
lpTime
==
NULL
)
return
MMSYSERR_INVALPARAM
;
if
(
lpTime
==
NULL
)
return
MMSYSERR_INVALPARAM
;
wwo
=
&
WOutDev
[
wDevID
];
wwo
=
&
WOutDev
[
wDevID
]
.
instance
;
OSSpinLockLock
(
&
WOutDev
[
wDevID
].
lock
);
OSSpinLockLock
(
&
wwo
->
lock
);
val
=
wwo
->
dwPlayedTotal
;
val
=
wwo
->
dwPlayedTotal
;
OSSpinLockUnlock
(
&
WOutDev
[
wDevID
].
lock
);
OSSpinLockUnlock
(
&
wwo
->
lock
);
return
bytes_to_mmtime
(
lpTime
,
val
,
&
wwo
->
format
);
return
bytes_to_mmtime
(
lpTime
,
val
,
&
wwo
->
format
);
}
}
...
@@ -1463,7 +1468,7 @@ static DWORD wodGetVolume(WORD wDevID, LPDWORD lpdwVol)
...
@@ -1463,7 +1468,7 @@ static DWORD wodGetVolume(WORD wDevID, LPDWORD lpdwVol)
TRACE
(
"(%u, %p);
\n
"
,
wDevID
,
lpdwVol
);
TRACE
(
"(%u, %p);
\n
"
,
wDevID
,
lpdwVol
);
AudioUnit_GetVolume
(
WOutDev
[
wDevID
].
audioUnit
,
&
left
,
&
right
);
AudioUnit_GetVolume
(
WOutDev
[
wDevID
].
instance
.
audioUnit
,
&
left
,
&
right
);
*
lpdwVol
=
((
WORD
)
left
*
0xFFFFl
)
+
(((
WORD
)
right
*
0xFFFFl
)
<<
16
);
*
lpdwVol
=
((
WORD
)
left
*
0xFFFFl
)
+
(((
WORD
)
right
*
0xFFFFl
)
<<
16
);
...
@@ -1489,7 +1494,7 @@ static DWORD wodSetVolume(WORD wDevID, DWORD dwParam)
...
@@ -1489,7 +1494,7 @@ static DWORD wodSetVolume(WORD wDevID, DWORD dwParam)
TRACE
(
"(%u, %08x);
\n
"
,
wDevID
,
dwParam
);
TRACE
(
"(%u, %08x);
\n
"
,
wDevID
,
dwParam
);
AudioUnit_SetVolume
(
WOutDev
[
wDevID
].
audioUnit
,
left
,
right
);
AudioUnit_SetVolume
(
WOutDev
[
wDevID
].
instance
.
audioUnit
,
left
,
right
);
return
MMSYSERR_NOERROR
;
return
MMSYSERR_NOERROR
;
}
}
...
@@ -1647,7 +1652,7 @@ OSStatus CoreAudio_woAudioUnitIOProc(void *inRefCon,
...
@@ -1647,7 +1652,7 @@ OSStatus CoreAudio_woAudioUnitIOProc(void *inRefCon,
AudioBufferList
*
ioData
)
AudioBufferList
*
ioData
)
{
{
UInt32
buffer
;
UInt32
buffer
;
WINE_WAVEOUT
*
wwo
=
(
WINE_WAVEOUT
*
)
inRefCon
;
WINE_WAVEOUT
_INSTANCE
*
wwo
=
(
WINE_WAVEOUT_INSTANCE
*
)
inRefCon
;
int
needNotify
=
0
;
int
needNotify
=
0
;
unsigned
int
dataNeeded
=
ioData
->
mBuffers
[
0
].
mDataByteSize
;
unsigned
int
dataNeeded
=
ioData
->
mBuffers
[
0
].
mDataByteSize
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment