From f21bc3f4aea8c5caa2e321642caa71435e5caf8a Mon Sep 17 00:00:00 2001 From: reuk Date: Tue, 28 Feb 2023 12:32:33 +0000 Subject: [PATCH] AudioSynthesiserDemo: Show output rather than input in waveform view --- examples/Audio/AudioSynthesiserDemo.h | 64 +++++++++++++++++++++------ 1 file changed, 50 insertions(+), 14 deletions(-) diff --git a/examples/Audio/AudioSynthesiserDemo.h b/examples/Audio/AudioSynthesiserDemo.h index 11891911b6..bd8d7cf38b 100644 --- a/examples/Audio/AudioSynthesiserDemo.h +++ b/examples/Audio/AudioSynthesiserDemo.h @@ -55,8 +55,6 @@ /** Our demo synth sound is just a basic sine wave.. */ struct SineWaveSound : public SynthesiserSound { - SineWaveSound() {} - bool appliesToNote (int /*midiNoteNumber*/) override { return true; } bool appliesToChannel (int /*midiChannel*/) override { return true; } }; @@ -65,8 +63,6 @@ struct SineWaveSound : public SynthesiserSound /** Our demo synth voice just plays a sine wave.. */ struct SineWaveVoice : public SynthesiserVoice { - SineWaveVoice() {} - bool canPlaySound (SynthesiserSound* sound) override { return dynamic_cast (sound) != nullptr; @@ -241,6 +237,51 @@ struct SynthAudioSource : public AudioSource Synthesiser synth; }; +//============================================================================== +class Callback : public AudioIODeviceCallback +{ +public: + Callback (AudioSourcePlayer& playerIn, LiveScrollingAudioDisplay& displayIn) + : player (playerIn), display (displayIn) {} + + void audioDeviceIOCallbackWithContext (const float* const* inputChannelData, + int numInputChannels, + float* const* outputChannelData, + int numOutputChannels, + int numSamples, + const AudioIODeviceCallbackContext& context) override + { + player.audioDeviceIOCallbackWithContext (inputChannelData, + numInputChannels, + outputChannelData, + numOutputChannels, + numSamples, + context); + display.audioDeviceIOCallbackWithContext (outputChannelData, + numOutputChannels, + nullptr, + 0, + numSamples, + context); + } + + void audioDeviceAboutToStart (AudioIODevice* device) override + { + player.audioDeviceAboutToStart (device); + display.audioDeviceAboutToStart (device); + } + + void audioDeviceStopped() override + { + player.audioDeviceStopped(); + display.audioDeviceStopped(); + } + +private: + AudioSourcePlayer& player; + LiveScrollingAudioDisplay& display; +}; + //============================================================================== class AudioSynthesiserDemo : public Component { @@ -259,19 +300,13 @@ public: sampledButton.onClick = [this] { synthAudioSource.setUsingSampledSound(); }; addAndMakeVisible (liveAudioDisplayComp); - audioDeviceManager.addAudioCallback (&liveAudioDisplayComp); audioSourcePlayer.setSource (&synthAudioSource); #ifndef JUCE_DEMO_RUNNER - RuntimePermissions::request (RuntimePermissions::recordAudio, - [this] (bool granted) - { - int numInputChannels = granted ? 2 : 0; - audioDeviceManager.initialise (numInputChannels, 2, nullptr, true, {}, nullptr); - }); + audioDeviceManager.initialise (0, 2, nullptr, true, {}, nullptr); #endif - audioDeviceManager.addAudioCallback (&audioSourcePlayer); + audioDeviceManager.addAudioCallback (&callback); audioDeviceManager.addMidiInputDeviceCallback ({}, &(synthAudioSource.midiCollector)); setOpaque (true); @@ -282,8 +317,7 @@ public: { audioSourcePlayer.setSource (nullptr); audioDeviceManager.removeMidiInputDeviceCallback ({}, &(synthAudioSource.midiCollector)); - audioDeviceManager.removeAudioCallback (&audioSourcePlayer); - audioDeviceManager.removeAudioCallback (&liveAudioDisplayComp); + audioDeviceManager.removeAudioCallback (&callback); } //============================================================================== @@ -318,5 +352,7 @@ private: LiveScrollingAudioDisplay liveAudioDisplayComp; + Callback callback { audioSourcePlayer, liveAudioDisplayComp }; + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioSynthesiserDemo) };