[sipxtapi] r1416 committed - Merged revisions 1375-1377 via svnmerge from ...

5 views
Skip to first unread message

codesite...@google.com

unread,
Jan 15, 2011, 10:36:56 AM1/15/11
to sipxtapi...@googlegroups.com
Revision: 1416
Author: jaroslavl1
Date: Sat Jan 15 07:34:29 2011
Log: Merged revisions 1375-1377 via svnmerge from
https://sipxtapi.googlecode.com/svn/trunk

........
r1375 | jaroslavl1 | 2010-01-22 22:08:15 +0100 (Fri, 22 Jan 2010) | 1 line

Bugfix: Portaudio DirectSound driver only supports asynchronous streams.
Therefore for Windows Multimedia driver use synchronous, for DirectSound
asynchronous portaudio streams.
........
r1376 | jaroslavl1 | 2010-01-23 11:51:04 +0100 (Sat, 23 Jan 2010) | 1 line

Input and output stream latency is now correctly calculated for both
synchronous and asynchronous streams.
........
r1377 | jaroslavl1 | 2010-01-23 12:17:53 +0100 (Sat, 23 Jan 2010) | 2
lines

Latency tuning. Tested various latency settings on Windows 7.
We now have 40ms input/output latency with Windows Multimedia driver, and
120ms input/output latency with DirectSound driver.
........

http://code.google.com/p/sipxtapi/source/detail?r=1416

Modified:
/branches/sipxtapi-3.2.1

/branches/sipxtapi-3.2.1/sipXmediaLib/contrib/portaudio_v19/src/hostapi/wmme/pa_win_wmme.c
/branches/sipxtapi-3.2.1/sipXmediaLib/include/mp/MpAsyncPortAudioStream.h
/branches/sipxtapi-3.2.1/sipXmediaLib/include/mp/MpAudioDriverManager.h
/branches/sipxtapi-3.2.1/sipXmediaLib/include/mp/MpPortAudioStreamBase.h
/branches/sipxtapi-3.2.1/sipXmediaLib/include/mp/MpSyncPortAudioStream.h
/branches/sipxtapi-3.2.1/sipXmediaLib/src/mp/MpAsyncPortAudioStream.cpp
/branches/sipxtapi-3.2.1/sipXmediaLib/src/mp/MpAudioDriverManager.cpp
/branches/sipxtapi-3.2.1/sipXmediaLib/src/mp/MpCallFlowGraph.cpp
/branches/sipxtapi-3.2.1/sipXmediaLib/src/mp/MpPortAudioDriver.cpp
/branches/sipxtapi-3.2.1/sipXmediaLib/src/mp/MpPortAudioStreamBase.cpp
/branches/sipxtapi-3.2.1/sipXmediaLib/src/mp/MpSyncPortAudioStream.cpp

=======================================
---
/branches/sipxtapi-3.2.1/sipXmediaLib/contrib/portaudio_v19/src/hostapi/wmme/pa_win_wmme.c
Wed Oct 22 11:32:45 2008
+++
/branches/sipxtapi-3.2.1/sipXmediaLib/contrib/portaudio_v19/src/hostapi/wmme/pa_win_wmme.c
Sat Jan 15 07:34:29 2011
@@ -192,7 +192,7 @@
#define PA_MME_WIN_NT_DEFAULT_LATENCY_
(PA_MME_WIN_9X_DEFAULT_LATENCY_ * 2)
#define PA_MME_WIN_WDM_DEFAULT_LATENCY_
(PA_MME_WIN_9X_DEFAULT_LATENCY_)
#define PA_MME_WIN_DEFAULT_MIN_BUFFER_COUNT_ 2
-#define PA_MME_WIN_VISTA_MIN_BUFFER_COUNT_ 16
+#define PA_MME_WIN_VISTA_MIN_BUFFER_COUNT_ 4


#define PA_MME_MIN_TIMEOUT_MSEC_ (1000)
=======================================
---
/branches/sipxtapi-3.2.1/sipXmediaLib/include/mp/MpAsyncPortAudioStream.h
Sat Jan 15 07:00:40 2011
+++
/branches/sipxtapi-3.2.1/sipXmediaLib/include/mp/MpAsyncPortAudioStream.h
Sat Jan 15 07:34:29 2011
@@ -107,6 +107,17 @@
/* ============================ ACCESSORS
================================= */
///@name Accessors
//@{
+
+ /**
+ * Returns input latency in seconds of the stream.
+ */
+ virtual double getInputLatency() const;
+
+ /**
+ * Returns output latency in seconds of the stream.
+ */
+ virtual double getOutputLatency() const;
+
//@}
/* ============================ INQUIRY
=================================== */
///@name Inquiry
@@ -170,7 +181,6 @@
volatile bool m_outputBufferPrefetchMode; ///< whether output buffer is
in prefetch mode
unsigned int m_inputPrefetchCount; ///< input buffer latency in frames
unsigned int m_outputPrefetchCount; ///< output buffer latency in frames
-
bool m_bFrameRecorded; ///< whether at least one frame has been recorded
bool m_bFramePushed; ///< whether at least one frame has been pushed

=======================================
--- /branches/sipxtapi-3.2.1/sipXmediaLib/include/mp/MpAudioDriverManager.h
Sat Jan 15 07:24:17 2011
+++ /branches/sipxtapi-3.2.1/sipXmediaLib/include/mp/MpAudioDriverManager.h
Sat Jan 15 07:34:29 2011
@@ -254,6 +254,11 @@
/// Assignment operator (not implemented for this class)
MpAudioDriverManager& operator=(const MpAudioDriverManager& rhs);

+ /**
+ * Returns TRUE if synchronous stream should be used for given host api.
+ */
+ static UtlBoolean useSynchronousStream(const UtlString& hostApiName);
+
static OsMutex ms_mutex;
static MpAudioDriverManager* ms_pInstance;

=======================================
---
/branches/sipxtapi-3.2.1/sipXmediaLib/include/mp/MpPortAudioStreamBase.h
Sat Jan 15 07:00:40 2011
+++
/branches/sipxtapi-3.2.1/sipXmediaLib/include/mp/MpPortAudioStreamBase.h
Sat Jan 15 07:34:29 2011
@@ -91,6 +91,35 @@
*/
virtual UtlContainableType getContainableType() const;

+ /**
+ * Returns input latency in seconds of the stream.
+ */
+ virtual double getInputLatency() const = 0;
+
+ /**
+ * Returns output latency in seconds of the stream.
+ */
+ virtual double getOutputLatency() const = 0;
+
+ /**
+ * Gets latency of the input port audio stream
+ * which excludes latency of the wrapper.
+ */
+ double getInputPortStreamLatency() const { return
m_inputPortStreamLatency; }
+ void setInputPortStreamLatency(double val) { m_inputPortStreamLatency =
val; }
+
+ /**
+ * Gets latency of the output port audio stream
+ * which excludes latency of the wrapper.
+ */
+ double getOutputPortStreamLatency() const { return
m_outputPortStreamLatency; }
+ void setOutputPortStreamLatency(double val) { m_outputPortStreamLatency
= val; }
+
+ /**
+ * Returns sample rate of stream in Hz.
+ */
+ double getSampleRate() const;
+
/* ============================ INQUIRY
=================================== */

/**
@@ -125,6 +154,9 @@
unsigned int m_inputSampleSize; ///< size of input sample in bytes per
channel
unsigned int m_outputSampleSize; ///< size of output sample in bytes
per channel

+ double m_inputPortStreamLatency; ///< latency in seconds of the input
port audio stream
+ double m_outputPortStreamLatency; ///< latency in seconds of the output
port audio stream
+
MpVolumeMeterBase* m_inputVolumeMeter; ///< volume meter for input
MpVolumeMeterBase* m_outputVolumeMeter; ///< volume meter for output

=======================================
---
/branches/sipxtapi-3.2.1/sipXmediaLib/include/mp/MpSyncPortAudioStream.h
Sat Jan 15 07:00:40 2011
+++
/branches/sipxtapi-3.2.1/sipXmediaLib/include/mp/MpSyncPortAudioStream.h
Sat Jan 15 07:34:29 2011
@@ -71,6 +71,16 @@

/* ============================ ACCESSORS
================================= */

+ /**
+ * Returns input latency in seconds of the stream.
+ */
+ virtual double getInputLatency() const;
+
+ /**
+ * Returns output latency in seconds of the stream.
+ */
+ virtual double getOutputLatency() const;
+
/* ============================ INQUIRY
=================================== */

/* //////////////////////////// PROTECTED
///////////////////////////////// */
=======================================
--- /branches/sipxtapi-3.2.1/sipXmediaLib/src/mp/MpAsyncPortAudioStream.cpp
Sat Jan 15 07:00:40 2011
+++ /branches/sipxtapi-3.2.1/sipXmediaLib/src/mp/MpAsyncPortAudioStream.cpp
Sat Jan 15 07:34:29 2011
@@ -328,6 +328,30 @@
}

/* ============================ ACCESSORS
================================= */
+
+double MpAsyncPortAudioStream::getInputLatency() const
+{
+ if (m_inputSampleSize != 0 && m_inputChannelCount != 0)
+ {
+ return m_inputPortStreamLatency + (double)m_inputPrefetchCount /
(m_sampleRate * m_inputSampleSize * m_inputChannelCount);
+ }
+ else
+ {
+ return 0.0;
+ }
+}
+
+double MpAsyncPortAudioStream::getOutputLatency() const
+{
+ if (m_outputSampleSize != 0 && m_outputChannelCount != 0)
+ {
+ return m_outputPortStreamLatency + (double)m_outputPrefetchCount /
(m_sampleRate * m_outputSampleSize * m_outputChannelCount);
+ }
+ else
+ {
+ return 0.0;
+ }
+}

/* ============================ INQUIRY
=================================== */

=======================================
--- /branches/sipxtapi-3.2.1/sipXmediaLib/src/mp/MpAudioDriverManager.cpp
Sat Jan 15 07:24:17 2011
+++ /branches/sipxtapi-3.2.1/sipXmediaLib/src/mp/MpAudioDriverManager.cpp
Sat Jan 15 07:34:29 2011
@@ -18,7 +18,7 @@
// DEFINES
#define INPUT_MIXER_INDEX 0
#define OUTPUT_MIXER_INDEX 0
-#define DEFAULT_LATENCY 0.06
+#define DEFAULT_LATENCY 0.04

// EXTERNAL FUNCTIONS
// EXTERNAL VARIABLES
@@ -191,6 +191,7 @@
UtlBoolean bDriverReq = !driverName.isNull();
MpAudioDeviceIndex deviceCount = 0;
MpAudioDeviceIndex i = 0;
+ UtlString hostApiName;
m_pAudioDriver->getDeviceCount(deviceCount);

// loop through all devices, and find matching one
@@ -207,6 +208,7 @@
{
// we found match, we will select this device
bDeviceFound = TRUE;
+ hostApiName = deviceInfo.getHostApiName();
break;
}
}
@@ -219,6 +221,7 @@
{
// we found match, we will select this device
bDeviceFound = TRUE;
+ hostApiName = deviceInfo.getHostApiName();
break;
}
}
@@ -243,7 +246,7 @@
MpMisc.m_audioSampleRate,
MpMisc.m_audioSamplesPerFrame,
MP_AUDIO_STREAM_DITHEROFF,
- TRUE);
+ MpAudioDriverManager::useSynchronousStream(hostApiName));
if (res != OS_SUCCESS)
{
return OS_FAILED;
@@ -336,6 +339,7 @@
UtlBoolean bDriverReq = !driverName.isNull();
MpAudioDeviceIndex deviceCount = 0;
MpAudioDeviceIndex i = 0;
+ UtlString hostApiName;
m_pAudioDriver->getDeviceCount(deviceCount);

// loop through all devices, and find matching one
@@ -352,6 +356,7 @@
{
// we found match, we will select this device
bDeviceFound = TRUE;
+ hostApiName = deviceInfo.getHostApiName();
break;
}
}
@@ -364,6 +369,7 @@
{
// we found match, we will select this device
bDeviceFound = TRUE;
+ hostApiName = deviceInfo.getHostApiName();
break;
}
}
@@ -388,7 +394,7 @@
MpMisc.m_audioSampleRate,
MpMisc.m_audioSamplesPerFrame,
MP_AUDIO_STREAM_DITHEROFF,
- TRUE);
+ MpAudioDriverManager::useSynchronousStream(hostApiName));
if (res != OS_SUCCESS)
{
return OS_FAILED;
@@ -824,7 +830,7 @@
inputParameters.setDeviceIndex(m_inputDeviceIndex);
outputParameters.setDeviceIndex(m_outputDeviceIndex);

- // open asynchronous input stream
+ // open default input stream
m_pAudioDriver->openStream(&m_inputAudioStream,
&inputParameters,
NULL,
@@ -833,7 +839,7 @@
MP_AUDIO_STREAM_CLIPOFF,
TRUE);

- // open asynchronous output stream
+ // open default output stream
m_pAudioDriver->openStream(&m_outputAudioStream,
NULL,
&outputParameters,
@@ -901,6 +907,18 @@
m_pAudioDriver = NULL;
}
}
+
+UtlBoolean MpAudioDriverManager::useSynchronousStream(const UtlString&
hostApiName)
+{
+ if (hostApiName.compareTo("Windows DirectSound", UtlString::matchCase)
== 0)
+ {
+ return FALSE; // direct sound driver doesn't support synchronous
streams
+ }
+ else
+ {
+ return TRUE;
+ }
+}

/* ============================ FUNCTIONS
================================= */

=======================================
--- /branches/sipxtapi-3.2.1/sipXmediaLib/src/mp/MpCallFlowGraph.cpp Sat
Jan 15 06:35:26 2011
+++ /branches/sipxtapi-3.2.1/sipXmediaLib/src/mp/MpCallFlowGraph.cpp Sat
Jan 15 07:34:29 2011
@@ -1841,7 +1841,7 @@
/* //////////////////////////// PROTECTED
///////////////////////////////// */

/* //////////////////////////// PRIVATE
/////////////////////////////////// */
-int MpCallFlowGraph::estimateEchoQueueLatency(int samplesPerSec,int
samplesPerFrame)
+int MpCallFlowGraph::estimateEchoQueueLatency(int samplesPerSec, int
samplesPerFrame)
{
#define MIN_DRIVER_LATENCY 4

=======================================
--- /branches/sipxtapi-3.2.1/sipXmediaLib/src/mp/MpPortAudioDriver.cpp Sat
Jan 15 07:00:40 2011
+++ /branches/sipxtapi-3.2.1/sipXmediaLib/src/mp/MpPortAudioDriver.cpp Sat
Jan 15 07:34:29 2011
@@ -346,6 +346,10 @@
outputSampleFormat, inputSampleFormat,
sampleRate, framesPerBuffer);
}
+ // update stream wrapper with info about latency
+ const PaStreamInfo* paStreamInfo = Pa_GetStreamInfo(*stream);
+ strm->setInputPortStreamLatency(paStreamInfo->inputLatency);
+ strm->setOutputPortStreamLatency(paStreamInfo->outputLatency);

m_audioStreamMap.insertKeyAndValue(new
UtlTypedValue<MpAudioStreamId>(*stream), strm);
status = OS_SUCCESS;
@@ -404,6 +408,11 @@
sampleFormat, sampleFormat,
sampleRate, framesPerBuffer);
}
+ // update stream wrapper with info about latency
+ const PaStreamInfo* paStreamInfo = Pa_GetStreamInfo(*stream);
+ strm->setInputPortStreamLatency(paStreamInfo->inputLatency);
+ strm->setOutputPortStreamLatency(paStreamInfo->outputLatency);
+
m_audioStreamMap.insertKeyAndValue(new
UtlTypedValue<MpAudioStreamId>(*stream), strm);
status = OS_SUCCESS;
}
@@ -556,15 +565,17 @@
OsLock lock(ms_driverMutex);
OsStatus status = OS_FAILED;

- if (isStreamValid(stream))
- {
- const PaStreamInfo* paStreamInfo = Pa_GetStreamInfo(stream);
-
- if (paStreamInfo)
- {
- streamInfo.setSampleRate(paStreamInfo->sampleRate);
- streamInfo.setOutputLatency(paStreamInfo->outputLatency);
- streamInfo.setInputLatency(paStreamInfo->inputLatency);
+ UtlTypedValue<MpAudioStreamId> streamKey(stream);
+ UtlContainable* res = m_audioStreamMap.findValue(&streamKey);
+
+ if (res) {
+ MpPortAudioStreamBase* strm =
dynamic_cast<MpPortAudioStreamBase*>(res);
+
+ if (strm)
+ {
+ streamInfo.setSampleRate(strm->getSampleRate());
+ streamInfo.setOutputLatency(strm->getOutputLatency());
+ streamInfo.setInputLatency(strm->getInputLatency());
status = OS_SUCCESS;
}
}
=======================================
--- /branches/sipxtapi-3.2.1/sipXmediaLib/src/mp/MpPortAudioStreamBase.cpp
Sat Jan 15 07:00:40 2011
+++ /branches/sipxtapi-3.2.1/sipXmediaLib/src/mp/MpPortAudioStreamBase.cpp
Sat Jan 15 07:34:29 2011
@@ -45,6 +45,8 @@
, m_outputSampleSize(0)
, m_inputVolumeMeter(NULL)
, m_outputVolumeMeter(NULL)
+, m_inputPortStreamLatency(0.0)
+, m_outputPortStreamLatency(0.0)
{
switch(m_inputSampleFormat & 0x3f)
{
@@ -152,6 +154,12 @@
{
return MpPortAudioStreamBase::TYPE;
}
+
+
+double MpPortAudioStreamBase::getSampleRate() const
+{
+ return m_sampleRate;
+}

/* ============================ INQUIRY
=================================== */

=======================================
--- /branches/sipxtapi-3.2.1/sipXmediaLib/src/mp/MpSyncPortAudioStream.cpp
Sat Jan 15 07:00:40 2011
+++ /branches/sipxtapi-3.2.1/sipXmediaLib/src/mp/MpSyncPortAudioStream.cpp
Sat Jan 15 07:34:29 2011
@@ -99,6 +99,16 @@
}

/* ============================ ACCESSORS
================================= */
+
+double MpSyncPortAudioStream::getInputLatency() const
+{
+ return m_inputPortStreamLatency;
+}
+
+double MpSyncPortAudioStream::getOutputLatency() const
+{
+ return m_outputPortStreamLatency;
+}

/* ============================ INQUIRY
=================================== */

Reply all
Reply to author
Forward
0 new messages