diff --git a/contrib/src/portaudio/rules.mak b/contrib/src/portaudio/rules.mak index c0db18a8b5b429e65e051e79bc96e7993bc3e775..6f4468523a3740380680e605229b51ab2ee1d7bf 100644 --- a/contrib/src/portaudio/rules.mak +++ b/contrib/src/portaudio/rules.mak @@ -11,6 +11,7 @@ ifeq ($(call need_pkg,"portaudio >= 2.0"),) PKGS_FOUND += portaudio endif +PORTAUDIOCONF := --with-winapi=directx $(TARBALLS)/portaudio-$(PORTAUDIO_VERSION).tgz: $(call download,$(PORTAUDIO_URL)) @@ -21,6 +22,6 @@ portaudio: portaudio-$(PORTAUDIO_VERSION).tgz .sum-portaudio $(UNPACK) .portaudio: portaudio - cd $< && $(HOSTVARS) ./configure $(HOSTCONF) + cd $< && $(HOSTVARS) ./configure $(HOSTCONF) $(PORTAUDIOCONF) cd $< && $(MAKE) install touch $@ diff --git a/src/media/audio/portaudio/portaudiolayer.cpp b/src/media/audio/portaudio/portaudiolayer.cpp index 0795a2d2dec2891e040ec24fa6f14e79b0966f17..3261031c6bb15db2dca1e136f71a22cf43811226 100644 --- a/src/media/audio/portaudio/portaudiolayer.cpp +++ b/src/media/audio/portaudio/portaudiolayer.cpp @@ -36,7 +36,7 @@ #include "audio/ringbuffer.h" namespace ring { -//FIXME: We should use WASAPi or DirectSound + PortAudioLayer::PortAudioLayer(const AudioPreference &pref) : AudioLayer(pref) , indexIn_(pref.getAlsaCardin()) @@ -133,9 +133,8 @@ PortAudioLayer::stopStream() RING_DBG("Stop PortAudio Streams"); - //FIX ME : Abort or Stop ?? for (int i = 0; i < Direction::End; i++) { - auto err = Pa_AbortStream(streams[i]); + auto err = Pa_StopStream(streams[i]); if(err != paNoError) this->handleError(err); @@ -349,11 +348,19 @@ PortAudioLayer::init() this->handleError(err); this->terminate(); } - //FIXME: Maybe find a better way - const PaDeviceInfo *outputDeviceInfo = Pa_GetDeviceInfo(indexOut_); + + indexOut_ = indexRing_ = Pa_GetDefaultOutputDevice(); + indexIn_ = Pa_GetDefaultInputDevice(); + + const auto outputDeviceInfo = Pa_GetDeviceInfo(indexOut_); audioFormat_.nb_channels = outputDeviceInfo->maxOutputChannels; - audioFormat_.sample_rate = 48000; + audioFormat_.sample_rate = outputDeviceInfo->defaultSampleRate; hardwareFormatAvailable(audioFormat_); + + const auto inputDeviceInfo = Pa_GetDeviceInfo(indexIn_); + audioInputFormat_.nb_channels = inputDeviceInfo->maxInputChannels; + audioInputFormat_.sample_rate = inputDeviceInfo->defaultSampleRate; + hardwareInputFormatAvailable(audioInputFormat_); } void @@ -373,19 +380,15 @@ PortAudioLayer::initStream() RING_DBG("Open PortAudio Output Stream"); PaStreamParameters outputParameters; outputParameters.device = indexOut_; - RING_DBG("Index Device: %d", indexOut_); + if (outputParameters.device == paNoDevice) { - //TODO Should we fallback to default output device ? RING_ERR("Error: No valid output device. There will be no sound."); } + const auto outputDeviceInfo = Pa_GetDeviceInfo(outputParameters.device); - RING_DBG("Default Sample Rate : %d", outputDeviceInfo->defaultSampleRate); outputParameters.channelCount = audioFormat_.nb_channels = outputDeviceInfo->maxOutputChannels; - //FIX ME : Default is 0.... - audioFormat_.sample_rate = 48000; - outputParameters.sampleFormat = paInt16; outputParameters.suggestedLatency = outputDeviceInfo->defaultLowOutputLatency; outputParameters.hostApiSpecificStreamInfo = NULL; @@ -394,7 +397,7 @@ PortAudioLayer::initStream() &streams[Direction::Output], NULL, &outputParameters, - audioFormat_.sample_rate, + outputDeviceInfo->defaultSampleRate, paFramesPerBufferUnspecified, paNoFlag, &PortAudioLayer::paOutputCallback, @@ -406,14 +409,11 @@ PortAudioLayer::initStream() PaStreamParameters inputParameters; inputParameters.device = indexIn_; if (inputParameters.device == paNoDevice) { - //TODO Should we fallback to default output device ? RING_ERR("Error: No valid input device. There will be no mic."); } const auto inputDeviceInfo = Pa_GetDeviceInfo(inputParameters.device); - //FIX ME : Default is 0.... - audioInputFormat_.sample_rate = 48000; inputParameters.channelCount = audioInputFormat_.nb_channels = inputDeviceInfo->maxInputChannels; inputParameters.sampleFormat = paInt16; @@ -424,7 +424,7 @@ PortAudioLayer::initStream() &streams[Direction::Input], &inputParameters, NULL, - audioInputFormat_.sample_rate, + inputDeviceInfo->defaultSampleRate, paFramesPerBufferUnspecified, paNoFlag, &PortAudioLayer::paInputCallback, @@ -437,9 +437,6 @@ PortAudioLayer::initStream() this->handleError(err); } - hardwareFormatAvailable(audioFormat_); - hardwareInputFormatAvailable(audioInputFormat_); - flushUrgent(); flushMain(); }