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