Ken Thomases : winecoreaudio: Allow getting/ setting volume on device as well as instances.
Alexandre Julliard
julliard at winehq.org
Fri Oct 23 10:19:00 CDT 2009
Module: wine
Branch: master
Commit: 3d93a1926658e05dd7f59280d4b8dfcac1ed0e64
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3d93a1926658e05dd7f59280d4b8dfcac1ed0e64
Author: Ken Thomases <ken at codeweavers.com>
Date: Thu Oct 22 19:36:24 2009 -0500
winecoreaudio: Allow getting/setting volume on device as well as instances.
---
dlls/winecoreaudio.drv/audio.c | 34 +++++++++++++++++++++++++++-------
1 files changed, 27 insertions(+), 7 deletions(-)
diff --git a/dlls/winecoreaudio.drv/audio.c b/dlls/winecoreaudio.drv/audio.c
index 91f6599..f48a5aa 100644
--- a/dlls/winecoreaudio.drv/audio.c
+++ b/dlls/winecoreaudio.drv/audio.c
@@ -170,6 +170,7 @@ typedef struct {
CoreAudio_Device *cadev;
WAVEOUTCAPSW caps;
char interface_name[32];
+ DWORD device_volume;
BOOL trace_on;
BOOL warn_on;
@@ -620,6 +621,8 @@ LONG CoreAudio_WaveInit(void)
WOutDev[i].caps.dwFormats |= WAVE_FORMAT_1M16;
WOutDev[i].caps.dwFormats |= WAVE_FORMAT_1S16;
+ WOutDev[i].device_volume = 0xffffffff;
+
WOutDev[i].lock = 0; /* initialize the mutex */
}
@@ -904,6 +907,9 @@ static DWORD wodOpen(WORD wDevID, WINE_WAVEOUT_INSTANCE** pInstance, LPWAVEOPEND
}
auInited = TRUE;
+ AudioUnit_SetVolume(audioUnit, LOWORD(WOutDev[wDevID].device_volume) / 65535.0f,
+ HIWORD(WOutDev[wDevID].device_volume) / 65535.0f);
+
/* Our render callback CoreAudio_woAudioUnitIOProc may be called before
* AudioOutputUnitStart returns. Core Audio will grab its own internal
* lock before calling it and the callback grabs wwo->lock. This would
@@ -1439,9 +1445,6 @@ static DWORD wodGetPosition(WORD wDevID, WINE_WAVEOUT_INSTANCE* wwo, LPMMTIME lp
*/
static DWORD wodGetVolume(WORD wDevID, WINE_WAVEOUT_INSTANCE* wwo, LPDWORD lpdwVol)
{
- float left;
- float right;
-
if (wDevID >= MAX_WAVEOUTDRV)
{
WARN("bad device ID !\n");
@@ -1450,10 +1453,17 @@ static DWORD wodGetVolume(WORD wDevID, WINE_WAVEOUT_INSTANCE* wwo, LPDWORD lpdwV
TRACE("(%u, %p, %p);\n", wDevID, wwo, lpdwVol);
- AudioUnit_GetVolume(wwo->audioUnit, &left, &right);
+ if (wwo)
+ {
+ float left;
+ float right;
+
+ AudioUnit_GetVolume(wwo->audioUnit, &left, &right);
+ *lpdwVol = (WORD)(left * 0xFFFFl) + ((WORD)(right * 0xFFFFl) << 16);
+ }
+ else
+ *lpdwVol = WOutDev[wDevID].device_volume;
- *lpdwVol = (WORD)(left * 0xFFFFl) + ((WORD)(right * 0xFFFFl) << 16);
-
return MMSYSERR_NOERROR;
}
@@ -1476,7 +1486,17 @@ static DWORD wodSetVolume(WORD wDevID, WINE_WAVEOUT_INSTANCE* wwo, DWORD dwParam
TRACE("(%u, %p, %08x);\n", wDevID, wwo, dwParam);
- AudioUnit_SetVolume(wwo->audioUnit, left, right);
+ if (wwo)
+ AudioUnit_SetVolume(wwo->audioUnit, left, right);
+ else
+ {
+ OSSpinLockLock(&WOutDev[wDevID].lock);
+ LIST_FOR_EACH_ENTRY(wwo, &WOutDev[wDevID].instances, WINE_WAVEOUT_INSTANCE, entry)
+ AudioUnit_SetVolume(wwo->audioUnit, left, right);
+ OSSpinLockUnlock(&WOutDev[wDevID].lock);
+
+ WOutDev[wDevID].device_volume = dwParam;
+ }
return MMSYSERR_NOERROR;
}
More information about the wine-cvs
mailing list