cannam@124: #include "portaudiocpp/StreamParameters.hxx" cannam@124: cannam@124: #include cannam@124: cannam@124: #include "portaudiocpp/Device.hxx" cannam@124: cannam@124: namespace portaudio cannam@124: { cannam@124: // ----------------------------------------------------------------------------------- cannam@124: cannam@124: ////// cannam@124: /// Default constructor; does nothing. cannam@124: ////// cannam@124: StreamParameters::StreamParameters() cannam@124: { cannam@124: } cannam@124: cannam@124: ////// cannam@124: /// Sets up the all parameters needed to open either a half-duplex or full-duplex Stream. cannam@124: /// cannam@124: /// @param inputParameters The parameters for the input direction of the to-be opened cannam@124: /// Stream or DirectionSpecificStreamParameters::null() for an output-only Stream. cannam@124: /// @param outputParameters The parameters for the output direction of the to-be opened cannam@124: /// Stream or DirectionSpecificStreamParameters::null() for an input-only Stream. cannam@124: /// @param sampleRate The to-be opened Stream's sample rate in Hz. cannam@124: /// @param framesPerBuffer The number of frames per buffer for a CallbackStream, or cannam@124: /// the preferred buffer granularity for a BlockingStream. cannam@124: /// @param flags The flags for the to-be opened Stream; default paNoFlag. cannam@124: ////// cannam@124: StreamParameters::StreamParameters(const DirectionSpecificStreamParameters &inputParameters, cannam@124: const DirectionSpecificStreamParameters &outputParameters, double sampleRate, unsigned long framesPerBuffer, cannam@124: PaStreamFlags flags) : inputParameters_(inputParameters), outputParameters_(outputParameters), cannam@124: sampleRate_(sampleRate), framesPerBuffer_(framesPerBuffer), flags_(flags) cannam@124: { cannam@124: } cannam@124: cannam@124: // ----------------------------------------------------------------------------------- cannam@124: cannam@124: ////// cannam@124: /// Sets the requested sample rate. If this sample rate isn't supported by the hardware, the cannam@124: /// Stream will fail to open. The real-life sample rate used might differ slightly due to cannam@124: /// imperfections in the sound card hardware; use Stream::sampleRate() to retreive the cannam@124: /// best known estimate for this value. cannam@124: ////// cannam@124: void StreamParameters::setSampleRate(double sampleRate) cannam@124: { cannam@124: sampleRate_ = sampleRate; cannam@124: } cannam@124: cannam@124: ////// cannam@124: /// Either the number of frames per buffer for a CallbackStream, or cannam@124: /// the preferred buffer granularity for a BlockingStream. See PortAudio cannam@124: /// documentation. cannam@124: ////// cannam@124: void StreamParameters::setFramesPerBuffer(unsigned long framesPerBuffer) cannam@124: { cannam@124: framesPerBuffer_ = framesPerBuffer; cannam@124: } cannam@124: cannam@124: ////// cannam@124: /// Sets the specified flag or does nothing when the flag is already set. Doesn't cannam@124: /// `unset' any previously existing flags (use clearFlags() for that). cannam@124: ////// cannam@124: void StreamParameters::setFlag(PaStreamFlags flag) cannam@124: { cannam@124: flags_ |= flag; cannam@124: } cannam@124: cannam@124: ////// cannam@124: /// Unsets the specified flag or does nothing if the flag isn't set. Doesn't affect cannam@124: /// any other flags. cannam@124: ////// cannam@124: void StreamParameters::unsetFlag(PaStreamFlags flag) cannam@124: { cannam@124: flags_ &= ~flag; cannam@124: } cannam@124: cannam@124: ////// cannam@124: /// Clears or `unsets' all set flags. cannam@124: ////// cannam@124: void StreamParameters::clearFlags() cannam@124: { cannam@124: flags_ = paNoFlag; cannam@124: } cannam@124: cannam@124: // ----------------------------------------------------------------------------------- cannam@124: cannam@124: void StreamParameters::setInputParameters(const DirectionSpecificStreamParameters ¶meters) cannam@124: { cannam@124: inputParameters_ = parameters; cannam@124: } cannam@124: cannam@124: void StreamParameters::setOutputParameters(const DirectionSpecificStreamParameters ¶meters) cannam@124: { cannam@124: outputParameters_ = parameters; cannam@124: } cannam@124: cannam@124: // ----------------------------------------------------------------------------------- cannam@124: cannam@124: bool StreamParameters::isSupported() const cannam@124: { cannam@124: return (Pa_IsFormatSupported(inputParameters_.paStreamParameters(), cannam@124: outputParameters_.paStreamParameters(), sampleRate_) == paFormatIsSupported); cannam@124: } cannam@124: cannam@124: // ----------------------------------------------------------------------------------- cannam@124: cannam@124: double StreamParameters::sampleRate() const cannam@124: { cannam@124: return sampleRate_; cannam@124: } cannam@124: cannam@124: unsigned long StreamParameters::framesPerBuffer() const cannam@124: { cannam@124: return framesPerBuffer_; cannam@124: } cannam@124: cannam@124: ////// cannam@124: /// Returns all currently set flags as a binary combined cannam@124: /// integer value (PaStreamFlags). Use isFlagSet() to cannam@124: /// avoid dealing with the bitmasks. cannam@124: ////// cannam@124: PaStreamFlags StreamParameters::flags() const cannam@124: { cannam@124: return flags_; cannam@124: } cannam@124: cannam@124: ////// cannam@124: /// Returns true if the specified flag is currently set cannam@124: /// or false if it isn't. cannam@124: ////// cannam@124: bool StreamParameters::isFlagSet(PaStreamFlags flag) const cannam@124: { cannam@124: return ((flags_ & flag) != 0); cannam@124: } cannam@124: cannam@124: // ----------------------------------------------------------------------------------- cannam@124: cannam@124: DirectionSpecificStreamParameters &StreamParameters::inputParameters() cannam@124: { cannam@124: return inputParameters_; cannam@124: } cannam@124: cannam@124: const DirectionSpecificStreamParameters &StreamParameters::inputParameters() const cannam@124: { cannam@124: return inputParameters_; cannam@124: } cannam@124: cannam@124: DirectionSpecificStreamParameters &StreamParameters::outputParameters() cannam@124: { cannam@124: return outputParameters_; cannam@124: } cannam@124: cannam@124: const DirectionSpecificStreamParameters &StreamParameters::outputParameters() const cannam@124: { cannam@124: return outputParameters_; cannam@124: } cannam@124: cannam@124: // ----------------------------------------------------------------------------------- cannam@124: } // namespace portaudio cannam@124: cannam@124: cannam@124: cannam@124: cannam@124: