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

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

?? pa_mac_core.c

?? ppciaxclient softphone
?? C
?? 第 1 頁 / 共 5 頁
字號:
    int                 numChannelsRemaining;
    Boolean             deinterleavingNeeded;
    int                 numFramesInOutputBuffer;
    
    if( outOutputData == NULL )
    {
        DBUG(("PaOSX_HandleOutput: outOutputData == NULL\n"));
        return noErr;
    }

    deinterleavingNeeded = past->past_NumOutputChannels != outOutputData->mBuffers[0].mNumberChannels;
    
	numFramesInOutputBuffer = outOutputData->mBuffers[0].mDataByteSize /
        (sizeof(float) * outOutputData->mBuffers[0].mNumberChannels);
    
    if( pahsc->mode != PA_MODE_INPUT_ONLY )
    {
        /* If we are using output, then we need an empty output buffer. */
        if( outOutputData->mNumberBuffers > 0 )
        {
        	
            /* If we have multiple CoreAudio buffers, then we will need to deinterleave after conversion. */
            if( deinterleavingNeeded )
            {
            	numBytes = numFramesInOutputBuffer * sizeof(float) * past->past_NumOutputChannels;
                
                /* Free old buffer if we are allocating new one. */
                if ( (pahsc->output.streamInterleavingBuffer != NULL) &&
                     (pahsc->output.streamInterleavingBufferLen < numBytes) )
                {
                    PaHost_FreeFastMemory( pahsc->output.streamInterleavingBuffer, pahsc->output.streamInterleavingBufferLen );
                    pahsc->output.streamInterleavingBuffer = NULL;
                }
                /* Allocate interleaving buffer if needed. */
                if ( pahsc->output.streamInterleavingBuffer == NULL )
                {
                    pahsc->output.streamInterleavingBufferLen = numBytes;
                    pahsc->output.streamInterleavingBuffer = (float *)PaHost_AllocateFastMemory( pahsc->output.streamInterleavingBufferLen );
                }

                outputNativeBufferfPtr =  (void*)pahsc->output.streamInterleavingBuffer;
            }
            else
            {
                numBytes = outOutputData->mBuffers[0].mDataByteSize;
                outputNativeBufferfPtr =  (void*)outOutputData->mBuffers[0].mData;
            }
    
            /* Pull data from PA user through converter. */
            err = AudioConverterFillBuffer(
                pahsc->output.converter,
                PaOSX_OutputConverterCallbackProc,
                past,
                &numBytes,
                outputNativeBufferfPtr);
            if( err != noErr )
            {
                PRINT_ERR("PaOSX_HandleOutput: AudioConverterFillBuffer failed", err);
                goto error;
            }
            
            /* Deinterleave data from PortAudio and write to multiple CoreAudio buffers. */
            if( deinterleavingNeeded )
            {
                int numInterleavedChannels = past->past_NumOutputChannels;
                int i, currentInterleavedChannelIndex = 0;
                numChannelsRemaining = numInterleavedChannels;
                
                for( i=0; i<outOutputData->mNumberBuffers; i++ )
                {
                    int numBufChannels = outOutputData->mBuffers[i].mNumberChannels;
                    int j;            
                    /* 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 = &((float *)outOutputData->mBuffers[i].mData)[ j ];
                        float *src = &pahsc->output.streamInterleavingBuffer[ currentInterleavedChannelIndex ];
                        /* Move one channel from interleaved buffer to CoreAudio buffer. */
                        for( k=0; k<numFramesInOutputBuffer; k++ )
                        {
                            *dest = *src;
                            dest += numBufChannels;
                            src += numInterleavedChannels;
                        }
                        currentInterleavedChannelIndex++;
                    }
                    
                    numChannelsRemaining -= numChannelsUsedInThisBuffer;
                    if( numChannelsRemaining <= 0 ) break;
                }
            }
        }
    }
    
error:
    return err;
}

/******************************************************************
 * This callback is used when two separate devices are used for input and output.
 * This often happens when using USB devices which present as two devices: input and output.
 * It just writes its data to a FIFO so that it can be read by the main callback
 * proc PaOSX_CoreAudioIOCallback().
 */
static OSStatus PaOSX_CoreAudioInputCallback (AudioDeviceID  inDevice, const AudioTimeStamp*  inNow,
                    const AudioBufferList*  inInputData, const AudioTimeStamp*  inInputTime,
                    AudioBufferList*  outOutputData, const AudioTimeStamp* inOutputTime,
                    void* contextPtr)
{
    OSStatus      err = noErr;
    internalPortAudioStream *past = (internalPortAudioStream *) contextPtr;
    PaHostSoundControl *pahsc;
    pahsc = (PaHostSoundControl *) past->past_DeviceData;
   
    /* If there is a FIFO for input then write to it. */
    if( (pahsc->ringBufferData != NULL) && (inInputData != NULL) )
    {
        err = PaOSX_WriteInputRingBuffer( past, inInputData  );
        if( err != noErr ) goto error;
    }
error:
    return err;
}

/******************************************************************
 * This is the primary callback for CoreAudio.
 * It can handle input and/or output for a single device.
 * It takes input from CoreAudio, converts it and passes it to the
 * PortAudio user callback. Then takes the PA results and passes it
 * back to CoreAudio.
 */
static OSStatus PaOSX_CoreAudioIOCallback (AudioDeviceID  inDevice, const AudioTimeStamp*  inNow,
                    const AudioBufferList*  inInputData, const AudioTimeStamp*  inInputTime,
                    AudioBufferList*  outOutputData, const AudioTimeStamp* inOutputTime,
                    void* contextPtr)
{
    OSStatus      err = noErr;
    internalPortAudioStream *past;
    PaHostSoundControl *pahsc;
    past = (internalPortAudioStream *) contextPtr;
    pahsc = (PaHostSoundControl *) past->past_DeviceData;

    /* Has someone asked us to abort by calling Pa_AbortStream()? */
    if( past->past_StopNow )
    {
        past->past_IsActive = 0; /* Will cause thread to return. */
    }
    /* Has someone asked us to stop by calling Pa_StopStream()
     * OR has a user callback returned '1' to indicate finished.
     */
    else if( past->past_StopSoon )
    {
        // FIXME - Pretend all done. Should wait for audio to play out but CoreAudio latency very low.
        past->past_IsActive = 0; /* Will cause thread to return. */
    }
    else
    {
        /* use time stamp from CoreAudio if valid */
        if( inOutputTime->mFlags & kAudioTimeStampSampleTimeValid) 
        {
            past->past_FrameCount = inOutputTime->mSampleTime;
        }
        else if( inInputTime->mFlags & kAudioTimeStampSampleTimeValid) 
        {
            past->past_FrameCount = inInputTime->mSampleTime;
        }
        
        past->past_NumCallbacks += 1;
        
        /* Process full input buffer. */
        err = PaOSX_HandleInput( past, inInputData );
        if( err != 0 ) goto error;
        
        /* Fill up empty output buffers. */
        err = PaOSX_HandleOutput( past, outOutputData );
        if( err != 0 ) goto error;
    }

    if( err != 0 ) DBUG(("PaOSX_CoreAudioIOCallback: returns %ld.\n", err ));
    
error:
    return err;
}

/*******************************************************************/
/** Attempt to set device sample rate.
 * This is not critical because we use an AudioConverter but we may
 * get better fidelity if we can avoid resampling.
 *
 * Only set format once because some devices take time to settle.
 * Return flag indicating whether format changed so we know whether to wait
 * for DevicePropertyListener to get called.
 *
 * @return negative error, zero if no change, or one if changed successfully.
 */
static PaError PaOSX_SetFormat( AudioDeviceID devID, Boolean isInput,
        double desiredRate, int desiredNumChannels )
{
    AudioStreamBasicDescription formatDesc;
    PaError  result = 0;
    OSStatus err;
    UInt32   dataSize;
    Float64  originalRate;
    int      originalChannels;
    
    /* Get current device format. This is critical because if we pass
     * zeros for unspecified fields then the iMic device gets switched to a 16 bit
     * integer format!!! I don't know if this is a Mac bug or not. But it only
     * started happening when I upgraded from OS X V10.1 to V10.2 (Jaguar).
     */
    dataSize = sizeof(formatDesc);
    err = AudioDeviceGetProperty( devID, 0, isInput,
        kAudioDevicePropertyStreamFormat, &dataSize, &formatDesc);
    if( err != noErr )
    {
        PRINT_ERR("PaOSX_SetFormat: Could not get format.", err);
        sSavedHostError = err;
        return paHostError;
    }
    
    originalRate = formatDesc.mSampleRate;
    originalChannels = formatDesc.mChannelsPerFrame;
        
    // Is it already set to the correct format?
    if( (originalRate != desiredRate) || (originalChannels != desiredNumChannels) )
    {
        DBUG(("PaOSX_SetFormat: try to change sample rate to %f.\n", desiredRate ));
        DBUG(("PaOSX_SetFormat: try to set number of channels to %d\n", desiredNumChannels));

        formatDesc.mSampleRate = desiredRate;
        formatDesc.mChannelsPerFrame = desiredNumChannels;
        formatDesc.mBytesPerFrame = formatDesc.mChannelsPerFrame * sizeof(float);
        formatDesc.mBytesPerPacket = formatDesc.mBytesPerFrame * formatDesc.mFramesPerPacket;

        err = AudioDeviceSetProperty( devID, 0, 0,
            isInput, kAudioDevicePropertyStreamFormat, sizeof(formatDesc), &formatDesc);
        if (err != noErr)
        {
            /* Could not set to desired rate so query for closest match. */
            dataSize = sizeof(formatDesc);
            err = AudioDeviceGetProperty( devID, 0,
                isInput, kAudioDevicePropertyStreamFormatMatch, &dataSize, &formatDesc);
                
            DBUG(("PaOSX_SetFormat: closest rate is %f.\n", formatDesc.mSampleRate ));
            DBUG(("PaOSX_SetFormat: closest numChannels is %d.\n", (int)formatDesc.mChannelsPerFrame ));
            // Set to closest if different from original.
            if( (err == noErr) &&
                ((originalRate != formatDesc.mSampleRate) ||
                 (originalChannels != formatDesc.mChannelsPerFrame)) )
            {
                err = AudioDeviceSetProperty( devID, 0, 0,
                    isInput, kAudioDevicePropertyStreamFormat, sizeof(formatDesc), &formatDesc);
                if( err == noErr ) result = 1;
            }
        }
        else result = 1;
    }
    
    return result;
}

/*******************************************************************
 * Check volume level of device. If below threshold, then set to newLevel.
 * Using volume instead of decibels because decibel range varies by device.
 */
static void PaOSX_FixVolumeScalars( AudioDeviceID devID, Boolean isInput,
    int numChannels, double threshold, double newLevel )
{
    OSStatus err = noErr;
    UInt32    dataSize;
    int       iChannel;

/* The master channel is 0. Left and right are channels 1 and 2. */
/* Fix volume. */
    for( iChannel = 0; iChannel<=numChannels; iChannel++ )
    {
        Float32   fdata32;
        dataSize = sizeof( fdata32 );
        err = AudioDeviceGetProperty( devID, iChannel, isInput, 
            kAudioDevicePropertyVolumeScalar, &dataSize, &fdata32 );
        if( err == noErr )
        {
            DBUG(("kAudioDevicePropertyVolumeScalar for channel %d = %f\n", iChannel, fdata32));
            if( fdata32 <= (Float32) threshold )
            {
                dataSize = sizeof( fdata32 );
                fdata32 = (Float32) newLevel;
                err = AudioDeviceSetProperty( devID, 0, iChannel, isInput, 
                    kAudioDevicePropertyVolumeScalar, dataSize, &fdata32 );
                if( err != noErr )
                {
                    PRINT(("Warning: audio volume is very low and could not be turned up.\n"));
                }
                else
                {
                    PRINT(("Volume for audio channel %d was <= %4.2f so set to %4.2f by PortAudio!\n",
                        iChannel, threshold, newLevel ));
                }
            }
        }
    }
/* Unmute if muted. */
    for( iChannel = 0; iChannel<=numChannels; iChannel++ )
    {
        UInt32    uidata32;
        dataSize = sizeof( uidata32 );
        err = AudioDeviceGetProperty( devID, iChannel, isInput, 
            kAudioDevicePropertyMute, &dataSize, &uidata32 );
        if( err == noErr )
        {
            DBUG(("mute for channel %d = %ld\n", iChannel, uidata32));
            if( uidata32 == 1 ) // muted?
            {
                dataSize = sizeof( uidata32 );
                uidata32 = 0; // unmute
                err = AudioDeviceSetProperty( devID, 0, iChannel, isInput, 
                    kAudioDevicePropertyMute, dataSize, &uidata32 );
                if( err != noErr )
                {
                    PRINT(("Warning: audio is muted and could not be unmuted!\n"));
                }
                else
                {
                    PRINT(("Audio channel %d was unmuted by PortAudio!\n", iChannel ));
                }
            }
        }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久九九久久九九| 成人永久免费视频| 欧美电影影音先锋| 午夜影视日本亚洲欧洲精品| 在线播放中文字幕一区| 人禽交欧美网站| 精品欧美一区二区在线观看| 极品美女销魂一区二区三区| 国产亚洲午夜高清国产拍精品| 久久草av在线| 亚洲欧洲日韩在线| 欧美三级韩国三级日本一级| 丝袜亚洲另类丝袜在线| 欧美精品一区二区在线播放| 成人永久免费视频| 午夜精品久久久久久| 久久综合久久鬼色| 91色婷婷久久久久合中文| 亚洲www啪成人一区二区麻豆| 欧美成人午夜电影| 成人爱爱电影网址| 天天亚洲美女在线视频| 国产午夜亚洲精品理论片色戒| 91精品福利在线| 国内外成人在线视频| 国产精品国产三级国产三级人妇| 欧美日韩在线观看一区二区| 精品午夜一区二区三区在线观看| 国产精品黄色在线观看| 欧美精品少妇一区二区三区| 国产麻豆一精品一av一免费 | 91精品久久久久久蜜臀| 韩国v欧美v亚洲v日本v| 亚洲美女在线国产| 精品人在线二区三区| 91久久一区二区| 国产一区二区导航在线播放| 夜夜亚洲天天久久| 久久理论电影网| 欧美精品三级日韩久久| 不卡av在线免费观看| 日本91福利区| 亚洲乱码精品一二三四区日韩在线| 日韩欧美一区二区免费| 在线一区二区三区做爰视频网站| 久久99精品久久久久久久久久久久| 亚洲男女一区二区三区| 精品国产免费视频| 欧美日本视频在线| 成人看片黄a免费看在线| 日韩 欧美一区二区三区| 国产精品成人免费精品自在线观看| 欧美一级电影网站| 在线观看免费一区| 99re8在线精品视频免费播放| 久久99精品久久久久| 午夜久久久久久久久| 亚洲乱码国产乱码精品精小说 | 日本一区二区综合亚洲| 91精品国产91综合久久蜜臀| 色999日韩国产欧美一区二区| 黄页视频在线91| 日韩电影在线免费观看| 亚洲一二三区不卡| 亚洲女同ⅹxx女同tv| 欧美激情一区不卡| 26uuu亚洲综合色| 日韩一区二区三区电影在线观看 | 欧美另类z0zxhd电影| 色综合久久综合网| 97超碰欧美中文字幕| 国产成人午夜精品影院观看视频| 奇米综合一区二区三区精品视频| 亚洲色图第一区| 久久综合久久综合九色| 日韩欧美在线网站| 欧美日本韩国一区二区三区视频| 色哟哟精品一区| 91丨porny丨最新| 成人看片黄a免费看在线| 成人国产精品视频| 成人国产在线观看| 99久久免费精品高清特色大片| 国产mv日韩mv欧美| 福利一区二区在线观看| 成人免费看黄yyy456| 成人99免费视频| 91麻豆国产香蕉久久精品| aa级大片欧美| 欧美视频中文字幕| 欧美精品高清视频| 精品久久国产老人久久综合| 日韩精品一区二区三区蜜臀 | 91精品国产福利| 日韩美女视频在线| 久久女同精品一区二区| 久久精品这里都是精品| 最新高清无码专区| 亚洲伊人伊色伊影伊综合网| 日韩国产精品久久| 国产在线一区二区| 99久久免费视频.com| 欧美日韩一区精品| 精品少妇一区二区三区日产乱码| 久久综合九色综合欧美就去吻| 国产亚洲成av人在线观看导航| 国产精品久久久久久久岛一牛影视| 亚洲色图另类专区| 日本免费在线视频不卡一不卡二| 激情综合网最新| av网站免费线看精品| 欧美日韩和欧美的一区二区| 欧美精品一区二区三区久久久| 国产精品乱人伦一区二区| 亚洲一区自拍偷拍| 狠狠色丁香婷婷综合| 日本精品一区二区三区高清| 日韩你懂的在线播放| 成人欧美一区二区三区1314| 天天综合日日夜夜精品| 国产91精品欧美| 欧美人与性动xxxx| 国产精品污www在线观看| 午夜私人影院久久久久| 国产一区二区三区四| 欧美丝袜丝交足nylons| 国产欧美一区二区在线观看| 日韩专区中文字幕一区二区| 国产精品66部| 欧美亚洲高清一区二区三区不卡| 精品国产麻豆免费人成网站| 亚洲精选在线视频| 国产精品99久久久久久久女警 | 国产精品丝袜在线| 日本大胆欧美人术艺术动态| 97se亚洲国产综合在线| 精品国产免费人成在线观看| 亚洲国产成人高清精品| 成人av在线影院| 欧美精品一区二区三| 亚洲成人黄色影院| 成人91在线观看| 欧美国产日韩精品免费观看| 美女免费视频一区二区| 欧美日韩一区二区三区四区五区| 国产精品久久一卡二卡| 免费黄网站欧美| 欧美人xxxx| 一区二区三区欧美日韩| 成人小视频在线观看| 精品福利一区二区三区免费视频| 亚洲电影激情视频网站| 在线观看一区不卡| 亚洲日本电影在线| 成人免费毛片片v| 国产精品久久午夜夜伦鲁鲁| 国内一区二区在线| 久久男人中文字幕资源站| 日产精品久久久久久久性色| 欧美性大战久久| 夜夜精品浪潮av一区二区三区| 丁香六月久久综合狠狠色| 久久久美女毛片| 国产精品一二三四| 精品盗摄一区二区三区| 捆绑调教一区二区三区| 欧美成人乱码一区二区三区| 另类成人小视频在线| 日韩手机在线导航| 美日韩一区二区| 久久综合久久鬼色中文字| 国产一区二区导航在线播放| 久久九九久精品国产免费直播| 国产专区欧美精品| 久久一二三国产| 高清不卡一区二区在线| 国产精品二三区| 欧美性色欧美a在线播放| 亚洲成av人片在线| 91精品国产欧美一区二区成人| 日韩不卡一区二区| 精品久久99ma| 成人免费视频视频| 亚洲美女免费在线| 欧美日韩成人在线| 久久99九九99精品| 国产精品嫩草影院com| 一本一道久久a久久精品综合蜜臀| 亚洲激情图片小说视频| 欧美日韩色一区| 麻豆成人久久精品二区三区红 | 中文欧美字幕免费| 91美女蜜桃在线| 天天色综合成人网| 精品久久一区二区三区| yourporn久久国产精品| 亚洲综合在线视频| 精品国精品国产| 99国产精品久久久| 日韩激情一区二区|