Looks good for checkin. ======================================= Eric Hyche (ehy...@real.com) Principal Engineer RealNetworks, Inc.
>-----Original Message----- >From: Sheldon fu [mailto:s...@real.com] >Sent: Friday, May 01, 2009 10:01 AM >To: ehy...@real.com >Cc: audio-dev@helixcommunity.org >Subject: RE: [Audio-dev] CR: Eliminate memory copying in mix engine for single >player/stream case > >Thanks Eric. Good advice. Here is the safe-guard in unix audio device >code to error out when both features are defined. MIN_ROLLBACK_BUFFER is >a local define in audio device so the check can not be in the session >object itself. > >MIN_ROLLBACK_BUFFER is defined when MIN_HEAP is used so this pretty much >makes OPTIMIZED_MIXING not usable for any Unix build with MIN_HEAP. Once >this CR is checked in I'll have a look to see if the MIN_ROLLBACK_BUFFER >logic can be changed so it doesn't make the assumption that we always >call Write() with a whole block of data. > >I'll check in the change EOD if there is no further comment. > >Thanks! > >fxd > > >Index: platform/unix/audUnix.cpp >=================================================================== >RCS file: /cvsroot/audio/device/platform/unix/audUnix.cpp,v >retrieving revision 1.12.2.4 >diff -u -w -r1.12.2.4 audUnix.cpp >--- platform/unix/audUnix.cpp 17 Mar 2009 12:46:53 -0000 1.12.2.4 >+++ platform/unix/audUnix.cpp 1 May 2009 12:52:02 -0000 >@@ -989,6 +989,20 @@ > // In heap-optimized mode, this is where we set the value of > // m_ulDeviceBufferSize, and malloc the buffer. > #ifdef HELIX_CONFIG_MIN_ROLLBACK_BUFFER >+ >+ //OPTIMIZED_MIXING conflicts with MIN_ROLLBACK_BUFFER feature. >+ //This is because the logic here assumes that the audio device >+ //Write() method is always called with a constant size -- the >block size, >+ //while in OPTIMIZED_MIXING mode, session will write partial >blocks to avoid >+ ///memory copying. >+ //TODO: MIN_ROLLBACK_BUFFER logic should be improved so that it >gets >+ //the block size from audio session through a new API and >reduce the rollback size >+ //to the block size, rather than second guessing it from >Write() call here. >+ //Error out for now if both features are defined. >+#ifdef HELIX_FEATURE_OPTIMIZED_MIXING >+#error "Can not have both HELIX_FEATURE_OPTIMIZED_MIXING and >HELIX_CONFIG_MIN_ROLLBACK_BUFFER" >+#endif >+ > if( m_ulDeviceBufferSize != nBuffSize ) > { > m_ulDeviceBufferSize = nBuffSize; > > >On Fri, 2009-05-01 at 09:13 -0400, Eric Hyche wrote: >> This change looks good. >> >> >Also this feature conflicts with HELIX_CONFIG_MIN_ROLLBACK_BUFFER that the >> >unix audio device uses. >> >> Can you make an intentional preprocessor error (#error) if hxaudses.cpp (or >> whatever file is >appropriate) is compiled with these >> conflicting features. A compile-time error will be much easier to catch than >> a run-time error. >> >> Eric >> >> ======================================= >> Eric Hyche (ehy...@real.com) >> Principal Engineer >> RealNetworks, Inc. >> >> >> >-----Original Message----- >> >From: audio-dev-boun...@helixcommunity.org >> >[mailto:audio-dev-boun...@helixcommunity.org] On Behalf >Of >> >Sheldon fu >> >Sent: Wednesday, April 29, 2009 11:14 AM >> >To: audio-dev@helixcommunity.org >> >Subject: [Audio-dev] CR: Eliminate memory copying in mix engine for single >> >player/stream case >> > >> >Synopsis: >> > >> >This change gets rid of unnecessary memcpy and/or equivalent when mixing is >> >not really needed. >> > >> > >> >Overview: >> > >> >Currently even when there is only a single player/stream, we still run PCM >> >data through the DSP mix >> >engine. The mix engine logic will do two memory copying operations even >> >when in/out format matches >> >(same sample rate, channels and bytesPerSample) -- one in ConvertIntoBuffer >> >when it asks for the >data >> >from stream object and one to mix the data into the output buffer session >> >object provides. These >two >> >memcpys are pure overhead in the typical single player/stream playback case. >> > >> >The change adds a buffer list parameter to the stream object MixIntoBuffer >> >and in turn mixengine >> >MixIntoBuffer method and a flag to control it. When both session and >> >mixengine agrees to do the >> >'bypass' >> >optimization, the stream object will return a list of buffers containing >> >exactly one block of audio >> >data if put together. Stream object constructs this list from its internal >> >data buffers with >> >CHXBufferFragment to avoid create any new memory buffer. mix engine >> >MixIntoBuffer still runs >through >> >its logic but it will not touch any actual data (no ConvertIntoBuffer call >> >and no mixing into >output >> >buffer). Stream object sends the buffer in the 'direct list' to the audio >> >device without change. >> > >> >Session object agress to do 'bypass' when it knows there is only a single >> >player/stream and when >the >> >new HELIX_FEATURE_OPTIMIZED_MIXING is defined. >> > >> >MixEngine agrees to do 'bypass' when it knows that there is nothing it >> >really needs to do -- same >> >in/out format and when some of the DSP features are not defined. The logic >> >here can be improved in >the >> >future so that we can handle these features dynamically -- e.g. when cross >> >fade is on, we can still >do >> >bypass until to the point that cross fade kicks in. This is not coded yet >> >since this work is mainly >> >for optimization on Android and Android build doesn't have these DSP >> >features defined currently. >> > >> >Also this feature conflicts with HELIX_CONFIG_MIN_ROLLBACK_BUFFER that the >> >unix audio device uses. >> >When HELIX_CONFIG_MIN_ROLLBACK_BUFFER is on, unix audio device dynamically >> >adjust its rollback >buffer >> >size to the incoming buffer size every time _Write is called. That >> >apparently only can work when >> >_Write is always called with a constant buffer size and if not, it will >> >break. Not sure why we have >> >such logic there. Also the rollback handling in unix audio device makes >> >copies of incoming data >too. >> > >> >Even with the change, the 'artificial' block-based handling of audio data >> >is still not efficient. >> >Though now there is no memcpy anymore, the control logic is quite >> >complicated. OS Audio API can >handle >> >any size write, up to the maximum buffer limit and for the simplest case, >> >we should just write the >> >decoded PCM frame data to OS audio device in a >> >1-to-1 mapping way. >> > >> >On Android, the change results in about 1-2% CPU usage saving when playing >> >a MP3 clip and there is >no >> >noticeable change on my host Linux box (the machine is too fast already I >> >think). >> > >> >This CR also contains the change in the previous CR for mixengine >> >cvt16/cvt32 optimization. >> > >> >Head and Atlas310. >> > >> >fxd >> >> _______________________________________________ Audio-dev mailing list Audio-dev@helixcommunity.org http://lists.helixcommunity.org/mailman/listinfo/audio-dev