⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pa_mac_core.c

📁 一个开源的sip源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
    if( 0 != AudioHardwareGetProperty(kAudioHardwarePropertyDefaultInputDevice,                     &size,                     &auhalHostApi->defaultIn) ) {       int i;       auhalHostApi->defaultIn  = kAudioDeviceUnknown;       VDBUG(("Failed to get default input device from OS."));       VDBUG((" I will substitute the first available input Device."));       for( i=0; i<auhalHostApi->devCount; ++i ) {          PaDeviceInfo devInfo;          if( 0 != GetChannelInfo( auhalHostApi, &devInfo,                                   auhalHostApi->devIds[i], TRUE ) )             if( devInfo.maxInputChannels ) {                auhalHostApi->defaultIn = auhalHostApi->devIds[i];                break;             }       }    }       if( 0 != AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice,                     &size,                     &auhalHostApi->defaultOut) ) {       int i;       auhalHostApi->defaultIn  = kAudioDeviceUnknown;       VDBUG(("Failed to get default output device from OS."));       VDBUG((" I will substitute the first available output Device."));       for( i=0; i<auhalHostApi->devCount; ++i ) {          PaDeviceInfo devInfo;          if( 0 != GetChannelInfo( auhalHostApi, &devInfo,                                   auhalHostApi->devIds[i], FALSE ) )             if( devInfo.maxOutputChannels ) {                auhalHostApi->defaultOut = auhalHostApi->devIds[i];                break;             }       }    }       VDBUG( ( "Default in : %ld\n", auhalHostApi->defaultIn  ) );    VDBUG( ( "Default out: %ld\n", auhalHostApi->defaultOut ) );    return paNoError;}static PaError GetChannelInfo( PaMacAUHAL *auhalHostApi,                               PaDeviceInfo *deviceInfo,                               AudioDeviceID macCoreDeviceId,                               int isInput){    UInt32 propSize;    PaError err = paNoError;    UInt32 i;    int numChannels = 0;    AudioBufferList *buflist = NULL;    UInt32 frameLatency;    VVDBUG(("GetChannelInfo()\n"));    /* Get the number of channels from the stream configuration.       Fail if we can't get this. */    err = ERR(AudioDeviceGetPropertyInfo(macCoreDeviceId, 0, isInput, kAudioDevicePropertyStreamConfiguration, &propSize, NULL));    if (err)        return err;    buflist = PaUtil_AllocateMemory(propSize);    if( !buflist )       return paInsufficientMemory;    err = ERR(AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyStreamConfiguration, &propSize, buflist));    if (err)        goto error;    for (i = 0; i < buflist->mNumberBuffers; ++i)        numChannels += buflist->mBuffers[i].mNumberChannels;    if (isInput)        deviceInfo->maxInputChannels = numChannels;    else        deviceInfo->maxOutputChannels = numChannels;          if (numChannels > 0) /* do not try to retrieve the latency if there is no channels. */    {       /* Get the latency.  Don't fail if we can't get this. */       /* default to something reasonable */       deviceInfo->defaultLowInputLatency = .01;       deviceInfo->defaultHighInputLatency = .10;       deviceInfo->defaultLowOutputLatency = .01;       deviceInfo->defaultHighOutputLatency = .10;       propSize = sizeof(UInt32);       err = WARNING(AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyLatency, &propSize, &frameLatency));       if (!err)       {          /** FEEDBACK:           * This code was arrived at by trial and error, and some extentive, but not exhaustive           * testing. Sebastien Beaulieu <seb@plogue.com> has suggested using           * kAudioDevicePropertyLatency + kAudioDevicePropertySafetyOffset + buffer size instead.           * At the time this code was written, many users were reporting dropouts with audio           * programs that probably used this formula. This was probably           * around 10.4.4, and the problem is probably fixed now. So perhaps           * his formula should be reviewed and used.           * */          double secondLatency = frameLatency / deviceInfo->defaultSampleRate;          if (isInput)          {             deviceInfo->defaultLowInputLatency = 3 * secondLatency;             deviceInfo->defaultHighInputLatency = 3 * 10 * secondLatency;          }          else          {             deviceInfo->defaultLowOutputLatency = 3 * secondLatency;             deviceInfo->defaultHighOutputLatency = 3 * 10 * secondLatency;          }       }    }    PaUtil_FreeMemory( buflist );    return paNoError; error:    PaUtil_FreeMemory( buflist );    return err;}static PaError InitializeDeviceInfo( PaMacAUHAL *auhalHostApi,                                     PaDeviceInfo *deviceInfo,                                     AudioDeviceID macCoreDeviceId,                                     PaHostApiIndex hostApiIndex ){    Float64 sampleRate;    char *name;    PaError err = paNoError;    UInt32 propSize;    VVDBUG(("InitializeDeviceInfo(): macCoreDeviceId=%ld\n", macCoreDeviceId));    memset(deviceInfo, 0, sizeof(deviceInfo));    deviceInfo->structVersion = 2;    deviceInfo->hostApi = hostApiIndex;    /* Get the device name.  Fail if we can't get it. */    err = ERR(AudioDeviceGetPropertyInfo(macCoreDeviceId, 0, 0, kAudioDevicePropertyDeviceName, &propSize, NULL));    if (err)        return err;    name = PaUtil_GroupAllocateMemory(auhalHostApi->allocations,propSize);    if ( !name )        return paInsufficientMemory;    err = ERR(AudioDeviceGetProperty(macCoreDeviceId, 0, 0, kAudioDevicePropertyDeviceName, &propSize, name));    if (err)        return err;    deviceInfo->name = name;    /* Try to get the default sample rate.  Don't fail if we can't get this. */    propSize = sizeof(Float64);    err = ERR(AudioDeviceGetProperty(macCoreDeviceId, 0, 0, kAudioDevicePropertyNominalSampleRate, &propSize, &sampleRate));    if (err)        deviceInfo->defaultSampleRate = 0.0;    else        deviceInfo->defaultSampleRate = sampleRate;    /* Get the maximum number of input and output channels.  Fail if we can't get this. */    err = GetChannelInfo(auhalHostApi, deviceInfo, macCoreDeviceId, 1);    if (err)        return err;    err = GetChannelInfo(auhalHostApi, deviceInfo, macCoreDeviceId, 0);    if (err)        return err;    return paNoError;}PaError PaMacCore_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex hostApiIndex ){    PaError result = paNoError;    int i;    PaMacAUHAL *auhalHostApi;    PaDeviceInfo *deviceInfoArray;    VVDBUG(("PaMacCore_Initialize(): hostApiIndex=%d\n", hostApiIndex));    auhalHostApi = (PaMacAUHAL*)PaUtil_AllocateMemory( sizeof(PaMacAUHAL) );    if( !auhalHostApi )    {        result = paInsufficientMemory;        goto error;    }    auhalHostApi->allocations = PaUtil_CreateAllocationGroup();    if( !auhalHostApi->allocations )    {        result = paInsufficientMemory;        goto error;    }    auhalHostApi->devIds = NULL;    auhalHostApi->devCount = 0;    /* get the info we need about the devices */    result = gatherDeviceInfo( auhalHostApi );    if( result != paNoError )       goto error;    *hostApi = &auhalHostApi->inheritedHostApiRep;    (*hostApi)->info.structVersion = 1;    (*hostApi)->info.type = paCoreAudio;    (*hostApi)->info.name = "Core Audio";    (*hostApi)->info.defaultInputDevice = paNoDevice;    (*hostApi)->info.defaultOutputDevice = paNoDevice;    (*hostApi)->info.deviceCount = 0;      if( auhalHostApi->devCount > 0 )    {        (*hostApi)->deviceInfos = (PaDeviceInfo**)PaUtil_GroupAllocateMemory(                auhalHostApi->allocations, sizeof(PaDeviceInfo*) * auhalHostApi->devCount);        if( !(*hostApi)->deviceInfos )        {            result = paInsufficientMemory;            goto error;        }        /* allocate all device info structs in a contiguous block */        deviceInfoArray = (PaDeviceInfo*)PaUtil_GroupAllocateMemory(                auhalHostApi->allocations, sizeof(PaDeviceInfo) * auhalHostApi->devCount );        if( !deviceInfoArray )        {            result = paInsufficientMemory;            goto error;        }        for( i=0; i < auhalHostApi->devCount; ++i )        {            int err;            err = InitializeDeviceInfo( auhalHostApi, &deviceInfoArray[i],                                      auhalHostApi->devIds[i],                                      hostApiIndex );            if (err == paNoError)            { /* copy some info and set the defaults */                (*hostApi)->deviceInfos[(*hostApi)->info.deviceCount] = &deviceInfoArray[i];                if (auhalHostApi->devIds[i] == auhalHostApi->defaultIn)                    (*hostApi)->info.defaultInputDevice = (*hostApi)->info.deviceCount;                if (auhalHostApi->devIds[i] == auhalHostApi->defaultOut)                    (*hostApi)->info.defaultOutputDevice = (*hostApi)->info.deviceCount;                (*hostApi)->info.deviceCount++;            }            else            { /* there was an error. we need to shift the devices down, so we ignore this one */                int j;                auhalHostApi->devCount--;                for( j=i; j<auhalHostApi->devCount; ++j )                   auhalHostApi->devIds[j] = auhalHostApi->devIds[j+1];                i--;            }        }    }    (*hostApi)->Terminate = Terminate;    (*hostApi)->OpenStream = OpenStream;    (*hostApi)->IsFormatSupported = IsFormatSupported;    PaUtil_InitializeStreamInterface( &auhalHostApi->callbackStreamInterface,                                      CloseStream, StartStream,                                      StopStream, AbortStream, IsStreamStopped,                                      IsStreamActive,                                      GetStreamTime, GetStreamCpuLoad,                                      PaUtil_DummyRead, PaUtil_DummyWrite,                                      PaUtil_DummyGetReadAvailable,                                      PaUtil_DummyGetWriteAvailable );    PaUtil_InitializeStreamInterface( &auhalHostApi->blockingStreamInterface,                                      CloseStream, StartStream,                                      StopStream, AbortStream, IsStreamStopped,                                      IsStreamActive,                                      GetStreamTime, PaUtil_DummyGetCpuLoad,                                      ReadStream, WriteStream,                                      GetStreamReadAvailable,                                      GetStreamWriteAvailable );    return result;error:    if( auhalHostApi )    {        if( auhalHostApi->allocations )        {            PaUtil_FreeAllAllocations( auhalHostApi->allocations );            PaUtil_DestroyAllocationGroup( auhalHostApi->allocations );        }                        PaUtil_FreeMemory( auhalHostApi );    }    return result;}static void Terminate( struct PaUtilHostApiRepresentation *hostApi ){    PaMacAUHAL *auhalHostApi = (PaMacAUHAL*)hostApi;    VVDBUG(("Terminate()\n"));    /*        IMPLEMENT ME:            - clean up any resources not handled by the allocation group        TODO: Double check that everything is handled by alloc group    */    if( auhalHostApi->allocations )    {        PaUtil_FreeAllAllocations( auhalHostApi->allocations );        PaUtil_DestroyAllocationGroup( auhalHostApi->allocations );    }    PaUtil_FreeMemory( auhalHostApi );}static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi,                                  const PaStreamParameters *inputParameters,                                  const PaStreamParameters *outputParameters,                                  double sampleRate ){    int inputChannelCount, outputChannelCount;    PaSampleFormat inputSampleFormat, outputSampleFormat;

⌨️ 快捷键说明

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