Description
----------------------------------
The audio out class for UNIX is creating a thread that continuously
attempts to read from the list of available audio data buffers, and
then use the device specific method for writting that data to the audio
device.
This change will introduce a new IHXEvent for letting the main thread
signal the data writing thread when new data is available for pushing to
the audio device, instead of having the audio thread do a bunch of small
micro sleeps while it waits for some new data to push.
If data is available for writting to the device, then a small sleep is
still added for none ALSA based device, since none ALSA devices will not
block on write (making it possible for the thread to spin until the
audio device is ready to accept new data.)
By doing this we remove a source of interrupts that tend to drive
the CPU into high C0 (full power mode) residency. This is especially
true when on a MID device that has the ASound prealloc buffer max'ed
out, allowing large periods of time for the original output audio thread
to wait for new blocks of data.
Files Modified
----------------------------------
audio/device/platform/unix/audUnix.cpp
audio/device/pub/platform/unix/audUnix.h
Branches
---------------------------------
HEAD, hxclient_3_1_0_atlas
Index: platform/unix/audUnix.cpp
===================================================================
RCS file: /cvsroot/audio/device/platform/unix/audUnix.cpp,v
retrieving revision 1.12
diff -u -r1.12 audUnix.cpp
--- platform/unix/audUnix.cpp 6 Jul 2007 20:21:16 -0000 1.12
+++ platform/unix/audUnix.cpp 28 Apr 2008 20:07:39 -0000
@@ -73,7 +73,8 @@
#include "hxprefs.h"
#endif
-
+#include "hxtlogutil.h"
+#include "ihxtlogsystem.h"
//-1 is usually considered to be no file descriptor.
const int CAudioOutUNIX::NO_FILE_DESCRIPTOR = -1;
@@ -102,6 +103,7 @@
m_audioThread(NULL),
m_bUserWantsThreads(TRUE),
m_ulSleepTime(0),
+ m_pAvailableDataEvent(NULL),
#endif
m_pRollbackBuffer(NULL)
{
@@ -114,7 +116,6 @@
//Allco our write buffer list. Want to throw from here? You will,
like
//it or not.
m_pWriteList = new CHXSimpleList();
-
}
void CAudioOutUNIX::_initAfterContext()
@@ -142,6 +143,7 @@
CreateInstanceCCF(CLSID_IHXMutex,
(void**)&m_mtxWriteListPlayStateLock, m_pContext);
CreateInstanceCCF(CLSID_IHXMutex, (void**)&m_mtxDeviceStateLock,
m_pContext);
CreateInstanceCCF(CLSID_IHXThread, (void**)&m_audioThread,
m_pContext);
+ CreateInstanceCCF(CLSID_IHXEvent, (void**)&m_pAvailableDataEvent,
m_pContext);
}
#endif
@@ -194,6 +196,7 @@
HX_RELEASE( m_mtxWriteListPlayStateLock );
HX_RELEASE( m_mtxDeviceStateLock );
HX_RELEASE( m_audioThread );
+ HX_RELEASE( m_pAvailableDataEvent );
}
#endif
@@ -353,6 +356,8 @@
//Wait for it to do so and clean up.
if( m_bUserWantsThreads )
{
+ HXLOGL4 (HXLOG_ADEV, "CAudioUnixOUT::_Imp_Close signaling
event...");
+ m_pAvailableDataEvent->SignalEvent();
m_audioThread->Exit(0);
}
@@ -778,8 +783,21 @@
that->m_mtxDeviceStateLock->Unlock();
that->m_mtxWriteListPlayStateLock->Unlock();
- //OK, sleep the amount of time it takes to play 1/4 of the
device's buffer.
- microsleep(that->m_ulSleepTime/4);
+ if(bReadyToExit == FALSE)
+ {
+ if (that->m_pWriteList->GetCount() == 0 || that->m_wState ==
RA_AOS_OPEN_PAUSED)
+ {
+ HXLOGL4 (HXLOG_ADEV, "CAudioUnixOUT::AudioThread() waiting for
audio data...");
+ that->m_pAvailableDataEvent->Wait(ALLFS);
+ }
+ else
+ {
+#if !defined(HELIX_FEATURE_ALSA)
+ // OK, sleep the amount of time it takes to play 1/4 of the
device's buffer.
+ microsleep(that->m_ulSleepTime/4);
+#endif
+ }
+ }
}
//Signal the parent thread that we are done.
@@ -833,6 +851,7 @@
}
UNLOCK(m_mtxWriteListPlayStateLock);
+ HXLOGL4 (HXLOG_ADEV, "CAudioUnixOUT::_PushBits() writing %i bits",
(int)ulBufLen);
_WriteBytes(pData, ulBufLen, lCount);
LOCK(m_mtxWriteListPlayStateLock);
@@ -995,6 +1014,8 @@
//grab the data and write it to the device.
if( m_bUserWantsThreads )
{
+ HXLOGL4 (HXLOG_ADEV, "CAudioUnixOUT::_Imp_Write signaling
event...");
+ m_pAvailableDataEvent->SignalEvent();
return RA_AOE_NOERR;
}
#endif
Index: pub/platform/unix/audUnix.h
===================================================================
RCS file: /cvsroot/audio/device/pub/platform/unix/audUnix.h,v
retrieving revision 1.8
diff -u -r1.8 audUnix.h
--- pub/platform/unix/audUnix.h 6 Jul 2007 20:21:19 -0000 1.8
+++ pub/platform/unix/audUnix.h 28 Apr 2008 20:07:39 -0000
@@ -289,6 +289,7 @@
IHXThread* m_audioThread;
HXBOOL m_bUserWantsThreads;
ULONG32 m_ulSleepTime;
+ IHXEvent* m_pAvailableDataEvent;
#endif
private:
------------------------------------------------------------------------
_______________________________________________
Audio-dev mailing list
[email protected]
http://lists.helixcommunity.org/mailman/listinfo/audio-dev