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