pa_win_ds.c

来自「基于sip协议的网络电话源码」· C语言 代码 · 共 1,801 行 · 第 1/5 页

C
1,801
字号
        return FALSE;    }    ++namesAndGUIDs->count;    --namesAndGUIDs->free;        return TRUE;}#define PA_DEFAULTSAMPLERATESEARCHORDER_COUNT_  (13) /* must match array length below */static double defaultSampleRateSearchOrder_[] =    { 44100.0, 48000.0, 32000.0, 24000.0, 22050.0, 88200.0, 96000.0, 192000.0,        16000.0, 12000.0, 11025.0, 9600.0, 8000.0 };/************************************************************************************** Extract capabilities from an output device, and add it to the device info list** if successful. This function assumes that there is enough room in the** device info list to accomodate all entries.**** The device will not be added to the device list if any errors are encountered.*/static PaError AddOutputDeviceInfoFromDirectSound(        PaWinDsHostApiRepresentation *winDsHostApi, char *name, LPGUID lpGUID ){    PaUtilHostApiRepresentation  *hostApi = &winDsHostApi->inheritedHostApiRep;    PaDeviceInfo                 *deviceInfo = hostApi->deviceInfos[hostApi->info.deviceCount];    PaWinDsDeviceInfo            *winDsDeviceInfo = &winDsHostApi->winDsDeviceInfos[hostApi->info.deviceCount];    HRESULT                       hr;    LPDIRECTSOUND                 lpDirectSound;    DSCAPS                        caps;    int                           deviceOK = TRUE;    PaError                       result = paNoError;    int                           i;        /* Copy GUID to the device info structure. Set pointer. */    if( lpGUID == NULL )    {        winDsDeviceInfo->lpGUID = NULL;    }    else    {        memcpy( &winDsDeviceInfo->guid, lpGUID, sizeof(GUID) );        winDsDeviceInfo->lpGUID = &winDsDeviceInfo->guid;    }        /* Create a DirectSound object for the specified GUID        Note that using CoCreateInstance doesn't work on windows CE.    */    hr = dswDSoundEntryPoints.DirectSoundCreate( lpGUID, &lpDirectSound, NULL );    /** try using CoCreateInstance because DirectSoundCreate was hanging under        some circumstances - note this was probably related to the        #define BOOL short bug which has now been fixed        @todo delete this comment and the following code once we've ensured        there is no bug.    */    /*    hr = CoCreateInstance( &CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER,            &IID_IDirectSound, (void**)&lpDirectSound );    if( hr == S_OK )    {        hr = IDirectSound_Initialize( lpDirectSound, lpGUID );    }    */        if( hr != DS_OK )    {        DBUG(("Cannot create DirectSound for %s. Result = 0x%x\n", name, hr ));        deviceOK = FALSE;    }    else    {        /* Query device characteristics. */        memset( &caps, 0, sizeof(caps) );         caps.dwSize = sizeof(caps);        hr = IDirectSound_GetCaps( lpDirectSound, &caps );        if( hr != DS_OK )        {            DBUG(("Cannot GetCaps() for DirectSound device %s. Result = 0x%x\n", name, hr ));            deviceOK = FALSE;        }        else        {#ifndef PA_NO_WMME            if( caps.dwFlags & DSCAPS_EMULDRIVER )            {                /* If WMME supported, then reject Emulated drivers because they are lousy. */                deviceOK = FALSE;            }#endif            if( deviceOK )            {                deviceInfo->maxInputChannels = 0;                /* Mono or stereo device? */                deviceInfo->maxOutputChannels = ( caps.dwFlags & DSCAPS_PRIMARYSTEREO ) ? 2 : 1;                deviceInfo->defaultLowInputLatency = 0.;    /** @todo IMPLEMENT ME */                deviceInfo->defaultLowOutputLatency = 0.;   /** @todo IMPLEMENT ME */                deviceInfo->defaultHighInputLatency = 0.;   /** @todo IMPLEMENT ME */                deviceInfo->defaultHighOutputLatency = 0.;  /** @todo IMPLEMENT ME */                                /* initialize defaultSampleRate */                                if( caps.dwFlags & DSCAPS_CONTINUOUSRATE )                {                    /* initialize to caps.dwMaxSecondarySampleRate incase none of the standard rates match */                    deviceInfo->defaultSampleRate = caps.dwMaxSecondarySampleRate;                    for( i = 0; i < PA_DEFAULTSAMPLERATESEARCHORDER_COUNT_; ++i )                    {                        if( defaultSampleRateSearchOrder_[i] >= caps.dwMinSecondarySampleRate                                && defaultSampleRateSearchOrder_[i] <= caps.dwMaxSecondarySampleRate ){                            deviceInfo->defaultSampleRate = defaultSampleRateSearchOrder_[i];                            break;                        }                    }                }                else if( caps.dwMinSecondarySampleRate == caps.dwMaxSecondarySampleRate )                {                    if( caps.dwMinSecondarySampleRate == 0 )                    {                        /*                        ** On my Thinkpad 380Z, DirectSoundV6 returns min-max=0 !!                        ** But it supports continuous sampling.                        ** So fake range of rates, and hope it really supports it.                        */                        deviceInfo->defaultSampleRate = 44100.0f;                        DBUG(("PA - Reported rates both zero. Setting to fake values for device #%d\n", sDeviceIndex ));                    }                    else                    {	                    deviceInfo->defaultSampleRate = caps.dwMaxSecondarySampleRate;                    }                }                else if( (caps.dwMinSecondarySampleRate < 1000.0) && (caps.dwMaxSecondarySampleRate > 50000.0) )                {                    /* The EWS88MT drivers lie, lie, lie. The say they only support two rates, 100 & 100000.                    ** But we know that they really support a range of rates!                    ** So when we see a ridiculous set of rates, assume it is a range.                    */                  deviceInfo->defaultSampleRate = 44100.0f;                  DBUG(("PA - Sample rate range used instead of two odd values for device #%d\n", sDeviceIndex ));                }                else deviceInfo->defaultSampleRate = caps.dwMaxSecondarySampleRate;                //printf( "min %d max %d\n", caps.dwMinSecondarySampleRate, caps.dwMaxSecondarySampleRate );                // dwFlags | DSCAPS_CONTINUOUSRATE             }        }        IDirectSound_Release( lpDirectSound );    }    if( deviceOK )    {        deviceInfo->name = name;        if( lpGUID == NULL )            hostApi->info.defaultOutputDevice = hostApi->info.deviceCount;                    hostApi->info.deviceCount++;    }    return result;}/************************************************************************************** Extract capabilities from an input device, and add it to the device info list** if successful. This function assumes that there is enough room in the** device info list to accomodate all entries.**** The device will not be added to the device list if any errors are encountered.*/static PaError AddInputDeviceInfoFromDirectSoundCapture(        PaWinDsHostApiRepresentation *winDsHostApi, char *name, LPGUID lpGUID ){    PaUtilHostApiRepresentation  *hostApi = &winDsHostApi->inheritedHostApiRep;    PaDeviceInfo                 *deviceInfo = hostApi->deviceInfos[hostApi->info.deviceCount];    PaWinDsDeviceInfo            *winDsDeviceInfo = &winDsHostApi->winDsDeviceInfos[hostApi->info.deviceCount];    HRESULT                       hr;    LPDIRECTSOUNDCAPTURE          lpDirectSoundCapture;    DSCCAPS                       caps;    int                           deviceOK = TRUE;    PaError                       result = paNoError;        /* Copy GUID to the device info structure. Set pointer. */    if( lpGUID == NULL )    {        winDsDeviceInfo->lpGUID = NULL;    }    else    {        winDsDeviceInfo->lpGUID = &winDsDeviceInfo->guid;        memcpy( &winDsDeviceInfo->guid, lpGUID, sizeof(GUID) );    }    hr = dswDSoundEntryPoints.DirectSoundCaptureCreate( lpGUID, &lpDirectSoundCapture, NULL );    /** try using CoCreateInstance because DirectSoundCreate was hanging under        some circumstances - note this was probably related to the        #define BOOL short bug which has now been fixed        @todo delete this comment and the following code once we've ensured        there is no bug.    */    /*    hr = CoCreateInstance( &CLSID_DirectSoundCapture, NULL, CLSCTX_INPROC_SERVER,            &IID_IDirectSoundCapture, (void**)&lpDirectSoundCapture );    */    if( hr != DS_OK )    {        DBUG(("Cannot create Capture for %s. Result = 0x%x\n", name, hr ));        deviceOK = FALSE;    }    else    {        /* Query device characteristics. */        memset( &caps, 0, sizeof(caps) );        caps.dwSize = sizeof(caps);        hr = IDirectSoundCapture_GetCaps( lpDirectSoundCapture, &caps );        if( hr != DS_OK )        {            DBUG(("Cannot GetCaps() for Capture device %s. Result = 0x%x\n", name, hr ));            deviceOK = FALSE;        }        else        {#ifndef PA_NO_WMME            if( caps.dwFlags & DSCAPS_EMULDRIVER )            {                /* If WMME supported, then reject Emulated drivers because they are lousy. */                deviceOK = FALSE;            }#endif            if( deviceOK )            {                deviceInfo->maxInputChannels = caps.dwChannels;                deviceInfo->maxOutputChannels = 0;                deviceInfo->defaultLowInputLatency = 0.;    /** @todo IMPLEMENT ME */                deviceInfo->defaultLowOutputLatency = 0.;   /** @todo IMPLEMENT ME */                deviceInfo->defaultHighInputLatency = 0.;   /** @todo IMPLEMENT ME */                deviceInfo->defaultHighOutputLatency = 0.;  /** @todo IMPLEMENT ME *//*  constants from a WINE patch by Francois Gouget, see:    http://www.winehq.com/hypermail/wine-patches/2003/01/0290.html    ---    Date: Fri, 14 May 2004 10:38:12 +0200 (CEST)    From: Francois Gouget <fgouget@ ... .fr>    To: Ross Bencina <rbencina@ ... .au>    Subject: Re: Permission to use wine 48/96 wave patch in BSD licensed library    [snip]    I give you permission to use the patch below under the BSD license.    http://www.winehq.com/hypermail/wine-patches/2003/01/0290.html    [snip]*/#ifndef WAVE_FORMAT_48M08#define WAVE_FORMAT_48M08      0x00001000    /* 48     kHz, Mono,   8-bit  */#define WAVE_FORMAT_48S08      0x00002000    /* 48     kHz, Stereo, 8-bit  */#define WAVE_FORMAT_48M16      0x00004000    /* 48     kHz, Mono,   16-bit */#define WAVE_FORMAT_48S16      0x00008000    /* 48     kHz, Stereo, 16-bit */#define WAVE_FORMAT_96M08      0x00010000    /* 96     kHz, Mono,   8-bit  */#define WAVE_FORMAT_96S08      0x00020000    /* 96     kHz, Stereo, 8-bit  */#define WAVE_FORMAT_96M16      0x00040000    /* 96     kHz, Mono,   16-bit */#define WAVE_FORMAT_96S16      0x00080000    /* 96     kHz, Stereo, 16-bit */#endif                /* defaultSampleRate */                if( caps.dwChannels == 2 )                {                    if( caps.dwFormats & WAVE_FORMAT_4S16 )                        deviceInfo->defaultSampleRate = 44100.0;                    else if( caps.dwFormats & WAVE_FORMAT_48S16 )                        deviceInfo->defaultSampleRate = 48000.0;                    else if( caps.dwFormats & WAVE_FORMAT_2S16 )                        deviceInfo->defaultSampleRate = 22050.0;                    else if( caps.dwFormats & WAVE_FORMAT_1S16 )                        deviceInfo->defaultSampleRate = 11025.0;                    else if( caps.dwFormats & WAVE_FORMAT_96S16 )                        deviceInfo->defaultSampleRate = 96000.0;                    else                        deviceInfo->defaultSampleRate = 0.;                }                else if( caps.dwChannels == 1 )                {                    if( caps.dwFormats & WAVE_FORMAT_4M16 )                        deviceInfo->defaultSampleRate = 44100.0;                    else if( caps.dwFormats & WAVE_FORMAT_48M16 )                        deviceInfo->defaultSampleRate = 48000.0;                    else if( caps.dwFormats & WAVE_FORMAT_2M16 )                        deviceInfo->defaultSampleRate = 22050.0;                    else if( caps.dwFormats & WAVE_FORMAT_1M16 )                        deviceInfo->defaultSampleRate = 11025.0;                    else if( caps.dwFormats & WAVE_FORMAT_96M16 )                        deviceInfo->defaultSampleRate = 96000.0;                    else                        deviceInfo->defaultSampleRate = 0.;                }                else deviceInfo->defaultSampleRate = 0.;            }        }                IDirectSoundCapture_Release( lpDirectSoundCapture );    }    if( deviceOK )    {        deviceInfo->name = name;        if( lpGUID == NULL )            hostApi->info.defaultInputDevice = hostApi->info.deviceCount;        hostApi->info.deviceCount++;    }    return result;}/***********************************************************************************/PaError PaWinDs_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex hostApiIndex ){    PaError result = paNoError;    int i, deviceCount;    PaWinDsHostApiRepresentation *winDsHostApi;    DSDeviceNameAndGUIDVector inputNamesAndGUIDs, outputNamesAndGUIDs;    PaDeviceInfo *deviceInfoArray;    HRESULT hr = CoInitialize(NULL);        /** @todo: should uninitialize too */    if( FAILED(hr) ){        return paUnanticipatedHostError;    }                /* initialise guid vectors so they can be safely deleted on error */    inputNamesAndGUIDs.items = NULL;    outputNamesAndGUIDs.items = NULL;    DSW_InitializeDSoundEntryPoints();    winDsHostApi = (PaWinDsHostApiRepresentation*)PaUtil_AllocateMemory( sizeof(PaWinDsHostApiRepresentation) );    if( !winDsHostApi )    {        result = paInsufficientMemory;        goto error;    }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?