Ken Thomases : winecoreaudio: Report actual supported input wave formats.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Dec 29 06:47:26 CST 2006


Module: wine
Branch: master
Commit: 0e52c42aa6aa39cafacd97ce5466437e66c063a6
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0e52c42aa6aa39cafacd97ce5466437e66c063a6

Author: Ken Thomases <ken at codeweavers.com>
Date:   Thu Dec 28 11:07:24 2006 -0600

winecoreaudio: Report actual supported input wave formats.

Also, added some output formats that Core Audio ought to be able to handle.

---

 dlls/winmm/winecoreaudio/audio.c     |   64 +++++++++++++++++++++++++++------
 dlls/winmm/winecoreaudio/audiounit.c |   32 +++++++++++++++++
 2 files changed, 84 insertions(+), 12 deletions(-)

diff --git a/dlls/winmm/winecoreaudio/audio.c b/dlls/winmm/winecoreaudio/audio.c
index 7e39ba9..455a365 100644
--- a/dlls/winmm/winecoreaudio/audio.c
+++ b/dlls/winmm/winecoreaudio/audio.c
@@ -224,6 +224,8 @@ extern OSStatus AudioUnitUninitialize(Au
 extern int AudioUnit_SetVolume(AudioUnit au, float left, float right);
 extern int AudioUnit_GetVolume(AudioUnit au, float *left, float *right);
 
+extern int AudioUnit_GetInputDeviceSampleRate(void);
+
 extern int AudioUnit_CreateInputUnit(void* wwi, AudioUnit* out_au,
         WORD nChannels, DWORD nSamplesPerSec, WORD wBitsPerSample,
         UInt32* outFrameCount);
@@ -500,6 +502,7 @@ LONG CoreAudio_WaveInit(void)
     HANDLE hThread;
     CFStringRef  messageThreadPortName;
     CFMessagePortRef port_ReceiveInMessageThread;
+    int inputSampleRate;
 
     TRACE("()\n");
     
@@ -550,6 +553,14 @@ LONG CoreAudio_WaveInit(void)
         WOutDev[i].caps.wChannels = 2;
       /*  WOutDev[i].caps.dwSupport |= WAVECAPS_LRVOLUME; */ /* FIXME */
         
+        WOutDev[i].caps.dwFormats |= WAVE_FORMAT_96M08;
+        WOutDev[i].caps.dwFormats |= WAVE_FORMAT_96S08;
+        WOutDev[i].caps.dwFormats |= WAVE_FORMAT_96M16;
+        WOutDev[i].caps.dwFormats |= WAVE_FORMAT_96S16;
+        WOutDev[i].caps.dwFormats |= WAVE_FORMAT_48M08;
+        WOutDev[i].caps.dwFormats |= WAVE_FORMAT_48S08;
+        WOutDev[i].caps.dwFormats |= WAVE_FORMAT_48M16;
+        WOutDev[i].caps.dwFormats |= WAVE_FORMAT_48S16;
         WOutDev[i].caps.dwFormats |= WAVE_FORMAT_4M08;
         WOutDev[i].caps.dwFormats |= WAVE_FORMAT_4S08; 
         WOutDev[i].caps.dwFormats |= WAVE_FORMAT_4S16;
@@ -566,6 +577,9 @@ LONG CoreAudio_WaveInit(void)
         WOutDev[i].lock = 0; /* initialize the mutex */
     }
 
+    /* FIXME: implement sample rate conversion on input */
+    inputSampleRate = AudioUnit_GetInputDeviceSampleRate();
+
     for (i = 0; i < MAX_WAVEINDRV; ++i)
     {
         memset(&WInDev[i], 0, sizeof(WInDev[i]));
@@ -584,18 +598,41 @@ LONG CoreAudio_WaveInit(void)
         MultiByteToWideChar(CP_ACP, 0, szPname, -1, WInDev[i].caps.szPname, sizeof(WInDev[i].caps.szPname)/sizeof(WCHAR));
         snprintf(WInDev[i].interface_name, sizeof(WInDev[i].interface_name), "winecoreaudio in: %d", i);
 
-        WInDev[i].caps.dwFormats |= WAVE_FORMAT_4M08;
-        WInDev[i].caps.dwFormats |= WAVE_FORMAT_4S08;
-        WInDev[i].caps.dwFormats |= WAVE_FORMAT_4S16;
-        WInDev[i].caps.dwFormats |= WAVE_FORMAT_4M16;
-        WInDev[i].caps.dwFormats |= WAVE_FORMAT_2M08;
-        WInDev[i].caps.dwFormats |= WAVE_FORMAT_2S08;
-        WInDev[i].caps.dwFormats |= WAVE_FORMAT_2M16;
-        WInDev[i].caps.dwFormats |= WAVE_FORMAT_2S16;
-        WInDev[i].caps.dwFormats |= WAVE_FORMAT_1M08;
-        WInDev[i].caps.dwFormats |= WAVE_FORMAT_1S08;
-        WInDev[i].caps.dwFormats |= WAVE_FORMAT_1M16;
-        WInDev[i].caps.dwFormats |= WAVE_FORMAT_1S16;
+        if (inputSampleRate == 96000)
+        {
+            WInDev[i].caps.dwFormats |= WAVE_FORMAT_96M08;
+            WInDev[i].caps.dwFormats |= WAVE_FORMAT_96S08;
+            WInDev[i].caps.dwFormats |= WAVE_FORMAT_96M16;
+            WInDev[i].caps.dwFormats |= WAVE_FORMAT_96S16;
+        }
+        if (inputSampleRate == 48000)
+        {
+            WInDev[i].caps.dwFormats |= WAVE_FORMAT_48M08;
+            WInDev[i].caps.dwFormats |= WAVE_FORMAT_48S08;
+            WInDev[i].caps.dwFormats |= WAVE_FORMAT_48M16;
+            WInDev[i].caps.dwFormats |= WAVE_FORMAT_48S16;
+        }
+        if (inputSampleRate == 44100)
+        {
+            WInDev[i].caps.dwFormats |= WAVE_FORMAT_4M08;
+            WInDev[i].caps.dwFormats |= WAVE_FORMAT_4S08;
+            WInDev[i].caps.dwFormats |= WAVE_FORMAT_4M16;
+            WInDev[i].caps.dwFormats |= WAVE_FORMAT_4S16;
+        }
+        if (inputSampleRate == 22050)
+        {
+            WInDev[i].caps.dwFormats |= WAVE_FORMAT_2M08;
+            WInDev[i].caps.dwFormats |= WAVE_FORMAT_2S08;
+            WInDev[i].caps.dwFormats |= WAVE_FORMAT_2M16;
+            WInDev[i].caps.dwFormats |= WAVE_FORMAT_2S16;
+        }
+        if (inputSampleRate == 11025)
+        {
+            WInDev[i].caps.dwFormats |= WAVE_FORMAT_1M08;
+            WInDev[i].caps.dwFormats |= WAVE_FORMAT_1S08;
+            WInDev[i].caps.dwFormats |= WAVE_FORMAT_1M16;
+            WInDev[i].caps.dwFormats |= WAVE_FORMAT_1S16;
+        }
 
         WInDev[i].caps.wChannels = 2;
     }
@@ -2140,6 +2177,9 @@ OSStatus CoreAudio_wiAudioUnitIOProc(voi
             *ioActionFlags, inTimeStamp->mSampleTime, inTimeStamp->mHostTime, inTimeStamp->mRateScalar, inTimeStamp->mWordClockTime, inTimeStamp->mFlags, inBusNumber, inNumberFrames);
 
     /* Render into audio buffer */
+    /* FIXME: implement sample rate conversion on input.  This will require
+     * a different render strategy.  We'll need to buffer the sound data
+     * received here and pass it off to an AUConverter in another thread. */
     err = AudioUnitRender(wwi->audioUnit, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, wwi->bufferList);
     if (err)
     {
diff --git a/dlls/winmm/winecoreaudio/audiounit.c b/dlls/winmm/winecoreaudio/audiounit.c
index 433cab1..b6da953 100644
--- a/dlls/winmm/winecoreaudio/audiounit.c
+++ b/dlls/winmm/winecoreaudio/audiounit.c
@@ -130,6 +130,34 @@ int AudioUnit_GetVolume(AudioUnit au, fl
 }
 
 
+/* FIXME: implement sample rate conversion on input */
+int AudioUnit_GetInputDeviceSampleRate(void)
+{
+    AudioDeviceID               defaultInputDevice;
+    UInt32                      param;
+    Float64                     sampleRate;
+    OSStatus                    err;
+
+    param = sizeof(defaultInputDevice);
+    err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultInputDevice, &param, &defaultInputDevice);
+    if (err != noErr || defaultInputDevice == kAudioDeviceUnknown)
+    {
+        ERR("Couldn't get the default audio input device ID: %08lx\n", err);
+        return 0;
+    }
+
+    param = sizeof(sampleRate);
+    err = AudioDeviceGetProperty(defaultInputDevice, 0, 1, kAudioDevicePropertyNominalSampleRate, &param, &sampleRate);
+    if (err != noErr)
+    {
+        ERR("Couldn't get the device sample rate: %08lx\n", err);
+        return 0;
+    }
+
+    return sampleRate;
+}
+
+
 int AudioUnit_CreateInputUnit(void* wwi, AudioUnit* out_au,
         WORD nChannels, DWORD nSamplesPerSec, WORD wBitsPerSample,
         UInt32* outFrameCount)
@@ -232,6 +260,10 @@ int AudioUnit_CreateInputUnit(void* wwi,
     }
 
     /* Setup the desired data format. */
+    /* FIXME: implement sample rate conversion on input.  We shouldn't set
+     * the mSampleRate of this to the desired sample rate.  We need to query
+     * the input device and use that.  If they don't match, we need to set up
+     * an AUConverter to do the sample rate conversion on a separate thread. */
     desiredFormat.mFormatID         = kAudioFormatLinearPCM;
     desiredFormat.mFormatFlags      = kLinearPCMFormatFlagIsPacked;
     if (wBitsPerSample != 8)




More information about the wine-cvs mailing list