........
r1208 | jaroslavl1 | 2009-01-21 00:46:30 +0100 (Wed, 21 Jan 2009) | 2
lines
API change:
- added functions sipxAudioSetDriverLatency, sipxAudioGetDriverLatency to
configure audio driver latency
........
r1209 | jaroslavl1 | 2009-01-21 00:47:15 +0100 (Wed, 21 Jan 2009) | 1 line
Check if parameters for getting audio latency were provided.
........
r1210 | jaroslavl1 | 2009-01-21 00:48:17 +0100 (Wed, 21 Jan 2009) | 1 line
Better result codes for sipxAudioGetDriverLatency,
sipxAudioSetDriverLatency.
........
http://code.google.com/p/sipxtapi/source/detail?r=1414
Modified:
/branches/sipxtapi-3.2.1
/branches/sipxtapi-3.2.1/sipXcallLib/include/tapi/SipXCore.h
/branches/sipxtapi-3.2.1/sipXcallLib/include/tapi/sipXtapi.h
/branches/sipxtapi-3.2.1/sipXcallLib/src/tapi/SipXAudio.cpp
/branches/sipxtapi-3.2.1/sipXmediaAdapterLib/interface/include/mi/CpMediaInterfaceFactory.h
/branches/sipxtapi-3.2.1/sipXmediaAdapterLib/sipXmediaMediaProcessing/include/sipXmediaFactoryImpl.h
/branches/sipxtapi-3.2.1/sipXmediaAdapterLib/sipXmediaMediaProcessing/src/sipXmediaFactoryImpl.cpp
/branches/sipxtapi-3.2.1/sipXmediaLib/include/mp/MpAudioDriverManager.h
/branches/sipxtapi-3.2.1/sipXmediaLib/src/mp/MpAudioDriverManager.cpp
/branches/sipxtapi-3.2.1/sipXportLib/include/os/OsDefs.h
=======================================
--- /branches/sipxtapi-3.2.1/sipXcallLib/include/tapi/SipXCore.h Wed Oct 22
11:32:45 2008
+++ /branches/sipxtapi-3.2.1/sipXcallLib/include/tapi/SipXCore.h Sat Jan 15
07:24:17 2011
@@ -152,6 +152,7 @@
class SIPX_INSTANCE_DATA
{
public:
+ size_t nSize; /**< Size of the structure */
SipUserAgent* pSipUserAgent;
SipPimClient* pSipPimClient;
SdpCodecFactory* pCodecFactory;
@@ -193,6 +194,7 @@
UtlBoolean bRtpOverTcp; /**< allow RTP over TCP */
SIPX_INSTANCE_DATA() : lock(OsMutex::Q_FIFO),
+ nSize(sizeof(SIPX_INSTANCE_DATA)),
pSipUserAgent(NULL),
pSipPimClient(NULL),
pCodecFactory(NULL),
@@ -233,6 +235,11 @@
memset(szAcceptLanguage, 0, sizeof(szAcceptLanguage));
memset(szLocationHeader, 0, sizeof(szLocationHeader));
}
+
+ ~SIPX_INSTANCE_DATA()
+ {
+ nSize = 0;
+ }
};
typedef enum SIPX_INTERNAL_CALLSTATE
=======================================
--- /branches/sipxtapi-3.2.1/sipXcallLib/include/tapi/sipXtapi.h Wed Oct 22
12:27:37 2008
+++ /branches/sipxtapi-3.2.1/sipXcallLib/include/tapi/sipXtapi.h Sat Jan 15
07:24:17 2011
@@ -2768,6 +2768,42 @@
SIPXTAPI_API SIPX_RESULT sipxAudioGetOutputDevice(const SIPX_INST hInst,
SIPX_AUDIO_DEVICE*
deviceInfo);
+
+/**
+* Configures audio driver latency. Settings will be applied next time
audio driver
+* is reset. To trigger reset of audio driver, set audio device to "None"
and then
+* back to previous audio device.
+*
+* @param hInst Instance pointer obtained by sipxInitialize.
+* @param inputLatency Suggested latency in seconds. 0.06 is the default
value.
+* @param outputLatency Suggested latency in seconds. 0.06 is the default
value.
+*/
+SIPXTAPI_API SIPX_RESULT sipxAudioSetDriverLatency(const SIPX_INST hInst,
+ double inputLatency,
+ double outputLatency);
+
+/**
+* Gets audio driver latency. If "None" audio device is selected, then
initial
+* latency will be returned. If some real audio device is selected and
audio stream
+* is active, then real latency of audio stream will be returned.
+*
+* Latency returned by this function doesn't reflect the whole internal
latency
+* of sipXtapi media processing, it merely contains information about
latency of
+* audio driver. Other sources of latency are jitter buffer, encoder/decoder
+* and operating system.
+*
+* By default synchronous Portaudio streams are used. It is possible to
enable
+* asynchronous Portaudio streams in sipXmediaLib, but that leads to
increase
+* of latency at least 80ms for both input and output.
+*
+* @param hInst Instance pointer obtained by sipxInitialize.
+* @param inputLatency Latency in seconds.
+* @param outputLatency Latency in seconds.
+*/
+SIPXTAPI_API SIPX_RESULT sipxAudioGetDriverLatency(const SIPX_INST hInst,
+ double* inputLatency,
+ double* outputLatency);
+
//@}
/** @name Line / Identity Methods*/
//@{
=======================================
--- /branches/sipxtapi-3.2.1/sipXcallLib/src/tapi/SipXAudio.cpp Wed Oct 22
12:27:37 2008
+++ /branches/sipxtapi-3.2.1/sipXcallLib/src/tapi/SipXAudio.cpp Sat Jan 15
07:24:17 2011
@@ -985,3 +985,63 @@
return rc;
}
+
+SIPXTAPI_API SIPX_RESULT sipxAudioSetDriverLatency(const SIPX_INST hInst,
+ double inputLatency,
+ double outputLatency)
+{
+ OsSysLog::add(FAC_SIPXTAPI, PRI_INFO, "sipxAudioSetDriverLatency
hInst=%p", hInst);
+
+ SIPX_RESULT rc = SIPX_RESULT_INVALID_ARGS;
+ SIPX_INSTANCE_DATA* pInst = SAFE_PTR_CAST(SIPX_INSTANCE_DATA, hInst);
+
+ if (pInst)
+ {
+ CpMediaInterfaceFactory* pInterface =
pInst->pCallManager->getMediaInterfaceFactory();
+
+ if (pInterface)
+ {
+ OsStatus res = pInterface->setAudioDriverLatency(inputLatency,
outputLatency);
+ if (res == OS_SUCCESS)
+ {
+ rc = SIPX_RESULT_SUCCESS;
+ }
+ else
+ {
+ rc= SIPX_RESULT_FAILURE;
+ }
+ }
+ }
+
+ return rc;
+}
+
+SIPXTAPI_API SIPX_RESULT sipxAudioGetDriverLatency(const SIPX_INST hInst,
+ double* inputLatency,
+ double* outputLatency)
+{
+ OsSysLog::add(FAC_SIPXTAPI, PRI_INFO, "sipxAudioGetDriverLatency
hInst=%p", hInst);
+
+ SIPX_RESULT rc = SIPX_RESULT_INVALID_ARGS;
+ SIPX_INSTANCE_DATA* pInst = SAFE_PTR_CAST(SIPX_INSTANCE_DATA, hInst);
+
+ if (pInst && inputLatency && outputLatency)
+ {
+ CpMediaInterfaceFactory* pInterface =
pInst->pCallManager->getMediaInterfaceFactory();
+
+ if (pInterface)
+ {
+ OsStatus res = pInterface->getAudioDriverLatency(*inputLatency,
*outputLatency);
+ if (res == OS_SUCCESS)
+ {
+ rc = SIPX_RESULT_SUCCESS;
+ }
+ else
+ {
+ rc= SIPX_RESULT_FAILURE;
+ }
+ }
+ }
+
+ return rc;
+}
=======================================
---
/branches/sipxtapi-3.2.1/sipXmediaAdapterLib/interface/include/mi/CpMediaInterfaceFactory.h
Wed Oct 22 11:32:45 2008
+++
/branches/sipxtapi-3.2.1/sipXmediaAdapterLib/interface/include/mi/CpMediaInterfaceFactory.h
Sat Jan 15 07:24:17 2011
@@ -185,6 +185,22 @@
{
return OS_NOT_SUPPORTED;
}
+
+ /**
+ * Sets audio driver latency.
+ */
+ virtual OsStatus setAudioDriverLatency(double inputLatency, double
outputLatency)
+ {
+ return OS_NOT_SUPPORTED;
+ }
+
+ /**
+ * Gets audio driver latency.
+ */
+ virtual OsStatus getAudioDriverLatency(double& inputLatency, double&
outputLatency)
+ {
+ return OS_NOT_SUPPORTED;
+ }
/**
* Mute the speaker
=======================================
---
/branches/sipxtapi-3.2.1/sipXmediaAdapterLib/sipXmediaMediaProcessing/include/sipXmediaFactoryImpl.h
Wed Oct 22 12:27:37 2008
+++
/branches/sipxtapi-3.2.1/sipXmediaAdapterLib/sipXmediaMediaProcessing/include/sipXmediaFactoryImpl.h
Sat Jan 15 07:24:17 2011
@@ -98,6 +98,9 @@
virtual OsStatus setAudioOutputDevice(const UtlString& device, const
UtlString& driverName = "");
virtual OsStatus setAudioInputDevice(const UtlString& device, const
UtlString& driverName = "");
+ virtual OsStatus setAudioDriverLatency(double inputLatency, double
outputLatency);
+ virtual OsStatus getAudioDriverLatency(double& inputLatency, double&
outputLatency);
+
virtual OsStatus muteAudioOutput(UtlBoolean bMute);
virtual OsStatus muteAudioInput(UtlBoolean bMute);
=======================================
---
/branches/sipxtapi-3.2.1/sipXmediaAdapterLib/sipXmediaMediaProcessing/src/sipXmediaFactoryImpl.cpp
Wed Oct 22 11:32:45 2008
+++
/branches/sipxtapi-3.2.1/sipXmediaAdapterLib/sipXmediaMediaProcessing/src/sipXmediaFactoryImpl.cpp
Sat Jan 15 07:24:17 2011
@@ -30,6 +30,10 @@
#include "mp/MpAudioDriverManager.h"
#include "mi/CpAudioDeviceInfo.h"
+#ifndef DISABLE_LOCAL_AUDIO
+#include <mp/MpAudioStreamInfo.h>
+#endif
+
#ifdef INCLUDE_RTCP /* [ */
#include "rtcp/RTCManager.h"
#endif /* INCLUDE_RTCP ] */
@@ -323,6 +327,77 @@
return OS_NOT_SUPPORTED;
}
+
+OsStatus sipXmediaFactoryImpl::setAudioDriverLatency(double inputLatency,
double outputLatency)
+{
+#ifndef DISABLE_LOCAL_AUDIO
+ MpAudioDriverManager* pAudioManager =
MpAudioDriverManager::getInstance();
+ if (pAudioManager)
+ {
+ pAudioManager->setInitialInputStreamLatency(inputLatency);
+ pAudioManager->setInitialOutputStreamLatency(outputLatency);
+ }
+
+ return OS_SUCCESS;
+#endif
+
+ return OS_NOT_SUPPORTED;
+}
+
+OsStatus sipXmediaFactoryImpl::getAudioDriverLatency(double& inputLatency,
double& outputLatency)
+{
+#ifndef DISABLE_LOCAL_AUDIO
+ MpAudioDriverManager* pAudioManager =
MpAudioDriverManager::getInstance();
+ if (pAudioManager)
+ {
+ MpAudioStreamId inputStreamId = pAudioManager->getInputAudioStream();
+ MpAudioStreamId outputStreamId =
pAudioManager->getOutputAudioStream();
+ if (inputStreamId != 0)
+ {
+ // input stream is active, get real latency
+ MpAudioStreamInfo streamInfo;
+ OsStatus res = pAudioManager->getInputStreamInfo(streamInfo);
+ if (res == OS_SUCCESS)
+ {
+ inputLatency = streamInfo.getInputLatency();
+ }
+ else
+ {
+ outputLatency = 0.0;
+ }
+ }
+ else
+ {
+ // get initial latency
+ inputLatency = pAudioManager->getInitialInputStreamLatency();
+ }
+
+ if (outputStreamId != 0)
+ {
+ // output stream is active, get real latency
+ MpAudioStreamInfo streamInfo;
+ OsStatus res = pAudioManager->getOutputStreamInfo(streamInfo);
+ if (res == OS_SUCCESS)
+ {
+ outputLatency = streamInfo.getOutputLatency();
+ }
+ else
+ {
+ outputLatency = 0.0;
+ }
+ }
+ else
+ {
+ // get initial latency
+ outputLatency = pAudioManager->getInitialOutputStreamLatency();
+ }
+ }
+
+ return OS_SUCCESS;
+#endif
+
+ return OS_NOT_SUPPORTED;
+}
OsStatus sipXmediaFactoryImpl::muteAudioOutput(UtlBoolean bMute)
{
=======================================
--- /branches/sipxtapi-3.2.1/sipXmediaLib/include/mp/MpAudioDriverManager.h
Wed Oct 22 12:27:37 2008
+++ /branches/sipxtapi-3.2.1/sipXmediaLib/include/mp/MpAudioDriverManager.h
Sat Jan 15 07:24:17 2011
@@ -23,6 +23,7 @@
// FORWARD DECLARATIONS
class MpAudioDriverBase;
class MpAudioMixerBase;
+class MpAudioStreamInfo;
class UtlString;
// STRUCTS
@@ -98,6 +99,22 @@
*/
OsStatus getOutputDeviceInfo(int deviceIndex, MpAudioDeviceInfo&
deviceInfo);
+ /**
+ * Gets information about input audio stream.
+ *
+ * @param streamInfo Information about requested audio stream
+ * @returns OS_SUCCESS if successful
+ */
+ OsStatus getInputStreamInfo(MpAudioStreamInfo& streamInfo);
+
+ /**
+ * Gets information about output audio stream.
+ *
+ * @param streamInfo Information about requested audio stream
+ * @returns OS_SUCCESS if successful
+ */
+ OsStatus getOutputStreamInfo(MpAudioStreamInfo& streamInfo);
+
/**
* Starts input stream.
*/
@@ -206,6 +223,12 @@
MpAudioDeviceIndex getOutputDeviceIndex() const { return
m_outputDeviceIndex; }
MpAudioDriverBase* getAudioDriver() const { return m_pAudioDriver; }
+
+ double getInitialInputStreamLatency() const { return
m_initialInputStreamLatency; }
+ void setInitialInputStreamLatency(double val) {
m_initialInputStreamLatency = val; }
+
+ double getInitialOutputStreamLatency() const { return
m_initialOutputStreamLatency; }
+ void setInitialOutputStreamLatency(double val) {
m_initialOutputStreamLatency = val; }
//@}
/* ============================ INQUIRY
=================================== */
@@ -242,7 +265,10 @@
MpAudioMixerBase* m_inputAudioMixer; ///< mixer for input stream
MpAudioMixerBase* m_outputAudioMixer; ///< mixer for output stream
-
+
+ double m_initialInputStreamLatency; ///< latency used when opening new
stream in seconds
+ double m_initialOutputStreamLatency; ///< latency used when opening new
stream in seconds
+
std::vector<MpAudioDeviceInfo> m_outputAudioDevices; ///< array to
store device info
std::vector<MpAudioDeviceInfo> m_inputAudioDevices; ///< array to store
device info
};
=======================================
--- /branches/sipxtapi-3.2.1/sipXmediaLib/src/mp/MpAudioDriverManager.cpp
Sat Jan 15 07:00:40 2011
+++ /branches/sipxtapi-3.2.1/sipXmediaLib/src/mp/MpAudioDriverManager.cpp
Sat Jan 15 07:24:17 2011
@@ -152,10 +152,10 @@
MpAudioStreamParameters outputParameters;
outputParameters.setChannelCount(1);
outputParameters.setSampleFormat(MP_AUDIO_FORMAT_INT16);
- outputParameters.setSuggestedLatency(DEFAULT_LATENCY);
+
outputParameters.setSuggestedLatency(m_initialOutputStreamLatency);
outputParameters.setDeviceIndex(defaultOutputDeviceIndex);
- // open asynchronous output stream
+ // open output stream
res = m_pAudioDriver->openStream(&m_outputAudioStream,
NULL,
&outputParameters,
@@ -233,10 +233,10 @@
MpAudioStreamParameters outputParameters;
outputParameters.setChannelCount(1);
outputParameters.setSampleFormat(MP_AUDIO_FORMAT_INT16);
- outputParameters.setSuggestedLatency(DEFAULT_LATENCY);
+
outputParameters.setSuggestedLatency(m_initialOutputStreamLatency);
outputParameters.setDeviceIndex(i);
- // open asynchronous output stream
+ // open output stream
res = m_pAudioDriver->openStream(&m_outputAudioStream,
NULL,
&outputParameters,
@@ -296,7 +296,7 @@
MpAudioStreamParameters inputParameters;
inputParameters.setChannelCount(1);
inputParameters.setSampleFormat(MP_AUDIO_FORMAT_INT16);
- inputParameters.setSuggestedLatency(DEFAULT_LATENCY);
+
inputParameters.setSuggestedLatency(m_initialInputStreamLatency);
inputParameters.setDeviceIndex(defaultInputDeviceIndex);
// open asynchronous input stream
@@ -378,7 +378,7 @@
MpAudioStreamParameters inputParameters;
inputParameters.setChannelCount(1);
inputParameters.setSampleFormat(MP_AUDIO_FORMAT_INT16);
- inputParameters.setSuggestedLatency(DEFAULT_LATENCY);
+
inputParameters.setSuggestedLatency(m_initialInputStreamLatency);
inputParameters.setDeviceIndex(i);
// open asynchronous input stream
@@ -454,6 +454,30 @@
return res;
}
+
+OsStatus MpAudioDriverManager::getInputStreamInfo(MpAudioStreamInfo&
streamInfo)
+{
+ OsLock lock(ms_mutex);
+
+ if (m_inputAudioStream && m_pAudioDriver)
+ {
+ return m_pAudioDriver->getStreamInfo(m_inputAudioStream, streamInfo);
+ }
+
+ return OS_FAILED;
+}
+
+OsStatus MpAudioDriverManager::getOutputStreamInfo(MpAudioStreamInfo&
streamInfo)
+{
+ OsLock lock(ms_mutex);
+
+ if (m_outputAudioStream && m_pAudioDriver)
+ {
+ return m_pAudioDriver->getStreamInfo(m_outputAudioStream,
streamInfo);
+ }
+
+ return OS_FAILED;
+}
OsStatus MpAudioDriverManager::startInputStream() const
{
@@ -746,6 +770,8 @@
, m_inputAudioDevices()
, m_inputAudioMixer(NULL)
, m_outputAudioMixer(NULL)
+, m_initialInputStreamLatency(DEFAULT_LATENCY)
+, m_initialOutputStreamLatency(DEFAULT_LATENCY)
{
m_pAudioDriver =
MpAudioDriverFactory::createAudioDriver(MpAudioDriverFactory::AUDIO_DRIVER_PORTAUDIO);
@@ -787,10 +813,10 @@
inputParameters.setChannelCount(1);
inputParameters.setSampleFormat(MP_AUDIO_FORMAT_INT16);
- inputParameters.setSuggestedLatency(DEFAULT_LATENCY);
+ inputParameters.setSuggestedLatency(m_initialInputStreamLatency);
outputParameters.setChannelCount(1);
outputParameters.setSampleFormat(MP_AUDIO_FORMAT_INT16);
- outputParameters.setSuggestedLatency(DEFAULT_LATENCY);
+ outputParameters.setSuggestedLatency(m_initialOutputStreamLatency);
m_pAudioDriver->getDefaultInputDevice(m_inputDeviceIndex);
m_pAudioDriver->getDefaultOutputDevice(m_outputDeviceIndex);
=======================================
--- /branches/sipxtapi-3.2.1/sipXportLib/include/os/OsDefs.h Thu Aug 28
15:34:51 2008
+++ /branches/sipxtapi-3.2.1/sipXportLib/include/os/OsDefs.h Sat Jan 15
07:24:17 2011
@@ -59,6 +59,8 @@
#define SAFE_STRCHR(X, Y) (((X) == NULL) ? NULL : strchr((X), (Y)))
#endif
+#define SAFE_PTR_CAST(CLASSTYPE, UNKNOWNPTR) \
+ ((CLASSTYPE*)(UNKNOWNPTR) && ((CLASSTYPE*)(UNKNOWNPTR))->nSize ==
sizeof(CLASSTYPE)) ? (CLASSTYPE*)(UNKNOWNPTR) : NULL;
// strncpy_s introduced in MSVC++ 2005
#if defined(_WIN32) && defined(_MSC_VER) && _MSC_VER >= 1400