Chris@4: #include "portaudiocpp/DirectionSpecificStreamParameters.hxx" Chris@4: Chris@4: #include "portaudiocpp/Device.hxx" Chris@4: Chris@4: namespace portaudio Chris@4: { Chris@4: Chris@4: // ----------------------------------------------------------------------------------- Chris@4: Chris@4: ////// Chris@4: /// Returns a `nil' DirectionSpecificStreamParameters object. This can be used to Chris@4: /// specify that one direction of a Stream is not required (i.e. when creating Chris@4: /// a half-duplex Stream). All fields of the null DirectionSpecificStreamParameters Chris@4: /// object are invalid except for the device and the number of channel, which are set Chris@4: /// to paNoDevice and 0 respectively. Chris@4: ////// Chris@4: DirectionSpecificStreamParameters DirectionSpecificStreamParameters::null() Chris@4: { Chris@4: DirectionSpecificStreamParameters tmp; Chris@4: tmp.paStreamParameters_.device = paNoDevice; Chris@4: tmp.paStreamParameters_.channelCount = 0; Chris@4: return tmp; Chris@4: } Chris@4: Chris@4: // ----------------------------------------------------------------------------------- Chris@4: Chris@4: ////// Chris@4: /// Default constructor -- all parameters will be uninitialized. Chris@4: ////// Chris@4: DirectionSpecificStreamParameters::DirectionSpecificStreamParameters() Chris@4: { Chris@4: } Chris@4: Chris@4: ////// Chris@4: /// Constructor which sets all required fields. Chris@4: ////// Chris@4: DirectionSpecificStreamParameters::DirectionSpecificStreamParameters(const Device &device, int numChannels, Chris@4: SampleDataFormat format, bool interleaved, PaTime suggestedLatency, void *hostApiSpecificStreamInfo) Chris@4: { Chris@4: setDevice(device); Chris@4: setNumChannels(numChannels); Chris@4: setSampleFormat(format, interleaved); Chris@4: setSuggestedLatency(suggestedLatency); Chris@4: setHostApiSpecificStreamInfo(hostApiSpecificStreamInfo); Chris@4: } Chris@4: Chris@4: // ----------------------------------------------------------------------------------- Chris@4: Chris@4: void DirectionSpecificStreamParameters::setDevice(const Device &device) Chris@4: { Chris@4: paStreamParameters_.device = device.index(); Chris@4: } Chris@4: Chris@4: void DirectionSpecificStreamParameters::setNumChannels(int numChannels) Chris@4: { Chris@4: paStreamParameters_.channelCount = numChannels; Chris@4: } Chris@4: Chris@4: void DirectionSpecificStreamParameters::setSampleFormat(SampleDataFormat format, bool interleaved) Chris@4: { Chris@4: paStreamParameters_.sampleFormat = static_cast(format); Chris@4: Chris@4: if (!interleaved) Chris@4: paStreamParameters_.sampleFormat |= paNonInterleaved; Chris@4: } Chris@4: Chris@4: void DirectionSpecificStreamParameters::setHostApiSpecificSampleFormat(PaSampleFormat format, bool interleaved) Chris@4: { Chris@4: paStreamParameters_.sampleFormat = format; Chris@4: Chris@4: paStreamParameters_.sampleFormat |= paCustomFormat; Chris@4: Chris@4: if (!interleaved) Chris@4: paStreamParameters_.sampleFormat |= paNonInterleaved; Chris@4: } Chris@4: Chris@4: void DirectionSpecificStreamParameters::setSuggestedLatency(PaTime latency) Chris@4: { Chris@4: paStreamParameters_.suggestedLatency = latency; Chris@4: } Chris@4: Chris@4: void DirectionSpecificStreamParameters::setHostApiSpecificStreamInfo(void *streamInfo) Chris@4: { Chris@4: paStreamParameters_.hostApiSpecificStreamInfo = streamInfo; Chris@4: } Chris@4: Chris@4: // ----------------------------------------------------------------------------------- Chris@4: Chris@4: PaStreamParameters *DirectionSpecificStreamParameters::paStreamParameters() Chris@4: { Chris@4: if (paStreamParameters_.channelCount > 0 && paStreamParameters_.device != paNoDevice) Chris@4: return &paStreamParameters_; Chris@4: else Chris@4: return NULL; Chris@4: } Chris@4: Chris@4: const PaStreamParameters *DirectionSpecificStreamParameters::paStreamParameters() const Chris@4: { Chris@4: if (paStreamParameters_.channelCount > 0 && paStreamParameters_.device != paNoDevice) Chris@4: return &paStreamParameters_; Chris@4: else Chris@4: return NULL; Chris@4: } Chris@4: Chris@4: Device &DirectionSpecificStreamParameters::device() const Chris@4: { Chris@4: return System::instance().deviceByIndex(paStreamParameters_.device); Chris@4: } Chris@4: Chris@4: int DirectionSpecificStreamParameters::numChannels() const Chris@4: { Chris@4: return paStreamParameters_.channelCount; Chris@4: } Chris@4: Chris@4: ////// Chris@4: /// Returns the (non host api-specific) sample format, without including Chris@4: /// the paNonInterleaved flag. If the sample format is host api-spefific, Chris@4: /// INVALID_FORMAT (0) will be returned. Chris@4: ////// Chris@4: SampleDataFormat DirectionSpecificStreamParameters::sampleFormat() const Chris@4: { Chris@4: if (isSampleFormatHostApiSpecific()) Chris@4: return INVALID_FORMAT; Chris@4: else Chris@4: return static_cast(paStreamParameters_.sampleFormat & ~paNonInterleaved); Chris@4: } Chris@4: Chris@4: bool DirectionSpecificStreamParameters::isSampleFormatInterleaved() const Chris@4: { Chris@4: return ((paStreamParameters_.sampleFormat & paNonInterleaved) == 0); Chris@4: } Chris@4: Chris@4: bool DirectionSpecificStreamParameters::isSampleFormatHostApiSpecific() const Chris@4: { Chris@4: return ((paStreamParameters_.sampleFormat & paCustomFormat) == 0); Chris@4: } Chris@4: Chris@4: ////// Chris@4: /// Returns the host api-specific sample format, without including any Chris@4: /// paCustomFormat or paNonInterleaved flags. Will return 0 if the sample format is Chris@4: /// not host api-specific. Chris@4: ////// Chris@4: PaSampleFormat DirectionSpecificStreamParameters::hostApiSpecificSampleFormat() const Chris@4: { Chris@4: if (isSampleFormatHostApiSpecific()) Chris@4: return paStreamParameters_.sampleFormat & ~paCustomFormat & ~paNonInterleaved; Chris@4: else Chris@4: return 0; Chris@4: } Chris@4: Chris@4: PaTime DirectionSpecificStreamParameters::suggestedLatency() const Chris@4: { Chris@4: return paStreamParameters_.suggestedLatency; Chris@4: } Chris@4: Chris@4: void *DirectionSpecificStreamParameters::hostApiSpecificStreamInfo() const Chris@4: { Chris@4: return paStreamParameters_.hostApiSpecificStreamInfo; Chris@4: } Chris@4: Chris@4: // ----------------------------------------------------------------------------------- Chris@4: Chris@4: } // namespace portaudio