[09/18] winecoreaudio: Do additional setup in AudioUnit_CreateInputUnit.

Ken Thomases ken at codeweavers.com
Thu Dec 28 11:06:23 CST 2006


It now returns in an output parameter the frame count that the AU will use.
This will be used to allocated audio buffers of sufficient size to receive the
audio data in the input callback.

Also, initialize the Audio Unit.
---
  dlls/winmm/winecoreaudio/audio.c     |    8 +++++---
  dlls/winmm/winecoreaudio/audiounit.c |   28 +++++++++++++++++++++++++++-
  2 files changed, 32 insertions(+), 4 deletions(-)
-------------- next part --------------
diff --git a/dlls/winmm/winecoreaudio/audio.c b/dlls/winmm/winecoreaudio/audio.c
index 6d093ae..ae9d4ba 100644
--- a/dlls/winmm/winecoreaudio/audio.c
+++ b/dlls/winmm/winecoreaudio/audio.c
@@ -211,7 +211,8 @@ extern int AudioUnit_SetVolume(AudioUnit
 extern int AudioUnit_GetVolume(AudioUnit au, float *left, float *right);
 
 extern int AudioUnit_CreateInputUnit(void* wwi, AudioUnit* out_au,
-        WORD nChannels, DWORD nSamplesPerSec, WORD wBitsPerSample);
+        WORD nChannels, DWORD nSamplesPerSec, WORD wBitsPerSample,
+        UInt32* outFrameCount);
 
 OSStatus CoreAudio_woAudioUnitIOProc(void *inRefCon, 
                                      AudioUnitRenderActionFlags *ioActionFlags, 
@@ -1522,7 +1523,8 @@ static DWORD widGetDevCaps(WORD wDevID, 
  */
 static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 {
-    WINE_WAVEIN* wwi;
+    WINE_WAVEIN*    wwi;
+    UInt32          frameCount;
 
     TRACE("(%u, %p, %08lX);\n", wDevID, lpDesc, dwFlags);
     if (lpDesc == NULL)
@@ -1592,7 +1594,7 @@ static DWORD widOpen(WORD wDevID, LPWAVE
 
     if (!AudioUnit_CreateInputUnit(wwi, &wwi->audioUnit,
         wwi->format.wf.nChannels, wwi->format.wf.nSamplesPerSec,
-        wwi->format.wBitsPerSample))
+        wwi->format.wBitsPerSample, &frameCount))
     {
         ERR("AudioUnit_CreateInputUnit failed\n");
         OSSpinLockUnlock(&wwi->lock);
diff --git a/dlls/winmm/winecoreaudio/audiounit.c b/dlls/winmm/winecoreaudio/audiounit.c
index 4060277..cd7c404 100644
--- a/dlls/winmm/winecoreaudio/audiounit.c
+++ b/dlls/winmm/winecoreaudio/audiounit.c
@@ -131,7 +131,8 @@ int AudioUnit_GetVolume(AudioUnit au, fl
 
 
 int AudioUnit_CreateInputUnit(void* wwi, AudioUnit* out_au,
-        WORD nChannels, DWORD nSamplesPerSec, WORD wBitsPerSample)
+        WORD nChannels, DWORD nSamplesPerSec, WORD wBitsPerSample,
+        UInt32* outFrameCount)
 {
     OSStatus                    err = noErr;
     ComponentDescription        description;
@@ -143,6 +144,12 @@ int AudioUnit_CreateInputUnit(void* wwi,
     AudioStreamBasicDescription desiredFormat;
 
 
+    if (!outFrameCount)
+    {
+        ERR("Invalid parameter\n");
+        return 0;
+    }
+
     /* Open the AudioOutputUnit */
     description.componentType           = kAudioUnitType_Output;
     description.componentSubType        = kAudioUnitSubType_HALOutput;
@@ -244,6 +251,25 @@ int AudioUnit_CreateInputUnit(void* wwi,
         goto error;
     }
 
+    /* Get the number of frames in the IO buffer(s) */
+    param = sizeof(*outFrameCount);
+    err = AudioUnitGetProperty(au, kAudioDevicePropertyBufferFrameSize, kAudioUnitScope_Global, 0, outFrameCount, &param);
+    if (err != noErr)
+    {
+        ERR("Failed to get audio sample size: %08x\n", err);
+        goto error;
+    }
+
+    TRACE("Frame count: %d\n", *outFrameCount);
+
+    /* Initialize the AU */
+    err = AudioUnitInitialize(au);
+    if (err != noErr)
+    {
+        ERR("Failed to initialize AU: %08x\n", err);
+        goto error;
+    }
+
     *out_au = au;
 
     return 1;


More information about the wine-patches mailing list