Make sure we clean the connected streams if any, prevents segfaults when using echo cancel. Open the devices in their reported default sample rate.

cusax-fix
Damian Minkov 16 years ago
parent 4c655342fe
commit e07578b89b

Binary file not shown.

Binary file not shown.

@ -191,6 +191,18 @@ Java_net_java_sip_communicator_impl_neomedia_portaudio_PortAudio_Pa_1CloseStream
if(!portAudioStream)
return;
/* Before clearing and destroying any part of current stream
* clear it from any connected stream so it wont be used
*/
if(portAudioStream->connectedToStream != NULL
&& ((PortAudioStream *)portAudioStream->connectedToStream)->
connectedToStream != NULL)
{
((PortAudioStream *)portAudioStream->connectedToStream)->
connectedToStream = NULL;
portAudioStream->connectedToStream = NULL;
}
PaError errorCode = Pa_CloseStream(portAudioStream->stream);
if(portAudioStream->outputResampleFactor != 1.0
@ -285,13 +297,30 @@ Java_net_java_sip_communicator_impl_neomedia_portaudio_PortAudio_Pa_1OpenStream(
if (!stream)
return 0;
double defSampleRate = DEFAULT_SAMPLE_RATE;
/*
* Obay default sample rate of the device. some devices has
* default 44.1 kHz and some 48 kHz.
*/
if(outputStreamParameters)
{
defSampleRate =
Pa_GetDeviceInfo(outputStreamParameters->device)->defaultSampleRate;
}
else if(inputStreamParameters)
{
defSampleRate =
Pa_GetDeviceInfo(inputStreamParameters->device)->defaultSampleRate;
}
errorCode
= Pa_OpenStream(
&(stream->stream),
PortAudio_fixInputParametersSuggestedLatency(inputStreamParameters),
PortAudio_fixOutputParametersSuggestedLatency(
outputStreamParameters),
DEFAULT_SAMPLE_RATE,
defSampleRate,
framesPerBuffer,
streamFlags,
streamCallback ? PortAudioStream_callback : NULL,
@ -301,14 +330,14 @@ Java_net_java_sip_communicator_impl_neomedia_portaudio_PortAudio_Pa_1OpenStream(
if(outputStreamParameters)
{
stream->outputResampleFactor = DEFAULT_SAMPLE_RATE / sampleRate;
stream->outputResampleFactor = defSampleRate / sampleRate;
if(stream->outputResampleFactor != 1.0)
{
stream->outputChannelCount = outputStreamParameters->channelCount;
// resample quality 3 is for voip
stream->outputResampler = speex_resampler_init(
stream->outputChannelCount, sampleRate, DEFAULT_SAMPLE_RATE, 3, NULL);
stream->outputChannelCount, sampleRate, defSampleRate, 3, NULL);
}
}
else
@ -316,7 +345,7 @@ Java_net_java_sip_communicator_impl_neomedia_portaudio_PortAudio_Pa_1OpenStream(
if(inputStreamParameters)
{
stream->inputResampleFactor = DEFAULT_SAMPLE_RATE / sampleRate;
stream->inputResampleFactor = defSampleRate / sampleRate;
if(stream->inputResampleFactor != 1.0)
{
@ -324,7 +353,7 @@ Java_net_java_sip_communicator_impl_neomedia_portaudio_PortAudio_Pa_1OpenStream(
// resample quality 3 is for voip
stream->inputResampler = speex_resampler_init(
stream->inputChannelCount, DEFAULT_SAMPLE_RATE, sampleRate, 3, NULL);
stream->inputChannelCount, defSampleRate, sampleRate, 3, NULL);
stream->inputFrameSize
= PortAudio_getFrameSize(inputStreamParameters);

Loading…
Cancel
Save