From 9ee711eb0cb443d2ca1dd4e8052f04a74a80cb08 Mon Sep 17 00:00:00 2001 From: wittend99 Date: Fri, 18 May 2012 02:06:15 +0000 Subject: [PATCH] Catching up before things get into a snarl. git-svn-id: https://svn.code.sf.net/p/freetel/code@475 01035d8c-6547-0410-b346-abe4f91aad63 --- .../portaudiocpp/AsioDeviceAdapter.hxx | 70 +-- .../include/portaudiocpp/AutoSystem.hxx | 84 ++-- .../include/portaudiocpp/BlockingStream.hxx | 44 +- .../portaudiocpp/CFunCallbackStream.hxx | 44 +- .../portaudiocpp/CallbackInterface.hxx | 56 +-- .../include/portaudiocpp/CallbackStream.hxx | 34 +- .../portaudiocpp/CppFunCallbackStream.hxx | 112 ++--- fdmdv2/extern/include/portaudiocpp/Device.hxx | 120 ++--- .../DirectionSpecificStreamParameters.hxx | 70 +-- .../extern/include/portaudiocpp/Exception.hxx | 172 +++---- .../extern/include/portaudiocpp/HostApi.hxx | 90 ++-- .../portaudiocpp/InterfaceCallbackStream.hxx | 38 +- .../portaudiocpp/MemFunCallbackStream.hxx | 162 +++---- .../include/portaudiocpp/PortAudioCpp.hxx | 38 +- .../include/portaudiocpp/SampleDataFormat.hxx | 30 +- fdmdv2/extern/include/portaudiocpp/Stream.hxx | 112 ++--- .../include/portaudiocpp/StreamParameters.hxx | 110 ++--- fdmdv2/extern/include/portaudiocpp/System.hxx | 116 ++--- .../portaudiocpp/SystemDeviceIterator.hxx | 70 +-- .../portaudiocpp/SystemHostApiIterator.hxx | 60 +-- fdmdv2/extern/lib/libportaudio.a | Bin 0 -> 355106 bytes fdmdv2/extern/lib/libportaudio.la | 41 ++ fdmdv2/pa_cppbinding_test/gui.cpp | 66 ++- fdmdv2/pa_cppbinding_test/gui.fbp | 440 +++++++++--------- fdmdv2/pa_cppbinding_test/gui.h | 8 +- fdmdv2/pa_cppbinding_test/main.cpp | 181 +++++++ fdmdv2/pa_cppbinding_test/main.h | 10 +- .../pa_cppbinding_test/pa_cppbinding_test.mk | 6 +- .../pa_cppbinding_test.project | 61 ++- 29 files changed, 1364 insertions(+), 1081 deletions(-) create mode 100644 fdmdv2/extern/lib/libportaudio.a create mode 100644 fdmdv2/extern/lib/libportaudio.la diff --git a/fdmdv2/extern/include/portaudiocpp/AsioDeviceAdapter.hxx b/fdmdv2/extern/include/portaudiocpp/AsioDeviceAdapter.hxx index 1964b6a2..3291457a 100644 --- a/fdmdv2/extern/include/portaudiocpp/AsioDeviceAdapter.hxx +++ b/fdmdv2/extern/include/portaudiocpp/AsioDeviceAdapter.hxx @@ -4,41 +4,41 @@ namespace portaudio { - // Forward declaration(s): - class Device; - - // Declaration(s): - ////// - /// @brief Adapts the given Device to an ASIO specific extension. - /// - /// Deleting the AsioDeviceAdapter does not affect the underlaying - /// Device. - ////// - class AsioDeviceAdapter - { - public: - AsioDeviceAdapter(Device &device); - - Device &device(); - - long minBufferSize() const; - long maxBufferSize() const; - long preferredBufferSize() const; - long granularity() const; - - void showControlPanel(void *systemSpecific); - - const char *inputChannelName(int channelIndex) const; - const char *outputChannelName(int channelIndex) const; - - private: - Device *device_; - - long minBufferSize_; - long maxBufferSize_; - long preferredBufferSize_; - long granularity_; - }; + // Forward declaration(s): + class Device; + + // Declaration(s): + ////// + /// @brief Adapts the given Device to an ASIO specific extension. + /// + /// Deleting the AsioDeviceAdapter does not affect the underlaying + /// Device. + ////// + class AsioDeviceAdapter + { + public: + AsioDeviceAdapter(Device &device); + + Device &device(); + + long minBufferSize() const; + long maxBufferSize() const; + long preferredBufferSize() const; + long granularity() const; + + void showControlPanel(void *systemSpecific); + + const char *inputChannelName(int channelIndex) const; + const char *outputChannelName(int channelIndex) const; + + private: + Device *device_; + + long minBufferSize_; + long maxBufferSize_; + long preferredBufferSize_; + long granularity_; + }; } #endif // INCLUDED_PORTAUDIO_ASIODEVICEADAPTER_HXX diff --git a/fdmdv2/extern/include/portaudiocpp/AutoSystem.hxx b/fdmdv2/extern/include/portaudiocpp/AutoSystem.hxx index 16cac5ed..7c5889e5 100644 --- a/fdmdv2/extern/include/portaudiocpp/AutoSystem.hxx +++ b/fdmdv2/extern/include/portaudiocpp/AutoSystem.hxx @@ -11,48 +11,48 @@ namespace portaudio { - ////// - /// @brief A RAII idiom class to ensure automatic clean-up when an exception is - /// raised. - /// - /// A simple helper class which uses the 'Resource Acquisition is Initialization' - /// idiom (RAII). Use this class to initialize/terminate the System rather than - /// using System directly. AutoSystem must be created on stack and must be valid - /// throughout the time you wish to use PortAudioCpp. Your 'main' function might be - /// a good place for it. - /// - /// To avoid having to type portaudio::System::instance().xyz() all the time, it's usually - /// a good idea to make a reference to the System which can be accessed directly. - /// @verbatim - /// portaudio::AutoSys autoSys; - /// portaudio::System &sys = portaudio::System::instance(); - /// @endverbatim - ////// - class AutoSystem - { - public: - AutoSystem(bool initialize = true) - { - if (initialize) - System::initialize(); - } - - ~AutoSystem() - { - if (System::exists()) - System::terminate(); - } - - void initialize() - { - System::initialize(); - } - - void terminate() - { - System::terminate(); - } - }; + ////// + /// @brief A RAII idiom class to ensure automatic clean-up when an exception is + /// raised. + /// + /// A simple helper class which uses the 'Resource Acquisition is Initialization' + /// idiom (RAII). Use this class to initialize/terminate the System rather than + /// using System directly. AutoSystem must be created on stack and must be valid + /// throughout the time you wish to use PortAudioCpp. Your 'main' function might be + /// a good place for it. + /// + /// To avoid having to type portaudio::System::instance().xyz() all the time, it's usually + /// a good idea to make a reference to the System which can be accessed directly. + /// @verbatim + /// portaudio::AutoSys autoSys; + /// portaudio::System &sys = portaudio::System::instance(); + /// @endverbatim + ////// + class AutoSystem + { + public: + AutoSystem(bool initialize = true) + { + if (initialize) + System::initialize(); + } + + ~AutoSystem() + { + if (System::exists()) + System::terminate(); + } + + void initialize() + { + System::initialize(); + } + + void terminate() + { + System::terminate(); + } + }; } // namespace portaudio diff --git a/fdmdv2/extern/include/portaudiocpp/BlockingStream.hxx b/fdmdv2/extern/include/portaudiocpp/BlockingStream.hxx index 37fa7665..9653550f 100644 --- a/fdmdv2/extern/include/portaudiocpp/BlockingStream.hxx +++ b/fdmdv2/extern/include/portaudiocpp/BlockingStream.hxx @@ -12,28 +12,28 @@ namespace portaudio - ////// - /// @brief Stream class for blocking read/write-style input and output. - ////// - class BlockingStream : public Stream - { - public: - BlockingStream(); - BlockingStream(const StreamParameters ¶meters); - ~BlockingStream(); - - void open(const StreamParameters ¶meters); - - void read(void *buffer, unsigned long numFrames); - void write(const void *buffer, unsigned long numFrames); - - signed long availableReadSize() const; - signed long availableWriteSize() const; - - private: - BlockingStream(const BlockingStream &); // non-copyable - BlockingStream &operator=(const BlockingStream &); // non-copyable - }; + ////// + /// @brief Stream class for blocking read/write-style input and output. + ////// + class BlockingStream : public Stream + { + public: + BlockingStream(); + BlockingStream(const StreamParameters ¶meters); + ~BlockingStream(); + + void open(const StreamParameters ¶meters); + + void read(void *buffer, unsigned long numFrames); + void write(const void *buffer, unsigned long numFrames); + + signed long availableReadSize() const; + signed long availableWriteSize() const; + + private: + BlockingStream(const BlockingStream &); // non-copyable + BlockingStream &operator=(const BlockingStream &); // non-copyable + }; diff --git a/fdmdv2/extern/include/portaudiocpp/CFunCallbackStream.hxx b/fdmdv2/extern/include/portaudiocpp/CFunCallbackStream.hxx index b3e3b5c1..f4d5918d 100644 --- a/fdmdv2/extern/include/portaudiocpp/CFunCallbackStream.hxx +++ b/fdmdv2/extern/include/portaudiocpp/CFunCallbackStream.hxx @@ -12,7 +12,7 @@ // Forward declaration(s) namespace portaudio { - class StreamParameters; + class StreamParameters; } // --------------------------------------------------------------------------------------- @@ -20,27 +20,27 @@ namespace portaudio // Declaration(s): namespace portaudio { - // ----------------------------------------------------------------------------------- - - ////// - /// @brief Callback stream using a free function with C linkage. It's important that the function - /// the passed function pointer points to is declared ``extern "C"''. - ////// - class CFunCallbackStream : public CallbackStream - { - public: - CFunCallbackStream(); - CFunCallbackStream(const StreamParameters ¶meters, PaStreamCallback *funPtr, void *userData); - ~CFunCallbackStream(); - - void open(const StreamParameters ¶meters, PaStreamCallback *funPtr, void *userData); - - private: - CFunCallbackStream(const CFunCallbackStream &); // non-copyable - CFunCallbackStream &operator=(const CFunCallbackStream &); // non-copyable - }; - - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- + + ////// + /// @brief Callback stream using a free function with C linkage. It's important that the function + /// the passed function pointer points to is declared ``extern "C"''. + ////// + class CFunCallbackStream : public CallbackStream + { + public: + CFunCallbackStream(); + CFunCallbackStream(const StreamParameters ¶meters, PaStreamCallback *funPtr, void *userData); + ~CFunCallbackStream(); + + void open(const StreamParameters ¶meters, PaStreamCallback *funPtr, void *userData); + + private: + CFunCallbackStream(const CFunCallbackStream &); // non-copyable + CFunCallbackStream &operator=(const CFunCallbackStream &); // non-copyable + }; + + // ----------------------------------------------------------------------------------- } // portaudio // --------------------------------------------------------------------------------------- diff --git a/fdmdv2/extern/include/portaudiocpp/CallbackInterface.hxx b/fdmdv2/extern/include/portaudiocpp/CallbackInterface.hxx index d498ec5b..c9236cdd 100644 --- a/fdmdv2/extern/include/portaudiocpp/CallbackInterface.hxx +++ b/fdmdv2/extern/include/portaudiocpp/CallbackInterface.hxx @@ -9,34 +9,34 @@ namespace portaudio { - // ----------------------------------------------------------------------------------- - - ////// - /// @brief Interface for an object that's callable as a PortAudioCpp callback object (ie that implements the - /// paCallbackFun method). - ////// - class CallbackInterface - { - public: - virtual ~CallbackInterface() {} - - virtual int paCallbackFun(const void *inputBuffer, void *outputBuffer, unsigned long numFrames, - const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags) = 0; - }; - - // ----------------------------------------------------------------------------------- - - namespace impl - { - extern "C" - { - int callbackInterfaceToPaCallbackAdapter(const void *inputBuffer, void *outputBuffer, unsigned long numFrames, - const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, - void *userData); - } // extern "C" - } - - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- + + ////// + /// @brief Interface for an object that's callable as a PortAudioCpp callback object (ie that implements the + /// paCallbackFun method). + ////// + class CallbackInterface + { + public: + virtual ~CallbackInterface() {} + + virtual int paCallbackFun(const void *inputBuffer, void *outputBuffer, unsigned long numFrames, + const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags) = 0; + }; + + // ----------------------------------------------------------------------------------- + + namespace impl + { + extern "C" + { + int callbackInterfaceToPaCallbackAdapter(const void *inputBuffer, void *outputBuffer, unsigned long numFrames, + const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, + void *userData); + } // extern "C" + } + + // ----------------------------------------------------------------------------------- } // namespace portaudio diff --git a/fdmdv2/extern/include/portaudiocpp/CallbackStream.hxx b/fdmdv2/extern/include/portaudiocpp/CallbackStream.hxx index 0382275e..8ee6d4c4 100644 --- a/fdmdv2/extern/include/portaudiocpp/CallbackStream.hxx +++ b/fdmdv2/extern/include/portaudiocpp/CallbackStream.hxx @@ -14,23 +14,23 @@ namespace portaudio { - ////// - /// @brief Base class for all Streams which use a callback-based mechanism. - ////// - class CallbackStream : public Stream - { - protected: - CallbackStream(); - virtual ~CallbackStream(); - - public: - // stream info (time-varying) - double cpuLoad() const; - - private: - CallbackStream(const CallbackStream &); // non-copyable - CallbackStream &operator=(const CallbackStream &); // non-copyable - }; + ////// + /// @brief Base class for all Streams which use a callback-based mechanism. + ////// + class CallbackStream : public Stream + { + protected: + CallbackStream(); + virtual ~CallbackStream(); + + public: + // stream info (time-varying) + double cpuLoad() const; + + private: + CallbackStream(const CallbackStream &); // non-copyable + CallbackStream &operator=(const CallbackStream &); // non-copyable + }; } // namespace portaudio diff --git a/fdmdv2/extern/include/portaudiocpp/CppFunCallbackStream.hxx b/fdmdv2/extern/include/portaudiocpp/CppFunCallbackStream.hxx index e0c00127..08d1aabe 100644 --- a/fdmdv2/extern/include/portaudiocpp/CppFunCallbackStream.hxx +++ b/fdmdv2/extern/include/portaudiocpp/CppFunCallbackStream.hxx @@ -12,7 +12,7 @@ // Forward declaration(s): namespace portaudio { - class StreamParameters; + class StreamParameters; } // --------------------------------------------------------------------------------------- @@ -22,61 +22,61 @@ namespace portaudio { - namespace impl - { - extern "C" - { - int cppCallbackToPaCallbackAdapter(const void *inputBuffer, void *outputBuffer, unsigned long numFrames, - const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, - void *userData); - } // extern "C" - } - - // ----------------------------------------------------------------------------------- - - ////// - /// @brief Callback stream using a C++ function (either a free function or a static function) - /// callback. - ////// - class FunCallbackStream : public CallbackStream - { - public: - typedef int (*CallbackFunPtr)(const void *inputBuffer, void *outputBuffer, unsigned long numFrames, - const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, - void *userData); - - // ------------------------------------------------------------------------------- - - ////// - /// @brief Simple structure containing a function pointer to the C++ callback function and a - /// (void) pointer to the user supplied data. - ////// - struct CppToCCallbackData - { - CppToCCallbackData(); - CppToCCallbackData(CallbackFunPtr funPtr, void *userData); - void init(CallbackFunPtr funPtr, void *userData); - - CallbackFunPtr funPtr; - void *userData; - }; - - // ------------------------------------------------------------------------------- - - FunCallbackStream(); - FunCallbackStream(const StreamParameters ¶meters, CallbackFunPtr funPtr, void *userData); - ~FunCallbackStream(); - - void open(const StreamParameters ¶meters, CallbackFunPtr funPtr, void *userData); - - private: - FunCallbackStream(const FunCallbackStream &); // non-copyable - FunCallbackStream &operator=(const FunCallbackStream &); // non-copyable - - CppToCCallbackData adapterData_; - - void open(const StreamParameters ¶meters); - }; + namespace impl + { + extern "C" + { + int cppCallbackToPaCallbackAdapter(const void *inputBuffer, void *outputBuffer, unsigned long numFrames, + const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, + void *userData); + } // extern "C" + } + + // ----------------------------------------------------------------------------------- + + ////// + /// @brief Callback stream using a C++ function (either a free function or a static function) + /// callback. + ////// + class FunCallbackStream : public CallbackStream + { + public: + typedef int (*CallbackFunPtr)(const void *inputBuffer, void *outputBuffer, unsigned long numFrames, + const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, + void *userData); + + // ------------------------------------------------------------------------------- + + ////// + /// @brief Simple structure containing a function pointer to the C++ callback function and a + /// (void) pointer to the user supplied data. + ////// + struct CppToCCallbackData + { + CppToCCallbackData(); + CppToCCallbackData(CallbackFunPtr funPtr, void *userData); + void init(CallbackFunPtr funPtr, void *userData); + + CallbackFunPtr funPtr; + void *userData; + }; + + // ------------------------------------------------------------------------------- + + FunCallbackStream(); + FunCallbackStream(const StreamParameters ¶meters, CallbackFunPtr funPtr, void *userData); + ~FunCallbackStream(); + + void open(const StreamParameters ¶meters, CallbackFunPtr funPtr, void *userData); + + private: + FunCallbackStream(const FunCallbackStream &); // non-copyable + FunCallbackStream &operator=(const FunCallbackStream &); // non-copyable + + CppToCCallbackData adapterData_; + + void open(const StreamParameters ¶meters); + }; } // portaudio diff --git a/fdmdv2/extern/include/portaudiocpp/Device.hxx b/fdmdv2/extern/include/portaudiocpp/Device.hxx index ffde7aa8..db5018fa 100644 --- a/fdmdv2/extern/include/portaudiocpp/Device.hxx +++ b/fdmdv2/extern/include/portaudiocpp/Device.hxx @@ -14,8 +14,8 @@ // Forward declaration(s): namespace portaudio { - class System; - class HostApi; + class System; + class HostApi; } // --------------------------------------------------------------------------------------- @@ -24,64 +24,64 @@ namespace portaudio namespace portaudio { - ////// - /// @brief Class which represents a PortAudio device in the System. - /// - /// A single physical device in the system may have multiple PortAudio - /// Device representations using different HostApi 's though. A Device - /// can be half-duplex or full-duplex. A half-duplex Device can be used - /// to create a half-duplex Stream. A full-duplex Device can be used to - /// create a full-duplex Stream. If supported by the HostApi, two - /// half-duplex Devices can even be used to create a full-duplex Stream. - /// - /// Note that Device objects are very light-weight and can be passed around - /// by-value. - ////// - class Device - { - public: - // query info: name, max in channels, max out channels, - // default low/hight input/output latency, default sample rate - PaDeviceIndex index() const; - const char *name() const; - int maxInputChannels() const; - int maxOutputChannels() const; - PaTime defaultLowInputLatency() const; - PaTime defaultHighInputLatency() const; - PaTime defaultLowOutputLatency() const; - PaTime defaultHighOutputLatency() const; - double defaultSampleRate() const; - - bool isInputOnlyDevice() const; // extended - bool isOutputOnlyDevice() const; // extended - bool isFullDuplexDevice() const; // extended - bool isSystemDefaultInputDevice() const; // extended - bool isSystemDefaultOutputDevice() const; // extended - bool isHostApiDefaultInputDevice() const; // extended - bool isHostApiDefaultOutputDevice() const; // extended - - bool operator==(const Device &rhs); - bool operator!=(const Device &rhs); - - // host api reference - HostApi &hostApi(); - const HostApi &hostApi() const; - - private: - PaDeviceIndex index_; - const PaDeviceInfo *info_; - - private: - friend class System; - - explicit Device(PaDeviceIndex index); - ~Device(); - - Device(const Device &); // non-copyable - Device &operator=(const Device &); // non-copyable - }; - - // ----------------------------------------------------------------------------------- + ////// + /// @brief Class which represents a PortAudio device in the System. + /// + /// A single physical device in the system may have multiple PortAudio + /// Device representations using different HostApi 's though. A Device + /// can be half-duplex or full-duplex. A half-duplex Device can be used + /// to create a half-duplex Stream. A full-duplex Device can be used to + /// create a full-duplex Stream. If supported by the HostApi, two + /// half-duplex Devices can even be used to create a full-duplex Stream. + /// + /// Note that Device objects are very light-weight and can be passed around + /// by-value. + ////// + class Device + { + public: + // query info: name, max in channels, max out channels, + // default low/hight input/output latency, default sample rate + PaDeviceIndex index() const; + const char *name() const; + int maxInputChannels() const; + int maxOutputChannels() const; + PaTime defaultLowInputLatency() const; + PaTime defaultHighInputLatency() const; + PaTime defaultLowOutputLatency() const; + PaTime defaultHighOutputLatency() const; + double defaultSampleRate() const; + + bool isInputOnlyDevice() const; // extended + bool isOutputOnlyDevice() const; // extended + bool isFullDuplexDevice() const; // extended + bool isSystemDefaultInputDevice() const; // extended + bool isSystemDefaultOutputDevice() const; // extended + bool isHostApiDefaultInputDevice() const; // extended + bool isHostApiDefaultOutputDevice() const; // extended + + bool operator==(const Device &rhs); + bool operator!=(const Device &rhs); + + // host api reference + HostApi &hostApi(); + const HostApi &hostApi() const; + + private: + PaDeviceIndex index_; + const PaDeviceInfo *info_; + + private: + friend class System; + + explicit Device(PaDeviceIndex index); + ~Device(); + + Device(const Device &); // non-copyable + Device &operator=(const Device &); // non-copyable + }; + + // ----------------------------------------------------------------------------------- } // namespace portaudio diff --git a/fdmdv2/extern/include/portaudiocpp/DirectionSpecificStreamParameters.hxx b/fdmdv2/extern/include/portaudiocpp/DirectionSpecificStreamParameters.hxx index dd5ae0b9..5001149b 100644 --- a/fdmdv2/extern/include/portaudiocpp/DirectionSpecificStreamParameters.hxx +++ b/fdmdv2/extern/include/portaudiocpp/DirectionSpecificStreamParameters.hxx @@ -15,7 +15,7 @@ // Forward declaration(s): namespace portaudio { - class Device; + class Device; } // --------------------------------------------------------------------------------------- @@ -24,50 +24,50 @@ namespace portaudio namespace portaudio { - ////// - /// @brief All parameters for one direction (either in or out) of a Stream. Together with - /// parameters common to both directions, two DirectionSpecificStreamParameters can make up - /// a StreamParameters object which contains all parameters for a Stream. - ////// - class DirectionSpecificStreamParameters - { - public: - static DirectionSpecificStreamParameters null(); + ////// + /// @brief All parameters for one direction (either in or out) of a Stream. Together with + /// parameters common to both directions, two DirectionSpecificStreamParameters can make up + /// a StreamParameters object which contains all parameters for a Stream. + ////// + class DirectionSpecificStreamParameters + { + public: + static DirectionSpecificStreamParameters null(); - DirectionSpecificStreamParameters(); - DirectionSpecificStreamParameters(const Device &device, int numChannels, SampleDataFormat format, - bool interleaved, PaTime suggestedLatency, void *hostApiSpecificStreamInfo); + DirectionSpecificStreamParameters(); + DirectionSpecificStreamParameters(const Device &device, int numChannels, SampleDataFormat format, + bool interleaved, PaTime suggestedLatency, void *hostApiSpecificStreamInfo); - // Set up methods: - void setDevice(const Device &device); - void setNumChannels(int numChannels); + // Set up methods: + void setDevice(const Device &device); + void setNumChannels(int numChannels); - void setSampleFormat(SampleDataFormat format, bool interleaved = true); - void setHostApiSpecificSampleFormat(PaSampleFormat format, bool interleaved = true); + void setSampleFormat(SampleDataFormat format, bool interleaved = true); + void setHostApiSpecificSampleFormat(PaSampleFormat format, bool interleaved = true); - void setSuggestedLatency(PaTime latency); + void setSuggestedLatency(PaTime latency); - void setHostApiSpecificStreamInfo(void *streamInfo); + void setHostApiSpecificStreamInfo(void *streamInfo); - // Accessor methods: - PaStreamParameters *paStreamParameters(); - const PaStreamParameters *paStreamParameters() const; + // Accessor methods: + PaStreamParameters *paStreamParameters(); + const PaStreamParameters *paStreamParameters() const; - Device &device() const; - int numChannels() const; + Device &device() const; + int numChannels() const; - SampleDataFormat sampleFormat() const; - bool isSampleFormatInterleaved() const; - bool isSampleFormatHostApiSpecific() const; - PaSampleFormat hostApiSpecificSampleFormat() const; + SampleDataFormat sampleFormat() const; + bool isSampleFormatInterleaved() const; + bool isSampleFormatHostApiSpecific() const; + PaSampleFormat hostApiSpecificSampleFormat() const; - PaTime suggestedLatency() const; + PaTime suggestedLatency() const; - void *hostApiSpecificStreamInfo() const; - - private: - PaStreamParameters paStreamParameters_; - }; + void *hostApiSpecificStreamInfo() const; + + private: + PaStreamParameters paStreamParameters_; + }; } // namespace portaudio diff --git a/fdmdv2/extern/include/portaudiocpp/Exception.hxx b/fdmdv2/extern/include/portaudiocpp/Exception.hxx index a70c2f1d..96e4ad2f 100644 --- a/fdmdv2/extern/include/portaudiocpp/Exception.hxx +++ b/fdmdv2/extern/include/portaudiocpp/Exception.hxx @@ -12,92 +12,92 @@ namespace portaudio { - ////// - /// @brief Base class for all exceptions PortAudioCpp can throw. - /// - /// Class is derived from std::exception. - ////// - class Exception : public std::exception - { - public: - virtual ~Exception() throw() {} - - virtual const char *what() const throw() = 0; - }; - - // ----------------------------------------------------------------------------------- - - ////// - /// @brief Wrapper for PortAudio error codes to C++ exceptions. - /// - /// It wraps up PortAudio's error handling mechanism using - /// C++ exceptions and is derived from std::exception for - /// easy exception handling and to ease integration with - /// other code. - /// - /// To know what exceptions each function may throw, look up - /// the errors that can occure in the PortAudio documentation - /// for the equivalent functions. - /// - /// Some functions are likely to throw an exception (such as - /// Stream::open(), etc) and these should always be called in - /// try{} catch{} blocks and the thrown exceptions should be - /// handled properly (ie. the application shouldn't just abort, - /// but merely display a warning dialog to the user or something). - /// However nearly all functions in PortAudioCpp are capable - /// of throwing exceptions. When a function like Stream::isStopped() - /// throws an exception, it's such an exceptional state that it's - /// not likely that it can be recovered. PaExceptions such as these - /// can ``safely'' be left to be handled by some outer catch-all-like - /// mechanism for unrecoverable errors. - ////// - class PaException : public Exception - { - public: - explicit PaException(PaError error); - - const char *what() const throw(); - - PaError paError() const; - const char *paErrorText() const; - - bool isHostApiError() const; // extended - long lastHostApiError() const; - const char *lastHostApiErrorText() const; - - bool operator==(const PaException &rhs) const; - bool operator!=(const PaException &rhs) const; - - private: - PaError error_; - }; - - // ----------------------------------------------------------------------------------- - - ////// - /// @brief Exceptions specific to PortAudioCpp (ie. exceptions which do not have an - /// equivalent PortAudio error code). - ////// - class PaCppException : public Exception - { - public: - enum ExceptionSpecifier - { - UNABLE_TO_ADAPT_DEVICE - }; - - PaCppException(ExceptionSpecifier specifier); - - const char *what() const throw(); - - ExceptionSpecifier specifier() const; - - bool operator==(const PaCppException &rhs) const; - bool operator!=(const PaCppException &rhs) const; - - private: - ExceptionSpecifier specifier_; - }; + ////// + /// @brief Base class for all exceptions PortAudioCpp can throw. + /// + /// Class is derived from std::exception. + ////// + class Exception : public std::exception + { + public: + virtual ~Exception() throw() {} + + virtual const char *what() const throw() = 0; + }; + + // ----------------------------------------------------------------------------------- + + ////// + /// @brief Wrapper for PortAudio error codes to C++ exceptions. + /// + /// It wraps up PortAudio's error handling mechanism using + /// C++ exceptions and is derived from std::exception for + /// easy exception handling and to ease integration with + /// other code. + /// + /// To know what exceptions each function may throw, look up + /// the errors that can occure in the PortAudio documentation + /// for the equivalent functions. + /// + /// Some functions are likely to throw an exception (such as + /// Stream::open(), etc) and these should always be called in + /// try{} catch{} blocks and the thrown exceptions should be + /// handled properly (ie. the application shouldn't just abort, + /// but merely display a warning dialog to the user or something). + /// However nearly all functions in PortAudioCpp are capable + /// of throwing exceptions. When a function like Stream::isStopped() + /// throws an exception, it's such an exceptional state that it's + /// not likely that it can be recovered. PaExceptions such as these + /// can ``safely'' be left to be handled by some outer catch-all-like + /// mechanism for unrecoverable errors. + ////// + class PaException : public Exception + { + public: + explicit PaException(PaError error); + + const char *what() const throw(); + + PaError paError() const; + const char *paErrorText() const; + + bool isHostApiError() const; // extended + long lastHostApiError() const; + const char *lastHostApiErrorText() const; + + bool operator==(const PaException &rhs) const; + bool operator!=(const PaException &rhs) const; + + private: + PaError error_; + }; + + // ----------------------------------------------------------------------------------- + + ////// + /// @brief Exceptions specific to PortAudioCpp (ie. exceptions which do not have an + /// equivalent PortAudio error code). + ////// + class PaCppException : public Exception + { + public: + enum ExceptionSpecifier + { + UNABLE_TO_ADAPT_DEVICE + }; + + PaCppException(ExceptionSpecifier specifier); + + const char *what() const throw(); + + ExceptionSpecifier specifier() const; + + bool operator==(const PaCppException &rhs) const; + bool operator!=(const PaCppException &rhs) const; + + private: + ExceptionSpecifier specifier_; + }; } // namespace portaudio diff --git a/fdmdv2/extern/include/portaudiocpp/HostApi.hxx b/fdmdv2/extern/include/portaudiocpp/HostApi.hxx index 899fc42d..a51cfe07 100644 --- a/fdmdv2/extern/include/portaudiocpp/HostApi.hxx +++ b/fdmdv2/extern/include/portaudiocpp/HostApi.hxx @@ -12,7 +12,7 @@ // Forward declaration(s): namespace portaudio { - class Device; + class Device; } // --------------------------------------------------------------------------------------- @@ -22,50 +22,50 @@ namespace portaudio { - ////// - /// @brief HostApi represents a host API (usually type of driver) in the System. - /// - /// A single System can support multiple HostApi's each one typically having - /// a set of Devices using that HostApi (usually driver type). All Devices in - /// the HostApi can be enumerated and the default input/output Device for this - /// HostApi can be retreived. - ////// - class HostApi - { - public: - typedef System::DeviceIterator DeviceIterator; - - // query info: id, name, numDevices - PaHostApiTypeId typeId() const; - PaHostApiIndex index() const; - const char *name() const; - int deviceCount() const; - - // iterate devices - DeviceIterator devicesBegin(); - DeviceIterator devicesEnd(); - - // default devices - Device &defaultInputDevice() const; - Device &defaultOutputDevice() const; - - // comparison operators - bool operator==(const HostApi &rhs) const; - bool operator!=(const HostApi &rhs) const; - - private: - const PaHostApiInfo *info_; - Device **devices_; - - private: - friend class System; - - explicit HostApi(PaHostApiIndex index); - ~HostApi(); - - HostApi(const HostApi &); // non-copyable - HostApi &operator=(const HostApi &); // non-copyable - }; + ////// + /// @brief HostApi represents a host API (usually type of driver) in the System. + /// + /// A single System can support multiple HostApi's each one typically having + /// a set of Devices using that HostApi (usually driver type). All Devices in + /// the HostApi can be enumerated and the default input/output Device for this + /// HostApi can be retreived. + ////// + class HostApi + { + public: + typedef System::DeviceIterator DeviceIterator; + + // query info: id, name, numDevices + PaHostApiTypeId typeId() const; + PaHostApiIndex index() const; + const char *name() const; + int deviceCount() const; + + // iterate devices + DeviceIterator devicesBegin(); + DeviceIterator devicesEnd(); + + // default devices + Device &defaultInputDevice() const; + Device &defaultOutputDevice() const; + + // comparison operators + bool operator==(const HostApi &rhs) const; + bool operator!=(const HostApi &rhs) const; + + private: + const PaHostApiInfo *info_; + Device **devices_; + + private: + friend class System; + + explicit HostApi(PaHostApiIndex index); + ~HostApi(); + + HostApi(const HostApi &); // non-copyable + HostApi &operator=(const HostApi &); // non-copyable + }; } diff --git a/fdmdv2/extern/include/portaudiocpp/InterfaceCallbackStream.hxx b/fdmdv2/extern/include/portaudiocpp/InterfaceCallbackStream.hxx index e496dd27..5e03035b 100644 --- a/fdmdv2/extern/include/portaudiocpp/InterfaceCallbackStream.hxx +++ b/fdmdv2/extern/include/portaudiocpp/InterfaceCallbackStream.hxx @@ -12,8 +12,8 @@ // Forward declaration(s) namespace portaudio { - class StreamParameters; - class CallbackInterface; + class StreamParameters; + class CallbackInterface; } // --------------------------------------------------------------------------------------- @@ -23,23 +23,23 @@ namespace portaudio { - ////// - /// @brief Callback stream using an instance of an object that's derived from the CallbackInterface - /// interface. - ////// - class InterfaceCallbackStream : public CallbackStream - { - public: - InterfaceCallbackStream(); - InterfaceCallbackStream(const StreamParameters ¶meters, CallbackInterface &instance); - ~InterfaceCallbackStream(); - - void open(const StreamParameters ¶meters, CallbackInterface &instance); - - private: - InterfaceCallbackStream(const InterfaceCallbackStream &); // non-copyable - InterfaceCallbackStream &operator=(const InterfaceCallbackStream &); // non-copyable - }; + ////// + /// @brief Callback stream using an instance of an object that's derived from the CallbackInterface + /// interface. + ////// + class InterfaceCallbackStream : public CallbackStream + { + public: + InterfaceCallbackStream(); + InterfaceCallbackStream(const StreamParameters ¶meters, CallbackInterface &instance); + ~InterfaceCallbackStream(); + + void open(const StreamParameters ¶meters, CallbackInterface &instance); + + private: + InterfaceCallbackStream(const InterfaceCallbackStream &); // non-copyable + InterfaceCallbackStream &operator=(const InterfaceCallbackStream &); // non-copyable + }; } // portaudio diff --git a/fdmdv2/extern/include/portaudiocpp/MemFunCallbackStream.hxx b/fdmdv2/extern/include/portaudiocpp/MemFunCallbackStream.hxx index a9e50ca6..a04c5be3 100644 --- a/fdmdv2/extern/include/portaudiocpp/MemFunCallbackStream.hxx +++ b/fdmdv2/extern/include/portaudiocpp/MemFunCallbackStream.hxx @@ -17,87 +17,87 @@ namespace portaudio { - ////// - /// @brief Callback stream using a class's member function as a callback. Template argument T is the type of the - /// class of which a member function is going to be used. - /// - /// Example usage: - /// @verbatim MemFunCallback stream = MemFunCallbackStream(parameters, *this, &MyClass::myCallbackFunction); @endverbatim - ////// - template - class MemFunCallbackStream : public CallbackStream - { - public: - typedef int (T::*CallbackFunPtr)(const void *, void *, unsigned long, const PaStreamCallbackTimeInfo *, - PaStreamCallbackFlags); - - // ------------------------------------------------------------------------------- - - MemFunCallbackStream() - { - } - - MemFunCallbackStream(const StreamParameters ¶meters, T &instance, CallbackFunPtr memFun) : adapter_(instance, memFun) - { - open(parameters); - } - - ~MemFunCallbackStream() - { - close(); - } - - void open(const StreamParameters ¶meters, T &instance, CallbackFunPtr memFun) - { - // XXX: need to check if already open? - - adapter_.init(instance, memFun); - open(parameters); - } - - private: - MemFunCallbackStream(const MemFunCallbackStream &); // non-copyable - MemFunCallbackStream &operator=(const MemFunCallbackStream &); // non-copyable - - ////// - /// @brief Inner class which adapts a member function callback to a CallbackInterface compliant - /// class (so it can be adapted using the paCallbackAdapter function). - ////// - class MemFunToCallbackInterfaceAdapter : public CallbackInterface - { - public: - MemFunToCallbackInterfaceAdapter() {} - MemFunToCallbackInterfaceAdapter(T &instance, CallbackFunPtr memFun) : instance_(&instance), memFun_(memFun) {} - - void init(T &instance, CallbackFunPtr memFun) - { - instance_ = &instance; - memFun_ = memFun; - } - - int paCallbackFun(const void *inputBuffer, void *outputBuffer, unsigned long numFrames, - const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags) - { - return (instance_->*memFun_)(inputBuffer, outputBuffer, numFrames, timeInfo, statusFlags); - } - - private: - T *instance_; - CallbackFunPtr memFun_; - }; - - MemFunToCallbackInterfaceAdapter adapter_; - - void open(const StreamParameters ¶meters) - { - PaError err = Pa_OpenStream(&stream_, parameters.inputParameters().paStreamParameters(), parameters.outputParameters().paStreamParameters(), - parameters.sampleRate(), parameters.framesPerBuffer(), parameters.flags(), &impl::callbackInterfaceToPaCallbackAdapter, - static_cast(&adapter_)); - - if (err != paNoError) - throw PaException(err); - } - }; + ////// + /// @brief Callback stream using a class's member function as a callback. Template argument T is the type of the + /// class of which a member function is going to be used. + /// + /// Example usage: + /// @verbatim MemFunCallback stream = MemFunCallbackStream(parameters, *this, &MyClass::myCallbackFunction); @endverbatim + ////// + template + class MemFunCallbackStream : public CallbackStream + { + public: + typedef int (T::*CallbackFunPtr)(const void *, void *, unsigned long, const PaStreamCallbackTimeInfo *, + PaStreamCallbackFlags); + + // ------------------------------------------------------------------------------- + + MemFunCallbackStream() + { + } + + MemFunCallbackStream(const StreamParameters ¶meters, T &instance, CallbackFunPtr memFun) : adapter_(instance, memFun) + { + open(parameters); + } + + ~MemFunCallbackStream() + { + close(); + } + + void open(const StreamParameters ¶meters, T &instance, CallbackFunPtr memFun) + { + // XXX: need to check if already open? + + adapter_.init(instance, memFun); + open(parameters); + } + + private: + MemFunCallbackStream(const MemFunCallbackStream &); // non-copyable + MemFunCallbackStream &operator=(const MemFunCallbackStream &); // non-copyable + + ////// + /// @brief Inner class which adapts a member function callback to a CallbackInterface compliant + /// class (so it can be adapted using the paCallbackAdapter function). + ////// + class MemFunToCallbackInterfaceAdapter : public CallbackInterface + { + public: + MemFunToCallbackInterfaceAdapter() {} + MemFunToCallbackInterfaceAdapter(T &instance, CallbackFunPtr memFun) : instance_(&instance), memFun_(memFun) {} + + void init(T &instance, CallbackFunPtr memFun) + { + instance_ = &instance; + memFun_ = memFun; + } + + int paCallbackFun(const void *inputBuffer, void *outputBuffer, unsigned long numFrames, + const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags) + { + return (instance_->*memFun_)(inputBuffer, outputBuffer, numFrames, timeInfo, statusFlags); + } + + private: + T *instance_; + CallbackFunPtr memFun_; + }; + + MemFunToCallbackInterfaceAdapter adapter_; + + void open(const StreamParameters ¶meters) + { + PaError err = Pa_OpenStream(&stream_, parameters.inputParameters().paStreamParameters(), parameters.outputParameters().paStreamParameters(), + parameters.sampleRate(), parameters.framesPerBuffer(), parameters.flags(), &impl::callbackInterfaceToPaCallbackAdapter, + static_cast(&adapter_)); + + if (err != paNoError) + throw PaException(err); + } + }; } // portaudio diff --git a/fdmdv2/extern/include/portaudiocpp/PortAudioCpp.hxx b/fdmdv2/extern/include/portaudiocpp/PortAudioCpp.hxx index f11e7fb9..9b9dfe36 100644 --- a/fdmdv2/extern/include/portaudiocpp/PortAudioCpp.hxx +++ b/fdmdv2/extern/include/portaudiocpp/PortAudioCpp.hxx @@ -6,23 +6,23 @@ ////// /// @mainpage PortAudioCpp /// -///

PortAudioCpp - A Native C++ Binding of PortAudio V19

+///

PortAudioCpp - A Native C++ Binding of PortAudio V19

///

PortAudio

///

-/// PortAudio is a portable and mature C API for accessing audio hardware. It offers both callback-based and blocking -/// style input and output, deals with sample data format conversions, dithering and much more. There are a large number -/// of implementations available for various platforms including Windows MME, Windows DirectX, Windows and MacOS (Classic) -/// ASIO, MacOS Classic SoundManager, MacOS X CoreAudio, OSS (Linux), Linux ALSA, JACK (MacOS X and Linux) and SGI Irix -/// AL. Note that, currently not all of these implementations are equally complete or up-to-date (as PortAudio V19 is -/// still in development). Because PortAudio has a C API, it can easily be called from a variety of other programming +/// PortAudio is a portable and mature C API for accessing audio hardware. It offers both callback-based and blocking +/// style input and output, deals with sample data format conversions, dithering and much more. There are a large number +/// of implementations available for various platforms including Windows MME, Windows DirectX, Windows and MacOS (Classic) +/// ASIO, MacOS Classic SoundManager, MacOS X CoreAudio, OSS (Linux), Linux ALSA, JACK (MacOS X and Linux) and SGI Irix +/// AL. Note that, currently not all of these implementations are equally complete or up-to-date (as PortAudio V19 is +/// still in development). Because PortAudio has a C API, it can easily be called from a variety of other programming /// languages. ///

///

PortAudioCpp

///

-/// Although, it is possible to use PortAudio's C API from within a C++ program, this is usually a little awkward -/// as procedural and object-oriented paradigms need to be mixed. PortAudioCpp aims to resolve this by encapsulating -/// PortAudio's C API to form an equivalent object-oriented C++ API. It provides a more natural integration of PortAudio -/// into C++ programs as well as a more structured interface. PortAudio's concepts were preserved as much as possible and +/// Although, it is possible to use PortAudio's C API from within a C++ program, this is usually a little awkward +/// as procedural and object-oriented paradigms need to be mixed. PortAudioCpp aims to resolve this by encapsulating +/// PortAudio's C API to form an equivalent object-oriented C++ API. It provides a more natural integration of PortAudio +/// into C++ programs as well as a more structured interface. PortAudio's concepts were preserved as much as possible and /// no additional features were added except for some `convenience methods'. ///

///

@@ -30,15 +30,15 @@ ///

    ///
  • Structured object model.
  • ///
  • C++ exception handling instead of C-style error return codes.
  • -///
  • Handling of callbacks using free functions (C and C++), static functions, member functions or instances of classes +///
  • Handling of callbacks using free functions (C and C++), static functions, member functions or instances of classes /// derived from a given interface.
  • ///
  • STL compliant iterators to host APIs and devices.
  • ///
  • Some additional convenience functions to more easily set up and use PortAudio.
  • ///
///

///

-/// PortAudioCpp requires a recent version of the PortAudio V19 source code. This can be obtained from CVS or as a snapshot -/// from the website. The examples also require the ASIO 2 SDK which can be obtained from the Steinberg website. Alternatively, the +/// PortAudioCpp requires a recent version of the PortAudio V19 source code. This can be obtained from CVS or as a snapshot +/// from the website. The examples also require the ASIO 2 SDK which can be obtained from the Steinberg website. Alternatively, the /// examples can easily be modified to compile without needing ASIO. ///

///

@@ -50,12 +50,12 @@ /// Other platforms should be easily supported as PortAudioCpp is platform-independent and (reasonably) C++ standard compliant. ///

///

-/// This documentation mainly provides information specific to PortAudioCpp. For a more complete explaination of all of the +/// This documentation mainly provides information specific to PortAudioCpp. For a more complete explaination of all of the /// concepts used, please consult the PortAudio documentation. ///

///

-/// PortAudioCpp was developed by Merlijn Blaauw with many great suggestions and help from Ross Bencina. Ludwig Schwardt provided -/// GNU/Linux build files and checked G++ compatibility. PortAudioCpp may be used under the same licensing, conditions and +/// PortAudioCpp was developed by Merlijn Blaauw with many great suggestions and help from Ross Bencina. Ludwig Schwardt provided +/// GNU/Linux build files and checked G++ compatibility. PortAudioCpp may be used under the same licensing, conditions and /// warranty as PortAudio. See the PortAudio license for more details. ///

///

Links

@@ -69,8 +69,8 @@ ////// /// @namespace portaudio /// -/// To avoid name collision, everything in PortAudioCpp is in the portaudio -/// namespace. If this name is too long it's usually pretty safe to use an +/// To avoid name collision, everything in PortAudioCpp is in the portaudio +/// namespace. If this name is too long it's usually pretty safe to use an /// alias like ``namespace pa = portaudio;''. ////// diff --git a/fdmdv2/extern/include/portaudiocpp/SampleDataFormat.hxx b/fdmdv2/extern/include/portaudiocpp/SampleDataFormat.hxx index a7e25b24..5224768b 100644 --- a/fdmdv2/extern/include/portaudiocpp/SampleDataFormat.hxx +++ b/fdmdv2/extern/include/portaudiocpp/SampleDataFormat.hxx @@ -11,21 +11,21 @@ namespace portaudio { - ////// - /// @brief PortAudio sample data formats. - /// - /// Small helper enum to wrap the PortAudio defines. - ////// - enum SampleDataFormat - { - INVALID_FORMAT = 0, - FLOAT32 = paFloat32, - INT32 = paInt32, - INT24 = paInt24, - INT16 = paInt16, - INT8 = paInt8, - UINT8 = paUInt8 - }; + ////// + /// @brief PortAudio sample data formats. + /// + /// Small helper enum to wrap the PortAudio defines. + ////// + enum SampleDataFormat + { + INVALID_FORMAT = 0, + FLOAT32 = paFloat32, + INT32 = paInt32, + INT24 = paInt24, + INT16 = paInt16, + INT8 = paInt8, + UINT8 = paUInt8 + }; } // namespace portaudio diff --git a/fdmdv2/extern/include/portaudiocpp/Stream.hxx b/fdmdv2/extern/include/portaudiocpp/Stream.hxx index 8a255ec7..80c363d0 100644 --- a/fdmdv2/extern/include/portaudiocpp/Stream.hxx +++ b/fdmdv2/extern/include/portaudiocpp/Stream.hxx @@ -8,7 +8,7 @@ // Forward declaration(s): namespace portaudio { - class StreamParameters; + class StreamParameters; } // --------------------------------------------------------------------------------------- @@ -18,61 +18,61 @@ namespace portaudio { - ////// - /// @brief A Stream represents an active or inactive input and/or output data - /// stream in the System. - /// - /// Concrete Stream classes should ensure themselves being in a closed state at - /// destruction (i.e. by calling their own close() method in their deconstructor). - /// Following good C++ programming practices, care must be taken to ensure no - /// exceptions are thrown by the deconstructor of these classes. As a consequence, - /// clients need to explicitly call close() to ensure the stream closed successfully. - /// - /// The Stream object can be used to manipulate the Stream's state. Also, time-constant - /// and time-varying information about the Stream can be retreived. - ////// - class Stream - { - public: - // Opening/closing: - virtual ~Stream(); - - virtual void close(); - bool isOpen() const; - - // Additional set up: - void setStreamFinishedCallback(PaStreamFinishedCallback *callback); - - // State management: - void start(); - void stop(); - void abort(); - - bool isStopped() const; - bool isActive() const; - - // Stream info (time-constant, but might become time-variant soon): - PaTime inputLatency() const; - PaTime outputLatency() const; - double sampleRate() const; - - // Stream info (time-varying): - PaTime time() const; - - // Accessors for PortAudio PaStream, useful for interfacing - // with PortAudio add-ons (such as PortMixer) for instance: - const PaStream *paStream() const; - PaStream *paStream(); - - protected: - Stream(); // abstract class - - PaStream *stream_; - - private: - Stream(const Stream &); // non-copyable - Stream &operator=(const Stream &); // non-copyable - }; + ////// + /// @brief A Stream represents an active or inactive input and/or output data + /// stream in the System. + /// + /// Concrete Stream classes should ensure themselves being in a closed state at + /// destruction (i.e. by calling their own close() method in their deconstructor). + /// Following good C++ programming practices, care must be taken to ensure no + /// exceptions are thrown by the deconstructor of these classes. As a consequence, + /// clients need to explicitly call close() to ensure the stream closed successfully. + /// + /// The Stream object can be used to manipulate the Stream's state. Also, time-constant + /// and time-varying information about the Stream can be retreived. + ////// + class Stream + { + public: + // Opening/closing: + virtual ~Stream(); + + virtual void close(); + bool isOpen() const; + + // Additional set up: + void setStreamFinishedCallback(PaStreamFinishedCallback *callback); + + // State management: + void start(); + void stop(); + void abort(); + + bool isStopped() const; + bool isActive() const; + + // Stream info (time-constant, but might become time-variant soon): + PaTime inputLatency() const; + PaTime outputLatency() const; + double sampleRate() const; + + // Stream info (time-varying): + PaTime time() const; + + // Accessors for PortAudio PaStream, useful for interfacing + // with PortAudio add-ons (such as PortMixer) for instance: + const PaStream *paStream() const; + PaStream *paStream(); + + protected: + Stream(); // abstract class + + PaStream *stream_; + + private: + Stream(const Stream &); // non-copyable + Stream &operator=(const Stream &); // non-copyable + }; } // namespace portaudio diff --git a/fdmdv2/extern/include/portaudiocpp/StreamParameters.hxx b/fdmdv2/extern/include/portaudiocpp/StreamParameters.hxx index 2b6aa2ef..d9b90e9e 100644 --- a/fdmdv2/extern/include/portaudiocpp/StreamParameters.hxx +++ b/fdmdv2/extern/include/portaudiocpp/StreamParameters.hxx @@ -13,61 +13,61 @@ namespace portaudio { - ////// - /// @brief The entire set of parameters needed to configure and open - /// a Stream. - /// - /// It contains parameters of input, output and shared parameters. - /// Using the isSupported() method, the StreamParameters can be - /// checked if opening a Stream using this StreamParameters would - /// succeed or not. Accessors are provided to higher-level parameters - /// aswell as the lower-level parameters which are mainly intended for - /// internal use. - ////// - class StreamParameters - { - public: - StreamParameters(); - StreamParameters(const DirectionSpecificStreamParameters &inputParameters, - const DirectionSpecificStreamParameters &outputParameters, double sampleRate, - unsigned long framesPerBuffer, PaStreamFlags flags); - - // Set up for direction-specific: - void setInputParameters(const DirectionSpecificStreamParameters ¶meters); - void setOutputParameters(const DirectionSpecificStreamParameters ¶meters); - - // Set up for common parameters: - void setSampleRate(double sampleRate); - void setFramesPerBuffer(unsigned long framesPerBuffer); - void setFlag(PaStreamFlags flag); - void unsetFlag(PaStreamFlags flag); - void clearFlags(); - - // Validation: - bool isSupported() const; - - // Accessors (direction-specific): - DirectionSpecificStreamParameters &inputParameters(); - const DirectionSpecificStreamParameters &inputParameters() const; - DirectionSpecificStreamParameters &outputParameters(); - const DirectionSpecificStreamParameters &outputParameters() const; - - // Accessors (common): - double sampleRate() const; - unsigned long framesPerBuffer() const; - PaStreamFlags flags() const; - bool isFlagSet(PaStreamFlags flag) const; - - private: - // Half-duplex specific parameters: - DirectionSpecificStreamParameters inputParameters_; - DirectionSpecificStreamParameters outputParameters_; - - // Common parameters: - double sampleRate_; - unsigned long framesPerBuffer_; - PaStreamFlags flags_; - }; + ////// + /// @brief The entire set of parameters needed to configure and open + /// a Stream. + /// + /// It contains parameters of input, output and shared parameters. + /// Using the isSupported() method, the StreamParameters can be + /// checked if opening a Stream using this StreamParameters would + /// succeed or not. Accessors are provided to higher-level parameters + /// aswell as the lower-level parameters which are mainly intended for + /// internal use. + ////// + class StreamParameters + { + public: + StreamParameters(); + StreamParameters(const DirectionSpecificStreamParameters &inputParameters, + const DirectionSpecificStreamParameters &outputParameters, double sampleRate, + unsigned long framesPerBuffer, PaStreamFlags flags); + + // Set up for direction-specific: + void setInputParameters(const DirectionSpecificStreamParameters ¶meters); + void setOutputParameters(const DirectionSpecificStreamParameters ¶meters); + + // Set up for common parameters: + void setSampleRate(double sampleRate); + void setFramesPerBuffer(unsigned long framesPerBuffer); + void setFlag(PaStreamFlags flag); + void unsetFlag(PaStreamFlags flag); + void clearFlags(); + + // Validation: + bool isSupported() const; + + // Accessors (direction-specific): + DirectionSpecificStreamParameters &inputParameters(); + const DirectionSpecificStreamParameters &inputParameters() const; + DirectionSpecificStreamParameters &outputParameters(); + const DirectionSpecificStreamParameters &outputParameters() const; + + // Accessors (common): + double sampleRate() const; + unsigned long framesPerBuffer() const; + PaStreamFlags flags() const; + bool isFlagSet(PaStreamFlags flag) const; + + private: + // Half-duplex specific parameters: + DirectionSpecificStreamParameters inputParameters_; + DirectionSpecificStreamParameters outputParameters_; + + // Common parameters: + double sampleRate_; + unsigned long framesPerBuffer_; + PaStreamFlags flags_; + }; } // namespace portaudio diff --git a/fdmdv2/extern/include/portaudiocpp/System.hxx b/fdmdv2/extern/include/portaudiocpp/System.hxx index f5fb7132..014cc20b 100644 --- a/fdmdv2/extern/include/portaudiocpp/System.hxx +++ b/fdmdv2/extern/include/portaudiocpp/System.hxx @@ -10,9 +10,9 @@ // Forward declaration(s): namespace portaudio { - class Device; - class Stream; - class HostApi; + class Device; + class Stream; + class HostApi; } // --------------------------------------------------------------------------------------- @@ -22,82 +22,82 @@ namespace portaudio { - ////// - /// @brief System singleton which represents the PortAudio system. - /// - /// The System is used to initialize/terminate PortAudio and provide - /// a single acccess point to the PortAudio System (instance()). - /// It can be used to iterate through all HostApi 's in the System as - /// well as all devices in the System. It also provides some utility - /// functionality of PortAudio. - /// - /// Terminating the System will also abort and close the open streams. - /// The Stream objects will need to be deallocated by the client though - /// (it's usually a good idea to have them cleaned up automatically). - ////// - class System - { - public: - class HostApiIterator; // forward declaration - class DeviceIterator; // forward declaration + ////// + /// @brief System singleton which represents the PortAudio system. + /// + /// The System is used to initialize/terminate PortAudio and provide + /// a single acccess point to the PortAudio System (instance()). + /// It can be used to iterate through all HostApi 's in the System as + /// well as all devices in the System. It also provides some utility + /// functionality of PortAudio. + /// + /// Terminating the System will also abort and close the open streams. + /// The Stream objects will need to be deallocated by the client though + /// (it's usually a good idea to have them cleaned up automatically). + ////// + class System + { + public: + class HostApiIterator; // forward declaration + class DeviceIterator; // forward declaration - // ------------------------------------------------------------------------------- + // ------------------------------------------------------------------------------- - static int version(); - static const char *versionText(); + static int version(); + static const char *versionText(); - static void initialize(); - static void terminate(); + static void initialize(); + static void terminate(); - static System &instance(); - static bool exists(); + static System &instance(); + static bool exists(); - // ------------------------------------------------------------------------------- + // ------------------------------------------------------------------------------- - // host apis: - HostApiIterator hostApisBegin(); - HostApiIterator hostApisEnd(); + // host apis: + HostApiIterator hostApisBegin(); + HostApiIterator hostApisEnd(); - HostApi &defaultHostApi(); + HostApi &defaultHostApi(); - HostApi &hostApiByTypeId(PaHostApiTypeId type); - HostApi &hostApiByIndex(PaHostApiIndex index); + HostApi &hostApiByTypeId(PaHostApiTypeId type); + HostApi &hostApiByIndex(PaHostApiIndex index); - int hostApiCount(); + int hostApiCount(); - // ------------------------------------------------------------------------------- + // ------------------------------------------------------------------------------- - // devices: - DeviceIterator devicesBegin(); - DeviceIterator devicesEnd(); + // devices: + DeviceIterator devicesBegin(); + DeviceIterator devicesEnd(); - Device &defaultInputDevice(); - Device &defaultOutputDevice(); + Device &defaultInputDevice(); + Device &defaultOutputDevice(); - Device &deviceByIndex(PaDeviceIndex index); + Device &deviceByIndex(PaDeviceIndex index); - int deviceCount(); + int deviceCount(); - static Device &nullDevice(); + static Device &nullDevice(); - // ------------------------------------------------------------------------------- + // ------------------------------------------------------------------------------- - // misc: - void sleep(long msec); - int sizeOfSample(PaSampleFormat format); + // misc: + void sleep(long msec); + int sizeOfSample(PaSampleFormat format); - private: - System(); - ~System(); + private: + System(); + ~System(); - static System *instance_; - static int initCount_; + static System *instance_; + static int initCount_; - static HostApi **hostApis_; - static Device **devices_; + static HostApi **hostApis_; + static Device **devices_; - static Device *nullDevice_; - }; + static Device *nullDevice_; + }; } // namespace portaudio diff --git a/fdmdv2/extern/include/portaudiocpp/SystemDeviceIterator.hxx b/fdmdv2/extern/include/portaudiocpp/SystemDeviceIterator.hxx index 613fc3db..8dc8ed67 100644 --- a/fdmdv2/extern/include/portaudiocpp/SystemDeviceIterator.hxx +++ b/fdmdv2/extern/include/portaudiocpp/SystemDeviceIterator.hxx @@ -13,8 +13,8 @@ // Forward declaration(s): namespace portaudio { - class Device; - class HostApi; + class Device; + class HostApi; } // --------------------------------------------------------------------------------------- @@ -23,39 +23,39 @@ namespace portaudio namespace portaudio { - - ////// - /// @brief Iterator class for iterating through all Devices in a System. - /// - /// Devices will be iterated by iterating all Devices in each - /// HostApi in the System. Compliant with the STL bidirectional - /// iterator concept. - ////// - class System::DeviceIterator - { - public: - typedef std::bidirectional_iterator_tag iterator_category; - typedef Device value_type; - typedef ptrdiff_t difference_type; - typedef Device * pointer; - typedef Device & reference; - - Device &operator*() const; - Device *operator->() const; - - DeviceIterator &operator++(); - DeviceIterator operator++(int); - DeviceIterator &operator--(); - DeviceIterator operator--(int); - - bool operator==(const DeviceIterator &rhs); - bool operator!=(const DeviceIterator &rhs); - - private: - friend class System; - friend class HostApi; - Device **ptr_; - }; + + ////// + /// @brief Iterator class for iterating through all Devices in a System. + /// + /// Devices will be iterated by iterating all Devices in each + /// HostApi in the System. Compliant with the STL bidirectional + /// iterator concept. + ////// + class System::DeviceIterator + { + public: + typedef std::bidirectional_iterator_tag iterator_category; + typedef Device value_type; + typedef ptrdiff_t difference_type; + typedef Device * pointer; + typedef Device & reference; + + Device &operator*() const; + Device *operator->() const; + + DeviceIterator &operator++(); + DeviceIterator operator++(int); + DeviceIterator &operator--(); + DeviceIterator operator--(int); + + bool operator==(const DeviceIterator &rhs); + bool operator!=(const DeviceIterator &rhs); + + private: + friend class System; + friend class HostApi; + Device **ptr_; + }; } // namespace portaudio diff --git a/fdmdv2/extern/include/portaudiocpp/SystemHostApiIterator.hxx b/fdmdv2/extern/include/portaudiocpp/SystemHostApiIterator.hxx index b9b13b85..82988776 100644 --- a/fdmdv2/extern/include/portaudiocpp/SystemHostApiIterator.hxx +++ b/fdmdv2/extern/include/portaudiocpp/SystemHostApiIterator.hxx @@ -13,7 +13,7 @@ // Forward declaration(s): namespace portaudio { - class HostApi; + class HostApi; } // --------------------------------------------------------------------------------------- @@ -23,35 +23,35 @@ namespace portaudio { - ////// - /// @brief Iterator class for iterating through all HostApis in a System. - /// - /// Compliant with the STL bidirectional iterator concept. - ////// - class System::HostApiIterator - { - public: - typedef std::bidirectional_iterator_tag iterator_category; - typedef Device value_type; - typedef ptrdiff_t difference_type; - typedef HostApi * pointer; - typedef HostApi & reference; - - HostApi &operator*() const; - HostApi *operator->() const; - - HostApiIterator &operator++(); - HostApiIterator operator++(int); - HostApiIterator &operator--(); - HostApiIterator operator--(int); - - bool operator==(const HostApiIterator &rhs); - bool operator!=(const HostApiIterator &rhs); - - private: - friend class System; - HostApi **ptr_; - }; + ////// + /// @brief Iterator class for iterating through all HostApis in a System. + /// + /// Compliant with the STL bidirectional iterator concept. + ////// + class System::HostApiIterator + { + public: + typedef std::bidirectional_iterator_tag iterator_category; + typedef Device value_type; + typedef ptrdiff_t difference_type; + typedef HostApi * pointer; + typedef HostApi & reference; + + HostApi &operator*() const; + HostApi *operator->() const; + + HostApiIterator &operator++(); + HostApiIterator operator++(int); + HostApiIterator &operator--(); + HostApiIterator operator--(int); + + bool operator==(const HostApiIterator &rhs); + bool operator!=(const HostApiIterator &rhs); + + private: + friend class System; + HostApi **ptr_; + }; } // namespace portaudio diff --git a/fdmdv2/extern/lib/libportaudio.a b/fdmdv2/extern/lib/libportaudio.a new file mode 100644 index 0000000000000000000000000000000000000000..e5b3b04919e91864739936131e59005fd2b74587 GIT binary patch literal 355106 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%0D8dhVb+ZLHk-H--cd? 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

9WKmLtggm;umRs3)%mkLJdD!!!TkkjBK-rO#FB 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 hduvQAH+*_SeS!mj=Qild_+=ZKSetMinSize( wxSize( 65,65 ) ); + wxFlexGridSizer* fgSizer1; fgSizer1 = new wxFlexGridSizer( 4, 4, 1, 1 ); fgSizer1->AddGrowableCol( 3 ); @@ -37,41 +39,61 @@ MainFrameBase::MainFrameBase( wxWindow* parent, wxWindowID id, const wxString& t fgSizer1->Add( 0, 0, 1, wxEXPAND, 5 ); - m_staticText1 = new wxStaticText( m_panel1, wxID_ANY, _("Input, Output:"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); + m_staticText1 = new wxStaticText( m_audioInfo, wxID_ANY, _("Input, Output:"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); m_staticText1->Wrap( -1 ); fgSizer1->Add( m_staticText1, 1, wxALL|wxEXPAND, 5 ); - m_comboBox1 = new wxComboBox( m_panel1, wxID_ANY, _("Combo!"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - fgSizer1->Add( m_comboBox1, 1, wxALL|wxEXPAND, 5 ); + wxBoxSizer* bSizer2; + bSizer2 = new wxBoxSizer( wxVERTICAL ); + + bSizer2->SetMinSize( wxSize( 65,65 ) ); + m_comboBoxLeft = new wxComboBox( m_audioInfo, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_SIMPLE ); + m_comboBoxLeft->SetToolTip( _("Input Audio Interface") ); + m_comboBoxLeft->SetMinSize( wxSize( 65,65 ) ); + + bSizer2->Add( m_comboBoxLeft, 1, wxALL|wxEXPAND, 5 ); + + + fgSizer1->Add( bSizer2, 1, wxEXPAND|wxFIXED_MINSIZE, 5 ); + + wxBoxSizer* bSizer3; + bSizer3 = new wxBoxSizer( wxVERTICAL ); + + bSizer3->SetMinSize( wxSize( 65,65 ) ); + m_comboBoxRight = new wxComboBox( m_audioInfo, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_SIMPLE ); + m_comboBoxRight->SetToolTip( _("Output Audio Interface") ); + m_comboBoxRight->SetMinSize( wxSize( 65,65 ) ); + + bSizer3->Add( m_comboBoxRight, 1, wxALL|wxEXPAND, 5 ); + - m_comboBox2 = new wxComboBox( m_panel1, wxID_ANY, _("Combo!"), wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - fgSizer1->Add( m_comboBox2, 1, wxALL|wxEXPAND, 5 ); + fgSizer1->Add( bSizer3, 1, wxEXPAND, 5 ); fgSizer1->Add( 0, 0, 1, wxEXPAND, 5 ); - m_staticText2 = new wxStaticText( m_panel1, wxID_ANY, _("Behavor:"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); + m_staticText2 = new wxStaticText( m_audioInfo, wxID_ANY, _("Behavor:"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); m_staticText2->Wrap( -1 ); - fgSizer1->Add( m_staticText2, 1, wxALL|wxEXPAND, 5 ); + fgSizer1->Add( m_staticText2, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL|wxEXPAND, 5 ); - m_gauge1 = new wxGauge( m_panel1, wxID_ANY, 100, wxDefaultPosition, wxDefaultSize, wxGA_HORIZONTAL|wxGA_SMOOTH ); + m_gauge1 = new wxGauge( m_audioInfo, wxID_ANY, 100, wxDefaultPosition, wxDefaultSize, wxGA_HORIZONTAL|wxGA_SMOOTH ); fgSizer1->Add( m_gauge1, 1, wxALL|wxEXPAND, 5 ); - m_slider1 = new wxSlider( m_panel1, wxID_ANY, 50, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL ); + m_slider1 = new wxSlider( m_audioInfo, wxID_ANY, 50, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_AUTOTICKS|wxSL_HORIZONTAL|wxSL_SELRANGE|wxSL_TOP ); fgSizer1->Add( m_slider1, 1, wxALL|wxEXPAND, 5 ); fgSizer1->Add( 0, 0, 1, wxEXPAND, 5 ); - m_staticText5 = new wxStaticText( m_panel1, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText5 = new wxStaticText( m_audioInfo, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); m_staticText5->Wrap( -1 ); fgSizer1->Add( m_staticText5, 1, wxALL|wxEXPAND, 5 ); - m_toggleBtn2 = new wxToggleButton( m_panel1, wxID_ANY, _("On / Off"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtn2 = new wxToggleButton( m_audioInfo, wxID_ANY, _("On / Off"), wxDefaultPosition, wxDefaultSize, 0 ); m_toggleBtn2->SetValue( true ); fgSizer1->Add( m_toggleBtn2, 1, wxALL|wxEXPAND, 5 ); - m_toggleBtn3 = new wxToggleButton( m_panel1, wxID_ANY, _("On / Off"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtn3 = new wxToggleButton( m_audioInfo, wxID_ANY, _("On / Off"), wxDefaultPosition, wxDefaultSize, 0 ); m_toggleBtn3->SetValue( true ); fgSizer1->Add( m_toggleBtn3, 0, wxALL|wxEXPAND, 5 ); @@ -84,15 +106,15 @@ MainFrameBase::MainFrameBase( wxWindow* parent, wxWindowID id, const wxString& t fgSizer1->Add( 0, 0, 1, 0, 5 ); - m_button1 = new wxButton( m_panel1, wxID_ANY, _("Exit"), wxDefaultPosition, wxDefaultSize, 0 ); + m_button1 = new wxButton( m_audioInfo, wxID_ANY, _("Exit"), wxDefaultPosition, wxDefaultSize, 0 ); m_button1->SetDefault(); fgSizer1->Add( m_button1, 0, wxALIGN_BOTTOM|wxALIGN_RIGHT|wxALL, 5 ); - m_panel1->SetSizer( fgSizer1 ); - m_panel1->Layout(); - fgSizer1->Fit( m_panel1 ); - mainSizer->Add( m_panel1, 1, wxALL|wxEXPAND, 0 ); + m_audioInfo->SetSizer( fgSizer1 ); + m_audioInfo->Layout(); + fgSizer1->Fit( m_audioInfo ); + mainSizer->Add( m_audioInfo, 1, wxALL|wxEXPAND|wxFIXED_MINSIZE, 0 ); this->SetSizer( mainSizer ); @@ -104,8 +126,8 @@ MainFrameBase::MainFrameBase( wxWindow* parent, wxWindowID id, const wxString& t // Connect Events this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainFrameBase::OnCloseFrame ) ); this->Connect( menuFileExit->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnExitClick ) ); - m_comboBox1->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( MainFrameBase::OnComboLeft ), NULL, this ); - m_comboBox2->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( MainFrameBase::OnComboRight ), NULL, this ); + m_comboBoxLeft->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( MainFrameBase::OnComboLeft ), NULL, this ); + m_comboBoxRight->Connect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( MainFrameBase::OnComboRight ), NULL, this ); m_slider1->Connect( wxEVT_SCROLL_TOP, wxScrollEventHandler( MainFrameBase::OnScroll ), NULL, this ); m_slider1->Connect( wxEVT_SCROLL_BOTTOM, wxScrollEventHandler( MainFrameBase::OnScroll ), NULL, this ); m_slider1->Connect( wxEVT_SCROLL_LINEUP, wxScrollEventHandler( MainFrameBase::OnScroll ), NULL, this ); @@ -125,8 +147,8 @@ MainFrameBase::~MainFrameBase() // Disconnect Events this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainFrameBase::OnCloseFrame ) ); this->Disconnect( wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainFrameBase::OnExitClick ) ); - m_comboBox1->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( MainFrameBase::OnComboLeft ), NULL, this ); - m_comboBox2->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( MainFrameBase::OnComboRight ), NULL, this ); + m_comboBoxLeft->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( MainFrameBase::OnComboLeft ), NULL, this ); + m_comboBoxRight->Disconnect( wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler( MainFrameBase::OnComboRight ), NULL, this ); m_slider1->Disconnect( wxEVT_SCROLL_TOP, wxScrollEventHandler( MainFrameBase::OnScroll ), NULL, this ); m_slider1->Disconnect( wxEVT_SCROLL_BOTTOM, wxScrollEventHandler( MainFrameBase::OnScroll ), NULL, this ); m_slider1->Disconnect( wxEVT_SCROLL_LINEUP, wxScrollEventHandler( MainFrameBase::OnScroll ), NULL, this ); diff --git a/fdmdv2/pa_cppbinding_test/gui.fbp b/fdmdv2/pa_cppbinding_test/gui.fbp index e63361aa..3b3b63e8 100644 --- a/fdmdv2/pa_cppbinding_test/gui.fbp +++ b/fdmdv2/pa_cppbinding_test/gui.fbp @@ -3,7 +3,7 @@ - C++ + C++|Python|XRC 1 source_name 0 @@ -120,7 +120,7 @@ - + 1 1 1 @@ -200,7 +200,7 @@ - + &File m_menuFile protected @@ -228,7 +228,7 @@ none 0 - wxALL|wxEXPAND + wxALL|wxEXPAND|wxFIXED_MINSIZE 1 1 @@ -263,9 +263,9 @@ 0 - + 65,65 1 - m_panel1 + m_audioInfo 1 @@ -275,7 +275,7 @@ Resizable 1 - + ; 0 @@ -320,21 +320,21 @@ none 4 1 - + 5 wxEXPAND 1 - + 0 protected 0 - + 5 wxALL|wxEXPAND 1 - + 1 1 1 @@ -419,201 +419,223 @@ 5 - wxALL|wxEXPAND + wxEXPAND|wxFIXED_MINSIZE 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_comboBox1 - 1 - - - protected - 1 - - Resizable - -1 - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - Combo! - - - - - OnComboLeft - - - - - - - - - - - - - - - - - - - - - - - - + + 65,65 + bSizer2 + wxVERTICAL + none + + 5 + wxALL|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + 65,65 + 1 + m_comboBoxLeft + 1 + + + protected + 1 + + Resizable + -1 + 1 + + wxCB_SIMPLE + + 0 + Input Audio Interface + + wxFILTER_NONE + wxDefaultValidator + + + + + + + OnComboLeft + + + + + + + + + + + + + + + + + + + + + + + + + + 5 - wxALL|wxEXPAND + wxEXPAND 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_comboBox2 - 1 - - - protected - 1 - - Resizable - -1 - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - Combo! - - - - - OnComboRight - - - - - - - - - - - - - - - - - - - - - - - - + + 65,65 + bSizer3 + wxVERTICAL + none + + 5 + wxALL|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + 65,65 + 1 + m_comboBoxRight + 1 + + + protected + 1 + + Resizable + -1 + 1 + + wxCB_SIMPLE + + 0 + Output Audio Interface + + wxFILTER_NONE + wxDefaultValidator + + + + + + + OnComboRight + + + + + + + + + + + + + + + + + + + + + + + + + + - + 5 wxEXPAND 1 - + 0 protected 0 - + 5 - wxALL|wxEXPAND + wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL|wxEXPAND 1 - + 1 1 1 @@ -696,11 +718,11 @@ - + 5 wxALL|wxEXPAND 1 - + 1 1 1 @@ -783,11 +805,11 @@ - + 5 wxALL|wxEXPAND 1 - + 1 1 1 @@ -834,7 +856,7 @@ Resizable 1 - wxSL_HORIZONTAL + wxSL_AUTOTICKS|wxSL_HORIZONTAL|wxSL_SELRANGE|wxSL_TOP 0 @@ -891,21 +913,21 @@ - + 5 wxEXPAND 1 - + 0 protected 0 - + 5 wxALL|wxEXPAND 1 - + 1 1 1 @@ -988,11 +1010,11 @@ - + 5 wxALL|wxEXPAND 1 - + 1 1 1 @@ -1075,11 +1097,11 @@ - + 5 wxALL|wxEXPAND 0 - + 1 1 1 @@ -1162,41 +1184,41 @@ - + 5 1 - + 0 protected 0 - + 5 1 - + 0 protected 0 - + 5 1 - + 0 protected 0 - + 5 wxALIGN_BOTTOM|wxALIGN_RIGHT|wxALL 0 - + 1 1 1 diff --git a/fdmdv2/pa_cppbinding_test/gui.h b/fdmdv2/pa_cppbinding_test/gui.h index 94d27b7d..b0fd86e1 100644 --- a/fdmdv2/pa_cppbinding_test/gui.h +++ b/fdmdv2/pa_cppbinding_test/gui.h @@ -22,11 +22,11 @@ #include #include #include +#include #include #include #include #include -#include #include #include #include @@ -44,10 +44,10 @@ class MainFrameBase : public wxFrame protected: wxMenuBar* m_menuBar; wxMenu* m_menuFile; - wxPanel* m_panel1; + wxPanel* m_audioInfo; wxStaticText* m_staticText1; - wxComboBox* m_comboBox1; - wxComboBox* m_comboBox2; + wxComboBox* m_comboBoxLeft; + wxComboBox* m_comboBoxRight; wxStaticText* m_staticText2; wxGauge* m_gauge1; wxSlider* m_slider1; diff --git a/fdmdv2/pa_cppbinding_test/main.cpp b/fdmdv2/pa_cppbinding_test/main.cpp index 89772f2c..24aecd4f 100644 --- a/fdmdv2/pa_cppbinding_test/main.cpp +++ b/fdmdv2/pa_cppbinding_test/main.cpp @@ -50,3 +50,184 @@ void MainFrame::OnExitClick(wxCommandEvent& event) { Destroy(); } + +void MainFrame::printSupportedStandardSampleRates( + const portaudio::DirectionSpecificStreamParameters &inputParameters, + const portaudio::DirectionSpecificStreamParameters &outputParameters) +{ + static double STANDARD_SAMPLE_RATES[] = { + 8000.0, + 9600.0, + 11025.0, + 12000.0, + 16000.0, + 22050.0, + 24000.0, + 32000.0, + 44100.0, + 48000.0, + 88200.0, + 96000.0, + 192000.0, + -1 + }; // negative terminated list + + int printCount = 0; + + for (int i = 0; STANDARD_SAMPLE_RATES[i] > 0; ++i) + { + portaudio::StreamParameters tmp = portaudio::StreamParameters(inputParameters, outputParameters, STANDARD_SAMPLE_RATES[i], 0, paNoFlag); + if (tmp.isSupported()) + { + if (printCount == 0) + { + std::cout << " " << STANDARD_SAMPLE_RATES[i]; // 8.2 + printCount = 1; + } + else if (printCount == 4) + { + std::cout << "," << std::endl; + std::cout << " " << STANDARD_SAMPLE_RATES[i]; // 8.2 + printCount = 1; + } + else + { + std::cout << ", " << STANDARD_SAMPLE_RATES[i]; // 8.2 + ++printCount; + } + } + } + if (printCount == 0) + { + std::cout << "None" << std::endl; + } + else + { + std::cout << std::endl; + } +} + +int MainFrame::populateAudioInfo() +{ + + try + { + portaudio::AutoSystem autoSys; + portaudio::System &sys = portaudio::System::instance(); + + std::cout << "PortAudio version number = " << sys.version() << std::endl; + std::cout << "PortAudio version text = '" << sys.versionText() << "'" << std::endl; + + int numDevices = sys.deviceCount(); + std::cout << "Number of devices = " << numDevices << std::endl; + + for (portaudio::System::DeviceIterator i = sys.devicesBegin(); i != sys.devicesEnd(); ++i) + { + std::cout << "--------------------------------------- device #" << (*i).index() << std::endl; + + // Mark global and API specific default devices: + bool defaultDisplayed = false; + + if ((*i).isSystemDefaultInputDevice()) + { + std::cout << "[ Default Input"; + defaultDisplayed = true; + } + else if ((*i).isHostApiDefaultInputDevice()) + { + std::cout << "[ Default " << (*i).hostApi().name() << " Input"; + defaultDisplayed = true; + } + if ((*i).isSystemDefaultOutputDevice()) + { + std::cout << (defaultDisplayed ? "," : "["); + std::cout << " Default Output"; + defaultDisplayed = true; + } + else if ((*i).isHostApiDefaultOutputDevice()) + { + std::cout << (defaultDisplayed ? "," : "["); + std::cout << " Default " << (*i).hostApi().name() << " Output"; + defaultDisplayed = true; + } + if (defaultDisplayed) + { + std::cout << " ]" << std::endl; + } + // Print device info: + std::cout << "Name = " << (*i).name() << std::endl; + std::cout << "Host API = " << (*i).hostApi().name() << std::endl; + std::cout << "Max inputs = " << (*i).maxInputChannels() << ", Max outputs = " << (*i).maxOutputChannels() << std::endl; + + std::cout << "Default low input latency = " << (*i).defaultLowInputLatency() << std::endl; // 8.3 + std::cout << "Default low output latency = " << (*i).defaultLowOutputLatency() << std::endl; // 8.3 + std::cout << "Default high input latency = " << (*i).defaultHighInputLatency() << std::endl; // 8.3 + std::cout << "Default high output latency = " << (*i).defaultHighOutputLatency() << std::endl; // 8.3 + +#ifdef WIN32 + // ASIO specific latency information: + if ((*i).hostApi().typeId() == paASIO) + { + portaudio::AsioDeviceAdapter asioDevice((*i)); + + std::cout << "ASIO minimum buffer size = " << asioDevice.minBufferSize() << std::endl; + std::cout << "ASIO maximum buffer size = " << asioDevice.maxBufferSize() << std::endl; + std::cout << "ASIO preferred buffer size = " << asioDevice.preferredBufferSize() << std::endl; + + if (asioDevice.granularity() == -1) + { + std::cout << "ASIO buffer granularity = power of 2" << std::endl; + } + else + { + std::cout << "ASIO buffer granularity = " << asioDevice.granularity() << std::endl; + } + } +#endif // WIN32 + + std::cout << "Default sample rate = " << (*i).defaultSampleRate() << std::endl; // 8.2 + + // Poll for standard sample rates: + portaudio::DirectionSpecificStreamParameters inputParameters((*i), (*i).maxInputChannels(), portaudio::INT16, true, 0.0, NULL); + portaudio::DirectionSpecificStreamParameters outputParameters((*i), (*i).maxOutputChannels(), portaudio::INT16, true, 0.0, NULL); + if (inputParameters.numChannels() > 0) + { + std::cout << "Supported standard sample rates" << std::endl; + std::cout << " for half-duplex 16 bit " << inputParameters.numChannels() << " channel input = " << std::endl; + printSupportedStandardSampleRates(inputParameters, portaudio::DirectionSpecificStreamParameters::null()); + } + if (outputParameters.numChannels() > 0) + { + std::cout << "Supported standard sample rates" << std::endl; + std::cout << " for half-duplex 16 bit " << outputParameters.numChannels() << " channel output = " << std::endl; + printSupportedStandardSampleRates(portaudio::DirectionSpecificStreamParameters::null(), outputParameters); + } + if (inputParameters.numChannels() > 0 && outputParameters.numChannels() > 0) + { + std::cout << "Supported standard sample rates" << std::endl; + std::cout << " for full-duplex 16 bit " << inputParameters.numChannels() << " channel input, " << outputParameters.numChannels() << " channel output = " << std::endl; + printSupportedStandardSampleRates(inputParameters, outputParameters); + } + } + std::cout << "----------------------------------------------" << std::endl; + } + catch (const portaudio::PaException &e) + { + std::cout << "A PortAudio error occured: " << e.paErrorText() << std::endl; + } + catch (const portaudio::PaCppException &e) + { + std::cout << "A PortAudioCpp error occured: " << e.what() << std::endl; + } + catch (const std::exception &e) + { + std::cout << "A generic exception occured: " << e.what() << std::endl; + } + catch (...) + { + std::cout << "An unknown exception occured." << std::endl; + } + return 0; +} + + diff --git a/fdmdv2/pa_cppbinding_test/main.h b/fdmdv2/pa_cppbinding_test/main.h index fe0e9138..5684cd66 100644 --- a/fdmdv2/pa_cppbinding_test/main.h +++ b/fdmdv2/pa_cppbinding_test/main.h @@ -10,14 +10,16 @@ * Notes: Note that all GUI creation code is declared in * gui.h source file which is generated by wxFormBuilder. *********************************************************************/ - #ifndef __main__ #define __main__ // main wxWidgets header file #include #include -#include +#include "portaudiocpp/PortAudioCpp.hxx" +#ifdef WIN32 +#include "../extern/include/portaudiocpp/AsioDeviceAdapter.hxx" +#endif // gui classes generated by wxFormBuilder #include "gui.h" @@ -49,6 +51,10 @@ class MainFrame : public MainFrameBase // protected event handlers virtual void OnCloseFrame(wxCloseEvent& event); virtual void OnExitClick(wxCommandEvent& event); + void printSupportedStandardSampleRates( + const portaudio::DirectionSpecificStreamParameters &inputParameters, + const portaudio::DirectionSpecificStreamParameters &outputParameters); + int populateAudioInfo(); }; #endif //__main__ diff --git a/fdmdv2/pa_cppbinding_test/pa_cppbinding_test.mk b/fdmdv2/pa_cppbinding_test/pa_cppbinding_test.mk index 6d20f74e..7c2527c9 100644 --- a/fdmdv2/pa_cppbinding_test/pa_cppbinding_test.mk +++ b/fdmdv2/pa_cppbinding_test/pa_cppbinding_test.mk @@ -41,11 +41,11 @@ MakeDirCommand :=makedir CmpOptions := -O2 -Wall $(shell wx-config --cxxflags --unicode=yes --debug=no) $(Preprocessors) C_CmpOptions := -O2 -Wall $(shell wx-config --cxxflags --unicode=yes --debug=no) $(Preprocessors) LinkOptions := -mwindows -s $(shell wx-config --debug=no --libs --unicode=yes) -IncludePath := $(IncludeSwitch). $(IncludeSwitch)./ $(IncludeSwitch)../extern/include/ $(IncludeSwitch)../pa_cpp_binding/ +IncludePath := $(IncludeSwitch). $(IncludeSwitch)./ $(IncludeSwitch)C:/bin/MinGW/msys/1.0/local/include $(IncludeSwitch)./portaudiocpp IncludePCH := RcIncludePath := -Libs := -LibPath := $(LibraryPathSwitch). +Libs := $(LibrarySwitch)portaudiocpp.la $(LibrarySwitch)portaudio.la +LibPath := $(LibraryPathSwitch). $(LibraryPathSwitch). $(LibraryPathSwitch)../../extern/lib/ ## diff --git a/fdmdv2/pa_cppbinding_test/pa_cppbinding_test.project b/fdmdv2/pa_cppbinding_test/pa_cppbinding_test.project index 07b83817..066f5a17 100644 --- a/fdmdv2/pa_cppbinding_test/pa_cppbinding_test.project +++ b/fdmdv2/pa_cppbinding_test/pa_cppbinding_test.project @@ -2,7 +2,7 @@ - + @@ -14,26 +14,28 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + @@ -52,7 +54,11 @@ - + + + + + @@ -87,11 +93,16 @@ - - + + - + + + + + + -- 2.25.1