Changes have been applied to HEAD and hxclient_3_1_0_atlas
On Tue, 2008-04-29 at 10:34 -0700, Greg Wright wrote:
> Rusty Lynch wrote:
> > When using ALSA we block while trying to write data to the audio device
> > if the audio device is full, while other implementations are setup to do
> > non-blocking writes. We sleep on non-alsa systems to keep from entering
> > into a tight spin where we have incoming data available, but the
> > hardware is not ready to consume more data.
>
> Ok, looks good then.
>
> >
> > I suspect that it would be ideal for more UNIX systems to start using
> > blocking writes to the audio device, and remove the need for a
> > microsleep just like an we do for ALSA systems.
>
> Yeah, for a later time I guess.
> --greg.
>
> >
> > --rusty
> >
> > On Tue, 2008-04-29 at 09:33 -0700, Greg Wright wrote:
> >> Why do we only microsleep for non-ALSA drivers? Or, what
> >> is it about OSS/etc. that require the microsleep while
> >> ALSA does not?
> >>
> >> I like the idea of an event rather then polling,
> >> overall I think this is a great change to add.
> >>
> >> --greg.
> >>
> >>
> >> Rusty Lynch wrote:
> >>> 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
> >
>
_______________________________________________
Audio-dev mailing list
[email protected]
http://lists.helixcommunity.org/mailman/listinfo/audio-dev