Beispiel #1
0
void* blk_alloc(int size)
{
   BlkMemElem* elem;
   int         chain_no = (size + 7) / 8 - 1;

   assert(size     >  0);
   assert(size     <  MAX_BLK_ELEM_SIZE);
   assert(chain_no >= 0);

   if (chain_no >= MAX_CHAINS)
   {
      blk_fails++;
      return malloc((size_t)size);
   }
   if (first_free[chain_no] == NULL)
      extend_memory(chain_no);

   assert(first_free[chain_no] != NULL);

   elem                 = first_free[chain_no];
   first_free[chain_no] = elem->next;
   blk_count++;
   
   return elem;
}
Beispiel #2
0
static  t_block *first_malloc_call(size_t size)
{
  t_block	*block;

  block = extend_memory(NULL, size);
  g_base = block;
  return (block);
}
Beispiel #3
0
static t_block	*use_free_block(size_t size, t_block *last)
{
  t_block	*block;

  last = g_base;
  block = find_block(&last, size);
  if (block)
    {
      if (block->size - size >= (SIZE + sizeof(int)))
	split_memory(block, size);
      block->free = 0;
    }
  else
    block = extend_memory(last, size);
  return (block);
}
//------------------------------------------------------------------------------------------
ASIOError KXAsio::createBuffers (ASIOBufferInfo *bufferInfos, long numChannels,
    long bufferSize, ASIOCallbacks *callbacks)
{
    ASIOBufferInfo *info = bufferInfos;
    long i;
    bool notEnoughMem = false;

    activeInputs = 0;
    activeOutputs = 0;
    blockFrames = bufferSize;

    for (i = 0; i < numChannels; i++, info++)
    {
        if (info->isInput)
        {
            if (info->channelNum < 0 || info->channelNum >= (num_inputs))
                goto error;
            inMap[activeInputs] = info->channelNum;

            int ret;
AGAIN1:
            int cnt;
            for(cnt=0;cnt<3;cnt++)
            {
                ret=ikx->asio_alloc(ASIO_INPUT,info->channelNum,(void **)&inputBuffers[activeInputs],blockFrames * 2 * bps / 8,(int)sampleRate,bps);

                if (inputBuffers[activeInputs] && ret==0)
                {
                    info->buffers[0] = inputBuffers[activeInputs];
                    info->buffers[1] = (void *)((uintptr_t)inputBuffers[activeInputs] + (uintptr_t)(blockFrames*bps/8));
                    inputBufferSizes[activeInputs]=blockFrames * 2 * bps / 8;
                    memset(info->buffers[0],0,(blockFrames*bps/8));
                    memset(info->buffers[1],0,(blockFrames*bps/8));
                    break;
                }
                debug("!! kxasio: asio_alloc failed: input #%d [size=%d] ret=%d -- extending pool by %d bytes; GetLastError()=%x\n",
                  activeInputs,blockFrames*2*bps/8,ret,blockFrames*2*2*bps/8,GetLastError());
                if(ret==E_INVALIDARG)
                {
                 set_config(KXASIO_LATENCY,1024);
                 break;
                }
                extend_memory(blockFrames * 2 * 2 * bps / 8);
            }
            if(ret || (inputBuffers[activeInputs]==0))
            {
                char name[256];
                sprintf(name,"Error creating input buffer #%d: error = %d [size=%d]\nGetLastError()=%x\n\n%s\n\nRetry?",
                  activeInputs,ret,blockFrames*2*bps/8,GetLastError(),get_asio_error_string(ret));
                if(MessageBox(NULL,name,"kX ASIO",((ret==E_INVALIDARG)?MB_OK:MB_YESNO)|MB_ICONSTOP)==IDYES)
                 goto AGAIN1;
                info->buffers[0] = info->buffers[1] = 0;
                notEnoughMem = true;

                set_defaults(1);
                break;
            }
            activeInputs++;
            if (activeInputs > num_inputs)
            {
error:
                disposeBuffers();
                return ASE_InvalidParameter;
            }
        }
        else    // output           
        {
            if (info->channelNum < 0 || info->channelNum >= num_outputs)
                goto error;
            outMap[activeOutputs] = info->channelNum;
AGAIN2:
            int ret;
            for(int cnt=0;cnt<3;cnt++)
            {
                ret=ikx->asio_alloc(ASIO_OUTPUT,info->channelNum,(void **)&outputBuffers[activeOutputs],blockFrames * 2 * bps/8,(int)sampleRate,bps);

                if (outputBuffers[activeOutputs] && ret==0)
                {
                    info->buffers[0] = outputBuffers[activeOutputs];
                    info->buffers[1] = (void *)((uintptr_t)outputBuffers[activeOutputs] + (uintptr_t)blockFrames*bps/8);
                    outputBufferSizes[activeOutputs]=blockFrames * 2 * bps / 8;

                    memset(info->buffers[0],0,(blockFrames*bps/8));
                    memset(info->buffers[1],0,(blockFrames*bps/8));
                    break;
                }
                debug("kxasio: asio_alloc failed: output #%d [size=%d] ret=%d -- extending pool by %d bytes; GetLastError()=%x\n",
                  activeOutputs,blockFrames*2*bps/8,ret,blockFrames*2*2*bps/8,GetLastError());
                if(ret==E_INVALIDARG)
                {
                 set_config(KXASIO_LATENCY,1024);
                 break;
                }
                extend_memory(blockFrames * 2 * 2 * bps/8);
            }
            if(ret || (outputBuffers[activeOutputs]==0))
            {
                char name[256];
                sprintf(name,"Error creating output buffer #%d: error = %d [size=%d]\nGetLastError()=%x\n\n%s\n\nRetry?",
                  activeOutputs,ret,blockFrames*2*bps/8,GetLastError(),get_asio_error_string(ret));
                if(MessageBox(NULL,name,"kX ASIO",((ret==E_INVALIDARG)?MB_OK:MB_YESNO)|MB_ICONSTOP)==IDYES)
                 goto AGAIN2;
                info->buffers[0] = info->buffers[1] = 0;
                notEnoughMem = true;

                set_config(KXASIO_LATENCY,1024);
                set_config(KXASIO_BPS,16);

                int freq=48000; ikx->get_clock(&freq);

                set_config(KXASIO_FREQ,freq);
                set_config(KXASIO_N_PB_CHN,16);
                set_config(KXASIO_N_REC_CHN,16);
                break;
            }
            activeOutputs++;
            if (activeOutputs > num_outputs)
            {
                activeOutputs--;
                disposeBuffers();
                return ASE_InvalidParameter;
            }
        }
    }       
    if (notEnoughMem)
    {
        strcpy (errorMessage,"not enough virtual memory");
        disposeBuffers();
                debug("kxasio: alloc(): not enough memory\n");
        return ASE_NoMemory;
    }

    this->callbacks = callbacks;

    if(callbacks && callbacks->asioMessage && (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.flags = kSystemTimeValid | kSamplePositionValid | kSampleRateValid;

        asioTime.timeCode.speed = 1.;
        asioTime.timeCode.timeCodeSamples.lo = asioTime.timeCode.timeCodeSamples.hi = 0;

        if(tcRead)
          asioTime.timeCode.flags = kTcValid | kTcRunning;
        else
          asioTime.timeCode.flags = 0;
    }
    else
    {
        timeInfoMode = false;   
        memset(&asioTime,0,sizeof(asioTime));
    }
    return ASE_OK;
}