diff --git a/lib/native/linux/libjportaudio.so b/lib/native/linux/libjportaudio.so index 914c741bc..3363a69e8 100755 Binary files a/lib/native/linux/libjportaudio.so and b/lib/native/linux/libjportaudio.so differ diff --git a/src/native/portaudio/net_java_sip_communicator_impl_media_protocol_portaudio_PortAudio.c b/src/native/portaudio/net_java_sip_communicator_impl_media_protocol_portaudio_PortAudio.c index ffa388da0..b6742f0be 100644 --- a/src/native/portaudio/net_java_sip_communicator_impl_media_protocol_portaudio_PortAudio.c +++ b/src/native/portaudio/net_java_sip_communicator_impl_media_protocol_portaudio_PortAudio.c @@ -390,20 +390,17 @@ static PaStreamParameters * PortAudio_fixInputParametersSuggestedLatency( PaStreamParameters *inputParameters) { - if (inputParameters && (0 == inputParameters->suggestedLatency)) - { - PaDeviceInfo *deviceInfo = Pa_GetDeviceInfo(inputParameters->device); + if (inputParameters && (0 == inputParameters->suggestedLatency)) + { + PaDeviceInfo *deviceInfo = Pa_GetDeviceInfo(inputParameters->device); - if (deviceInfo) + if (deviceInfo) { - // default latency of 100ms seems ok - // to use portaudio on all systems inputParameters->suggestedLatency - = 0.1; //= deviceInfo->defaultLowInputLatency; - + = deviceInfo->defaultLowInputLatency; } - } - return inputParameters; + } + return inputParameters; } static PaStreamParameters * diff --git a/src/net/java/sip/communicator/impl/media/device/PortAudioAuto.java b/src/net/java/sip/communicator/impl/media/device/PortAudioAuto.java index 64269d7bb..ad2057317 100644 --- a/src/net/java/sip/communicator/impl/media/device/PortAudioAuto.java +++ b/src/net/java/sip/communicator/impl/media/device/PortAudioAuto.java @@ -61,7 +61,7 @@ public class PortAudioAuto new CaptureDeviceInfo( PortAudio.PaDeviceInfo_getName(deviceInfo), new MediaLocator( - PortAudioStream.LOCATOR_PREFIX + deviceIndex), + PortAudioUtils.LOCATOR_PREFIX + deviceIndex), PortAudioStream.getFormats()); if(maxInputChannels > 0) diff --git a/src/net/java/sip/communicator/impl/media/notify/PortAudioClipImpl.java b/src/net/java/sip/communicator/impl/media/notify/PortAudioClipImpl.java index 341ebd757..3701dee07 100644 --- a/src/net/java/sip/communicator/impl/media/notify/PortAudioClipImpl.java +++ b/src/net/java/sip/communicator/impl/media/notify/PortAudioClipImpl.java @@ -111,7 +111,7 @@ public void run() if (portAudioStream == 0) { int deviceIndex = - PortAudioStream.getDeviceIndexFromLocator( + PortAudioUtils.getDeviceIndexFromLocator( audioNotifier.getDeviceConfiguration(). getAudioNotifyDevice().getLocator()); long devInfo = PortAudio.Pa_GetDeviceInfo(deviceIndex); @@ -129,7 +129,8 @@ public void run() = PortAudio.PaStreamParameters_new( deviceIndex, outChannels, - PortAudio.SAMPLE_FORMAT_INT16); + PortAudioUtils.getPortAudioSampleFormat( + audioStreamFormat.getSampleSizeInBits())); // check if file samplerate is supported // if it is use it and not resample if(!PortAudio.Pa_IsFormatSupported( diff --git a/src/net/java/sip/communicator/impl/media/protocol/portaudio/PortAudio.java b/src/net/java/sip/communicator/impl/media/protocol/portaudio/PortAudio.java index ce5a0f29a..6535456e7 100644 --- a/src/net/java/sip/communicator/impl/media/protocol/portaudio/PortAudio.java +++ b/src/net/java/sip/communicator/impl/media/protocol/portaudio/PortAudio.java @@ -30,6 +30,36 @@ public final class PortAudio */ public static final long SAMPLE_FORMAT_INT16 = 0x00000008; + /** + * A type used to specify one or more sample formats. + * The format paFloat32. + */ + public static final long SAMPLE_FORMAT_FLOAT32 = 0x00000001; + + /** + * A type used to specify one or more sample formats. + * The format paInt32. + */ + public static final long SAMPLE_FORMAT_INT32 = 0x00000002; + + /** + * A type used to specify one or more sample formats. + * The format paInt24. + */ + public static final long SAMPLE_FORMAT_INT24 = 0x00000004; + + /** + * A type used to specify one or more sample formats. + * The format paInt8. + */ + public static final long SAMPLE_FORMAT_INT8 = 0x00000010; + + /** + * A type used to specify one or more sample formats. + * The format paUInt8. + */ + public static final long SAMPLE_FORMAT_UINT8 = 0x00000020; + /** * Flags used to control the behavior of a stream. * They are passed as parameters to Pa_OpenStream or Pa_OpenDefaultStream. diff --git a/src/net/java/sip/communicator/impl/media/protocol/portaudio/PortAudioStream.java b/src/net/java/sip/communicator/impl/media/protocol/portaudio/PortAudioStream.java index 070305eb8..6ce80f6a5 100644 --- a/src/net/java/sip/communicator/impl/media/protocol/portaudio/PortAudioStream.java +++ b/src/net/java/sip/communicator/impl/media/protocol/portaudio/PortAudioStream.java @@ -24,11 +24,6 @@ public class PortAudioStream private static final Logger logger = Logger.getLogger(PortAudioStream.class); - /** - * The locator prefix used when creating or parsing MediaLocators. - */ - public static final String LOCATOR_PREFIX = "portaudio:#"; - /** * The indicator which determines whether * PortAudioStream#read(Buffer) will try to workaround a crash @@ -55,8 +50,8 @@ public class PortAudioStream { String osName = System.getProperty("os.name"); - USE_FRAMES_PER_BUFFER_WORKAROUND - = (osName != null) && osName.contains("Linux"); + USE_FRAMES_PER_BUFFER_WORKAROUND = false; +// = (osName != null) && osName.contains("Linux"); } private Control[] controls = new Control[0]; @@ -75,7 +70,7 @@ public class PortAudioStream */ public PortAudioStream(MediaLocator locator) { - this.deviceIndex = getDeviceIndexFromLocator(locator); + this.deviceIndex = PortAudioUtils.getDeviceIndexFromLocator(locator); } /** @@ -272,7 +267,7 @@ public synchronized void read(Buffer buffer) } PortAudio.Pa_ReadStream(stream, bytebuff, readAvailableFrames); - + buffer.setTimeStamp(System.nanoTime()); buffer.setData(bytebuff); buffer.setSequenceNumber(seqNo); @@ -289,15 +284,4 @@ public synchronized void read(Buffer buffer) throw ioe; } } - - /** - * Extracts the device index from the locator. - * @param locator the locator containing the device index. - * @return the extracted device index. - */ - public static int getDeviceIndexFromLocator(MediaLocator locator) - { - return Integer.parseInt(locator.toExternalForm().replace( - PortAudioStream.LOCATOR_PREFIX, "")); - } } diff --git a/src/net/java/sip/communicator/impl/media/protocol/portaudio/PortAudioUtils.java b/src/net/java/sip/communicator/impl/media/protocol/portaudio/PortAudioUtils.java new file mode 100644 index 000000000..b05c2b52e --- /dev/null +++ b/src/net/java/sip/communicator/impl/media/protocol/portaudio/PortAudioUtils.java @@ -0,0 +1,49 @@ +/* + * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package net.java.sip.communicator.impl.media.protocol.portaudio; + +import javax.media.*; + +/** + * Common used util methods concerning PortAudio. + * @author Damian Minkov + */ +public class PortAudioUtils +{ + /** + * The locator prefix used when creating or parsing MediaLocators. + */ + public static final String LOCATOR_PREFIX = "portaudio:#"; + + /** + * Extracts the device index from the locator. + * @param locator the locator containing the device index. + * @return the extracted device index. + */ + public static int getDeviceIndexFromLocator(MediaLocator locator) + { + return Integer.parseInt(locator.toExternalForm().replace( + LOCATOR_PREFIX, "")); + } + + /** + * Returns the PortAudio sample format. + * @param sampleSizeInBits the size in bits. + * @return the portaudio sampleformat. + */ + public static long getPortAudioSampleFormat(int sampleSizeInBits) + { + switch(sampleSizeInBits) + { + case 8 : return PortAudio.SAMPLE_FORMAT_INT8; + case 16 : return PortAudio.SAMPLE_FORMAT_INT16; + case 24 : return PortAudio.SAMPLE_FORMAT_INT24; + case 32 : return PortAudio.SAMPLE_FORMAT_INT32; + default : return PortAudio.SAMPLE_FORMAT_INT16; + } + } +} diff --git a/src/net/java/sip/communicator/impl/media/renderer/audio/PortAudioRenderer.java b/src/net/java/sip/communicator/impl/media/renderer/audio/PortAudioRenderer.java index 12ae0e8e4..a9088de9a 100644 --- a/src/net/java/sip/communicator/impl/media/renderer/audio/PortAudioRenderer.java +++ b/src/net/java/sip/communicator/impl/media/renderer/audio/PortAudioRenderer.java @@ -43,8 +43,6 @@ public class PortAudioRenderer boolean started = false; -// private final Object bufferSync = new Object(); - private static int deviceIndex = -1; private static int frameSize; @@ -274,7 +272,7 @@ public Object getControl(String controlType) */ public static void setDevice(MediaLocator locator) { - deviceIndex = PortAudioStream.getDeviceIndexFromLocator(locator); + deviceIndex = PortAudioUtils.getDeviceIndexFromLocator(locator); long device = PortAudio.Pa_GetDeviceInfo(deviceIndex); int outputChannels = 1; diff --git a/src/net/java/sip/communicator/impl/neomedia/device/PortAudioAuto.java b/src/net/java/sip/communicator/impl/neomedia/device/PortAudioAuto.java index 74ff908bd..8c98d3ed6 100644 --- a/src/net/java/sip/communicator/impl/neomedia/device/PortAudioAuto.java +++ b/src/net/java/sip/communicator/impl/neomedia/device/PortAudioAuto.java @@ -50,7 +50,7 @@ public class PortAudioAuto new CaptureDeviceInfo( PortAudio.PaDeviceInfo_getName(deviceInfo), new MediaLocator( - PortAudioStream.LOCATOR_PREFIX + deviceIndex), + PortAudioUtils.LOCATOR_PREFIX + deviceIndex), PortAudioStream.getFormats()); if(maxInputChannels > 0)