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