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
							 |