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