/*
  ==============================================================================

  This file is part of the dRowAudio JUCE module
  Copyright 2004-13 by dRowAudio.

  ------------------------------------------------------------------------------

  dRowAudio is provided under the terms of The MIT License (MIT):

  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files (the "Software"), to deal
  in the Software without restriction, including without limitation the rights
  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  copies of the Software, and to permit persons to whom the Software is
  furnished to do so, subject to the following conditions:

  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.

  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 
  SOFTWARE.

  ==============================================================================
*/

#ifndef _DROWAUDIOHEADER_H_
#define _DROWAUDIOHEADER_H_

/**
  @mainpage dRowAudio - A JUCE module for high level audio application development.

  @details

  dRowAudio is a 3rd party JUCE module designed for rapid audio application
  development. It contains classes for audio processing and gui elements.
  Additionally there are several wrappers around 3rd party libraries including
  cURL, FFTReal and SoundTouch. dRowAudio is written in the strict JUCE style,
  closely following the style guide set out at [JUCE Coding Standards][1].

  dRowAudio is hosted on Github at [https://github.com/drowaudio/drowaudio][2]

  The online documentation is at [http://drowaudio.co.uk/docs/][3]

  A wiki with feature overview and demo screenshots can be found at
  [http://www.rawmaterialsoftware.com/wiki/index.php/DRowAudio][4]

  ## Platforms

  All platforms supported by JUCE are also supported by dRowAudio. Currently these
  platforms include:

  - **Windows**: Applications and VST/RTAS/NPAPI/ActiveX plugins can be built 
  using MS Visual Studio. The results are all fully compatible with Windows
  XP, Vista or Windows 7.

  - **Mac OS X**: Applications and VST/AudioUnit/RTAS/NPAPI plugins with Xcode.

  - **GNU/Linux**: Applications and plugins can be built for any kernel 2.6 or
  later.

  - **iOS**: Native iPhone and iPad apps.

  - **Android**: Supported.

  ## Prerequisites

  This documentation assumes that the reader has a working knowledge of JUCE.

  ## External Modules

  In order to use the cURL classes you will need to link to the cURL library.
  This is included as part of Mac OSX, for Windows there pre-built 32-bit binaries
  or you can download the library yourself for the most recent version.
  Instructions for linkage are detailed on the [dRowAudio wiki][4].

  Although some aspects of dRowAudio rely on other 3rd party modules such as
  [SoundTouch][5] and [FFTReal][6], these are included as part of the module so
  no external linking is required. Their use should be transparent to the user.

  ## Integration

  dRowAudio requires recent versions of JUCE. It won't work with versions 2.28 or
  earlier. To use the library it is necessary to first download JUCE to a
  location where your development environment can find it. Or, you can use your
  existing installation of JUCE.

  To use the module simply include it, or a symbolic link to it, in your
  juce/modules folder. Simply them run the Introjucer as normal and tick the
  dRowAudio module. Config flags are provided to disable some functionality if
  not required.

  ## License

  Copyright (C) 2013 by David Rowland ([e-mail][0])

  dRowAudio is provided under the terms of The MIT License (MIT):
 
  Permission is hereby granted, free of charge, to any person obtaining a copy of
  this software and associated documentation files (the "Software"), to deal in the
  Software without restriction, including without limitation the rights to use,
  copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
  Software, and to permit persons to whom the Software is furnished to do so,
  subject to the following conditions:
 
  The above copyright notice and this permission notice shall be included in all
  copies or substantial portions of the Software.
 
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
  FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
  Some portions of the software including but not limited to [SoundTouch][5] and
  [FFTReal][6] are included with in the repository but released under separate
  licences. Please see the individual source files for details.
 
  [0]: mailto:dave@drowaudio.co.uk "David Rowland (Email)"
  [1]: http://www.rawmaterialsoftware.com/wiki/index.php/Coding_Standards
  [2]: https://github.com/drowaudio/drowaudio
  [3]: http://drowaudio.co.uk/docs/
  [4]: http://www.rawmaterialsoftware.com/wiki/index.php/DRowAudio
  [5]: http://www.surina.net/soundtouch/index.html
  [6]: http://ldesoras.free.fr/prod.html
  [7]: http://www.gnu.org/licenses/gpl-2.0.html
  [8]: http://www.opensource.org/licenses/mit-license.html "The MIT License"
 
  @author David Rowland (<a href="mailto:dave@drowaudio.co.uk">email</a>)
  @version 1.0
  @date 2008
  @copyright Copyright (C) 2013 by David Rowland.
  @copyright Provided under the [The MIT License][5]
*/

//=============================================================================
#include <modules/juce_audio_basics/juce_audio_basics.h>
#include <modules/juce_audio_devices/juce_audio_devices.h>
#include <modules/juce_audio_formats/juce_audio_formats.h>
#include <modules/juce_audio_utils/juce_audio_utils.h>
#include <modules/juce_core/juce_core.h>
#include <modules/juce_data_structures/juce_data_structures.h>
#include <modules/juce_events/juce_events.h>
#include <modules/juce_graphics/juce_graphics.h>
#include <modules/juce_gui_basics/juce_gui_basics.h>

#if JUCE_MODULE_AVAILABLE_juce_cryptography
 #include <modules/juce_cryptography/juce_cryptography.h>
#endif

#if JUCE_MAC || JUCE_IOS
 #define Component CarbonDummyCompName
 #include <Accelerate/Accelerate.h>
 #undef Component
#endif

#undef min
#undef max

#ifdef __clang__
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wunused-function"
#endif

//=============================================================================
/** Config: DROWAUDIO_USE_FFTREAL
    Enables the FFTReal library. By default this is enabled except on the Mac
    where the Accelerate framework is preferred. However, if you do explicity 
    enable this setting fftreal can be used for testing purposes.
 */
#ifndef DROWAUDIO_USE_FFTREAL
 #if (! JUCE_MAC)
  #define DROWAUDIO_USE_FFTREAL 1
 #endif
#endif

/** Config: DROWAUDIO_USE_SOUNDTOUCH
    Enables the SoundTouch library and the associated SoundTouch classes for
    independant pitch and tempo scaling. By default this is enabled.
 */
#ifndef DROWAUDIO_USE_SOUNDTOUCH
 #define DROWAUDIO_USE_SOUNDTOUCH 1
#endif

/** Config: DROWAUDIO_USE_CURL
    Enables the cURL library and the associated network classes. By default
    this is enabled.
 */
#ifndef DROWAUDIO_USE_CURL
 #define DROWAUDIO_USE_CURL 1
#endif

//=============================================================================
// fftReal needs to be outside of the drow namespace
#if DROWAUDIO_USE_FFTREAL
 #include "audio/fft/fftreal/FFTReal.h"
#endif

//=============================================================================
namespace drow {
using namespace juce;
using juce::int64;
using juce::uint32;
using juce::int32;
using juce::MemoryBlock;
using juce::UnitTest;
//using juce::Rectangle;

// Audio
#ifndef __DROWAUDIO_AUDIOFILEPLAYER_H__
 #include "audio/dRowAudio_AudioFilePlayer.h"
#endif

#ifndef __DROWAUDIO_AUDIOFILEPLAYEREXT_H__
 #include "audio/dRowAudio_AudioFilePlayerExt.h"
#endif

#ifndef __DROWAUDIO_AUDIOSAMPLEBUFFERAUDIOFORMAT_H__
 #include "audio/dRowAudio_AudioSampleBufferAudioFormat.h"
#endif

#ifndef __DROWAUDIO_SOUNDTOUCHPROCESSOR_H__
 #include "audio/dRowAudio_SoundTouchProcessor.h"
#endif

#ifndef __DROWAUDIO_SOUNDTOUCHAUDIOSOURCE_H__
 #include "audio/dRowAudio_SoundTouchAudioSource.h"
#endif

#ifndef __DROWAUDIO_FILTERINGAUDIOSOURCE_H__
 #include "audio/dRowAudio_FilteringAudioSource.h"
#endif

#ifndef __DROWAUDIO_REVERSIBLEAUDIOSOURCE_H__
 #include "audio/dRowAudio_ReversibleAudioSource.h"
#endif

#ifndef __DROWAUDIO_LOOPINGAUDIOSOURCE_H__
 #include "audio/dRowAudio_LoopingAudioSource.h"
#endif

#ifndef __DROWAUDIO_PITCH_H__
 #include "audio/dRowAudio_Pitch.h"
#endif

#ifndef __DROWAUDIO_PITCHDETECTOR_H__
 #include "audio/dRowAudio_PitchDetector.h"
#endif

#ifndef __DROWAUDIO_AUDIOUTILITY_H__
 #include "audio/dRowAudio_AudioUtility.h"
#endif

#ifndef __DROWAUDIO_FIFOBUFFER_H__
 #include "audio/dRowAudio_FifoBuffer.h"
#endif

#ifndef __DROWAUDIO_BUFFER_H__
 #include "audio/dRowAudio_Buffer.h"
#endif

#ifndef __DROWAUDIO_ENVELOPEFOLLOWER_H__
 #include "audio/dRowAudio_EnvelopeFollower.h"
#endif

#ifndef __DROWAUDIO_SAMPLERATECONVERTER_H__
 #include "audio/dRowAudio_SampleRateConverter.h"
#endif

#ifndef __DROWAUDIO_BIQUADFILTER_H__
 #include "audio/filters/dRowAudio_BiquadFilter.h"
#endif

#ifndef __DROWAUDIO_ONEPOLEFILTER_H__
 #include "audio/filters/dRowAudio_OnePoleFilter.h"
#endif

#ifndef __DROWAUDIO_WINDOW_H__
 #include "audio/fft/dRowAudio_Window.h"
#endif

#ifndef DROWAUDIO_FFT_H_INCLUDED
 #include "audio/fft/dRowAudio_FFT.h"
#endif

#ifndef __DROWAUDIO_LTAS_H__
 #include "audio/fft/dRowAudio_LTAS.h"
#endif

// Gui
#ifndef __DROWAUDIO_AUDIOFILEDROPTARGET_H__
 #include "gui/dRowAudio_AudioFileDropTarget.h"
#endif

#ifndef __DROWAUDIO_GUIHELPERS_H__
 #include "gui/dRowAudio_GuiHelpers.h"
#endif

#ifndef __DROWAUDIO_GRAPHICALCOMPONENT_H__
 #include "gui/dRowAudio_GraphicalComponent.h"
#endif

#ifndef __DROWAUDIO_AUDIOOSCILLOSCOPE_H__
 #include "gui/dRowAudio_AudioOscilloscope.h"
#endif

#ifndef __DROWAUDIO_AUDIOTRANSPORTCUROSR_H__
 #include "gui/dRowAudio_AudioTransportCursor.h"
#endif

#ifndef __DROWAUDIO_SEGMENTEDMETER_H__
 #include "gui/dRowAudio_SegmentedMeter.h"
#endif

#ifndef __DROWAUDIO_SONOGRAM_H__
 #include "gui/dRowAudio_Sonogram.h"
#endif

#ifndef __DROWAUDIO_SPECTROGRAPH_H__
 #include "gui/dRowAudio_Spectrograph.h"
#endif 
 #ifndef __DROWAUDIO_SPECTROSCOPE_H__
 #include "gui/dRowAudio_Spectroscope.h"
#endif

#ifndef __DROWAUDIO_TRIGGEREDSCOPE_H__
 #include "gui/dRowAudio_TriggeredScope.h"
#endif

#ifndef __DROWAUDIO_CPUMETER_H__
 #include "gui/dRowAudio_CpuMeter.h"
#endif

#ifndef __DROWAUDIO_CLOCK_H__
 #include "gui/dRowAudio_Clock.h"
#endif

#ifndef __DROWAUDIO_CENTREALIGNVIEWPORT_H__
 //#include "gui/dRowAudio_CentreAlignViewport.h"
#endif

#ifndef __DROWAUDIO_MUSICLIBRARYTABLE_H__
 #include "gui/dRowAudio_MusicLibraryTable.h"
#endif

#ifndef __DROWAUDIO_BASICFILEBROWSER_H__
 #include "gui/filebrowser/dRowAudio_BasicFileBrowser.h"
#endif

#ifndef __DROWAUDIO_COLUMNFILEBROWSERLOOKANDFEEL_H__
 #include "gui/filebrowser/dRowAudio_ColumnFileBrowserLookAndFeel.h"
#endif

#ifndef __DROWAUDIO_COLUMNFILEBROWSER_H__
 #include "gui/filebrowser/dRowAudio_ColumnFileBrowser.h"
#endif

// audiothumbnail
#ifndef __DROWAUDIO_AUDIOTHUMBNAILIMAGE_H__
 #include "gui/audiothumbnail/dRowAudio_AudioThumbnailImage.h"
#endif

#ifndef __DROWAUDIO_COLOUREDAUDIOTHUMBNAIL_H__
 #include "gui/audiothumbnail/dRowAudio_ColouredAudioThumbnail.h"
#endif

#ifndef __DROWAUDIO_POSITIONALWAVEDISPLAY_H__
 #include "gui/audiothumbnail/dRowAudio_PositionableWaveDisplay.h"
#endif

#ifndef __DROWAUDIO_DRAGGABLEWAVEDISPLAY_H__
 #include "gui/audiothumbnail/dRowAudio_DraggableWaveDisplay.h"
#endif 
 #if ! defined(__DROWAUDIO_DEFAULTCOLOURS_H__) && ! JUCE_AUDIOPROCESSOR_NO_GUI
 #include "gui/dRowAudio_DefaultColours.h"
#endif

// maths
#ifndef __DROWAUDIO_MATHSUTILITIES_H__
 #include "maths/dRowAudio_MathsUtilities.h"
#endif

#ifndef __DROWAUDIO_CUMULATIVEMOVINGAVERAGE_H__
 #include "maths/dRowAudio_CumulativeMovingAverage.h"
#endif 

#ifndef __DROWAUDIO_BEZIERCURVE_H__
 #include "maths/dRowAudio_BezierCurve.h"
#endif

// native
#ifndef __DROWAUDIO_AUDIOPICKER__
 #include "native/dRowAudio_AudioPicker.h"
#endif

#ifndef __DROWAUDIO_AVASSETAUDIOFORMAT_H__
 #include "native/dRowAudio_AVAssetAudioFormat.h"
#endif

#ifndef __DROWAUDIO_IOSAUDIOCONVERTER__
 #include "native/dRowAudio_IOSAudioConverter.h"
#endif

// network
#ifndef __DROWAUDIO_CURLMANAGER_H__
 #include "network/dRowAudio_CURLManager.h"
#endif 

#ifndef __DROWAUDIO_CURLEASYSESSION_H__
 #include "network/dRowAudio_CURLEasySession.h"
#endif 

// streams
#ifndef __DROWAUDIO_STREAMANDFILEHANDLER_H__
 #include "audio/dRowAudio_StreamAndFileHandler.h"
#endif
    
#ifndef __DROWAUDIO_MEMORYINPUTSOURCE_H__
 #include "streams/dRowAudio_MemoryInputSource.h"
#endif

// Utility
#ifndef __DROWAUDIO_PLUGINPARAMETER_H__
 #include "parameters/dRowAudio_PluginParameter.h"
#endif

#ifndef __DROWAUDIO_CONSTANTS_H__
 #include "utility/dRowAudio_Constants.h"
#endif

#ifndef __DROWAUDIO_DEBUGOBJECT_H__
 #include "utility/dRowAudio_DebugObject.h"
#endif 
 #ifndef __DROWAUDIO_ENCRYPTEDSTRING_H__
 #include "utility/dRowAudio_EncryptedString.h"
#endif

#ifndef __DROWAUDIO_UNITYBUILDER_H__
 #include "utility/dRowAudio_UnityBuilder.h"
#endif

#ifndef __UNITYPROJECTBUILDER_H_27A8CF68__
 #include "utility/dRowAudio_UnityProjectBuilder.h"
#endif 
 #ifndef __DROWAUDIO_UTILITY_H__
 #include "utility/dRowAudio_Utility.h"
#endif

#ifndef __DROWAUDIO_STATEVARIABLE_H__
 #include "utility/dRowAudio_StateVariable.h"
#endif

#ifndef __DROWAUDIO_XMLHELPERS_H__
 #include "utility/dRowAudio_XmlHelpers.h"
#endif

#ifndef __DROWAUDIO_COMPARATORS_H__
 #include "utility/dRowAudio_Comparators.h"
#endif

#ifndef __DROWAUDIO_MUSICLIBRARYHELPERS_H__
 #include "utility/dRowAudio_MusicLibraryHelpers.h"
#endif

#ifndef __DROWAUDIO_ITUNESLIBRARY_H__
 #include "utility/dRowAudio_ITunesLibrary.h"
#endif

#ifndef __DROWAUDIO_ITUNESLIBRARYPARSER_H__
 #include "utility/dRowAudio_ITunesLibraryParser.h"
#endif

#ifndef __DROWAUDIO_LOCKEDPOINTER_H__
 #include "utility/dRowAudio_LockedPointer.h"
#endif

}

#ifdef __clang__
 #pragma clang diagnostic pop
#endif

#endif //_DROWAUDIOHEADER_H_
