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