亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pa_mac_core.c

?? ppciaxclient softphone
?? C
?? 第 1 頁 / 共 5 頁
字號:

/*************************************************************************
** Try to fill in the device info for this device.
** Return 1 if a good device that PA can use.
** Return 0 if not appropriate
** or return negative error.
**
*/
static int PaOSX_QueryDeviceInfo( PaHostDeviceInfo *hostDeviceInfo, int coreDeviceIndex, Boolean isInput )
{
    OSStatus         err;
    UInt32           outSize;
    AudioStreamBasicDescription formatDesc;
    AudioDeviceID    devID;
    PaDeviceInfo    *deviceInfo = &hostDeviceInfo->paInfo;
    int              maxChannels;

    deviceInfo->structVersion = 1;
    deviceInfo->maxInputChannels = 0;
    deviceInfo->maxOutputChannels = 0;

    deviceInfo->sampleRates = supportedSampleRateRange; // because we use sample rate converter to get continuous rates
    deviceInfo->numSampleRates = -1;

    devID = sCoreDeviceIDs[ coreDeviceIndex ];
    hostDeviceInfo->audioDeviceID = devID;
    DBUG(("PaOSX_QueryDeviceInfo: coreDeviceIndex = %d, devID = %d, isInput = %d\n",
        coreDeviceIndex, (int) devID, isInput ));
        
    // Get data format info from the device.
    outSize = sizeof(formatDesc);
    err = AudioDeviceGetProperty(devID, 0, isInput, kAudioDevicePropertyStreamFormat, &outSize, &formatDesc);
    // This just may not be an appropriate device for input or output so leave quietly.
    if( (err != noErr)  || (formatDesc.mChannelsPerFrame == 0) ) goto error;
    
    DBUG(("PaOSX_QueryDeviceInfo: mFormatID = 0x%x\n", (unsigned int) formatDesc.mFormatID));
    DBUG(("PaOSX_QueryDeviceInfo: mFormatFlags = 0x%x\n",(unsigned int)  formatDesc.mFormatFlags));

    // Right now the Core Audio headers only define one formatID: LinearPCM
    // Apparently LinearPCM must be Float32 for now.
    if( (formatDesc.mFormatID == kAudioFormatLinearPCM) &&
        ((formatDesc.mFormatFlags & kLinearPCMFormatFlagIsFloat) != 0) )
    {
        deviceInfo->nativeSampleFormats = paFloat32;
    }
    else
    {
        PRINT(("PaOSX_QueryDeviceInfo: ERROR - not LinearPCM & Float32!!!\n"));
        return paSampleFormatNotSupported;
    }
    
    maxChannels = PaOSX_GetMaxChannels( devID, isInput );
    if( maxChannels <= 0 ) goto error;
    if( isInput )
    {
        deviceInfo->maxInputChannels = maxChannels;
    }
    else
    {
        deviceInfo->maxOutputChannels = maxChannels;
    }
    
    // Get the device name
    deviceInfo->name = PaOSX_DeviceNameFromID( devID, isInput );
    DBUG(("PaOSX_QueryDeviceInfo: name = %s\n", deviceInfo->name ));
    return 1;

error:
    return 0;
}

/**********************************************************************/
static PaError PaOSX_MaybeQueryDevices( void )
{
    if( sNumPaDevices == 0 )
    {
        return PaOSX_QueryDevices();
    }
    return 0;
}

static char zeroPad[256] = { 0 };

/**********************************************************************
** This is the proc that supplies the data to the AudioConverterFillBuffer call.
** We can pass back arbitrarily sized blocks so if the FIFO region is split
** just pass back the first half.
*/
static OSStatus PaOSX_InputConverterCallbackProc (AudioConverterRef			inAudioConverter,
								UInt32*						outDataSize,
								void**						outData,
								void*						inUserData)
{
    internalPortAudioStream   *past = (internalPortAudioStream *) inUserData;
    PaHostSoundControl *pahsc = (PaHostSoundControl *) past->past_DeviceData;
    void *dataPtr1;
    long size1;
    void *dataPtr2;
    long size2;
           
    /* Pass contiguous region from FIFO directly to converter. */
    RingBuffer_GetReadRegions( &pahsc->ringBuffer, *outDataSize,
            &dataPtr1, &size1, &dataPtr2, &size2 );

    if( size1 > 0 )
    {
        *outData = dataPtr1;
        *outDataSize = size1;
        RingBuffer_AdvanceReadIndex( &pahsc->ringBuffer, size1 );
        DBUGX(("PaOSX_InputConverterCallbackProc: read %ld bytes from FIFO.\n", size1 ));
    }
    else
    {
        DBUGBACK(("PaOSX_InputConverterCallbackProc: got no data!\n"));
        *outData = zeroPad; /* Give it zero data to keep it happy. */
        *outDataSize = sizeof(zeroPad);
    }
	return noErr;
}

/*****************************************************************************
** Get audio input, if any, from passed in buffer, or from converter or from FIFO,
** then run PA callback and output data.
*/
static OSStatus PaOSX_LoadAndProcess( internalPortAudioStream   *past,
    void *inputBuffer, void *outputBuffer )
{
    OSStatus err = noErr;
    PaHostSoundControl *pahsc = (PaHostSoundControl *) past->past_DeviceData;
    
    if( past->past_StopSoon )
    {
        if( outputBuffer )
        {
            /* Clear remainder of audio buffer if we are waiting for stop. */
            AddTraceMessage("PaOSX_LoadAndProcess: zero rest of wave buffer ", i );
            memset( outputBuffer, 0, pahsc->output.bytesPerUserNativeBuffer );
        }
    }
    else
    {
        /* Do we need data from the converted input? */
        if( PA_USING_INPUT )
        {
            UInt32 size = pahsc->input.bytesPerUserNativeBuffer;
            err = AudioConverterFillBuffer(
                pahsc->input.converter,
                PaOSX_InputConverterCallbackProc,
                past,
                &size,
                pahsc->input.converterBuffer);
            if( err != noErr ) return err;
            inputBuffer = pahsc->input.converterBuffer;
        }
        
        /* Measure CPU load. */
#if PA_ENABLE_LOAD_MEASUREMENT
        Pa_StartUsageCalculation( past );
#endif

        /* Fill part of audio converter buffer by converting input to user format,
        * calling user callback, then converting output to native format. */
        if( PaConvert_Process( past, inputBuffer, outputBuffer ))
        {
            past->past_StopSoon = 1;
        }
        
#if PA_ENABLE_LOAD_MEASUREMENT
        Pa_EndUsageCalculation( past );
#endif

    }
    return err;
}

/*****************************************************************************
** This is the proc that supplies the data to the AudioConverterFillBuffer call
*/
static OSStatus PaOSX_OutputConverterCallbackProc (AudioConverterRef			inAudioConverter,
								UInt32*						outDataSize,
								void**						outData,
								void*						inUserData)
{
    internalPortAudioStream   *past = (internalPortAudioStream *) inUserData;
    PaHostSoundControl *pahsc = (PaHostSoundControl *) past->past_DeviceData;
    
	*outData = pahsc->output.converterBuffer;
	*outDataSize = pahsc->output.bytesPerUserNativeBuffer;
    
	return PaOSX_LoadAndProcess ( past, pahsc->input.converterBuffer, pahsc->output.converterBuffer );
}

/**********************************************************************
** If data available, write it to the Ring Buffer so we can
** pull it from the other side.
*/
static OSStatus PaOSX_WriteInputRingBuffer( internalPortAudioStream   *past,
        const AudioBufferList*  inInputData  )
{
    int   numBytes = 0;
    int   currentInterleavedChannelIndex;
    int   numFramesInInputBuffer;
    int   numInterleavedChannels;
    int   numChannelsRemaining;
	int   i;
    long  writeRoom;
    char *inputNativeBufferfPtr = NULL;
    PaHostSoundControl *pahsc = (PaHostSoundControl *) past->past_DeviceData;

    /* Do we need to deinterleave the buffers first? */
    if( past->past_NumInputChannels != inInputData->mBuffers[0].mNumberChannels )
    {
		numFramesInInputBuffer = inInputData->mBuffers[0].mDataByteSize /
            (sizeof(float) * inInputData->mBuffers[0].mNumberChannels);
		
		numBytes = numFramesInInputBuffer * sizeof(float) * past->past_NumInputChannels;
	
		/* Allocate temporary buffer if needed. */
		if ( (pahsc->input.streamInterleavingBuffer != NULL) &&
			 (pahsc->input.streamInterleavingBufferLen < numBytes) )
		{
			PaHost_FreeFastMemory( pahsc->input.streamInterleavingBuffer, pahsc->input.streamInterleavingBufferLen );
			pahsc->input.streamInterleavingBuffer = NULL;
		}
		if ( pahsc->input.streamInterleavingBuffer == NULL )
		{
			pahsc->input.streamInterleavingBufferLen = numBytes;
			pahsc->input.streamInterleavingBuffer = (float *)PaHost_AllocateFastMemory( pahsc->input.streamInterleavingBufferLen );
		}
	
		/* Perform interleaving by writing to temp buffer. */
		currentInterleavedChannelIndex = 0;
		numInterleavedChannels = past->past_NumInputChannels;
		numChannelsRemaining = numInterleavedChannels;
		
		for( i=0; i<inInputData->mNumberBuffers; i++ )
		{
			int j;
			int numBufChannels = inInputData->mBuffers[i].mNumberChannels;
			/* Don't use more than we need or more than we have. */
			int numChannelsUsedInThisBuffer = (numChannelsRemaining < numBufChannels ) ?
				  numChannelsRemaining : numBufChannels;
			for( j=0; j<numChannelsUsedInThisBuffer; j++ )
			{
				int k;
                float *dest = &pahsc->input.streamInterleavingBuffer[ currentInterleavedChannelIndex ];
                float *src = &((float *)inInputData->mBuffers[i].mData)[ j ];
				/* Move one channel from CoreAudio buffer to interleaved buffer. */
				for( k=0; k<numFramesInInputBuffer; k++ )
				{
					*dest = *src;
                    src += numBufChannels;
                    dest += numInterleavedChannels;
				}
				currentInterleavedChannelIndex++;
			}
			numChannelsRemaining -= numChannelsUsedInThisBuffer;
			if( numChannelsRemaining <= 0 ) break;
		}

        inputNativeBufferfPtr = (char *)pahsc->input.streamInterleavingBuffer;
    }
    else
    {
        inputNativeBufferfPtr = (char*)inInputData->mBuffers[0].mData;
        numBytes = inInputData->mBuffers[0].mDataByteSize;
    }

    writeRoom = RingBuffer_GetWriteAvailable( &pahsc->ringBuffer );
    
    if( numBytes <= writeRoom )
    {
        RingBuffer_Write(  &pahsc->ringBuffer, inputNativeBufferfPtr, numBytes );
        DBUGBACK(("PaOSX_WriteInputRingBuffer: wrote %ld bytes to FIFO.\n", numBytes));
    } // FIXME else drop samples on floor, remember overflow???            

    return noErr;
}

/**********************************************************************
** Use any available input buffers by writing to RingBuffer.
** Process input if PA_MODE_INPUT_ONLY.
*/
static OSStatus PaOSX_HandleInput( internalPortAudioStream   *past,
        const AudioBufferList*  inInputData )
{
    OSStatus            err = noErr;
    PaHostSoundControl *pahsc = (PaHostSoundControl *) past->past_DeviceData;

    if( inInputData == NULL )
    {
        DBUG(("PaOSX_HandleInput: inInputData == NULL\n"));
        return noErr;
    }
    
    if(  inInputData->mNumberBuffers > 0  )
    {    
        /* Write to FIFO here if we are only using this callback. */
        if( (pahsc->mode == PA_MODE_INPUT_ONLY) || (pahsc->mode == PA_MODE_IO_ONE_DEVICE) )
        {
            err = PaOSX_WriteInputRingBuffer( past, inInputData  );
            if( err != noErr ) goto error;
        }
    }
    
    if( pahsc->mode == PA_MODE_INPUT_ONLY )
    {
        /* Generate user buffers as long as we have a half full input FIFO. */
        long halfSize = pahsc->ringBuffer.bufferSize / 2;
        while( (RingBuffer_GetReadAvailable( &pahsc->ringBuffer ) >= halfSize) &&
            (past->past_StopSoon == 0) )
        {
            err = PaOSX_LoadAndProcess ( past, NULL, NULL );
            if( err != noErr ) goto error;
        }
    }
        
error:
    return err;
}

/**********************************************************************
** Fill any available output buffers.
*/
static OSStatus PaOSX_HandleOutput( internalPortAudioStream   *past,
            AudioBufferList*  outOutputData )
{
    OSStatus            err = noErr;
    void               *outputNativeBufferfPtr = NULL;
    PaHostSoundControl *pahsc = (PaHostSoundControl *) past->past_DeviceData;
    UInt32              numBytes = 0;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
eeuss鲁一区二区三区| 亚洲成av人片观看| 国产成a人亚洲| 久久夜色精品一区| 国产精品一区免费视频| 国产精品家庭影院| 91香蕉国产在线观看软件| 亚洲精选视频在线| 欧美男人的天堂一二区| 麻豆成人91精品二区三区| 欧美成人精品3d动漫h| 国产不卡在线播放| 中文字幕在线不卡| 欧美喷潮久久久xxxxx| 国产在线观看一区二区| 最新欧美精品一区二区三区| 欧美中文字幕一区| 久久精品国产精品亚洲综合| 中文字幕日韩一区| 欧美日本在线播放| 国产一区二区三区不卡在线观看 | 国产精品99久久久久久宅男| 欧美激情综合网| 欧美无砖砖区免费| 国产一区二区久久| 亚洲男人电影天堂| 26uuu国产日韩综合| 欧美最猛性xxxxx直播| 久国产精品韩国三级视频| 成人免费在线观看入口| 欧美一区二区三区四区在线观看| 国产精品一区二区x88av| 亚洲精品国产视频| 欧美精品一区二区久久婷婷 | 欧美日韩国产三级| 国产激情视频一区二区在线观看| 亚洲女同女同女同女同女同69| 欧美一区午夜视频在线观看| 懂色av中文字幕一区二区三区| 午夜a成v人精品| 国产精品久久久久天堂| 欧美大片日本大片免费观看| 欧美自拍偷拍午夜视频| 国产成人午夜精品影院观看视频 | 国产在线不卡一区| 图片区小说区区亚洲影院| 国产精品高潮久久久久无| 日韩一区二区三区电影在线观看| 色综合亚洲欧洲| 国产成人免费9x9x人网站视频| 视频一区二区三区在线| 亚洲欧美日韩国产综合| 久久精品男人天堂av| 欧美一区二区三区视频在线| 欧美最新大片在线看| 99精品久久免费看蜜臀剧情介绍| 国内偷窥港台综合视频在线播放| 日日夜夜免费精品| 亚洲国产精品久久一线不卡| 亚洲日穴在线视频| 国产精品热久久久久夜色精品三区 | 一区二区三区不卡在线观看| 中文字幕av一区 二区| 久久亚区不卡日本| xvideos.蜜桃一区二区| 欧美电影精品一区二区| 日韩视频在线一区二区| 日韩三级精品电影久久久| 91麻豆精品国产91久久久久久久久| 色婷婷综合视频在线观看| 91女神在线视频| 91视频在线观看| 91丨porny丨首页| 色偷偷一区二区三区| 色综合天天性综合| 在线观看视频欧美| 在线免费亚洲电影| 欧美午夜片在线观看| 欧美日韩亚洲国产综合| 欧美日韩国产天堂| 欧美一级在线观看| 精品国产成人在线影院| 久久女同性恋中文字幕| 国产日韩精品一区二区三区 | 一区二区三区不卡在线观看 | 欧美精品v日韩精品v韩国精品v| 欧美视频第二页| 在线电影国产精品| 日韩三级电影网址| 国产欧美日韩在线| 亚洲欧美自拍偷拍| 亚洲一二三四区| 免费在线观看日韩欧美| 极品销魂美女一区二区三区| 国产精一区二区三区| 成人的网站免费观看| 色婷婷av一区二区三区之一色屋| 欧美网站一区二区| 日韩精品一区二区在线观看| 久久精品日韩一区二区三区| 亚洲色图都市小说| 日韩极品在线观看| 国产高清精品久久久久| 91精品办公室少妇高潮对白| 678五月天丁香亚洲综合网| 精品国产欧美一区二区| 一区视频在线播放| 亚洲不卡在线观看| 国产精品2024| 日本黄色一区二区| 日韩欧美三级在线| 国产精品热久久久久夜色精品三区| 亚洲国产综合91精品麻豆| 麻豆免费精品视频| voyeur盗摄精品| 678五月天丁香亚洲综合网| 日本一区二区三区国色天香 | 久久综合成人精品亚洲另类欧美| 中文字幕日本不卡| 美女视频黄a大片欧美| 91丨porny丨中文| 精品国产免费一区二区三区香蕉| 综合中文字幕亚洲| 精品亚洲aⅴ乱码一区二区三区| 91老师片黄在线观看| 欧美一区二区三区在线电影| 日本一区二区三级电影在线观看| 亚洲大片免费看| 成人免费看黄yyy456| 日韩欧美三级在线| 亚洲一二三四在线观看| 国产成人在线看| 日韩午夜电影在线观看| 亚洲日本在线视频观看| 国产一区二区网址| 欧美精品一二三| 亚洲日本一区二区| 国产成人精品午夜视频免费| 欧美一区二区三区在线电影| 一区二区三区成人在线视频| 丁香桃色午夜亚洲一区二区三区| 在线播放国产精品二区一二区四区 | 一本久道久久综合中文字幕| 国产性做久久久久久| 美女免费视频一区| 欧美日韩精品一区二区在线播放| 亚洲欧美日韩国产成人精品影院| 国产精品综合久久| 精品国产网站在线观看| 奇米亚洲午夜久久精品| 欧美性xxxxxxxx| 亚洲一区二区3| 欧洲视频一区二区| 亚洲免费观看高清完整版在线| 国产成人99久久亚洲综合精品| 精品电影一区二区| 毛片av一区二区| 日韩欧美综合一区| 日本欧美大码aⅴ在线播放| 欧美高清视频不卡网| 图片区小说区国产精品视频| 欧美日韩国产美女| 午夜成人在线视频| 欧美电影一区二区三区| 日日摸夜夜添夜夜添精品视频| 欧美日韩午夜影院| 五月天丁香久久| 在线播放91灌醉迷j高跟美女 | 国产在线观看一区二区| 精品国产一区a| 国产精华液一区二区三区| 久久久www免费人成精品| 国产精品资源网| 国产精品久久久久一区二区三区| 不卡的av中国片| 亚洲欧美一区二区三区极速播放 | 国产喷白浆一区二区三区| 国产乱码精品1区2区3区| 国产欧美日韩麻豆91| 成年人午夜久久久| 亚洲视频你懂的| 欧美午夜寂寞影院| 蜜桃久久久久久久| 2021中文字幕一区亚洲| 成人高清在线视频| 亚洲桃色在线一区| 欧美精选一区二区| 精品一区二区三区免费视频| 日本一区二区三区在线观看| 一本一道久久a久久精品| 亚洲成av人片www| 久久综合网色—综合色88| 国产suv精品一区二区883| 综合精品久久久| 91精品国产综合久久福利| 国产美女在线观看一区| 亚洲久草在线视频| 日韩免费高清视频| 成人av网站免费观看| 午夜影院在线观看欧美|