I'm seeing a problem using MidiKeyboardComponent. I've copied code out of the demo and ended up with this MainContentComponent:
The header MainContentComponent.h
class MainContentComponent : public Component
{
public:
//==============================================================================
MainContentComponent();
~MainContentComponent();
void paint (Graphics&) override;
void resized() override;
private:
MidiKeyboardComponent keyboard;
MidiKeyboardState state;
//==============================================================================
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainContentComponent)
};
The source: MainContentComponent.cpp
MainContentComponent::MainContentComponent()
: keyboard(state, MidiKeyboardComponent::horizontalKeyboard)
{
addAndMakeVisible(keyboard);
setSize (800, 600);
}
MainContentComponent::~MainContentComponent()
{
}
void MainContentComponent::paint (Graphics& g)
{
g.fillAll (Colour (0xffeeddff));
}
void MainContentComponent::resized()
{
keyboard.setBounds(0, getHeight() - 64, getWidth(), 64);
}
The problem is when I run I get the following:
First-chance exception at 0x00594270 in SynthesizerSample.exe: 0xC0000005: Access violation reading location 0xCDCDCDCD.
Unhandled exception at 0x00594270 in SynthesizerSample.exe: 0xC0000005: Access violation reading location 0xCDCDCDCD.
> SynthesizerSample.exe!juce::Array<juce::MidiKeyboardStateListener *,juce::DummyCriticalSection,0>::contains(juce::MidiKeyboardStateListener * elementToLookFor) Line 374 C++
SynthesizerSample.exe!juce::Array<juce::MidiKeyboardStateListener *,juce::DummyCriticalSection,0>::addIfNotAlreadyThere(juce::MidiKeyboardStateListener * newElement) Line 533 C++
SynthesizerSample.exe!juce::MidiKeyboardState::addListener(juce::MidiKeyboardStateListener * listener) Line 177 C++
SynthesizerSample.exe!juce::MidiKeyboardComponent::MidiKeyboardComponent(juce::MidiKeyboardState & s, juce::MidiKeyboardComponent::Orientation o) Line 100 C++
I just realised what the actual problem is - the order of the declarations. I had:
MidiKeyboardComponent keyboard; MidiKeyboardState state;
When I switched the order:
MidiKeyboardState state; MidiKeyboardComponent keyboard;
The problem goes away! I'm guessing state is being used before it's constructor has executed, hence the 0xCDCDCDCD.
