migrating to the latest JUCE version
This commit is contained in:
		
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,45 +1,45 @@
 | 
			
		||||
/*
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
 | 
			
		||||
   This file is part of the JUCE library.
 | 
			
		||||
   Copyright (c) 2020 - Raw Material Software Limited
 | 
			
		||||
 | 
			
		||||
   JUCE is an open source library subject to commercial or open-source
 | 
			
		||||
   licensing.
 | 
			
		||||
 | 
			
		||||
   The code included in this file is provided under the terms of the ISC license
 | 
			
		||||
   http://www.isc.org/downloads/software-support-policy/isc-license. Permission
 | 
			
		||||
   To use, copy, modify, and/or distribute this software for any purpose with or
 | 
			
		||||
   without fee is hereby granted provided that the above copyright notice and
 | 
			
		||||
   this permission notice appear in all copies.
 | 
			
		||||
 | 
			
		||||
   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
 | 
			
		||||
   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
 | 
			
		||||
   DISCLAIMED.
 | 
			
		||||
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
namespace juce
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
AudioIODevice::AudioIODevice (const String& deviceName, const String& deviceTypeName)
 | 
			
		||||
    : name (deviceName), typeName (deviceTypeName)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AudioIODevice::~AudioIODevice() {}
 | 
			
		||||
 | 
			
		||||
void AudioIODeviceCallback::audioDeviceError (const String&)    {}
 | 
			
		||||
bool AudioIODevice::setAudioPreprocessingEnabled (bool)         { return false; }
 | 
			
		||||
bool AudioIODevice::hasControlPanel() const                     { return false; }
 | 
			
		||||
int  AudioIODevice::getXRunCount() const noexcept               { return -1; }
 | 
			
		||||
 | 
			
		||||
bool AudioIODevice::showControlPanel()
 | 
			
		||||
{
 | 
			
		||||
    jassertfalse;    // this should only be called for devices which return true from
 | 
			
		||||
                     // their hasControlPanel() method.
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace juce
 | 
			
		||||
/*
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
 | 
			
		||||
   This file is part of the JUCE library.
 | 
			
		||||
   Copyright (c) 2022 - Raw Material Software Limited
 | 
			
		||||
 | 
			
		||||
   JUCE is an open source library subject to commercial or open-source
 | 
			
		||||
   licensing.
 | 
			
		||||
 | 
			
		||||
   The code included in this file is provided under the terms of the ISC license
 | 
			
		||||
   http://www.isc.org/downloads/software-support-policy/isc-license. Permission
 | 
			
		||||
   To use, copy, modify, and/or distribute this software for any purpose with or
 | 
			
		||||
   without fee is hereby granted provided that the above copyright notice and
 | 
			
		||||
   this permission notice appear in all copies.
 | 
			
		||||
 | 
			
		||||
   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
 | 
			
		||||
   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
 | 
			
		||||
   DISCLAIMED.
 | 
			
		||||
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
namespace juce
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
AudioIODevice::AudioIODevice (const String& deviceName, const String& deviceTypeName)
 | 
			
		||||
    : name (deviceName), typeName (deviceTypeName)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AudioIODevice::~AudioIODevice() {}
 | 
			
		||||
 | 
			
		||||
void AudioIODeviceCallback::audioDeviceError (const String&)    {}
 | 
			
		||||
bool AudioIODevice::setAudioPreprocessingEnabled (bool)         { return false; }
 | 
			
		||||
bool AudioIODevice::hasControlPanel() const                     { return false; }
 | 
			
		||||
int  AudioIODevice::getXRunCount() const noexcept               { return -1; }
 | 
			
		||||
 | 
			
		||||
bool AudioIODevice::showControlPanel()
 | 
			
		||||
{
 | 
			
		||||
    jassertfalse;    // this should only be called for devices which return true from
 | 
			
		||||
                     // their hasControlPanel() method.
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace juce
 | 
			
		||||
 
 | 
			
		||||
@@ -1,325 +1,352 @@
 | 
			
		||||
/*
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
 | 
			
		||||
   This file is part of the JUCE library.
 | 
			
		||||
   Copyright (c) 2020 - Raw Material Software Limited
 | 
			
		||||
 | 
			
		||||
   JUCE is an open source library subject to commercial or open-source
 | 
			
		||||
   licensing.
 | 
			
		||||
 | 
			
		||||
   The code included in this file is provided under the terms of the ISC license
 | 
			
		||||
   http://www.isc.org/downloads/software-support-policy/isc-license. Permission
 | 
			
		||||
   To use, copy, modify, and/or distribute this software for any purpose with or
 | 
			
		||||
   without fee is hereby granted provided that the above copyright notice and
 | 
			
		||||
   this permission notice appear in all copies.
 | 
			
		||||
 | 
			
		||||
   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
 | 
			
		||||
   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
 | 
			
		||||
   DISCLAIMED.
 | 
			
		||||
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
namespace juce
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class AudioIODevice;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//==============================================================================
 | 
			
		||||
/**
 | 
			
		||||
    One of these is passed to an AudioIODevice object to stream the audio data
 | 
			
		||||
    in and out.
 | 
			
		||||
 | 
			
		||||
    The AudioIODevice will repeatedly call this class's audioDeviceIOCallback()
 | 
			
		||||
    method on its own high-priority audio thread, when it needs to send or receive
 | 
			
		||||
    the next block of data.
 | 
			
		||||
 | 
			
		||||
    @see AudioIODevice, AudioDeviceManager
 | 
			
		||||
 | 
			
		||||
    @tags{Audio}
 | 
			
		||||
*/
 | 
			
		||||
class JUCE_API  AudioIODeviceCallback
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    /** Destructor. */
 | 
			
		||||
    virtual ~AudioIODeviceCallback()  = default;
 | 
			
		||||
 | 
			
		||||
    /** Processes a block of incoming and outgoing audio data.
 | 
			
		||||
 | 
			
		||||
        The subclass's implementation should use the incoming audio for whatever
 | 
			
		||||
        purposes it needs to, and must fill all the output channels with the next
 | 
			
		||||
        block of output data before returning.
 | 
			
		||||
 | 
			
		||||
        The channel data is arranged with the same array indices as the channel name
 | 
			
		||||
        array returned by AudioIODevice::getOutputChannelNames(), but those channels
 | 
			
		||||
        that aren't specified in AudioIODevice::open() will have a null pointer for their
 | 
			
		||||
        associated channel, so remember to check for this.
 | 
			
		||||
 | 
			
		||||
        @param inputChannelData     a set of arrays containing the audio data for each
 | 
			
		||||
                                    incoming channel - this data is valid until the function
 | 
			
		||||
                                    returns. There will be one channel of data for each input
 | 
			
		||||
                                    channel that was enabled when the audio device was opened
 | 
			
		||||
                                    (see AudioIODevice::open())
 | 
			
		||||
        @param numInputChannels     the number of pointers to channel data in the
 | 
			
		||||
                                    inputChannelData array.
 | 
			
		||||
        @param outputChannelData    a set of arrays which need to be filled with the data
 | 
			
		||||
                                    that should be sent to each outgoing channel of the device.
 | 
			
		||||
                                    There will be one channel of data for each output channel
 | 
			
		||||
                                    that was enabled when the audio device was opened (see
 | 
			
		||||
                                    AudioIODevice::open())
 | 
			
		||||
                                    The initial contents of the array is undefined, so the
 | 
			
		||||
                                    callback function must fill all the channels with zeros if
 | 
			
		||||
                                    its output is silence. Failing to do this could cause quite
 | 
			
		||||
                                    an unpleasant noise!
 | 
			
		||||
        @param numOutputChannels    the number of pointers to channel data in the
 | 
			
		||||
                                    outputChannelData array.
 | 
			
		||||
        @param numSamples           the number of samples in each channel of the input and
 | 
			
		||||
                                    output arrays. The number of samples will depend on the
 | 
			
		||||
                                    audio device's buffer size and will usually remain constant,
 | 
			
		||||
                                    although this isn't guaranteed. For example, on Android,
 | 
			
		||||
                                    on devices which support it, Android will chop up your audio
 | 
			
		||||
                                    processing into several smaller callbacks to ensure higher audio
 | 
			
		||||
                                    performance. So make sure your code can cope with reasonable
 | 
			
		||||
                                    changes in the buffer size from one callback to the next.
 | 
			
		||||
    */
 | 
			
		||||
    virtual void audioDeviceIOCallback (const float** inputChannelData,
 | 
			
		||||
                                        int numInputChannels,
 | 
			
		||||
                                        float** outputChannelData,
 | 
			
		||||
                                        int numOutputChannels,
 | 
			
		||||
                                        int numSamples) = 0;
 | 
			
		||||
 | 
			
		||||
    /** Called to indicate that the device is about to start calling back.
 | 
			
		||||
 | 
			
		||||
        This will be called just before the audio callbacks begin, either when this
 | 
			
		||||
        callback has just been added to an audio device, or after the device has been
 | 
			
		||||
        restarted because of a sample-rate or block-size change.
 | 
			
		||||
 | 
			
		||||
        You can use this opportunity to find out the sample rate and block size
 | 
			
		||||
        that the device is going to use by calling the AudioIODevice::getCurrentSampleRate()
 | 
			
		||||
        and AudioIODevice::getCurrentBufferSizeSamples() on the supplied pointer.
 | 
			
		||||
 | 
			
		||||
        @param device       the audio IO device that will be used to drive the callback.
 | 
			
		||||
                            Note that if you're going to store this this pointer, it is
 | 
			
		||||
                            only valid until the next time that audioDeviceStopped is called.
 | 
			
		||||
    */
 | 
			
		||||
    virtual void audioDeviceAboutToStart (AudioIODevice* device) = 0;
 | 
			
		||||
 | 
			
		||||
    /** Called to indicate that the device has stopped. */
 | 
			
		||||
    virtual void audioDeviceStopped() = 0;
 | 
			
		||||
 | 
			
		||||
    /** This can be overridden to be told if the device generates an error while operating.
 | 
			
		||||
        Be aware that this could be called by any thread! And not all devices perform
 | 
			
		||||
        this callback.
 | 
			
		||||
    */
 | 
			
		||||
    virtual void audioDeviceError (const String& errorMessage);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//==============================================================================
 | 
			
		||||
/**
 | 
			
		||||
    Base class for an audio device with synchronised input and output channels.
 | 
			
		||||
 | 
			
		||||
    Subclasses of this are used to implement different protocols such as DirectSound,
 | 
			
		||||
    ASIO, CoreAudio, etc.
 | 
			
		||||
 | 
			
		||||
    To create one of these, you'll need to use the AudioIODeviceType class - see the
 | 
			
		||||
    documentation for that class for more info.
 | 
			
		||||
 | 
			
		||||
    For an easier way of managing audio devices and their settings, have a look at the
 | 
			
		||||
    AudioDeviceManager class.
 | 
			
		||||
 | 
			
		||||
    @see AudioIODeviceType, AudioDeviceManager
 | 
			
		||||
 | 
			
		||||
    @tags{Audio}
 | 
			
		||||
*/
 | 
			
		||||
class JUCE_API  AudioIODevice
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    /** Destructor. */
 | 
			
		||||
    virtual ~AudioIODevice();
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Returns the device's name, (as set in the constructor). */
 | 
			
		||||
    const String& getName() const noexcept                          { return name; }
 | 
			
		||||
 | 
			
		||||
    /** Returns the type of the device.
 | 
			
		||||
 | 
			
		||||
        E.g. "CoreAudio", "ASIO", etc. - this comes from the AudioIODeviceType that created it.
 | 
			
		||||
    */
 | 
			
		||||
    const String& getTypeName() const noexcept                      { return typeName; }
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Returns the names of all the available output channels on this device.
 | 
			
		||||
        To find out which of these are currently in use, call getActiveOutputChannels().
 | 
			
		||||
    */
 | 
			
		||||
    virtual StringArray getOutputChannelNames() = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns the names of all the available input channels on this device.
 | 
			
		||||
        To find out which of these are currently in use, call getActiveInputChannels().
 | 
			
		||||
    */
 | 
			
		||||
    virtual StringArray getInputChannelNames() = 0;
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Returns the set of sample-rates this device supports.
 | 
			
		||||
        @see getCurrentSampleRate
 | 
			
		||||
    */
 | 
			
		||||
    virtual Array<double> getAvailableSampleRates() = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns the set of buffer sizes that are available.
 | 
			
		||||
        @see getCurrentBufferSizeSamples, getDefaultBufferSize
 | 
			
		||||
    */
 | 
			
		||||
    virtual Array<int> getAvailableBufferSizes() = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns the default buffer-size to use.
 | 
			
		||||
        @returns a number of samples
 | 
			
		||||
        @see getAvailableBufferSizes
 | 
			
		||||
    */
 | 
			
		||||
    virtual int getDefaultBufferSize() = 0;
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Tries to open the device ready to play.
 | 
			
		||||
 | 
			
		||||
        @param inputChannels        a BigInteger in which a set bit indicates that the corresponding
 | 
			
		||||
                                    input channel should be enabled
 | 
			
		||||
        @param outputChannels       a BigInteger in which a set bit indicates that the corresponding
 | 
			
		||||
                                    output channel should be enabled
 | 
			
		||||
        @param sampleRate           the sample rate to try to use - to find out which rates are
 | 
			
		||||
                                    available, see getAvailableSampleRates()
 | 
			
		||||
        @param bufferSizeSamples    the size of i/o buffer to use - to find out the available buffer
 | 
			
		||||
                                    sizes, see getAvailableBufferSizes()
 | 
			
		||||
        @returns    an error description if there's a problem, or an empty string if it succeeds in
 | 
			
		||||
                    opening the device
 | 
			
		||||
        @see close
 | 
			
		||||
    */
 | 
			
		||||
    virtual String open (const BigInteger& inputChannels,
 | 
			
		||||
                         const BigInteger& outputChannels,
 | 
			
		||||
                         double sampleRate,
 | 
			
		||||
                         int bufferSizeSamples) = 0;
 | 
			
		||||
 | 
			
		||||
    /** Closes and releases the device if it's open. */
 | 
			
		||||
    virtual void close() = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns true if the device is still open.
 | 
			
		||||
 | 
			
		||||
        A device might spontaneously close itself if something goes wrong, so this checks if
 | 
			
		||||
        it's still open.
 | 
			
		||||
    */
 | 
			
		||||
    virtual bool isOpen() = 0;
 | 
			
		||||
 | 
			
		||||
    /** Starts the device actually playing.
 | 
			
		||||
 | 
			
		||||
        This must be called after the device has been opened.
 | 
			
		||||
 | 
			
		||||
        @param callback     the callback to use for streaming the data.
 | 
			
		||||
        @see AudioIODeviceCallback, open
 | 
			
		||||
    */
 | 
			
		||||
    virtual void start (AudioIODeviceCallback* callback) = 0;
 | 
			
		||||
 | 
			
		||||
    /** Stops the device playing.
 | 
			
		||||
 | 
			
		||||
        Once a device has been started, this will stop it. Any pending calls to the
 | 
			
		||||
        callback class will be flushed before this method returns.
 | 
			
		||||
    */
 | 
			
		||||
    virtual void stop() = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns true if the device is still calling back.
 | 
			
		||||
 | 
			
		||||
        The device might mysteriously stop, so this checks whether it's
 | 
			
		||||
        still playing.
 | 
			
		||||
    */
 | 
			
		||||
    virtual bool isPlaying() = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns the last error that happened if anything went wrong. */
 | 
			
		||||
    virtual String getLastError() = 0;
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Returns the buffer size that the device is currently using.
 | 
			
		||||
 | 
			
		||||
        If the device isn't actually open, this value doesn't really mean much.
 | 
			
		||||
    */
 | 
			
		||||
    virtual int getCurrentBufferSizeSamples() = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns the sample rate that the device is currently using.
 | 
			
		||||
 | 
			
		||||
        If the device isn't actually open, this value doesn't really mean much.
 | 
			
		||||
    */
 | 
			
		||||
    virtual double getCurrentSampleRate() = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns the device's current physical bit-depth.
 | 
			
		||||
 | 
			
		||||
        If the device isn't actually open, this value doesn't really mean much.
 | 
			
		||||
    */
 | 
			
		||||
    virtual int getCurrentBitDepth() = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns a mask showing which of the available output channels are currently
 | 
			
		||||
        enabled.
 | 
			
		||||
        @see getOutputChannelNames
 | 
			
		||||
    */
 | 
			
		||||
    virtual BigInteger getActiveOutputChannels() const = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns a mask showing which of the available input channels are currently
 | 
			
		||||
        enabled.
 | 
			
		||||
        @see getInputChannelNames
 | 
			
		||||
    */
 | 
			
		||||
    virtual BigInteger getActiveInputChannels() const = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns the device's output latency.
 | 
			
		||||
 | 
			
		||||
        This is the delay in samples between a callback getting a block of data, and
 | 
			
		||||
        that data actually getting played.
 | 
			
		||||
    */
 | 
			
		||||
    virtual int getOutputLatencyInSamples() = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns the device's input latency.
 | 
			
		||||
 | 
			
		||||
        This is the delay in samples between some audio actually arriving at the soundcard,
 | 
			
		||||
        and the callback getting passed this block of data.
 | 
			
		||||
    */
 | 
			
		||||
    virtual int getInputLatencyInSamples() = 0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** True if this device can show a pop-up control panel for editing its settings.
 | 
			
		||||
 | 
			
		||||
        This is generally just true of ASIO devices. If true, you can call showControlPanel()
 | 
			
		||||
        to display it.
 | 
			
		||||
    */
 | 
			
		||||
    virtual bool hasControlPanel() const;
 | 
			
		||||
 | 
			
		||||
    /** Shows a device-specific control panel if there is one.
 | 
			
		||||
 | 
			
		||||
        This should only be called for devices which return true from hasControlPanel().
 | 
			
		||||
    */
 | 
			
		||||
    virtual bool showControlPanel();
 | 
			
		||||
 | 
			
		||||
    /** On devices which support it, this allows automatic gain control or other
 | 
			
		||||
        mic processing to be disabled.
 | 
			
		||||
        If the device doesn't support this operation, it'll return false.
 | 
			
		||||
    */
 | 
			
		||||
    virtual bool setAudioPreprocessingEnabled (bool shouldBeEnabled);
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Returns the number of under- or over runs reported by the OS since
 | 
			
		||||
        playback/recording has started.
 | 
			
		||||
 | 
			
		||||
        This number may be different than determining the Xrun count manually (by
 | 
			
		||||
        measuring the time spent in the audio callback) as the OS may be doing
 | 
			
		||||
        some buffering internally - especially on mobile devices.
 | 
			
		||||
 | 
			
		||||
        Returns -1 if playback/recording has not started yet or if getting the underrun
 | 
			
		||||
        count is not supported for this device (Android SDK 23 and lower).
 | 
			
		||||
    */
 | 
			
		||||
    virtual int getXRunCount() const noexcept;
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
protected:
 | 
			
		||||
    /** Creates a device, setting its name and type member variables. */
 | 
			
		||||
    AudioIODevice (const String& deviceName,
 | 
			
		||||
                   const String& typeName);
 | 
			
		||||
 | 
			
		||||
    /** @internal */
 | 
			
		||||
    String name, typeName;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace juce
 | 
			
		||||
/*
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
 | 
			
		||||
   This file is part of the JUCE library.
 | 
			
		||||
   Copyright (c) 2022 - Raw Material Software Limited
 | 
			
		||||
 | 
			
		||||
   JUCE is an open source library subject to commercial or open-source
 | 
			
		||||
   licensing.
 | 
			
		||||
 | 
			
		||||
   The code included in this file is provided under the terms of the ISC license
 | 
			
		||||
   http://www.isc.org/downloads/software-support-policy/isc-license. Permission
 | 
			
		||||
   To use, copy, modify, and/or distribute this software for any purpose with or
 | 
			
		||||
   without fee is hereby granted provided that the above copyright notice and
 | 
			
		||||
   this permission notice appear in all copies.
 | 
			
		||||
 | 
			
		||||
   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
 | 
			
		||||
   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
 | 
			
		||||
   DISCLAIMED.
 | 
			
		||||
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
namespace juce
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
class AudioIODevice;
 | 
			
		||||
 | 
			
		||||
/** Additional information that may be passed to the AudioIODeviceCallback. */
 | 
			
		||||
struct AudioIODeviceCallbackContext
 | 
			
		||||
{
 | 
			
		||||
    /** If the host provides this information, this field will be set to point to
 | 
			
		||||
        an integer holding the current value; otherwise, this will be nullptr.
 | 
			
		||||
    */
 | 
			
		||||
    const uint64_t* hostTimeNs = nullptr;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//==============================================================================
 | 
			
		||||
/**
 | 
			
		||||
    One of these is passed to an AudioIODevice object to stream the audio data
 | 
			
		||||
    in and out.
 | 
			
		||||
 | 
			
		||||
    The AudioIODevice will repeatedly call this class's audioDeviceIOCallback()
 | 
			
		||||
    method on its own high-priority audio thread, when it needs to send or receive
 | 
			
		||||
    the next block of data.
 | 
			
		||||
 | 
			
		||||
    @see AudioIODevice, AudioDeviceManager
 | 
			
		||||
 | 
			
		||||
    @tags{Audio}
 | 
			
		||||
*/
 | 
			
		||||
class JUCE_API  AudioIODeviceCallback
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    /** Destructor. */
 | 
			
		||||
    virtual ~AudioIODeviceCallback()  = default;
 | 
			
		||||
 | 
			
		||||
    /** Processes a block of incoming and outgoing audio data.
 | 
			
		||||
 | 
			
		||||
        The subclass's implementation should use the incoming audio for whatever
 | 
			
		||||
        purposes it needs to, and must fill all the output channels with the next
 | 
			
		||||
        block of output data before returning.
 | 
			
		||||
 | 
			
		||||
        The channel data is arranged with the same array indices as the channel name
 | 
			
		||||
        array returned by AudioIODevice::getOutputChannelNames(), but those channels
 | 
			
		||||
        that aren't specified in AudioIODevice::open() will have a null pointer for their
 | 
			
		||||
        associated channel, so remember to check for this.
 | 
			
		||||
 | 
			
		||||
        @param inputChannelData     a set of arrays containing the audio data for each
 | 
			
		||||
                                    incoming channel - this data is valid until the function
 | 
			
		||||
                                    returns. There will be one channel of data for each input
 | 
			
		||||
                                    channel that was enabled when the audio device was opened
 | 
			
		||||
                                    (see AudioIODevice::open())
 | 
			
		||||
        @param numInputChannels     the number of pointers to channel data in the
 | 
			
		||||
                                    inputChannelData array.
 | 
			
		||||
        @param outputChannelData    a set of arrays which need to be filled with the data
 | 
			
		||||
                                    that should be sent to each outgoing channel of the device.
 | 
			
		||||
                                    There will be one channel of data for each output channel
 | 
			
		||||
                                    that was enabled when the audio device was opened (see
 | 
			
		||||
                                    AudioIODevice::open())
 | 
			
		||||
                                    The initial contents of the array is undefined, so the
 | 
			
		||||
                                    callback function must fill all the channels with zeros if
 | 
			
		||||
                                    its output is silence. Failing to do this could cause quite
 | 
			
		||||
                                    an unpleasant noise!
 | 
			
		||||
        @param numOutputChannels    the number of pointers to channel data in the
 | 
			
		||||
                                    outputChannelData array.
 | 
			
		||||
        @param numSamples           the number of samples in each channel of the input and
 | 
			
		||||
                                    output arrays. The number of samples will depend on the
 | 
			
		||||
                                    audio device's buffer size and will usually remain constant,
 | 
			
		||||
                                    although this isn't guaranteed. For example, on Android,
 | 
			
		||||
                                    on devices which support it, Android will chop up your audio
 | 
			
		||||
                                    processing into several smaller callbacks to ensure higher audio
 | 
			
		||||
                                    performance. So make sure your code can cope with reasonable
 | 
			
		||||
                                    changes in the buffer size from one callback to the next.
 | 
			
		||||
    */
 | 
			
		||||
    virtual void audioDeviceIOCallback (const float** inputChannelData,
 | 
			
		||||
                                        int numInputChannels,
 | 
			
		||||
                                        float** outputChannelData,
 | 
			
		||||
                                        int numOutputChannels,
 | 
			
		||||
                                        int numSamples)
 | 
			
		||||
    {
 | 
			
		||||
        ignoreUnused (inputChannelData, numInputChannels, outputChannelData, numOutputChannels, numSamples);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** The same as audioDeviceIOCallback(), but with an additional context argument.
 | 
			
		||||
 | 
			
		||||
        The default implementation of this function will call audioDeviceIOCallback(),
 | 
			
		||||
        but you can override this function if you need to make use of the context information.
 | 
			
		||||
    */
 | 
			
		||||
    virtual void audioDeviceIOCallbackWithContext (const float** inputChannelData,
 | 
			
		||||
                                                   int numInputChannels,
 | 
			
		||||
                                                   float** outputChannelData,
 | 
			
		||||
                                                   int numOutputChannels,
 | 
			
		||||
                                                   int numSamples,
 | 
			
		||||
                                                   const AudioIODeviceCallbackContext& context)
 | 
			
		||||
    {
 | 
			
		||||
        audioDeviceIOCallback (inputChannelData, numInputChannels, outputChannelData, numOutputChannels, numSamples);
 | 
			
		||||
        ignoreUnused (context);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Called to indicate that the device is about to start calling back.
 | 
			
		||||
 | 
			
		||||
        This will be called just before the audio callbacks begin, either when this
 | 
			
		||||
        callback has just been added to an audio device, or after the device has been
 | 
			
		||||
        restarted because of a sample-rate or block-size change.
 | 
			
		||||
 | 
			
		||||
        You can use this opportunity to find out the sample rate and block size
 | 
			
		||||
        that the device is going to use by calling the AudioIODevice::getCurrentSampleRate()
 | 
			
		||||
        and AudioIODevice::getCurrentBufferSizeSamples() on the supplied pointer.
 | 
			
		||||
 | 
			
		||||
        @param device       the audio IO device that will be used to drive the callback.
 | 
			
		||||
                            Note that if you're going to store this this pointer, it is
 | 
			
		||||
                            only valid until the next time that audioDeviceStopped is called.
 | 
			
		||||
    */
 | 
			
		||||
    virtual void audioDeviceAboutToStart (AudioIODevice* device) = 0;
 | 
			
		||||
 | 
			
		||||
    /** Called to indicate that the device has stopped. */
 | 
			
		||||
    virtual void audioDeviceStopped() = 0;
 | 
			
		||||
 | 
			
		||||
    /** This can be overridden to be told if the device generates an error while operating.
 | 
			
		||||
        Be aware that this could be called by any thread! And not all devices perform
 | 
			
		||||
        this callback.
 | 
			
		||||
    */
 | 
			
		||||
    virtual void audioDeviceError (const String& errorMessage);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//==============================================================================
 | 
			
		||||
/**
 | 
			
		||||
    Base class for an audio device with synchronised input and output channels.
 | 
			
		||||
 | 
			
		||||
    Subclasses of this are used to implement different protocols such as DirectSound,
 | 
			
		||||
    ASIO, CoreAudio, etc.
 | 
			
		||||
 | 
			
		||||
    To create one of these, you'll need to use the AudioIODeviceType class - see the
 | 
			
		||||
    documentation for that class for more info.
 | 
			
		||||
 | 
			
		||||
    For an easier way of managing audio devices and their settings, have a look at the
 | 
			
		||||
    AudioDeviceManager class.
 | 
			
		||||
 | 
			
		||||
    @see AudioIODeviceType, AudioDeviceManager
 | 
			
		||||
 | 
			
		||||
    @tags{Audio}
 | 
			
		||||
*/
 | 
			
		||||
class JUCE_API  AudioIODevice
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    /** Destructor. */
 | 
			
		||||
    virtual ~AudioIODevice();
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Returns the device's name, (as set in the constructor). */
 | 
			
		||||
    const String& getName() const noexcept                          { return name; }
 | 
			
		||||
 | 
			
		||||
    /** Returns the type of the device.
 | 
			
		||||
 | 
			
		||||
        E.g. "CoreAudio", "ASIO", etc. - this comes from the AudioIODeviceType that created it.
 | 
			
		||||
    */
 | 
			
		||||
    const String& getTypeName() const noexcept                      { return typeName; }
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Returns the names of all the available output channels on this device.
 | 
			
		||||
        To find out which of these are currently in use, call getActiveOutputChannels().
 | 
			
		||||
    */
 | 
			
		||||
    virtual StringArray getOutputChannelNames() = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns the names of all the available input channels on this device.
 | 
			
		||||
        To find out which of these are currently in use, call getActiveInputChannels().
 | 
			
		||||
    */
 | 
			
		||||
    virtual StringArray getInputChannelNames() = 0;
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Returns the set of sample-rates this device supports.
 | 
			
		||||
        @see getCurrentSampleRate
 | 
			
		||||
    */
 | 
			
		||||
    virtual Array<double> getAvailableSampleRates() = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns the set of buffer sizes that are available.
 | 
			
		||||
        @see getCurrentBufferSizeSamples, getDefaultBufferSize
 | 
			
		||||
    */
 | 
			
		||||
    virtual Array<int> getAvailableBufferSizes() = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns the default buffer-size to use.
 | 
			
		||||
        @returns a number of samples
 | 
			
		||||
        @see getAvailableBufferSizes
 | 
			
		||||
    */
 | 
			
		||||
    virtual int getDefaultBufferSize() = 0;
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Tries to open the device ready to play.
 | 
			
		||||
 | 
			
		||||
        @param inputChannels        a BigInteger in which a set bit indicates that the corresponding
 | 
			
		||||
                                    input channel should be enabled
 | 
			
		||||
        @param outputChannels       a BigInteger in which a set bit indicates that the corresponding
 | 
			
		||||
                                    output channel should be enabled
 | 
			
		||||
        @param sampleRate           the sample rate to try to use - to find out which rates are
 | 
			
		||||
                                    available, see getAvailableSampleRates()
 | 
			
		||||
        @param bufferSizeSamples    the size of i/o buffer to use - to find out the available buffer
 | 
			
		||||
                                    sizes, see getAvailableBufferSizes()
 | 
			
		||||
        @returns    an error description if there's a problem, or an empty string if it succeeds in
 | 
			
		||||
                    opening the device
 | 
			
		||||
        @see close
 | 
			
		||||
    */
 | 
			
		||||
    virtual String open (const BigInteger& inputChannels,
 | 
			
		||||
                         const BigInteger& outputChannels,
 | 
			
		||||
                         double sampleRate,
 | 
			
		||||
                         int bufferSizeSamples) = 0;
 | 
			
		||||
 | 
			
		||||
    /** Closes and releases the device if it's open. */
 | 
			
		||||
    virtual void close() = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns true if the device is still open.
 | 
			
		||||
 | 
			
		||||
        A device might spontaneously close itself if something goes wrong, so this checks if
 | 
			
		||||
        it's still open.
 | 
			
		||||
    */
 | 
			
		||||
    virtual bool isOpen() = 0;
 | 
			
		||||
 | 
			
		||||
    /** Starts the device actually playing.
 | 
			
		||||
 | 
			
		||||
        This must be called after the device has been opened.
 | 
			
		||||
 | 
			
		||||
        @param callback     the callback to use for streaming the data.
 | 
			
		||||
        @see AudioIODeviceCallback, open
 | 
			
		||||
    */
 | 
			
		||||
    virtual void start (AudioIODeviceCallback* callback) = 0;
 | 
			
		||||
 | 
			
		||||
    /** Stops the device playing.
 | 
			
		||||
 | 
			
		||||
        Once a device has been started, this will stop it. Any pending calls to the
 | 
			
		||||
        callback class will be flushed before this method returns.
 | 
			
		||||
    */
 | 
			
		||||
    virtual void stop() = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns true if the device is still calling back.
 | 
			
		||||
 | 
			
		||||
        The device might mysteriously stop, so this checks whether it's
 | 
			
		||||
        still playing.
 | 
			
		||||
    */
 | 
			
		||||
    virtual bool isPlaying() = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns the last error that happened if anything went wrong. */
 | 
			
		||||
    virtual String getLastError() = 0;
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Returns the buffer size that the device is currently using.
 | 
			
		||||
 | 
			
		||||
        If the device isn't actually open, this value doesn't really mean much.
 | 
			
		||||
    */
 | 
			
		||||
    virtual int getCurrentBufferSizeSamples() = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns the sample rate that the device is currently using.
 | 
			
		||||
 | 
			
		||||
        If the device isn't actually open, this value doesn't really mean much.
 | 
			
		||||
    */
 | 
			
		||||
    virtual double getCurrentSampleRate() = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns the device's current physical bit-depth.
 | 
			
		||||
 | 
			
		||||
        If the device isn't actually open, this value doesn't really mean much.
 | 
			
		||||
    */
 | 
			
		||||
    virtual int getCurrentBitDepth() = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns a mask showing which of the available output channels are currently
 | 
			
		||||
        enabled.
 | 
			
		||||
        @see getOutputChannelNames
 | 
			
		||||
    */
 | 
			
		||||
    virtual BigInteger getActiveOutputChannels() const = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns a mask showing which of the available input channels are currently
 | 
			
		||||
        enabled.
 | 
			
		||||
        @see getInputChannelNames
 | 
			
		||||
    */
 | 
			
		||||
    virtual BigInteger getActiveInputChannels() const = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns the device's output latency.
 | 
			
		||||
 | 
			
		||||
        This is the delay in samples between a callback getting a block of data, and
 | 
			
		||||
        that data actually getting played.
 | 
			
		||||
    */
 | 
			
		||||
    virtual int getOutputLatencyInSamples() = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns the device's input latency.
 | 
			
		||||
 | 
			
		||||
        This is the delay in samples between some audio actually arriving at the soundcard,
 | 
			
		||||
        and the callback getting passed this block of data.
 | 
			
		||||
    */
 | 
			
		||||
    virtual int getInputLatencyInSamples() = 0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** True if this device can show a pop-up control panel for editing its settings.
 | 
			
		||||
 | 
			
		||||
        This is generally just true of ASIO devices. If true, you can call showControlPanel()
 | 
			
		||||
        to display it.
 | 
			
		||||
    */
 | 
			
		||||
    virtual bool hasControlPanel() const;
 | 
			
		||||
 | 
			
		||||
    /** Shows a device-specific control panel if there is one.
 | 
			
		||||
 | 
			
		||||
        This should only be called for devices which return true from hasControlPanel().
 | 
			
		||||
    */
 | 
			
		||||
    virtual bool showControlPanel();
 | 
			
		||||
 | 
			
		||||
    /** On devices which support it, this allows automatic gain control or other
 | 
			
		||||
        mic processing to be disabled.
 | 
			
		||||
        If the device doesn't support this operation, it'll return false.
 | 
			
		||||
    */
 | 
			
		||||
    virtual bool setAudioPreprocessingEnabled (bool shouldBeEnabled);
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Returns the number of under- or over runs reported by the OS since
 | 
			
		||||
        playback/recording has started.
 | 
			
		||||
 | 
			
		||||
        This number may be different than determining the Xrun count manually (by
 | 
			
		||||
        measuring the time spent in the audio callback) as the OS may be doing
 | 
			
		||||
        some buffering internally - especially on mobile devices.
 | 
			
		||||
 | 
			
		||||
        Returns -1 if playback/recording has not started yet or if getting the underrun
 | 
			
		||||
        count is not supported for this device (Android SDK 23 and lower).
 | 
			
		||||
    */
 | 
			
		||||
    virtual int getXRunCount() const noexcept;
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
protected:
 | 
			
		||||
    /** Creates a device, setting its name and type member variables. */
 | 
			
		||||
    AudioIODevice (const String& deviceName,
 | 
			
		||||
                   const String& typeName);
 | 
			
		||||
 | 
			
		||||
    /** @internal */
 | 
			
		||||
    String name, typeName;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace juce
 | 
			
		||||
 
 | 
			
		||||
@@ -1,146 +1,146 @@
 | 
			
		||||
/*
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
 | 
			
		||||
   This file is part of the JUCE library.
 | 
			
		||||
   Copyright (c) 2020 - Raw Material Software Limited
 | 
			
		||||
 | 
			
		||||
   JUCE is an open source library subject to commercial or open-source
 | 
			
		||||
   licensing.
 | 
			
		||||
 | 
			
		||||
   The code included in this file is provided under the terms of the ISC license
 | 
			
		||||
   http://www.isc.org/downloads/software-support-policy/isc-license. Permission
 | 
			
		||||
   To use, copy, modify, and/or distribute this software for any purpose with or
 | 
			
		||||
   without fee is hereby granted provided that the above copyright notice and
 | 
			
		||||
   this permission notice appear in all copies.
 | 
			
		||||
 | 
			
		||||
   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
 | 
			
		||||
   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
 | 
			
		||||
   DISCLAIMED.
 | 
			
		||||
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
namespace juce
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
AudioIODeviceType::AudioIODeviceType (const String& name)
 | 
			
		||||
    : typeName (name)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AudioIODeviceType::~AudioIODeviceType()
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//==============================================================================
 | 
			
		||||
void AudioIODeviceType::addListener (Listener* l)      { listeners.add (l); }
 | 
			
		||||
void AudioIODeviceType::removeListener (Listener* l)   { listeners.remove (l); }
 | 
			
		||||
 | 
			
		||||
void AudioIODeviceType::callDeviceChangeListeners()
 | 
			
		||||
{
 | 
			
		||||
    listeners.call ([] (Listener& l) { l.audioDeviceListChanged(); });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//==============================================================================
 | 
			
		||||
#if JUCE_MAC
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_CoreAudio()  { return new CoreAudioClasses::CoreAudioIODeviceType(); }
 | 
			
		||||
#else
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_CoreAudio()  { return nullptr; }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if JUCE_IOS
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_iOSAudio()   { return new iOSAudioIODeviceType(); }
 | 
			
		||||
#else
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_iOSAudio()   { return nullptr; }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if JUCE_WINDOWS && JUCE_WASAPI
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_WASAPI (WASAPIDeviceMode deviceMode)
 | 
			
		||||
 {
 | 
			
		||||
     auto windowsVersion = SystemStats::getOperatingSystemType();
 | 
			
		||||
 | 
			
		||||
     if (windowsVersion < SystemStats::WinVista
 | 
			
		||||
         || (WasapiClasses::isLowLatencyMode (deviceMode) && windowsVersion < SystemStats::Windows10))
 | 
			
		||||
         return nullptr;
 | 
			
		||||
 | 
			
		||||
     return new WasapiClasses::WASAPIAudioIODeviceType (deviceMode);
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_WASAPI (bool exclusiveMode)
 | 
			
		||||
 {
 | 
			
		||||
     return createAudioIODeviceType_WASAPI (exclusiveMode ? WASAPIDeviceMode::exclusive
 | 
			
		||||
                                                          : WASAPIDeviceMode::shared);
 | 
			
		||||
 }
 | 
			
		||||
#else
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_WASAPI (WASAPIDeviceMode)  { return nullptr; }
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_WASAPI (bool)              { return nullptr; }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if JUCE_WINDOWS && JUCE_DIRECTSOUND
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_DirectSound()  { return new DSoundAudioIODeviceType(); }
 | 
			
		||||
#else
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_DirectSound()  { return nullptr; }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if JUCE_WINDOWS && JUCE_ASIO
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_ASIO()         { return new ASIOAudioIODeviceType(); }
 | 
			
		||||
#else
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_ASIO()         { return nullptr; }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if (JUCE_LINUX || JUCE_BSD) && JUCE_ALSA
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_ALSA()         { return createAudioIODeviceType_ALSA_PCMDevices(); }
 | 
			
		||||
#else
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_ALSA()         { return nullptr; }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if (JUCE_LINUX || JUCE_BSD) && JUCE_JACK
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_JACK()         { return new JackAudioIODeviceType(); }
 | 
			
		||||
#else
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_JACK()         { return nullptr; }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if JUCE_LINUX && JUCE_BELA
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_Bela()         { return new BelaAudioIODeviceType(); }
 | 
			
		||||
#else
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_Bela()         { return nullptr; }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if JUCE_ANDROID
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_Android()
 | 
			
		||||
 {
 | 
			
		||||
    #if JUCE_USE_ANDROID_OBOE
 | 
			
		||||
     if (isOboeAvailable())
 | 
			
		||||
         return nullptr;
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    #if JUCE_USE_ANDROID_OPENSLES
 | 
			
		||||
     if (isOpenSLAvailable())
 | 
			
		||||
         return nullptr;
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
     return new AndroidAudioIODeviceType();
 | 
			
		||||
 }
 | 
			
		||||
#else
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_Android()   { return nullptr; }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if JUCE_ANDROID && JUCE_USE_ANDROID_OPENSLES
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_OpenSLES()
 | 
			
		||||
 {
 | 
			
		||||
     return isOpenSLAvailable() ? new OpenSLAudioDeviceType() : nullptr;
 | 
			
		||||
 }
 | 
			
		||||
#else
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_OpenSLES()  { return nullptr; }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if JUCE_ANDROID && JUCE_USE_ANDROID_OBOE
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_Oboe()
 | 
			
		||||
 {
 | 
			
		||||
     return isOboeAvailable() ? new OboeAudioIODeviceType() : nullptr;
 | 
			
		||||
 }
 | 
			
		||||
#else
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_Oboe()      { return nullptr; }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
} // namespace juce
 | 
			
		||||
/*
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
 | 
			
		||||
   This file is part of the JUCE library.
 | 
			
		||||
   Copyright (c) 2022 - Raw Material Software Limited
 | 
			
		||||
 | 
			
		||||
   JUCE is an open source library subject to commercial or open-source
 | 
			
		||||
   licensing.
 | 
			
		||||
 | 
			
		||||
   The code included in this file is provided under the terms of the ISC license
 | 
			
		||||
   http://www.isc.org/downloads/software-support-policy/isc-license. Permission
 | 
			
		||||
   To use, copy, modify, and/or distribute this software for any purpose with or
 | 
			
		||||
   without fee is hereby granted provided that the above copyright notice and
 | 
			
		||||
   this permission notice appear in all copies.
 | 
			
		||||
 | 
			
		||||
   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
 | 
			
		||||
   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
 | 
			
		||||
   DISCLAIMED.
 | 
			
		||||
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
namespace juce
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
AudioIODeviceType::AudioIODeviceType (const String& name)
 | 
			
		||||
    : typeName (name)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
AudioIODeviceType::~AudioIODeviceType()
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//==============================================================================
 | 
			
		||||
void AudioIODeviceType::addListener (Listener* l)      { listeners.add (l); }
 | 
			
		||||
void AudioIODeviceType::removeListener (Listener* l)   { listeners.remove (l); }
 | 
			
		||||
 | 
			
		||||
void AudioIODeviceType::callDeviceChangeListeners()
 | 
			
		||||
{
 | 
			
		||||
    listeners.call ([] (Listener& l) { l.audioDeviceListChanged(); });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//==============================================================================
 | 
			
		||||
#if JUCE_MAC
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_CoreAudio()  { return new CoreAudioClasses::CoreAudioIODeviceType(); }
 | 
			
		||||
#else
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_CoreAudio()  { return nullptr; }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if JUCE_IOS
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_iOSAudio()   { return new iOSAudioIODeviceType(); }
 | 
			
		||||
#else
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_iOSAudio()   { return nullptr; }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if JUCE_WINDOWS && JUCE_WASAPI
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_WASAPI (WASAPIDeviceMode deviceMode)
 | 
			
		||||
 {
 | 
			
		||||
     auto windowsVersion = SystemStats::getOperatingSystemType();
 | 
			
		||||
 | 
			
		||||
     if (windowsVersion < SystemStats::WinVista
 | 
			
		||||
         || (WasapiClasses::isLowLatencyMode (deviceMode) && windowsVersion < SystemStats::Windows10))
 | 
			
		||||
         return nullptr;
 | 
			
		||||
 | 
			
		||||
     return new WasapiClasses::WASAPIAudioIODeviceType (deviceMode);
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_WASAPI (bool exclusiveMode)
 | 
			
		||||
 {
 | 
			
		||||
     return createAudioIODeviceType_WASAPI (exclusiveMode ? WASAPIDeviceMode::exclusive
 | 
			
		||||
                                                          : WASAPIDeviceMode::shared);
 | 
			
		||||
 }
 | 
			
		||||
#else
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_WASAPI (WASAPIDeviceMode)  { return nullptr; }
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_WASAPI (bool)              { return nullptr; }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if JUCE_WINDOWS && JUCE_DIRECTSOUND
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_DirectSound()  { return new DSoundAudioIODeviceType(); }
 | 
			
		||||
#else
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_DirectSound()  { return nullptr; }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if JUCE_WINDOWS && JUCE_ASIO
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_ASIO()         { return new ASIOAudioIODeviceType(); }
 | 
			
		||||
#else
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_ASIO()         { return nullptr; }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if (JUCE_LINUX || JUCE_BSD) && JUCE_ALSA
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_ALSA()         { return createAudioIODeviceType_ALSA_PCMDevices(); }
 | 
			
		||||
#else
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_ALSA()         { return nullptr; }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if (JUCE_LINUX || JUCE_BSD) && JUCE_JACK
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_JACK()         { return new JackAudioIODeviceType(); }
 | 
			
		||||
#else
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_JACK()         { return nullptr; }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if JUCE_LINUX && JUCE_BELA
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_Bela()         { return new BelaAudioIODeviceType(); }
 | 
			
		||||
#else
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_Bela()         { return nullptr; }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if JUCE_ANDROID
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_Android()
 | 
			
		||||
 {
 | 
			
		||||
    #if JUCE_USE_ANDROID_OBOE
 | 
			
		||||
     if (isOboeAvailable())
 | 
			
		||||
         return nullptr;
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    #if JUCE_USE_ANDROID_OPENSLES
 | 
			
		||||
     if (isOpenSLAvailable())
 | 
			
		||||
         return nullptr;
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
     return new AndroidAudioIODeviceType();
 | 
			
		||||
 }
 | 
			
		||||
#else
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_Android()   { return nullptr; }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if JUCE_ANDROID && JUCE_USE_ANDROID_OPENSLES
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_OpenSLES()
 | 
			
		||||
 {
 | 
			
		||||
     return isOpenSLAvailable() ? new OpenSLAudioDeviceType() : nullptr;
 | 
			
		||||
 }
 | 
			
		||||
#else
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_OpenSLES()  { return nullptr; }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if JUCE_ANDROID && JUCE_USE_ANDROID_OBOE
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_Oboe()
 | 
			
		||||
 {
 | 
			
		||||
     return isOboeAvailable() ? new OboeAudioIODeviceType() : nullptr;
 | 
			
		||||
 }
 | 
			
		||||
#else
 | 
			
		||||
 AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_Oboe()      { return nullptr; }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
} // namespace juce
 | 
			
		||||
 
 | 
			
		||||
@@ -1,188 +1,188 @@
 | 
			
		||||
/*
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
 | 
			
		||||
   This file is part of the JUCE library.
 | 
			
		||||
   Copyright (c) 2020 - Raw Material Software Limited
 | 
			
		||||
 | 
			
		||||
   JUCE is an open source library subject to commercial or open-source
 | 
			
		||||
   licensing.
 | 
			
		||||
 | 
			
		||||
   The code included in this file is provided under the terms of the ISC license
 | 
			
		||||
   http://www.isc.org/downloads/software-support-policy/isc-license. Permission
 | 
			
		||||
   To use, copy, modify, and/or distribute this software for any purpose with or
 | 
			
		||||
   without fee is hereby granted provided that the above copyright notice and
 | 
			
		||||
   this permission notice appear in all copies.
 | 
			
		||||
 | 
			
		||||
   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
 | 
			
		||||
   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
 | 
			
		||||
   DISCLAIMED.
 | 
			
		||||
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
namespace juce
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
//==============================================================================
 | 
			
		||||
/**
 | 
			
		||||
    Represents a type of audio driver, such as DirectSound, ASIO, CoreAudio, etc.
 | 
			
		||||
 | 
			
		||||
    To get a list of available audio driver types, use the AudioDeviceManager::createAudioDeviceTypes()
 | 
			
		||||
    method. Each of the objects returned can then be used to list the available
 | 
			
		||||
    devices of that type. E.g.
 | 
			
		||||
    @code
 | 
			
		||||
    OwnedArray<AudioIODeviceType> types;
 | 
			
		||||
    myAudioDeviceManager.createAudioDeviceTypes (types);
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < types.size(); ++i)
 | 
			
		||||
    {
 | 
			
		||||
        String typeName (types[i]->getTypeName());  // This will be things like "DirectSound", "CoreAudio", etc.
 | 
			
		||||
 | 
			
		||||
        types[i]->scanForDevices();                 // This must be called before getting the list of devices
 | 
			
		||||
 | 
			
		||||
        StringArray deviceNames (types[i]->getDeviceNames());  // This will now return a list of available devices of this type
 | 
			
		||||
 | 
			
		||||
        for (int j = 0; j < deviceNames.size(); ++j)
 | 
			
		||||
        {
 | 
			
		||||
            AudioIODevice* device = types[i]->createDevice (deviceNames [j]);
 | 
			
		||||
 | 
			
		||||
            ...
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    @endcode
 | 
			
		||||
 | 
			
		||||
    For an easier way of managing audio devices and their settings, have a look at the
 | 
			
		||||
    AudioDeviceManager class.
 | 
			
		||||
 | 
			
		||||
    @see AudioIODevice, AudioDeviceManager
 | 
			
		||||
 | 
			
		||||
    @tags{Audio}
 | 
			
		||||
*/
 | 
			
		||||
class JUCE_API  AudioIODeviceType
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Returns the name of this type of driver that this object manages.
 | 
			
		||||
 | 
			
		||||
        This will be something like "DirectSound", "ASIO", "CoreAudio", "ALSA", etc.
 | 
			
		||||
    */
 | 
			
		||||
    const String& getTypeName() const noexcept                      { return typeName; }
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Refreshes the object's cached list of known devices.
 | 
			
		||||
 | 
			
		||||
        This must be called at least once before calling getDeviceNames() or any of
 | 
			
		||||
        the other device creation methods.
 | 
			
		||||
    */
 | 
			
		||||
    virtual void scanForDevices() = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns the list of available devices of this type.
 | 
			
		||||
 | 
			
		||||
        The scanForDevices() method must have been called to create this list.
 | 
			
		||||
 | 
			
		||||
        @param wantInputNames    for devices which have separate inputs and outputs
 | 
			
		||||
                                 this determines which list of names is returned
 | 
			
		||||
    */
 | 
			
		||||
    virtual StringArray getDeviceNames (bool wantInputNames = false) const = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns the name of the default device.
 | 
			
		||||
 | 
			
		||||
        This will be one of the names from the getDeviceNames() list.
 | 
			
		||||
 | 
			
		||||
        @param forInput     if true, this means that a default input device should be
 | 
			
		||||
                            returned; if false, it should return the default output
 | 
			
		||||
    */
 | 
			
		||||
    virtual int getDefaultDeviceIndex (bool forInput) const = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns the index of a given device in the list of device names.
 | 
			
		||||
        If asInput is true, it shows the index in the inputs list, otherwise it
 | 
			
		||||
        looks for it in the outputs list.
 | 
			
		||||
    */
 | 
			
		||||
    virtual int getIndexOfDevice (AudioIODevice* device, bool asInput) const = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns true if two different devices can be used for the input and output.
 | 
			
		||||
    */
 | 
			
		||||
    virtual bool hasSeparateInputsAndOutputs() const = 0;
 | 
			
		||||
 | 
			
		||||
    /** Creates one of the devices of this type.
 | 
			
		||||
 | 
			
		||||
        The deviceName must be one of the strings returned by getDeviceNames(), and
 | 
			
		||||
        scanForDevices() must have been called before this method is used.
 | 
			
		||||
    */
 | 
			
		||||
    virtual AudioIODevice* createDevice (const String& outputDeviceName,
 | 
			
		||||
                                         const String& inputDeviceName) = 0;
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /**
 | 
			
		||||
        A class for receiving events when audio devices are inserted or removed.
 | 
			
		||||
 | 
			
		||||
        You can register an AudioIODeviceType::Listener with an~AudioIODeviceType object
 | 
			
		||||
        using the AudioIODeviceType::addListener() method, and it will be called when
 | 
			
		||||
        devices of that type are added or removed.
 | 
			
		||||
 | 
			
		||||
        @see AudioIODeviceType::addListener, AudioIODeviceType::removeListener
 | 
			
		||||
    */
 | 
			
		||||
    class Listener
 | 
			
		||||
    {
 | 
			
		||||
    public:
 | 
			
		||||
        virtual ~Listener() = default;
 | 
			
		||||
 | 
			
		||||
        /** Called when the list of available audio devices changes. */
 | 
			
		||||
        virtual void audioDeviceListChanged() = 0;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    /** Adds a listener that will be called when this type of device is added or
 | 
			
		||||
        removed from the system.
 | 
			
		||||
    */
 | 
			
		||||
    void addListener (Listener* listener);
 | 
			
		||||
 | 
			
		||||
    /** Removes a listener that was previously added with addListener(). */
 | 
			
		||||
    void removeListener (Listener* listener);
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Destructor. */
 | 
			
		||||
    virtual ~AudioIODeviceType();
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Creates a CoreAudio device type if it's available on this platform, or returns null. */
 | 
			
		||||
    static AudioIODeviceType* createAudioIODeviceType_CoreAudio();
 | 
			
		||||
    /** Creates an iOS device type if it's available on this platform, or returns null. */
 | 
			
		||||
    static AudioIODeviceType* createAudioIODeviceType_iOSAudio();
 | 
			
		||||
    /** Creates a WASAPI device type in the specified mode if it's available on this platform, or returns null. */
 | 
			
		||||
    static AudioIODeviceType* createAudioIODeviceType_WASAPI (WASAPIDeviceMode deviceMode);
 | 
			
		||||
    /** Creates a DirectSound device type if it's available on this platform, or returns null. */
 | 
			
		||||
    static AudioIODeviceType* createAudioIODeviceType_DirectSound();
 | 
			
		||||
    /** Creates an ASIO device type if it's available on this platform, or returns null. */
 | 
			
		||||
    static AudioIODeviceType* createAudioIODeviceType_ASIO();
 | 
			
		||||
    /** Creates an ALSA device type if it's available on this platform, or returns null. */
 | 
			
		||||
    static AudioIODeviceType* createAudioIODeviceType_ALSA();
 | 
			
		||||
    /** Creates a JACK device type if it's available on this platform, or returns null. */
 | 
			
		||||
    static AudioIODeviceType* createAudioIODeviceType_JACK();
 | 
			
		||||
    /** Creates an Android device type if it's available on this platform, or returns null. */
 | 
			
		||||
    static AudioIODeviceType* createAudioIODeviceType_Android();
 | 
			
		||||
    /** Creates an Android OpenSLES device type if it's available on this platform, or returns null. */
 | 
			
		||||
    static AudioIODeviceType* createAudioIODeviceType_OpenSLES();
 | 
			
		||||
    /** Creates an Oboe device type if it's available on this platform, or returns null. */
 | 
			
		||||
    static AudioIODeviceType* createAudioIODeviceType_Oboe();
 | 
			
		||||
    /** Creates a Bela device type if it's available on this platform, or returns null. */
 | 
			
		||||
    static AudioIODeviceType* createAudioIODeviceType_Bela();
 | 
			
		||||
 | 
			
		||||
   #ifndef DOXYGEN
 | 
			
		||||
    [[deprecated ("You should call the method which takes a WASAPIDeviceMode instead.")]]
 | 
			
		||||
    static AudioIODeviceType* createAudioIODeviceType_WASAPI (bool exclusiveMode);
 | 
			
		||||
   #endif
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
    explicit AudioIODeviceType (const String& typeName);
 | 
			
		||||
 | 
			
		||||
    /** Synchronously calls all the registered device list change listeners. */
 | 
			
		||||
    void callDeviceChangeListeners();
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    String typeName;
 | 
			
		||||
    ListenerList<Listener> listeners;
 | 
			
		||||
 | 
			
		||||
    JUCE_DECLARE_NON_COPYABLE (AudioIODeviceType)
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace juce
 | 
			
		||||
/*
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
 | 
			
		||||
   This file is part of the JUCE library.
 | 
			
		||||
   Copyright (c) 2022 - Raw Material Software Limited
 | 
			
		||||
 | 
			
		||||
   JUCE is an open source library subject to commercial or open-source
 | 
			
		||||
   licensing.
 | 
			
		||||
 | 
			
		||||
   The code included in this file is provided under the terms of the ISC license
 | 
			
		||||
   http://www.isc.org/downloads/software-support-policy/isc-license. Permission
 | 
			
		||||
   To use, copy, modify, and/or distribute this software for any purpose with or
 | 
			
		||||
   without fee is hereby granted provided that the above copyright notice and
 | 
			
		||||
   this permission notice appear in all copies.
 | 
			
		||||
 | 
			
		||||
   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
 | 
			
		||||
   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
 | 
			
		||||
   DISCLAIMED.
 | 
			
		||||
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
namespace juce
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
//==============================================================================
 | 
			
		||||
/**
 | 
			
		||||
    Represents a type of audio driver, such as DirectSound, ASIO, CoreAudio, etc.
 | 
			
		||||
 | 
			
		||||
    To get a list of available audio driver types, use the AudioDeviceManager::createAudioDeviceTypes()
 | 
			
		||||
    method. Each of the objects returned can then be used to list the available
 | 
			
		||||
    devices of that type. E.g.
 | 
			
		||||
    @code
 | 
			
		||||
    OwnedArray<AudioIODeviceType> types;
 | 
			
		||||
    myAudioDeviceManager.createAudioDeviceTypes (types);
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < types.size(); ++i)
 | 
			
		||||
    {
 | 
			
		||||
        String typeName (types[i]->getTypeName());  // This will be things like "DirectSound", "CoreAudio", etc.
 | 
			
		||||
 | 
			
		||||
        types[i]->scanForDevices();                 // This must be called before getting the list of devices
 | 
			
		||||
 | 
			
		||||
        StringArray deviceNames (types[i]->getDeviceNames());  // This will now return a list of available devices of this type
 | 
			
		||||
 | 
			
		||||
        for (int j = 0; j < deviceNames.size(); ++j)
 | 
			
		||||
        {
 | 
			
		||||
            AudioIODevice* device = types[i]->createDevice (deviceNames [j]);
 | 
			
		||||
 | 
			
		||||
            ...
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    @endcode
 | 
			
		||||
 | 
			
		||||
    For an easier way of managing audio devices and their settings, have a look at the
 | 
			
		||||
    AudioDeviceManager class.
 | 
			
		||||
 | 
			
		||||
    @see AudioIODevice, AudioDeviceManager
 | 
			
		||||
 | 
			
		||||
    @tags{Audio}
 | 
			
		||||
*/
 | 
			
		||||
class JUCE_API  AudioIODeviceType
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Returns the name of this type of driver that this object manages.
 | 
			
		||||
 | 
			
		||||
        This will be something like "DirectSound", "ASIO", "CoreAudio", "ALSA", etc.
 | 
			
		||||
    */
 | 
			
		||||
    const String& getTypeName() const noexcept                      { return typeName; }
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Refreshes the object's cached list of known devices.
 | 
			
		||||
 | 
			
		||||
        This must be called at least once before calling getDeviceNames() or any of
 | 
			
		||||
        the other device creation methods.
 | 
			
		||||
    */
 | 
			
		||||
    virtual void scanForDevices() = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns the list of available devices of this type.
 | 
			
		||||
 | 
			
		||||
        The scanForDevices() method must have been called to create this list.
 | 
			
		||||
 | 
			
		||||
        @param wantInputNames    for devices which have separate inputs and outputs
 | 
			
		||||
                                 this determines which list of names is returned
 | 
			
		||||
    */
 | 
			
		||||
    virtual StringArray getDeviceNames (bool wantInputNames = false) const = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns the name of the default device.
 | 
			
		||||
 | 
			
		||||
        This will be one of the names from the getDeviceNames() list.
 | 
			
		||||
 | 
			
		||||
        @param forInput     if true, this means that a default input device should be
 | 
			
		||||
                            returned; if false, it should return the default output
 | 
			
		||||
    */
 | 
			
		||||
    virtual int getDefaultDeviceIndex (bool forInput) const = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns the index of a given device in the list of device names.
 | 
			
		||||
        If asInput is true, it shows the index in the inputs list, otherwise it
 | 
			
		||||
        looks for it in the outputs list.
 | 
			
		||||
    */
 | 
			
		||||
    virtual int getIndexOfDevice (AudioIODevice* device, bool asInput) const = 0;
 | 
			
		||||
 | 
			
		||||
    /** Returns true if two different devices can be used for the input and output.
 | 
			
		||||
    */
 | 
			
		||||
    virtual bool hasSeparateInputsAndOutputs() const = 0;
 | 
			
		||||
 | 
			
		||||
    /** Creates one of the devices of this type.
 | 
			
		||||
 | 
			
		||||
        The deviceName must be one of the strings returned by getDeviceNames(), and
 | 
			
		||||
        scanForDevices() must have been called before this method is used.
 | 
			
		||||
    */
 | 
			
		||||
    virtual AudioIODevice* createDevice (const String& outputDeviceName,
 | 
			
		||||
                                         const String& inputDeviceName) = 0;
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /**
 | 
			
		||||
        A class for receiving events when audio devices are inserted or removed.
 | 
			
		||||
 | 
			
		||||
        You can register an AudioIODeviceType::Listener with an~AudioIODeviceType object
 | 
			
		||||
        using the AudioIODeviceType::addListener() method, and it will be called when
 | 
			
		||||
        devices of that type are added or removed.
 | 
			
		||||
 | 
			
		||||
        @see AudioIODeviceType::addListener, AudioIODeviceType::removeListener
 | 
			
		||||
    */
 | 
			
		||||
    class Listener
 | 
			
		||||
    {
 | 
			
		||||
    public:
 | 
			
		||||
        virtual ~Listener() = default;
 | 
			
		||||
 | 
			
		||||
        /** Called when the list of available audio devices changes. */
 | 
			
		||||
        virtual void audioDeviceListChanged() = 0;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    /** Adds a listener that will be called when this type of device is added or
 | 
			
		||||
        removed from the system.
 | 
			
		||||
    */
 | 
			
		||||
    void addListener (Listener* listener);
 | 
			
		||||
 | 
			
		||||
    /** Removes a listener that was previously added with addListener(). */
 | 
			
		||||
    void removeListener (Listener* listener);
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Destructor. */
 | 
			
		||||
    virtual ~AudioIODeviceType();
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Creates a CoreAudio device type if it's available on this platform, or returns null. */
 | 
			
		||||
    static AudioIODeviceType* createAudioIODeviceType_CoreAudio();
 | 
			
		||||
    /** Creates an iOS device type if it's available on this platform, or returns null. */
 | 
			
		||||
    static AudioIODeviceType* createAudioIODeviceType_iOSAudio();
 | 
			
		||||
    /** Creates a WASAPI device type in the specified mode if it's available on this platform, or returns null. */
 | 
			
		||||
    static AudioIODeviceType* createAudioIODeviceType_WASAPI (WASAPIDeviceMode deviceMode);
 | 
			
		||||
    /** Creates a DirectSound device type if it's available on this platform, or returns null. */
 | 
			
		||||
    static AudioIODeviceType* createAudioIODeviceType_DirectSound();
 | 
			
		||||
    /** Creates an ASIO device type if it's available on this platform, or returns null. */
 | 
			
		||||
    static AudioIODeviceType* createAudioIODeviceType_ASIO();
 | 
			
		||||
    /** Creates an ALSA device type if it's available on this platform, or returns null. */
 | 
			
		||||
    static AudioIODeviceType* createAudioIODeviceType_ALSA();
 | 
			
		||||
    /** Creates a JACK device type if it's available on this platform, or returns null. */
 | 
			
		||||
    static AudioIODeviceType* createAudioIODeviceType_JACK();
 | 
			
		||||
    /** Creates an Android device type if it's available on this platform, or returns null. */
 | 
			
		||||
    static AudioIODeviceType* createAudioIODeviceType_Android();
 | 
			
		||||
    /** Creates an Android OpenSLES device type if it's available on this platform, or returns null. */
 | 
			
		||||
    static AudioIODeviceType* createAudioIODeviceType_OpenSLES();
 | 
			
		||||
    /** Creates an Oboe device type if it's available on this platform, or returns null. */
 | 
			
		||||
    static AudioIODeviceType* createAudioIODeviceType_Oboe();
 | 
			
		||||
    /** Creates a Bela device type if it's available on this platform, or returns null. */
 | 
			
		||||
    static AudioIODeviceType* createAudioIODeviceType_Bela();
 | 
			
		||||
 | 
			
		||||
   #ifndef DOXYGEN
 | 
			
		||||
    [[deprecated ("You should call the method which takes a WASAPIDeviceMode instead.")]]
 | 
			
		||||
    static AudioIODeviceType* createAudioIODeviceType_WASAPI (bool exclusiveMode);
 | 
			
		||||
   #endif
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
    explicit AudioIODeviceType (const String& typeName);
 | 
			
		||||
 | 
			
		||||
    /** Synchronously calls all the registered device list change listeners. */
 | 
			
		||||
    void callDeviceChangeListeners();
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    String typeName;
 | 
			
		||||
    ListenerList<Listener> listeners;
 | 
			
		||||
 | 
			
		||||
    JUCE_DECLARE_NON_COPYABLE (AudioIODeviceType)
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace juce
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										48
									
								
								deps/juce/modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								deps/juce/modules/juce_audio_devices/audio_io/juce_SampleRateHelpers.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
			
		||||
/*
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
 | 
			
		||||
   This file is part of the JUCE library.
 | 
			
		||||
   Copyright (c) 2022 - Raw Material Software Limited
 | 
			
		||||
 | 
			
		||||
   JUCE is an open source library subject to commercial or open-source
 | 
			
		||||
   licensing.
 | 
			
		||||
 | 
			
		||||
   The code included in this file is provided under the terms of the ISC license
 | 
			
		||||
   http://www.isc.org/downloads/software-support-policy/isc-license. Permission
 | 
			
		||||
   To use, copy, modify, and/or distribute this software for any purpose with or
 | 
			
		||||
   without fee is hereby granted provided that the above copyright notice and
 | 
			
		||||
   this permission notice appear in all copies.
 | 
			
		||||
 | 
			
		||||
   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
 | 
			
		||||
   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
 | 
			
		||||
   DISCLAIMED.
 | 
			
		||||
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
namespace juce
 | 
			
		||||
{
 | 
			
		||||
namespace SampleRateHelpers
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
static inline const std::vector<double>& getAllSampleRates()
 | 
			
		||||
{
 | 
			
		||||
    static auto sampleRates = []
 | 
			
		||||
    {
 | 
			
		||||
        std::vector<double> result;
 | 
			
		||||
        constexpr double baseRates[] = { 8000.0, 11025.0, 12000.0 };
 | 
			
		||||
        constexpr double maxRate = 768000.0;
 | 
			
		||||
 | 
			
		||||
        for (auto rate : baseRates)
 | 
			
		||||
            for (; rate <= maxRate; rate *= 2)
 | 
			
		||||
                result.insert (std::upper_bound (result.begin(), result.end(), rate),
 | 
			
		||||
                               rate);
 | 
			
		||||
 | 
			
		||||
        return result;
 | 
			
		||||
    }();
 | 
			
		||||
 | 
			
		||||
    return sampleRates;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace SampleRateHelpers
 | 
			
		||||
} // namespace juce
 | 
			
		||||
@@ -1,59 +1,59 @@
 | 
			
		||||
/*
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
 | 
			
		||||
   This file is part of the JUCE library.
 | 
			
		||||
   Copyright (c) 2020 - Raw Material Software Limited
 | 
			
		||||
 | 
			
		||||
   JUCE is an open source library subject to commercial or open-source
 | 
			
		||||
   licensing.
 | 
			
		||||
 | 
			
		||||
   The code included in this file is provided under the terms of the ISC license
 | 
			
		||||
   http://www.isc.org/downloads/software-support-policy/isc-license. Permission
 | 
			
		||||
   To use, copy, modify, and/or distribute this software for any purpose with or
 | 
			
		||||
   without fee is hereby granted provided that the above copyright notice and
 | 
			
		||||
   this permission notice appear in all copies.
 | 
			
		||||
 | 
			
		||||
   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
 | 
			
		||||
   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
 | 
			
		||||
   DISCLAIMED.
 | 
			
		||||
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
namespace juce
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
//==============================================================================
 | 
			
		||||
/**
 | 
			
		||||
    Contains functions to control the system's master volume.
 | 
			
		||||
 | 
			
		||||
    @tags{Audio}
 | 
			
		||||
*/
 | 
			
		||||
class JUCE_API  SystemAudioVolume
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Returns the operating system's current volume level in the range 0 to 1.0 */
 | 
			
		||||
    static float JUCE_CALLTYPE getGain();
 | 
			
		||||
 | 
			
		||||
    /** Attempts to set the operating system's current volume level.
 | 
			
		||||
        @param newGain  the level, between 0 and 1.0
 | 
			
		||||
        @returns true if the operation succeeds
 | 
			
		||||
    */
 | 
			
		||||
    static bool JUCE_CALLTYPE setGain (float newGain);
 | 
			
		||||
 | 
			
		||||
    /** Returns true if the system's audio output is currently muted. */
 | 
			
		||||
    static bool JUCE_CALLTYPE isMuted();
 | 
			
		||||
 | 
			
		||||
    /** Attempts to mute the operating system's audio output.
 | 
			
		||||
        @param shouldBeMuted    true if you want it to be muted
 | 
			
		||||
        @returns true if the operation succeeds
 | 
			
		||||
    */
 | 
			
		||||
    static bool JUCE_CALLTYPE setMuted (bool shouldBeMuted);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    SystemAudioVolume(); // Don't instantiate this class, just call its static fns.
 | 
			
		||||
    JUCE_DECLARE_NON_COPYABLE (SystemAudioVolume)
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace juce
 | 
			
		||||
/*
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
 | 
			
		||||
   This file is part of the JUCE library.
 | 
			
		||||
   Copyright (c) 2022 - Raw Material Software Limited
 | 
			
		||||
 | 
			
		||||
   JUCE is an open source library subject to commercial or open-source
 | 
			
		||||
   licensing.
 | 
			
		||||
 | 
			
		||||
   The code included in this file is provided under the terms of the ISC license
 | 
			
		||||
   http://www.isc.org/downloads/software-support-policy/isc-license. Permission
 | 
			
		||||
   To use, copy, modify, and/or distribute this software for any purpose with or
 | 
			
		||||
   without fee is hereby granted provided that the above copyright notice and
 | 
			
		||||
   this permission notice appear in all copies.
 | 
			
		||||
 | 
			
		||||
   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
 | 
			
		||||
   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
 | 
			
		||||
   DISCLAIMED.
 | 
			
		||||
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
namespace juce
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
//==============================================================================
 | 
			
		||||
/**
 | 
			
		||||
    Contains functions to control the system's master volume.
 | 
			
		||||
 | 
			
		||||
    @tags{Audio}
 | 
			
		||||
*/
 | 
			
		||||
class JUCE_API  SystemAudioVolume
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Returns the operating system's current volume level in the range 0 to 1.0 */
 | 
			
		||||
    static float JUCE_CALLTYPE getGain();
 | 
			
		||||
 | 
			
		||||
    /** Attempts to set the operating system's current volume level.
 | 
			
		||||
        @param newGain  the level, between 0 and 1.0
 | 
			
		||||
        @returns true if the operation succeeds
 | 
			
		||||
    */
 | 
			
		||||
    static bool JUCE_CALLTYPE setGain (float newGain);
 | 
			
		||||
 | 
			
		||||
    /** Returns true if the system's audio output is currently muted. */
 | 
			
		||||
    static bool JUCE_CALLTYPE isMuted();
 | 
			
		||||
 | 
			
		||||
    /** Attempts to mute the operating system's audio output.
 | 
			
		||||
        @param shouldBeMuted    true if you want it to be muted
 | 
			
		||||
        @returns true if the operation succeeds
 | 
			
		||||
    */
 | 
			
		||||
    static bool JUCE_CALLTYPE setMuted (bool shouldBeMuted);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    SystemAudioVolume(); // Don't instantiate this class, just call its static fns.
 | 
			
		||||
    JUCE_DECLARE_NON_COPYABLE (SystemAudioVolume)
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace juce
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user