//----------------------------------------------------------------------------- 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; }