void Win32DirectSoundAudioDriver::SetSampleRate(int sampleRate)
	{
		mutex->Lock();
		this->sampleRate = sampleRate;
		recreateBuffers();
		mutex->Unlock();
	}
	void Win32DirectSoundAudioDriver::SetLatencyMs(int latencyMs)
	{
		mutex->Lock();
		this->latencyMs = latencyMs;
		recreateBuffers();
		mutex->Unlock();
	}
Beispiel #3
0
bool PortAudioDriver::start(){

    if(audioDeviceIndex == paNoDevice){
        return false;
    }

    stop();

    qCInfo(jtAudio) << "Starting portaudio driver using" << getAudioDeviceName(audioDeviceIndex) << " as device.";

    ensureInputRangeIsValid();
    ensureOutputRangeIsValid();

    recreateBuffers();//adjust the input and output buffers channels

    unsigned long framesPerBuffer = bufferSize;// paFramesPerBufferUnspecified;
    qCInfo(jtAudio) << "Starting portaudio driver using" << framesPerBuffer << " as buffer size.";
    PaSampleFormat sampleFormat = paFloat32;// | paNonInterleaved;

    PaStreamParameters inputParams;
    inputParams.channelCount = globalInputRange.getChannels();// maxInputChannels;//*/ inputChannels;
    inputParams.device = audioDeviceIndex;
    inputParams.sampleFormat = sampleFormat;
    inputParams.suggestedLatency = 0;//computeSuggestedLatency(sampleRate, bufferSize);// Pa_GetDeviceInfo(inputDeviceIndex)->defaultLowOutputLatency;
    inputParams.hostApiSpecificStreamInfo = NULL;

    configureHostSpecificInputParameters(inputParams);//this can be different in different operational systems

    //+++++++++ OUTPUT
    PaStreamParameters outputParams;
    outputParams.channelCount = globalOutputRange.getChannels();// */outputChannels;
    outputParams.device = audioDeviceIndex;
    outputParams.sampleFormat = sampleFormat;
    outputParams.suggestedLatency = 0;//computeSuggestedLatency(sampleRate, bufferSize);//  Pa_GetDeviceInfo(outputDeviceIndex)->defaultLowOutputLatency;
    outputParams.hostApiSpecificStreamInfo = NULL;

    configureHostSpecificOutputParameters(outputParams);

    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    bool willUseInputParams = !globalInputRange.isEmpty();
    if(willUseInputParams){
        qCInfo(jtAudio) << "Trying initialize portaudio using inputParams and samplerate=" << sampleRate;
    }
    else{
        qCInfo(jtAudio) << "Trying initialize portaudio WITHOUT inputParams because globalInputRange is empty!";
        qCInfo(jtAudio) << "Detected inputs for " << getAudioDeviceName(audioDeviceIndex) << ":" << getMaxInputs();
    }

    // test if output format is supported
    if(globalOutputRange.isEmpty())
        return false;
    PaError error =  Pa_IsFormatSupported( nullptr, &outputParams, sampleRate);
    if(error != paNoError){
        qCritical() << "unsuported output format: " <<
                       Pa_GetErrorText(error) <<
                       "sampleRate: " << sampleRate <<
                       "channels: " << outputParams.channelCount << endl;
        this->audioDeviceIndex = paNoDevice;
        releaseHostSpecificParameters(inputParams, outputParams);
        return false;
    }


    // test if input format is supported
    if(!globalInputRange.isEmpty()){
        error =  Pa_IsFormatSupported( &inputParams, nullptr, sampleRate);
        if(error != paNoError){
            qCritical() << "unsuported input format: " <<
                           Pa_GetErrorText(error) <<
                           "sampleRate: " << sampleRate <<
                           "channels: " << inputParams.channelCount << endl;
            this->audioDeviceIndex = paNoDevice;
            releaseHostSpecificParameters(inputParams, outputParams);
            return false;
        }
    }

    paStream = NULL;
    error = Pa_OpenStream(&paStream,
                          (!globalInputRange.isEmpty()) ? (&inputParams) : NULL,
                          &outputParams,
                          sampleRate, framesPerBuffer,
                          paNoFlag, portaudioCallBack, (void*)this);//I'm passing this to portaudio, so I can run methods inside the callback function
    if (error != paNoError){
        releaseHostSpecificParameters(inputParams, outputParams);
        return false;
    }
    if(paStream != NULL){
        error = Pa_StartStream(paStream);
        if (error != paNoError){
            releaseHostSpecificParameters(inputParams, outputParams);
            return false;
        }
    }
    qCInfo(jtAudio) << "portaudio driver started ok!";
    emit started();

    releaseHostSpecificParameters(inputParams, outputParams);

    return true;
}