1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

AudioSynthesiserDemo: Show output rather than input in waveform view

This commit is contained in:
reuk 2023-02-28 12:32:33 +00:00
parent 28ad953a3a
commit f21bc3f4ae
No known key found for this signature in database
GPG key ID: FCB43929F012EE5C

View file

@ -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<SineWaveSound*> (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)
};