Greg Wright wrote:
Synopsis:
The alsa driver wasn't working, it would only write a partial buffer before returning from _WriteBytes(). This resulted in an assert for debug builds and choppy cricket sounds for release builds. The following patch fixes this by making ALSA write the whole buffer before returning.
Sounds good to me if it sounds good to you... _WriteBytes has an api that looks like it can handle partial writes, an alternative fix would be to move this write-until-everything-is-written loop up into audUnix(?)
Are you using threaded audio? I was getting asserts / problems with the audio thread turned on, and those went away when I turned it off... not sure if the problems here are related.
I have noticed that the ALSA driver uses about 100% cpu on my system when using ALSA as opposed to OSS which uses only about 20%. The increase is all SYS time as oppose to user time. The user time for both OSS and ALSA are the same.
Weird...
Files Modified:
audio/device/platform/unix/audlinux_alsa.cpp
Platforms and Profiles Affected:
linux only.
Branch: HEAD, 150Cay(after branch).
Index: platform/unix/audlinux_alsa.cpp =================================================================== RCS file: /cvsroot/audio/device/platform/unix/audlinux_alsa.cpp,v retrieving revision 1.4 diff -u -w -r1.4 audlinux_alsa.cpp --- platform/unix/audlinux_alsa.cpp 28 Sep 2004 21:04:17 -0000 1.4 +++ platform/unix/audlinux_alsa.cpp 8 Mar 2005 19:48:44 -0000 @@ -856,6 +856,8 @@ int err = 0; unsigned int frames_written = 0; snd_pcm_sframes_t num_frames; + ULONG32 ulBytesToWrite = ulBuffLength; + ULONG32 ulBytesWrote = 0;
lCount = 0;
@@ -874,15 +876,19 @@ return m_wLastError; }
- num_frames = snd_pcm_bytes_to_frames(m_pAlsaPCMHandle, ulBuffLength);
do
{
+ num_frames = snd_pcm_bytes_to_frames(m_pAlsaPCMHandle, ulBytesToWrite);
err = snd_pcm_writei( m_pAlsaPCMHandle, buffer, num_frames );
+
if (err >= 0)
{
frames_written = err;
- lCount = snd_pcm_frames_to_bytes (m_pAlsaPCMHandle, frames_written);
+ ulBytesWrote = snd_pcm_frames_to_bytes (m_pAlsaPCMHandle, frames_written);
+ buffer += ulBytesWrote;
+ ulBytesToWrite -= ulBytesWrote;
+ lCount += ulBytesWrote;
}
else
{
@@ -906,8 +912,9 @@
m_wLastError = RA_AOE_DEVBUSY;
}
}
- } while (err == -EAGAIN);
+ } while (err == -EAGAIN || (err>0 && ulBytesToWrite>0));
+ HX_ASSERT( lCount == ulBuffLength ); return m_wLastError; }
_______________________________________________ Player-dev mailing list [EMAIL PROTECTED] http://lists.helixcommunity.org/mailman/listinfo/player-dev
-- Ryan Gammon [EMAIL PROTECTED] Developer for Helix Player https://player.helixcommunity.org
_______________________________________________ Audio-dev mailing list [email protected] http://lists.helixcommunity.org/mailman/listinfo/audio-dev
