List Info

Thread: Mdf audio dsp time service optimisation proposal




Mdf audio dsp time service optimisation proposal
user name
2006-06-06 12:27:24
Overview
========
Mdf adaptation on audio generates too many calls to
SamplesPlayed API that significantly impact performances

Description
===========
DevSound's SamplePlayed API is called each time Helix needs
the current play time.
Implementation of this SamplePlayed service is in
DevSound's server, and actual information is available in
kernel side.
This means that, at each call, we have 2 process context
switches and a request to a driver.
Consequence is a lot of time spent by CPU just for obtaining
current timeline.
Examples of various calls to the GetCurrentPlayTime service
are given in CallStackExamples.txt. This shows the various
points from where timeline information is needed.

Proposal
========
Remove actual systematic call to the API and replace it by a
periodic call that gives the reference and, for other calls,
a computation using current system time information.
The periodic call can be achieved using the existing 
periodic timer (100ms) used to call OnTimeSync
The system time is obtained using User::NTickCount service.
The unit is 1 millisec.
The principle is:
- On periodic timer expiration, store the actual timeline
reference obtained with API SamplesPlayed and the current
system tick count.
- For calls to GetCurrentPlayTime, return the computed
timeline reference + delta t.


Files Affected
==============
datatype/mdf/audio/dsp/mdfauddevice.cpp
datatype/mdf/audio/dsp/mdfdevsound.cpp
datatype/mdf/audio/dsp/mdfdevsound.h


Testing Performed
=================
Unit Tests:
n/a

Integration Tests:
- Local playback of 3gp and mp4 files with amr and aac.

Performance Tests:
- Detected about 20% gain on CPU load

Platforms and Profiles Build Verified:
helix-client-s60-mmf-mdf-dsp
Branch: hxclient_2_1_0_cayennes 
B::var.frame
-000|CMDFDevSound::GetValidSamplesPlayed(this = 0x0081E6E0)
-001|CMDFDevSound::GetTimeInfo(this = 0x0081E6E0, ulTime =
0)
-002|CMDFDevSound::GetCurrentPlayTime(this = 0x0081E6E0,
ulTime = 0)
-003|CHXMDFAudioDevice::RunL(this = 0x0081E648)

B::var.frame
-000|CMDFDevSound::GetValidSamplesPlayed(this = 0x0081E6E0)
-001|CMDFDevSound::GetTimeInfo(this = 0x0081E6E0, ulTime =
0)
-002|CMDFDevSound::GetCurrentPlayTime(this = 0x0081E6E0,
ulTime = 0)
-003|CHXAudioSession::GetCurrentPlayBackTime(this =
0x008072D0)
-004|CHXAudioPlayer::OnTimeSync(this = 0x00809440, ?)
-005|CHXAudioSession::OnTimeSync(this = 0x008072D0,
ulCurrentTime = 480)
-006|CHXMDFAudioDevice::RunL(this = 0x0081E648)

B::var.frame
-000|CMDFDevSound::GetValidSamplesPlayed(this = 0x0081E6E0)
-001|CMDFDevSound::GetTimeInfo(this = 0x0081E6E0, ulTime =
0)
-002|CMDFDevSound::GetCurrentPlayTime(this = 0x0081E6E0,
ulTime = 0)
-003|CHXAudioSession::GetCurrentPlayBackTime(this =
0x008072D0)
-004|CHXAudioPlayer::GetCurrentPlayBackTime(this =
0x00809440)
-005|HXPlayer::ProcessIdle(this = 0x00808FD8)
-006|HXPlayer::OnTimeSync(this = 0x00808FD8, ?)
-007|CHXAudioPlayer::OnTimeSync(this = 0x00809440, ?)
-008|CHXAudioSession::OnTimeSync(this = 0x008072D0,
ulCurrentTime = 480)
-009|CHXMDFAudioDevice::RunL(this = 0x0081E648)

B::var.frame
-000|CMDFDevSound::GetValidSamplesPlayed(this = 0x0081E6E0)
-001|CMDFDevSound::GetTimeInfo(this = 0x0081E6E0, ulTime =
0)
-002|CMDFDevSound::GetCurrentPlayTime(this = 0x0081E6E0,
ulTime = 0)
-003|CHXAudioSession::GetCurrentPlayBackTime(this =
0x008072D0)
-004|CHXAudioPlayer::GetCurrentPlayBackTime(this =
0x00809440)
-005|SourceInfo::OnTimeSync(this = 0x00810740, pRendInfo =
0x0080FA70, bUseCurrentTime = 1)
-006|SourceInfo::OnTimeSync(this = 0x00810740, ulCurrentTime
= 480)
-007|HXPlayer::OnTimeSync(this = 0x00808FD8, ?)
-008|CHXAudioPlayer::OnTimeSync(this = 0x00809440, ?)
-009|CHXAudioSession::OnTimeSync(this = 0x008072D0,
ulCurrentTime = 480)
-010|CHXMDFAudioDevice::RunL(this = 0x0081E648)

B::var.frame
-000|CMDFDevSound::GetValidSamplesPlayed(this = 0x0081E6E0)
-001|CMDFDevSound::GetTimeInfo(this = 0x0081E6E0, ulTime =
0)
-002|CMDFDevSound::GetCurrentPlayTime(this = 0x0081E6E0,
ulTime = 0)
-003|CHXAudioSession::GetCurrentPlayBackTime(this =
0x008072D0)
-004|CHXAudioPlayer::GetCurrentPlayBackTime(this =
0x00809440)
-005|SourceInfo::OnTimeSync(this = 0x00810740, pRendInfo =
0x00815DC8, bUseCurrentTime = 1)
-006|SourceInfo::OnTimeSync(this = 0x00810740, ulCurrentTime
= 480)
-007|HXPlayer::OnTimeSync(this = 0x00808FD8, ?)
-008|CHXAudioPlayer::OnTimeSync(this = 0x00809440, ?)
-009|CHXAudioSession::OnTimeSync(this = 0x008072D0,
ulCurrentTime = 480)
-010|CHXMDFAudioDevice::RunL(this = 0x0081E648)

B::var.frame
-000|CMDFDevSound::GetValidSamplesPlayed(this = 0x0081E6E0)
-001|CMDFDevSound::GetTimeInfo(this = 0x0081E6E0, ulTime =
0)
-002|CMDFDevSound::GetCurrentPlayTime(this = 0x0081E6E0,
ulTime = 0)
-003|CHXAudioSession::GetBlocksRemainingToPlay(this =
0x008072D0)
-004|CHXAudioSession::CheckToPlayMoreAudio(this =
0x008072D0)
-005|CHXAudioSession::OnTimeSync(this = 0x008072D0,
ulCurrentTime = 480)
-006|CHXMDFAudioDevice::RunL(this = 0x0081E648)

B::var.frame
-000|CMDFDevSound::GetValidSamplesPlayed(this = 0x0081E6E0)
-001|CMDFDevSound::GetTimeInfo(this = 0x0081E6E0, ulTime =
0)
-002|CMDFDevSound::GetCurrentPlayTime(this = 0x0081E6E0,
ulTime = 0)
-003|CHXAudioSession::GetCurrentPlayBackTime(this =
0x008072D0)
-004|CHXAudioPlayer::GetCurrentPlayBackTime(this =
0x00809440)
-005|SourceInfo::OnTimeSync(this = 0x00810740, pRendInfo =
0x00815DC8, bUseCurrentTime = 0)
-006|SourceInfo::TimeSyncCallback(?)
-007|CHXGenericCallback::Func(this = 0x0081A170)
-008|PQ::dispatch_element(this = 0x00805FD8, pElem =
0x0082FF34)
-009|ClientPQ::execute(this = 0x00805FD8, now =
(HXTime::timeval::tv_sec = 8585012, HXTime::timeval::tv_usec
= 294875))
-010|HXScheduler::ExecuteCurrentFunctions(this = 0x00802300,
?)
-011|HXScheduler::OnTimeSync(this = 0x00802300, bAtInterrupt
= 0)
-012|Timeline::OnTimeSync(?, bAtInterrupt = 0)
-013|Timeline::NonMMTimerProc(?)
-014|HXSymbianRTimerAsyncTimer::RunL(this = 0x008074A8, ?)

B::var.frame
-000|CMDFDevSound::GetValidSamplesPlayed(this = 0x0081E6E0)
-001|CMDFDevSound::GetTimeInfo(this = 0x0081E6E0, ulTime =
0)
-002|CMDFDevSound::GetCurrentPlayTime(this = 0x0081E6E0,
ulTime = 0)
-003|CHXAudioSession::GetCurrentPlayBackTime(this =
0x008072D0)
-004|CHXAudioPlayer::GetCurrentPlayBackTime(this =
0x00809440)
-005|SourceInfo::OnTimeSync(this = 0x00810740, pRendInfo =
0x0080FA70, bUseCurrentTime = 0)
-006|SourceInfo::TimeSyncCallback(?)
-007|CHXGenericCallback::Func(this = 0x00812098)
-008|PQ::dispatch_element(this = 0x00805FD8, pElem =
0x00811E74)
-009|ClientPQ::execute(this = 0x00805FD8, now =
(HXTime::timeval::tv_sec = 8461940, HXTime::timeval::tv_usec
= 8461940))
-010|HXScheduler::ExecuteCurrentFunctions(this = 0x00802300,
?)
-011|HXScheduler::OnTimeSync(this = 0x00802300, bAtInterrupt
= 0)
-012|Timeline::OnTimeSync(?, bAtInterrupt = 0)
-013|Timeline::NonMMTimerProc(?)
-014|HXSymbianRTimerAsyncTimer::RunL(this = 0x008074A8, ?)

B::var.frame
-000|CMDFDevSound::GetValidSamplesPlayed(this = 0x0081E6E0)
-001|CMDFDevSound::GetTimeInfo(this = 0x0081E6E0, ulTime =
0)
-002|CMDFDevSound::GetCurrentPlayTime(this = 0x0081E6E0,
ulTime = 0)
-003|CHXAudioSession::GetBlocksRemainingToPlay(this =
0x008072D0)
-004|CHXAudioSession::CheckToPlayMoreAudio(this =
0x008072D0)
-005|CHXAudioSession::Func(this = 0x008072D0)
-006|PQ::dispatch_element(this = 0x00805FD8, pElem =
0x00832524)
-007|ClientPQ::execute(this = 0x00805FD8, now =
(HXTime::timeval::tv_sec = 8594724, HXTime::timeval::tv_usec
= 8594724))
-008|HXScheduler::ExecuteCurrentFunctions(this = 0x00802300,
?)
-009|HXScheduler::OnTimeSync(this = 0x00802300, bAtInterrupt
= 0)
-010|Timeline::OnTimeSync(?, bAtInterrupt = 0)
-011|Timeline::NonMMTimerProc(?)
-012|HXSymbianRTimerAsyncTimer::RunL(this = 0x008074A8, ?)

B::var.frame
-000|CMDFDevSound::GetValidSamplesPlayed(this = 0x0081E6E0)
-001|CMDFDevSound::GetTimeInfo(this = 0x0081E6E0, ulTime =
0)
-002|CMDFDevSound::GetCurrentPlayTime(this = 0x0081E6E0,
ulTime = 0)
-003|CHXAudioSession::GetBlocksRemainingToPlay(this =
0x008072D0)
-004|CHXAudioSession::GoingToUnderflow(this = 0x008072D0)
-005|HXSource:oRebuffe
rIfNeeded(this = 0x00810858)
-006|HXSource::ReportRebufferStatus(this = 0x00810858, ?, ?,
?, ?)
-007|HXStream::ReportAudioRebufferStatus(this = 0x00812960,
unNeeded = 1, unAvailable = 0)
-008|CAudioRenderer::OnDryNotification(this = 0x0081DA88,
ulCurrentStreamTime = 2000, ?)
-009|CHXAudioStream::MixIntoBuffer(this = 0x0081F428,
pPlayerBuf = 0x00826C20, ulBufSize = 800, ulBufTime = 2000,
bIsMixBufferDirty = 0, ?)
-010|CHXAudioSession::PlayAudio(this = 0x008072D0, ?)
-011|CHXAudioSession::CheckToPlayMoreAudio(this =
0x008072D0)
-012|CHXAudioSession::Func(this = 0x008072D0)
-013|PQ::dispatch_element(this = 0x00805FD8, pElem =
0x00832524)
-014|ClientPQ::execute(this = 0x00805FD8, now =
(HXTime::timeval::tv_sec = 8594724, HXTime::timeval::tv_usec
= 8594724))
-015|HXScheduler::ExecuteCurrentFunctions(this = 0x00802300,
?)
-016|HXScheduler::OnTimeSync(this = 0x00802300, bAtInterrupt
= 0)
-017|Timeline::OnTimeSync(?, bAtInterrupt = 0)
-018|Timeline::NonMMTimerProc(?)
-019|HXSymbianRTimerAsyncTimer::RunL(this = 0x008074A8, ?)

B::var.frame
-000|CMDFDevSound::GetValidSamplesPlayed(this = 0x0081E6E0)
-001|CMDFDevSound::GetTimeInfo(this = 0x0081E6E0, ulTime =
0)
-002|CMDFDevSound::GetCurrentPlayTime(this = 0x0081E6E0,
ulTime = 0)
-003|CHXAudioSession::GetBlocksRemainingToPlay(this =
0x008072D0)
-004|CHXAudioSession::GoingToUnderflow(this = 0x008072D0)
-005|HXSource:oRebuffe
rIfNeeded(this = 0x00810858)
-006|HXFileSource::_ProcessIdle(this = 0x00810858,
atInterrupt = 0)
-007|HXPlayer::ProcessIdle(this = 0x00808FD8)
-008|CHXGenericCallback::Func(this = 0x008092A0)
-009|PQ::dispatch_element(this = 0x00805FD8, pElem =
0x00811EA4)
-010|ClientPQ::execute(this = 0x00805FD8, now =
(HXTime::timeval::tv_sec = 8461988, HXTime::timeval::tv_usec
= 8461988))
-011|HXScheduler::ExecuteCurrentFunctions(this = 0x00802300,
?)
-012|HXScheduler::OnTimeSync(this = 0x00802300, bAtInterrupt
= 0)
-013|Timeline::OnTimeSync(?, bAtInterrupt = 0)
-014|Timeline::NonMMTimerProc(?)
-015|HXSymbianRTimerAsyncTimer::RunL(this = 0x008074A8, ?)

B::var.frame
-000|CMDFDevSound::GetValidSamplesPlayed(this = 0x0081E6E0)
-001|CMDFDevSound::GetTimeInfo(this = 0x0081E6E0, ulTime =
0)
-002|CMDFDevSound::GetCurrentPlayTime(this = 0x0081E6E0,
ulTime = 0)
-003|CHXAudioSession::GetCurrentPlayBackTime(this =
0x008072D0)
-004|CHXAudioPlayer::GetCurrentPlayBackTime(this =
0x00809440)
-005|HXPlayer::ProcessIdle(this = 0x00808FD8)
-006|CHXGenericCallback::Func(this = 0x008092A0)
-007|PQ::dispatch_element(this = 0x00805FD8, pElem =
0x00811EA4)
-008|ClientPQ::execute(this = 0x00805FD8, now =
(HXTime::timeval::tv_sec = 8461988, HXTime::timeval::tv_usec
= 8461988))
-009|HXScheduler::ExecuteCurrentFunctions(this = 0x00802300,
?)
-010|HXScheduler::OnTimeSync(this = 0x00802300, bAtInterrupt
= 0)
-011|Timeline::OnTimeSync(?, bAtInterrupt = 0)
-012|Timeline::NonMMTimerProc(?)
-013|HXSymbianRTimerAsyncTimer::RunL(this = 0x008074A8, ?)

B::var.frame
-000|CMDFDevSound::GetValidSamplesPlayed(this = 0x0081E6E0)
-001|CMDFDevSound::GetTimeInfo(this = 0x0081E6E0, ulTime =
0)
-002|CMDFDevSound::GetCurrentPlayTime(this = 0x0081E6E0,
ulTime = 0)
-003|CHXAudioSession::GetBlocksRemainingToPlay(this =
0x008072D0)
-004|CHXAudioSession::GoingToUnderflow(this = 0x008072D0)
-005|HXSource:oRebuffe
rIfNeeded(this = 0x00810858)
-006|HXFileSource::_ProcessIdle(this = 0x00810858,
atInterrupt = 0)
-007|HXPlayer::ProcessIdle(this = 0x00808FD8)
-008|CHXGenericCallback::Func(this = 0x008092C0)
-009|PQ::dispatch_element(this = 0x00805FD8, pElem =
0x0082831C)
-010|ClientPQ::execute(this = 0x00805FD8, now =
(HXTime::timeval::tv_sec = 8553244, HXTime::timeval::tv_usec
= 8553244))
-011|HXScheduler::ExecuteCurrentFunctions(this = 0x00802300,
?)
-012|HXScheduler::OnTimeSync(this = 0x00802300, bAtInterrupt
= 0)
-013|Timeline::OnTimeSync(?, bAtInterrupt = 0)
-014|Timeline::NonMMTimerProc(?)
-015|HXSymbianRTimerAsyncTimer::RunL(this = 0x008074A8, ?)

B::var.frame
-000|CMDFDevSound::GetValidSamplesPlayed(this = 0x0081E6E0)
-001|CMDFDevSound::GetTimeInfo(this = 0x0081E6E0, ulTime =
0)
-002|CMDFDevSound::GetCurrentPlayTime(this = 0x0081E6E0,
ulTime = 0)
-003|CHXAudioSession::GetCurrentPlayBackTime(this =
0x008072D0)
-004|CHXAudioPlayer::GetCurrentPlayBackTime(this =
0x00809440)
-005|HXPlayer::ProcessIdle(this = 0x00808FD8)
-006|CHXGenericCallback::Func(this = 0x008092C0)
-007|PQ::dispatch_element(this = 0x00805FD8, pElem =
0x0082831C)
-008|ClientPQ::execute(this = 0x00805FD8, now =
(HXTime::timeval::tv_sec = 8553244, HXTime::timeval::tv_usec
= 8553244))
-009|HXScheduler::ExecuteCurrentFunctions(this = 0x00802300,
?)
-010|HXScheduler::OnTimeSync(this = 0x00802300, bAtInterrupt
= 0)
-011|Timeline::OnTimeSync(?, bAtInterrupt = 0)
-012|Timeline::NonMMTimerProc(?)
-013|HXSymbianRTimerAsyncTimer::RunL(this = 0x008074A8, ?)

B::var.frame
-000|CMDFDevSound::GetValidSamplesPlayed(this = 0x0081E6E0)
-001|CMDFDevSound::GetTimeInfo(this = 0x0081E6E0, ulTime =
0)
-002|CMDFDevSound::GetCurrentPlayTime(this = 0x0081E6E0,
ulTime = 0)
-003|CHXMDFAudioDevice::RunL(this = 0x0081E648)



Index: datatype/mdf/audio/dsp/mdfauddevice.cpp
============================================================
=======
RCS file: /cvsroot/datatype/mdf/audio/dsp/mdfauddevice.cpp,v
retrieving revision 1.1.2.8
diff -u -w -r1.1.2.8 mdfauddevice.cpp
--- datatype/mdf/audio/dsp/mdfauddevice.cpp	7 Apr 2006
19:45:14 -0000	1.1.2.8
+++ datatype/mdf/audio/dsp/mdfauddevice.cpp	6 Jun 2006
10:52:30 -0000
 -333,7
+333,7 
         if(m_pDeviceResponse)
         {
             ULONG32 ulAudioTime = 0;
-            GetCurrentAudioTime(ulAudioTime);
+            m_pDevSound->GetTimeInfo(ulAudioTime);
             m_pDeviceResponse->OnTimeSync(ulAudioTime);
         }
 
Index: datatype/mdf/audio/dsp/mdfdevsound.cpp
============================================================
=======
RCS file: /cvsroot/datatype/mdf/audio/dsp/mdfdevsound.cpp,v
retrieving revision 1.1.2.9
diff -u -w -r1.1.2.9 mdfdevsound.cpp
--- datatype/mdf/audio/dsp/mdfdevsound.cpp	7 Apr 2006
19:44:35 -0000	1.1.2.9
+++ datatype/mdf/audio/dsp/mdfdevsound.cpp	6 Jun 2006
10:52:30 -0000
 -50,7
+50,7 
 #include <e32svr.h>
 #include <e32math.h>
 #include <e32uid.h>
- 
+#include <e32std.h>
 #include <StreamIdNotifierCI.h>
 #include <AddedDevSoundControlCI.h>
 
 -136,6
+136,8 
             m_ulLastValidSamplesPlayed(0),
             m_ulSamplesPlayedBeforeTaken(0),
             m_ulSamplesWritten(0),
+            m_bSamplesPlayedRead(FALSE),
+            m_ulRefTimeSamplesPlayedRead(0),
             m_pHWConfigurator(NULL),
             m_pDevObserver(NULL)
 {
 -394,9
+396,19 
 //
 HX_RESULT CMDFDevSound::GetCurrentPlayTime(UINT32&
ulTime)
 {
+    if (m_bSamplesPlayedRead)
+    {
+    	// Compute current audio time with last SamplePlayed
read
+    	// and add elapsed time since this read
+    	// NTickCount unit is also milliseconds
+   
	ulTime=m_ulDevTime+(User::NTickCount()-m_ulRefTimeSamplesPl
ayedRead);
+    }
+    else
+    {
     //HXLOGL2(HXLOG_MDFA, "---devsnd:gettime
<"));
     //ulTime = m_ulDevTime;
     GetTimeInfo(ulTime);
+    }
     
     // Try to recover from some minor play errors.
     if (m_devStatus==DevPlayError && m_nRetry<3)
 -672,6
+684,9 
                 // Adjustment if Reset() had been called.
                 samples -= m_ulSamplesPlayedOffset;
                 ulTime = samples * 1000 /
m_pAudioFormat->m_ulSamplesPerSec;
+                m_bSamplesPlayedRead=TRUE;
+                m_ulDevTime=ulTime;
+               
m_ulRefTimeSamplesPlayedRead=User::NTickCount();
                 break;
     }
     return HXR_OK;   
Index: datatype/mdf/audio/dsp/mdfdevsound.h
============================================================
=======
RCS file: /cvsroot/datatype/mdf/audio/dsp/mdfdevsound.h,v
retrieving revision 1.1.2.6
diff -u -w -r1.1.2.6 mdfdevsound.h
--- datatype/mdf/audio/dsp/mdfdevsound.h	7 Apr 2006 19:18:02
-0000	1.1.2.6
+++ datatype/mdf/audio/dsp/mdfdevsound.h	6 Jun 2006 10:52:30
-0000
 -138,6
+138,7 
     
         // helper
         void
SetAudioDeviceObserver(CHXMDFAudioDeviceObserver* p)
{m_pDevObserver=p;};
+        HX_RESULT GetTimeInfo(UINT32& ulTime);
         
     private:
         // constructor
 -153,7
+154,6 
         
         HX_RESULT HandleMissingFrame();
         HX_RESULT UpdateTimeInfo();
-        HX_RESULT GetTimeInfo(UINT32& ulTime);
         UINT64 GetValidSamplesPlayed();
         char* getstate();
         
 -178,6
+178,8 
 		UINT32              m_ulDevTime;
         UINT32              m_ulFramesPlayedLastRound;
 		UINT64              m_ulTotalPCMBytesPlayed;    //for
policy SampleRate
+        HXBOOL              m_bSamplesPlayedRead;
+        UINT32              m_ulRefTimeSamplesPlayedRead;
 		
 		// -- For timing policy SamplesPlayed --
 		// m_ulSamplesPlayedOffset: the value kept before reset.
_______________________________________________
Datatype-dev mailing list
Datatype-devhelixcommunity.org
http://lists.helixcommunity.org/mailman/listinfo/da
tatype-dev
[1]

about | contact  Other archives ( Real Estate discussion Medical topics )