Example #1
0
//-----------------------------------------------------------------------------
OSStatus	C700::Render(   AudioUnitRenderActionFlags &	ioActionFlags,
                            const AudioTimeStamp &			inTimeStamp,
                            UInt32							inNumberFrames)
{
    OSStatus result = AUInstrumentBase::Render(ioActionFlags, inTimeStamp, inNumberFrames);

    CallHostBeatAndTempo(NULL, &mTempo);
    mEfx->SetTempo( mTempo );
    //バッファの確保
    float				*output[2];
    AudioBufferList&	bufferList = GetOutput(0)->GetBufferList();

    int numChans = bufferList.mNumberBuffers;
    if (numChans > 2) return -1;
    output[0] = (float*)bufferList.mBuffers[0].mData;
    output[1] = numChans==2 ? (float*)bufferList.mBuffers[1].mData : NULL;

    //パラメータの反映
    for ( int i=0; i<kNumberOfParameters; i++ ) {
        if (mParameterHasChanged[i]) {
            mEfx->SetParameter(i, Globals()->GetParameter(i));
            mParameterHasChanged[i] = false;
            if (i == kParam_alwaysDelayNote) {
                // 遅延時間の変更をホストに通知
                PropertyChanged(kAudioUnitProperty_Latency, kAudioUnitScope_Global, 0);
            }
        }
    }

    mEfx->SetSampleRate( GetOutput(0)->GetStreamFormat().mSampleRate );

    mEfx->Render(inNumberFrames, output);

    return result;
}
    //==============================================================================
    bool getCurrentPosition (AudioPlayHead::CurrentPositionInfo& info)
    {
        info.timeSigNumerator = 0;
        info.timeSigDenominator = 0;
        info.timeInSeconds = 0;
        info.editOriginTime = 0;
        info.ppqPositionOfLastBarStart = 0;
        info.isPlaying = false;
        info.isRecording = false;

        switch (lastSMPTETime.mType)
        {
            case kSMPTETimeType24:
                info.frameRate = AudioPlayHead::fps24;
                break;

            case kSMPTETimeType25:
                info.frameRate = AudioPlayHead::fps25;
                break;

            case kSMPTETimeType30Drop:
                info.frameRate = AudioPlayHead::fps30drop;
                break;

            case kSMPTETimeType30:
                info.frameRate = AudioPlayHead::fps30;
                break;

            case kSMPTETimeType2997:
                info.frameRate = AudioPlayHead::fps2997;
                break;

            case kSMPTETimeType2997Drop:
                info.frameRate = AudioPlayHead::fps2997drop;
                break;

            //case kSMPTETimeType60:
            //case kSMPTETimeType5994:
            default:
                info.frameRate = AudioPlayHead::fpsUnknown;
                break;
        }

        if (CallHostBeatAndTempo (&info.ppqPosition, &info.bpm) != noErr)
        {
            info.ppqPosition = 0;
            info.bpm = 0;
        }

        UInt32 outDeltaSampleOffsetToNextBeat;
        double outCurrentMeasureDownBeat;
        float num;
        UInt32 den;

        if (CallHostMusicalTimeLocation (&outDeltaSampleOffsetToNextBeat, &num, &den,
                                         &outCurrentMeasureDownBeat) == noErr)
        {
            info.timeSigNumerator = (int) num;
            info.timeSigDenominator = den;
            info.ppqPositionOfLastBarStart = outCurrentMeasureDownBeat;
        }

        double outCurrentSampleInTimeLine, outCycleStartBeat, outCycleEndBeat;
        Boolean playing, playchanged, looping;

        if (CallHostTransportState (&playing,
                                    &playchanged,
                                    &outCurrentSampleInTimeLine,
                                    &looping,
                                    &outCycleStartBeat,
                                    &outCycleEndBeat) == noErr)
        {
            info.isPlaying = playing;
            info.timeInSeconds = outCurrentSampleInTimeLine / GetSampleRate();
        }

        return true;
    }