/* ============================================================================== This is an automatically generated file created by the Jucer! Creation date: 1 May 2011 12:07:35pm Be careful when adding custom code to these files, as only the code within the "//[xyz]" and "//[/xyz]" sections will be retained when the file is loaded and re-saved. Jucer version: 1.12 ------------------------------------------------------------------------------ The Jucer is part of the JUCE library - "Jules' Utility Class Extensions" Copyright 2004-6 by Raw Material Software ltd. ============================================================================== */ //[Headers] You can add your own extra header files here... //[/Headers] #include "AudioDemoTabComponent.h" #include "AudioDemoSetupPage.h" #include "AudioDemoPlaybackPage.h" #include "AudioDemoSynthPage.h" #include "AudioDemoLatencyPage.h" #include "AudioDemoRecordPage.h" //[MiscUserDefs] You can add your own user definitions and misc code here... LiveAudioInputDisplayComp::LiveAudioInputDisplayComp() { nextSample = subSample = 0; accumulator = 0; zeromem (samples, sizeof (samples)); setOpaque (true); startTimer (1000 / 50); // use a timer to keep repainting this component } LiveAudioInputDisplayComp::~LiveAudioInputDisplayComp() { } void LiveAudioInputDisplayComp::paint (Graphics& g) { g.fillAll (Colours::black); g.setColour (Colours::green); const float midY = getHeight() * 0.5f; int sampleNum = (nextSample + numElementsInArray (samples) - 1); for (int x = jmin (getWidth(), numElementsInArray (samples)); --x >= 0;) { const float sampleSize = midY * samples [sampleNum-- % numElementsInArray (samples)]; g.drawVerticalLine (x, midY - sampleSize, midY + sampleSize); } } void LiveAudioInputDisplayComp::timerCallback() { repaint(); } void LiveAudioInputDisplayComp::audioDeviceAboutToStart (AudioIODevice*) { zeromem (samples, sizeof (samples)); } void LiveAudioInputDisplayComp::audioDeviceStopped() { zeromem (samples, sizeof (samples)); } void LiveAudioInputDisplayComp::audioDeviceIOCallback (const float** inputChannelData, int numInputChannels, float** outputChannelData, int numOutputChannels, int numSamples) { for (int i = 0; i < numSamples; ++i) { for (int chan = 0; chan < numInputChannels; ++chan) { if (inputChannelData[chan] != 0) accumulator += fabsf (inputChannelData[chan][i]); } const int numSubSamples = 100; // how many input samples go onto one pixel. const float boost = 10.0f; // how much to boost the levels to make it more visible. if (subSample == 0) { samples[nextSample] = accumulator * boost / numSubSamples; nextSample = (nextSample + 1) % numElementsInArray (samples); subSample = numSubSamples; accumulator = 0; } else { --subSample; } } // We need to clear the output buffers, in case they're full of junk.. for (int i = 0; i < numOutputChannels; ++i) if (outputChannelData[i] != 0) zeromem (outputChannelData[i], sizeof (float) * numSamples); } //[/MiscUserDefs] //============================================================================== AudioDemoTabComponent::AudioDemoTabComponent () : tabbedComponent (0) { addAndMakeVisible (tabbedComponent = new TabbedComponent (TabbedButtonBar::TabsAtTop)); tabbedComponent->setTabBarDepth (30); tabbedComponent->addTab (L"Audio Device Setup", Colours::lightgrey, new AudioDemoSetupPage (deviceManager), true); tabbedComponent->addTab (L"File Playback", Colours::lightgrey, new AudioDemoPlaybackPage (deviceManager), true); tabbedComponent->addTab (L"Synth Playback", Colours::lightgrey, new AudioDemoSynthPage (deviceManager), true); tabbedComponent->addTab (L"Latency Test", Colours::lightgrey, new AudioDemoLatencyPage (deviceManager), true); tabbedComponent->addTab (L"Recording", Colours::lightgrey, new AudioDemoRecordPage (deviceManager), true); tabbedComponent->setCurrentTabIndex (0); //[UserPreSize] deviceManager.initialise (2, 2, 0, true, String::empty, 0); //[/UserPreSize] setSize (600, 400); //[Constructor] You can add your own custom stuff here.. //[/Constructor] } AudioDemoTabComponent::~AudioDemoTabComponent() { //[Destructor_pre]. You can add your own custom destruction code here.. //[/Destructor_pre] deleteAndZero (tabbedComponent); //[Destructor]. You can add your own custom destruction code here.. //[/Destructor] } //============================================================================== void AudioDemoTabComponent::paint (Graphics& g) { //[UserPrePaint] Add your own custom painting code here.. //[/UserPrePaint] g.fillAll (Colours::white); //[UserPaint] Add your own custom painting code here.. //[/UserPaint] } void AudioDemoTabComponent::resized() { tabbedComponent->setBounds (0, 0, getWidth() - 0, getHeight() - 0); //[UserResized] Add your own custom resize handling here.. //[/UserResized] } //[MiscUserCode] You can add your own definitions of your custom methods or any other code here... //============================================================================== Component* createAudioDemo() { return new AudioDemoTabComponent(); } //[/MiscUserCode] //============================================================================== #if 0 /* -- Jucer information section -- This is where the Jucer puts all of its metadata, so don't change anything in here! BEGIN_JUCER_METADATA END_JUCER_METADATA */ #endif