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