cannam@140: #include "portaudiocpp/Stream.hxx" cannam@140: cannam@140: #include cannam@140: cannam@140: #include "portaudiocpp/Exception.hxx" cannam@140: #include "portaudiocpp/System.hxx" cannam@140: cannam@140: namespace portaudio cannam@140: { cannam@140: cannam@140: // ----------------------------------------------------------------------------------- cannam@140: cannam@140: Stream::Stream() : stream_(NULL) cannam@140: { cannam@140: } cannam@140: cannam@140: Stream::~Stream() cannam@140: { cannam@140: // (can't call close here, cannam@140: // the derived class should atleast call cannam@140: // close() in it's deconstructor) cannam@140: } cannam@140: cannam@140: // ----------------------------------------------------------------------------------- cannam@140: cannam@140: ////// cannam@140: /// Closes the Stream if it's open, else does nothing. cannam@140: ////// cannam@140: void Stream::close() cannam@140: { cannam@140: if (isOpen() && System::exists()) cannam@140: { cannam@140: PaError err = Pa_CloseStream(stream_); cannam@140: stream_ = NULL; cannam@140: cannam@140: if (err != paNoError) cannam@140: throw PaException(err); cannam@140: } cannam@140: } cannam@140: cannam@140: ////// cannam@140: /// Returns true if the Stream is open. cannam@140: ////// cannam@140: bool Stream::isOpen() const cannam@140: { cannam@140: return (stream_ != NULL); cannam@140: } cannam@140: cannam@140: // ----------------------------------------------------------------------------------- cannam@140: cannam@140: void Stream::setStreamFinishedCallback(PaStreamFinishedCallback *callback) cannam@140: { cannam@140: PaError err = Pa_SetStreamFinishedCallback(stream_, callback); cannam@140: cannam@140: if (err != paNoError) cannam@140: throw PaException(err); cannam@140: } cannam@140: cannam@140: // ----------------------------------------------------------------------------------- cannam@140: cannam@140: void Stream::start() cannam@140: { cannam@140: PaError err = Pa_StartStream(stream_); cannam@140: cannam@140: if (err != paNoError) cannam@140: throw PaException(err); cannam@140: } cannam@140: cannam@140: void Stream::stop() cannam@140: { cannam@140: PaError err = Pa_StopStream(stream_); cannam@140: cannam@140: if (err != paNoError) cannam@140: throw PaException(err); cannam@140: } cannam@140: cannam@140: void Stream::abort() cannam@140: { cannam@140: PaError err = Pa_AbortStream(stream_); cannam@140: cannam@140: if (err != paNoError) cannam@140: throw PaException(err); cannam@140: } cannam@140: cannam@140: bool Stream::isStopped() const cannam@140: { cannam@140: PaError ret = Pa_IsStreamStopped(stream_); cannam@140: cannam@140: if (ret < 0) cannam@140: throw PaException(ret); cannam@140: cannam@140: return (ret == 1); cannam@140: } cannam@140: cannam@140: bool Stream::isActive() const cannam@140: { cannam@140: PaError ret = Pa_IsStreamActive(stream_); cannam@140: cannam@140: if (ret < 0) cannam@140: throw PaException(ret); cannam@140: cannam@140: return (ret == 1); cannam@140: } cannam@140: cannam@140: // ----------------------------------------------------------------------------------- cannam@140: cannam@140: ////// cannam@140: /// Returns the best known input latency for the Stream. This value may differ from the cannam@140: /// suggested input latency set in the StreamParameters. Includes all sources of cannam@140: /// latency known to PortAudio such as internal buffering, and Host API reported latency. cannam@140: /// Doesn't include any estimates of unknown latency. cannam@140: ////// cannam@140: PaTime Stream::inputLatency() const cannam@140: { cannam@140: const PaStreamInfo *info = Pa_GetStreamInfo(stream_); cannam@140: if (info == NULL) cannam@140: { cannam@140: throw PaException(paInternalError); cannam@140: return PaTime(0.0); cannam@140: } cannam@140: cannam@140: return info->inputLatency; cannam@140: } cannam@140: cannam@140: ////// cannam@140: /// Returns the best known output latency for the Stream. This value may differ from the cannam@140: /// suggested output latency set in the StreamParameters. Includes all sources of cannam@140: /// latency known to PortAudio such as internal buffering, and Host API reported latency. cannam@140: /// Doesn't include any estimates of unknown latency. cannam@140: ////// cannam@140: PaTime Stream::outputLatency() const cannam@140: { cannam@140: const PaStreamInfo *info = Pa_GetStreamInfo(stream_); cannam@140: if (info == NULL) cannam@140: { cannam@140: throw PaException(paInternalError); cannam@140: return PaTime(0.0); cannam@140: } cannam@140: cannam@140: return info->outputLatency; cannam@140: } cannam@140: cannam@140: ////// cannam@140: /// Returns the sample rate of the Stream. Usually this will be the cannam@140: /// best known estimate of the used sample rate. For instance when opening a cannam@140: /// Stream setting 44100.0 Hz in the StreamParameters, the actual sample cannam@140: /// rate might be something like 44103.2 Hz (due to imperfections in the cannam@140: /// sound card hardware). cannam@140: ////// cannam@140: double Stream::sampleRate() const cannam@140: { cannam@140: const PaStreamInfo *info = Pa_GetStreamInfo(stream_); cannam@140: if (info == NULL) cannam@140: { cannam@140: throw PaException(paInternalError); cannam@140: return 0.0; cannam@140: } cannam@140: cannam@140: return info->sampleRate; cannam@140: } cannam@140: cannam@140: // ----------------------------------------------------------------------------------- cannam@140: cannam@140: PaTime Stream::time() const cannam@140: { cannam@140: return Pa_GetStreamTime(stream_); cannam@140: } cannam@140: cannam@140: // ----------------------------------------------------------------------------------- cannam@140: cannam@140: ////// cannam@140: /// Accessor (const) for PortAudio PaStream pointer, useful for interfacing with cannam@140: /// PortAudio add-ons such as PortMixer for instance. Normally accessing this cannam@140: /// pointer should not be needed as PortAudioCpp aims to provide all of PortAudio's cannam@140: /// functionality. cannam@140: ////// cannam@140: const PaStream *Stream::paStream() const cannam@140: { cannam@140: return stream_; cannam@140: } cannam@140: cannam@140: ////// cannam@140: /// Accessor (non-const) for PortAudio PaStream pointer, useful for interfacing with cannam@140: /// PortAudio add-ons such as PortMixer for instance. Normally accessing this cannam@140: /// pointer should not be needed as PortAudioCpp aims to provide all of PortAudio's cannam@140: /// functionality. cannam@140: ////// cannam@140: PaStream *Stream::paStream() cannam@140: { cannam@140: return stream_; cannam@140: } cannam@140: cannam@140: // ----------------------------------------------------------------------------------- cannam@140: cannam@140: } // namespace portaudio