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(); }
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; }