1 #include "portaudiocpp/StreamParameters.hxx" 2 3 #include <cstddef> 4 5 #include "portaudiocpp/Device.hxx" 6 7 namespace portaudio 8 { 9 // ----------------------------------------------------------------------------------- 10 11 ////// 12 /// Default constructor; does nothing. 13 ////// StreamParameters()14 StreamParameters::StreamParameters() 15 { 16 } 17 18 ////// 19 /// Sets up the all parameters needed to open either a half-duplex or full-duplex Stream. 20 /// 21 /// @param inputParameters The parameters for the input direction of the to-be opened 22 /// Stream or DirectionSpecificStreamParameters::null() for an output-only Stream. 23 /// @param outputParameters The parameters for the output direction of the to-be opened 24 /// Stream or DirectionSpecificStreamParameters::null() for an input-only Stream. 25 /// @param sampleRate The to-be opened Stream's sample rate in Hz. 26 /// @param framesPerBuffer The number of frames per buffer for a CallbackStream, or 27 /// the preferred buffer granularity for a BlockingStream. 28 /// @param flags The flags for the to-be opened Stream; default paNoFlag. 29 ////// StreamParameters(const DirectionSpecificStreamParameters & inputParameters,const DirectionSpecificStreamParameters & outputParameters,double sampleRate,unsigned long framesPerBuffer,PaStreamFlags flags)30 StreamParameters::StreamParameters(const DirectionSpecificStreamParameters &inputParameters, 31 const DirectionSpecificStreamParameters &outputParameters, double sampleRate, unsigned long framesPerBuffer, 32 PaStreamFlags flags) : inputParameters_(inputParameters), outputParameters_(outputParameters), 33 sampleRate_(sampleRate), framesPerBuffer_(framesPerBuffer), flags_(flags) 34 { 35 } 36 37 // ----------------------------------------------------------------------------------- 38 39 ////// 40 /// Sets the requested sample rate. If this sample rate isn't supported by the hardware, the 41 /// Stream will fail to open. The real-life sample rate used might differ slightly due to 42 /// imperfections in the sound card hardware; use Stream::sampleRate() to retreive the 43 /// best known estimate for this value. 44 ////// setSampleRate(double sampleRate)45 void StreamParameters::setSampleRate(double sampleRate) 46 { 47 sampleRate_ = sampleRate; 48 } 49 50 ////// 51 /// Either the number of frames per buffer for a CallbackStream, or 52 /// the preferred buffer granularity for a BlockingStream. See PortAudio 53 /// documentation. 54 ////// setFramesPerBuffer(unsigned long framesPerBuffer)55 void StreamParameters::setFramesPerBuffer(unsigned long framesPerBuffer) 56 { 57 framesPerBuffer_ = framesPerBuffer; 58 } 59 60 ////// 61 /// Sets the specified flag or does nothing when the flag is already set. Doesn't 62 /// `unset' any previously existing flags (use clearFlags() for that). 63 ////// setFlag(PaStreamFlags flag)64 void StreamParameters::setFlag(PaStreamFlags flag) 65 { 66 flags_ |= flag; 67 } 68 69 ////// 70 /// Unsets the specified flag or does nothing if the flag isn't set. Doesn't affect 71 /// any other flags. 72 ////// unsetFlag(PaStreamFlags flag)73 void StreamParameters::unsetFlag(PaStreamFlags flag) 74 { 75 flags_ &= ~flag; 76 } 77 78 ////// 79 /// Clears or `unsets' all set flags. 80 ////// clearFlags()81 void StreamParameters::clearFlags() 82 { 83 flags_ = paNoFlag; 84 } 85 86 // ----------------------------------------------------------------------------------- 87 setInputParameters(const DirectionSpecificStreamParameters & parameters)88 void StreamParameters::setInputParameters(const DirectionSpecificStreamParameters ¶meters) 89 { 90 inputParameters_ = parameters; 91 } 92 setOutputParameters(const DirectionSpecificStreamParameters & parameters)93 void StreamParameters::setOutputParameters(const DirectionSpecificStreamParameters ¶meters) 94 { 95 outputParameters_ = parameters; 96 } 97 98 // ----------------------------------------------------------------------------------- 99 isSupported() const100 bool StreamParameters::isSupported() const 101 { 102 return (Pa_IsFormatSupported(inputParameters_.paStreamParameters(), 103 outputParameters_.paStreamParameters(), sampleRate_) == paFormatIsSupported); 104 } 105 106 // ----------------------------------------------------------------------------------- 107 sampleRate() const108 double StreamParameters::sampleRate() const 109 { 110 return sampleRate_; 111 } 112 framesPerBuffer() const113 unsigned long StreamParameters::framesPerBuffer() const 114 { 115 return framesPerBuffer_; 116 } 117 118 ////// 119 /// Returns all currently set flags as a binary combined 120 /// integer value (PaStreamFlags). Use isFlagSet() to 121 /// avoid dealing with the bitmasks. 122 ////// flags() const123 PaStreamFlags StreamParameters::flags() const 124 { 125 return flags_; 126 } 127 128 ////// 129 /// Returns true if the specified flag is currently set 130 /// or false if it isn't. 131 ////// isFlagSet(PaStreamFlags flag) const132 bool StreamParameters::isFlagSet(PaStreamFlags flag) const 133 { 134 return ((flags_ & flag) != 0); 135 } 136 137 // ----------------------------------------------------------------------------------- 138 inputParameters()139 DirectionSpecificStreamParameters &StreamParameters::inputParameters() 140 { 141 return inputParameters_; 142 } 143 inputParameters() const144 const DirectionSpecificStreamParameters &StreamParameters::inputParameters() const 145 { 146 return inputParameters_; 147 } 148 outputParameters()149 DirectionSpecificStreamParameters &StreamParameters::outputParameters() 150 { 151 return outputParameters_; 152 } 153 outputParameters() const154 const DirectionSpecificStreamParameters &StreamParameters::outputParameters() const 155 { 156 return outputParameters_; 157 } 158 159 // ----------------------------------------------------------------------------------- 160 } // namespace portaudio 161 162 163 164 165 166