Asio驱动开发学习笔记(3)

Init之后就需要createBuffers。下面是createBuffers代码。

AsioError CUsbAsio::createBuffers(ASIOBufferInfo *bufferInfos, long numChannels, long bufferSize, ASIOCallbacks *callbacks)
{
    //bufferInfos, 需要分配内存,即将inputBuffers/outputBuffers分配好后指向bufferInfos->buffers;
    //numChannels, 声道数
    //bufferSize, 需要分配的buffer大小
    //callback, 分配完之后设置asioTime
    ASIOBufferInfo *info = bufferInfos;
    bool notEnoughMem = false;

    activeInputs = 0;
    activeOutputs = 0;
    blockFrames = bufferSize;
    for(int i=0; i<numChannels; i++)
    {
        //set Input buffer
        if(info->isInput)
        {
            //检查Asio buffer info 的channel数是否正确
            if(info->channelNum<0 || info->channelNum >= m_NumInputs)
                goto error;
            inMap[activeInputs] = info->channelNum;
            //分配buffer, *2是因为交换数据,需要2个buffer
            inputBuffers[activeInputs= = new char [bufferSize * m_NumSampleSize *2];
            memset(inputBuffers[acitive], 0 , bufferSize * m_NumSampleSize *2);
            if(inputBuffers[activeInputs])
            {
                info->buffers[0] = inputBuffers;
                info->buffers[1] = inputBuffers + bufferSize*m_NumSampleSize;
            }else{
                //new false, out of memory
                notEnoughMem = true;
                info->buffers[0] = NULL;
                info->buffers[1] = NULL;
            }
            activeInput++;
            if(activeInput > m_NumInputs)
                goto error;
        }else //set output buffer
        {
            if(info->channelNum<0 || info->channelNum>=m_NumInputs)
            outMap[activeOutputs] = info->channelNum;
            outputBuffers[activeOutputs] = new char[bufferSize * m_NumSampleSize *2];
            memset(outputBuffers, 0, bufferSize*m_NumSampleSize*2);
            if(outputBuffers[activeOutputs])
            {
                info->buffers[0] = outputBuffers;
                info->buffers[1] = outputBuffers+bufferSize*m_NumSampleSize;
            }else{//out of memory
                notEnoughMem = true;
                info->buffers[0]=NULL;
                info->buffers[1]= NULL;
            }
            activeOutputs++;
            if(avtiveOutputs > info->channleNum)
                goto error;
        }
    }
    if(notEnoughMem)
    {
        disposeBuffers();
        return ASE_NoMemory;
    }

    //set AsioTime
    this->callbacks = callbacks;
    if(callbacks->asioMessage(kAsioSupportsTimeInfo, 0, 0, 0))
    {
        timeInfoMode = true;
        asioTime.timeInfo.speed = 1;
        asioTime.timeInfo.systemTime.hi = asioTime.timeInfo.systemTime.lo = 0;
        asioTime.timeInfo.samplePosition.hi = asioTime.timeInfo.samplePosition.lo = 0;
        asioTime.timeInfo.sampleRate = sampleRate;
        asioTime.timeInfo.flag = kSystemTimeValid|kSamplePositionValid|kSampleRateValid;

        asioTime.timeCode.speed = 1;
        asioTime.timeCode.timeCodeSamples.lo = asioTime.timeCode.timeCodeSamples.hi = 0;
        asioTime.timeCode.flags = kTcValid|kTcRunning;
    }else
    {
        timeInfoMode = false;
    }
    m_BufferSwitchEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    return ASE_OK;
error:
    disposeBuffers();
    return ASE_InvalidParameter;
}

ASIOError CUsbAsio::disposeBuffers()
{
    callbacks = NULL;
    stop();
    for(int i=0; i<activeInputs; i++)
    {
        if(inputBuffers[i])
            delete inputBuffers[i];
        inputBuffers[i] = NULL;
    }
    activeInputs = 0;
    for(int i=0; i<activeOutputs; i++)
    {
        if(outputBuffers[i])
            delete outputBuffers[i];
        outoutBuffers[i] = NULL;
    }
    activeBuffers = 0;
    if(m_BufferSwitchEvent)
        CloseHandle(m_BufferSwitchEvent);
    m_BufferSwitchEvent = NULL;
    return ASE_OK;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值