X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=RtAudio.h;h=f37b9c268df86f01ca4cfd5ed014548909056a2c;hb=15ba9185d68d81ed4a7cd77f93ce3763faf17d0c;hp=a85578ef3766304e7a940f185bc09db7b5c92fd2;hpb=986ffc39fd4cfac9c25a324511c1204f9d8ba760;p=rtaudio-cdist.git diff --git a/RtAudio.h b/RtAudio.h index a85578e..f37b9c2 100644 --- a/RtAudio.h +++ b/RtAudio.h @@ -5,12 +5,12 @@ RtAudio provides a common API (Application Programming Interface) for realtime audio input/output across Linux (native ALSA, Jack, and OSS), Macintosh OS X (CoreAudio and Jack), and Windows - (DirectSound and ASIO) operating systems. + (DirectSound, ASIO and WASAPI) operating systems. RtAudio WWW site: http://www.music.mcgill.ca/~gary/rtaudio/ RtAudio: realtime audio i/o C++ classes - Copyright (c) 2001-2013 Gary P. Scavone + Copyright (c) 2001-2017 Gary P. Scavone Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files @@ -45,11 +45,21 @@ #ifndef __RTAUDIO_H #define __RTAUDIO_H -#define RTAUDIO_VERSION "4.1.0pre" +#define RTAUDIO_VERSION "5.0.0" + +#if defined _WIN32 || defined __CYGWIN__ + #define RTAUDIO_DLL_PUBLIC +#else + #if __GNUC__ >= 4 + #define RTAUDIO_DLL_PUBLIC __attribute__( (visibility( "default" )) ) + #else + #define RTAUDIO_DLL_PUBLIC + #endif +#endif #include #include -#include +#include #include /*! \typedef typedef unsigned long RtAudioFormat; @@ -86,6 +96,7 @@ static const RtAudioFormat RTAUDIO_FLOAT64 = 0x20; // Normalized between plus/mi - \e RTAUDIO_MINIMIZE_LATENCY: Attempt to set stream parameters for lowest possible latency. - \e RTAUDIO_HOG_DEVICE: Attempt grab device for exclusive use. - \e RTAUDIO_ALSA_USE_DEFAULT: Use the "default" PCM device (ALSA only). + - \e RTAUDIO_JACK_DONT_CONNECT: Do not automatically connect ports (JACK only). By default, RtAudio streams pass and receive audio data from the client in an interleaved format. By passing the @@ -117,6 +128,9 @@ static const RtAudioFormat RTAUDIO_FLOAT64 = 0x20; // Normalized between plus/mi If the RTAUDIO_ALSA_USE_DEFAULT flag is set, RtAudio will attempt to open the "default" PCM device when using the ALSA API. Note that this will override any specified input or output device id. + + If the RTAUDIO_JACK_DONT_CONNECT flag is set, RtAudio will not attempt + to automatically connect the ports of the client to the audio device. */ typedef unsigned int RtAudioStreamFlags; static const RtAudioStreamFlags RTAUDIO_NONINTERLEAVED = 0x1; // Use non-interleaved buffers (default = interleaved). @@ -124,6 +138,7 @@ static const RtAudioStreamFlags RTAUDIO_MINIMIZE_LATENCY = 0x2; // Attempt to s static const RtAudioStreamFlags RTAUDIO_HOG_DEVICE = 0x4; // Attempt grab device and prevent use by others. static const RtAudioStreamFlags RTAUDIO_SCHEDULE_REALTIME = 0x8; // Try to select realtime scheduling for callback thread. static const RtAudioStreamFlags RTAUDIO_ALSA_USE_DEFAULT = 0x10; // Use the "default" PCM device (ALSA only). +static const RtAudioStreamFlags RTAUDIO_JACK_DONT_CONNECT = 0x20; // Do not automatically connect ports (JACK only). /*! \typedef typedef unsigned long RtAudioStreamStatus; \brief RtAudio stream status (over- or underflow) flags. @@ -195,7 +210,7 @@ typedef int (*RtAudioCallback)( void *outputBuffer, void *inputBuffer, */ /************************************************************************/ -class RtAudioError : public std::exception +class RTAUDIO_DLL_PUBLIC RtAudioError : public std::runtime_error { public: //! Defined RtAudioError types. @@ -214,25 +229,22 @@ class RtAudioError : public std::exception }; //! The constructor. - RtAudioError( const std::string& message, Type type = RtAudioError::UNSPECIFIED ) throw() : message_(message), type_(type) {} - - //! The destructor. - virtual ~RtAudioError( void ) throw() {} + RtAudioError( const std::string& message, + Type type = RtAudioError::UNSPECIFIED ) + : std::runtime_error(message), type_(type) {} //! Prints thrown error message to stderr. - virtual void printMessage( void ) const throw() { std::cerr << '\n' << message_ << "\n\n"; } + virtual void printMessage( void ) const + { std::cerr << '\n' << what() << "\n\n"; } //! Returns the thrown error message type. - virtual const Type& getType(void) const throw() { return type_; } + virtual const Type& getType(void) const { return type_; } //! Returns the thrown error message string. - virtual const std::string& getMessage(void) const throw() { return message_; } - - //! Returns the thrown error message as a c-style string. - virtual const char* what( void ) const throw() { return message_.c_str(); } + virtual const std::string getMessage(void) const + { return std::string(what()); } protected: - std::string message_; Type type_; }; @@ -258,7 +270,7 @@ typedef void (*RtAudioErrorCallback)( RtAudioError::Type type, const std::string class RtApi; -class RtAudio +class RTAUDIO_DLL_PUBLIC RtAudio { public: @@ -286,12 +298,13 @@ class RtAudio bool isDefaultOutput; /*!< true if this is the default output device. */ bool isDefaultInput; /*!< true if this is the default input device. */ std::vector sampleRates; /*!< Supported sample rates (queried from list of standard rates). */ + unsigned int preferredSampleRate; /*!< Preferred sample rate, eg. for WASAPI the system sample rate. */ RtAudioFormat nativeFormats; /*!< Bit mask of supported data formats. */ // Default constructor. DeviceInfo() :probed(false), outputChannels(0), inputChannels(0), duplexChannels(0), - isDefaultOutput(false), isDefaultInput(false), nativeFormats(0) {} + isDefaultOutput(false), isDefaultInput(false), preferredSampleRate(0), nativeFormats(0) {} }; //! The structure for specifying input or ouput stream parameters. @@ -374,7 +387,7 @@ class RtAudio }; //! A static function to determine the current RtAudio version. - static std::string getVersion( void ) throw(); + static std::string getVersion( void ); //! A static function to determine the available compiled audio APIs. /*! @@ -382,7 +395,7 @@ class RtAudio the enumerated list values. Note that there can be more than one API compiled for certain operating systems. */ - static void getCompiledApi( std::vector &apis ) throw(); + static void getCompiledApi( std::vector &apis ); //! The class constructor. /*! @@ -400,10 +413,10 @@ class RtAudio If a stream is running or open, it will be stopped and closed automatically. */ - ~RtAudio() throw(); + ~RtAudio(); //! Returns the audio API specifier for the current instance of RtAudio. - RtAudio::Api getCurrentApi( void ) throw(); + RtAudio::Api getCurrentApi( void ); //! A public function that queries for the number of audio devices available. /*! @@ -411,7 +424,7 @@ class RtAudio is called, thus supporting devices connected \e after instantiation. If a system error occurs during processing, a warning will be issued. */ - unsigned int getDeviceCount( void ) throw(); + unsigned int getDeviceCount( void ); //! Return an RtAudio::DeviceInfo structure for a specified device number. /*! @@ -434,7 +447,7 @@ class RtAudio client's responsibility to verify that a device is available before attempting to open a stream. */ - unsigned int getDefaultOutputDevice( void ) throw(); + unsigned int getDefaultOutputDevice( void ); //! A function that returns the index of the default input device. /*! @@ -444,7 +457,7 @@ class RtAudio client's responsibility to verify that a device is available before attempting to open a stream. */ - unsigned int getDefaultInputDevice( void ) throw(); + unsigned int getDefaultInputDevice( void ); //! A public function for opening a stream with the specified parameters. /*! @@ -497,7 +510,7 @@ class RtAudio If a stream is not open, this function issues a warning and returns (no exception is thrown). */ - void closeStream( void ) throw(); + void closeStream( void ); //! A function that starts a stream. /*! @@ -527,10 +540,10 @@ class RtAudio void abortStream( void ); //! Returns true if a stream is open and false if not. - bool isStreamOpen( void ) const throw(); + bool isStreamOpen( void ) const; //! Returns true if the stream is running and false if it is stopped or not open. - bool isStreamRunning( void ) const throw(); + bool isStreamRunning( void ) const; //! Returns the number of elapsed seconds since the stream was started. /*! @@ -538,6 +551,12 @@ class RtAudio */ double getStreamTime( void ); + //! Set the stream time to a time in seconds greater than or equal to 0.0. + /*! + If a stream is not open, an RtAudioError (type = INVALID_USE) will be thrown. + */ + void setStreamTime( double time ); + //! Returns the internal stream latency in sample frames. /*! The stream latency refers to delay in audio input and/or output @@ -558,7 +577,7 @@ class RtAudio unsigned int getStreamSampleRate( void ); //! Specify whether warning messages should be printed to stderr. - void showWarnings( bool value = true ) throw(); + void showWarnings( bool value = true ); protected: @@ -567,11 +586,15 @@ class RtAudio }; // Operating system dependent thread functionality. -#if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__) || defined(__WINDOWS_WASAPI__) +#if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__) || defined(__WINDOWS_WASAPI__) + + #ifndef NOMINMAX + #define NOMINMAX + #endif #include #include - typedef ULONG_PTR ThreadHandle; + typedef uintptr_t ThreadHandle; typedef CRITICAL_SECTION StreamMutex; #elif defined(__LINUX_ALSA__) || defined(__LINUX_PULSE__) || defined(__UNIX_JACK__) || defined(__LINUX_OSS__) || defined(__MACOSX_CORE__) @@ -605,7 +628,7 @@ struct CallbackInfo { // Default constructor. CallbackInfo() - :object(0), callback(0), userData(0), errorCallback(0), apiInfo(0), isRunning(false), doRealtime(false) {} + :object(0), callback(0), userData(0), errorCallback(0), apiInfo(0), isRunning(false), doRealtime(false), priority(0) {} }; // **************************************************************** // @@ -658,7 +681,7 @@ class S24 { #include -class RtApi +class RTAUDIO_DLL_PUBLIC RtApi { public: @@ -682,6 +705,7 @@ public: long getStreamLatency( void ); unsigned int getStreamSampleRate( void ); virtual double getStreamTime( void ); + virtual void setStreamTime( double time ); bool isStreamOpen( void ) const { return stream_.state != STREAM_CLOSED; } bool isStreamRunning( void ) const { return stream_.state == STREAM_RUNNING; } void showWarnings( bool value ) { showWarnings_ = value; } @@ -812,21 +836,22 @@ protected: // // **************************************************************** // -inline RtAudio::Api RtAudio :: getCurrentApi( void ) throw() { return rtapi_->getCurrentApi(); } -inline unsigned int RtAudio :: getDeviceCount( void ) throw() { return rtapi_->getDeviceCount(); } +inline RtAudio::Api RtAudio :: getCurrentApi( void ) { return rtapi_->getCurrentApi(); } +inline unsigned int RtAudio :: getDeviceCount( void ) { return rtapi_->getDeviceCount(); } inline RtAudio::DeviceInfo RtAudio :: getDeviceInfo( unsigned int device ) { return rtapi_->getDeviceInfo( device ); } -inline unsigned int RtAudio :: getDefaultInputDevice( void ) throw() { return rtapi_->getDefaultInputDevice(); } -inline unsigned int RtAudio :: getDefaultOutputDevice( void ) throw() { return rtapi_->getDefaultOutputDevice(); } -inline void RtAudio :: closeStream( void ) throw() { return rtapi_->closeStream(); } +inline unsigned int RtAudio :: getDefaultInputDevice( void ) { return rtapi_->getDefaultInputDevice(); } +inline unsigned int RtAudio :: getDefaultOutputDevice( void ) { return rtapi_->getDefaultOutputDevice(); } +inline void RtAudio :: closeStream( void ) { return rtapi_->closeStream(); } inline void RtAudio :: startStream( void ) { return rtapi_->startStream(); } inline void RtAudio :: stopStream( void ) { return rtapi_->stopStream(); } inline void RtAudio :: abortStream( void ) { return rtapi_->abortStream(); } -inline bool RtAudio :: isStreamOpen( void ) const throw() { return rtapi_->isStreamOpen(); } -inline bool RtAudio :: isStreamRunning( void ) const throw() { return rtapi_->isStreamRunning(); } +inline bool RtAudio :: isStreamOpen( void ) const { return rtapi_->isStreamOpen(); } +inline bool RtAudio :: isStreamRunning( void ) const { return rtapi_->isStreamRunning(); } inline long RtAudio :: getStreamLatency( void ) { return rtapi_->getStreamLatency(); } inline unsigned int RtAudio :: getStreamSampleRate( void ) { return rtapi_->getStreamSampleRate(); } inline double RtAudio :: getStreamTime( void ) { return rtapi_->getStreamTime(); } -inline void RtAudio :: showWarnings( bool value ) throw() { rtapi_->showWarnings( value ); } +inline void RtAudio :: setStreamTime( double time ) { return rtapi_->setStreamTime( time ); } +inline void RtAudio :: showWarnings( bool value ) { rtapi_->showWarnings( value ); } // RtApi Subclass prototypes. @@ -899,6 +924,8 @@ public: unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, RtAudio::StreamOptions *options ); + + bool shouldAutoconnect_; }; #endif @@ -986,7 +1013,7 @@ class RtApiWasapi : public RtApi { public: RtApiWasapi(); - ~RtApiWasapi(); + virtual ~RtApiWasapi(); RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_WASAPI; } unsigned int getDeviceCount( void );