/******************************************************************************* The block below describes the properties of this PIP. A PIP is a short snippet of code that can be read by the Projucer and used to generate a JUCE project. BEGIN_JUCE_PIP_METADATA name: TickPositionPerf description: Plug-in that gets the playhead information during the process callback in order to enable profiling of AAX GetCurrentTickPosition() vs GetCustomTickPosition() dependencies: juce_audio_basics, juce_audio_devices, juce_audio_formats, juce_audio_plugin_client, juce_audio_processors, juce_audio_utils, juce_core, juce_data_structures, juce_events, juce_graphics, juce_gui_basics, juce_gui_extra exporters: vs2017 moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1 type: AudioProcessor mainClass: TickPositionPerf END_JUCE_PIP_METADATA *******************************************************************************/ #pragma once //============================================================================== class TickPositionPerf : public AudioProcessor { public: //============================================================================== TickPositionPerf() : AudioProcessor (BusesProperties().withInput ("Input", AudioChannelSet::stereo()) .withOutput ("Output", AudioChannelSet::stereo())) { } ~TickPositionPerf() { } //============================================================================== void prepareToPlay (double, int) override { // Use this method as the place to do any pre-playback // initialisation that you need.. } void releaseResources() override { // When playback stops, you can use this as an opportunity to free up any // spare memory, etc. } void processBlock (AudioBuffer& buffer, MidiBuffer&) override { ScopedNoDenormals noDenormals; auto totalNumInputChannels = getTotalNumInputChannels(); auto totalNumOutputChannels = getTotalNumOutputChannels(); // In case we have more outputs than inputs, this code clears any output // channels that didn't contain input data, (because these aren't // guaranteed to be empty - they may contain garbage). // This is here to avoid people getting screaming feedback // when they first compile a plugin, but obviously you don't need to keep // this code if your algorithm always overwrites all the output channels. for (auto i = totalNumInputChannels; i < totalNumOutputChannels; ++i) buffer.clear (i, 0, buffer.getNumSamples()); if (auto* head = getPlayHead()) { AudioPlayHead::CurrentPositionInfo info; info.resetToDefault(); // This is the call whose performance we are interested in. head->getCurrentPosition (info); } } //============================================================================== AudioProcessorEditor* createEditor() override { return nullptr; } bool hasEditor() const override { return false; } //============================================================================== const String getName() const override { return "AAX-TickPositionPerf"; } bool acceptsMidi() const override { return false; } bool producesMidi() const override { return false; } double getTailLengthSeconds() const override { return 0; } //============================================================================== int getNumPrograms() override { return 1; } int getCurrentProgram() override { return 0; } void setCurrentProgram (int) override {} const String getProgramName (int) override { return {}; } void changeProgramName (int, const String&) override {} //============================================================================== void getStateInformation (MemoryBlock& destData) override { // You should use this method to store your parameters in the memory block. // You could do that either as raw data, or use the XML or ValueTree classes // as intermediaries to make it easy to save and load complex data. } void setStateInformation (const void* data, int sizeInBytes) override { // You should use this method to restore your parameters from this memory block, // whose contents will have been created by the getStateInformation() call. } //============================================================================== bool isBusesLayoutSupported (const BusesLayout& layouts) const override { // This is the place where you check if the layout is supported. // In this template code we only support mono or stereo. if (layouts.getMainOutputChannelSet() != AudioChannelSet::mono() && layouts.getMainOutputChannelSet() != AudioChannelSet::stereo()) return false; // This checks if the input layout matches the output layout if (layouts.getMainOutputChannelSet() != layouts.getMainInputChannelSet()) return false; return true; } private: //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TickPositionPerf) };