[Bug 29299] Lords of the Realm 2: in-game videos missing audio

wine-bugs at winehq.org wine-bugs at winehq.org
Tue Jan 24 05:40:27 CST 2012


http://bugs.winehq.org/show_bug.cgi?id=29299

--- Comment #9 from Jörg Höhle <hoehle at users.sourceforge.net> 2012-01-24 05:40:27 CST ---
Native's precondition to append silence would be:
if (initially_held_frames (==held_frames+written) < mmdevapi_period)

However, ours is much more complicated because we may decrease padding by more
than one mmdevapi period. Furthermore, we need to handle cases where
a) alsa_period < mmdevapi_period
b) alsa_period = mmdevapi_period
c) alsa_period > mmdevapi_period

The scenario Release(30ms); Sleep(25ms); Release(more) is perfectly valid.  We
must not append silence even though our first callback write will move the 3
periods outside the sight of GCP, yielding held_frames == 0.
I still need more time to think through the exact condition.  There's also that
if (held_frames == 0) early return that will get modified.


The lead-in patch is not quite correct.  First, the comment is wrong.  When
we'll have a proper lead-out, its padding will have ALSA start.  We don't need
the lead-in for that.  I invented the lead-in (or its equivalent, the
start_threshold) solely to guarantee that ALSA has enough frames to play even
in the XAudio2/Rage scenario.

The amount of lead-in frames is not one alsa period.  I can't remember whether
I explained the
threshold = ALSA_period + mmdevapi_period + safety:

+ mmdevapi_period because at the end of the "buffer processing" period,
  we still want ALSA to have enough data;
+ safety(=3-5ms) because our next period callback may come a little late;
+ ALSA_period because we don't know exactly, but I assume ALSA feels better
when it has at least one period in its buffers.  For instance, dmix appears to
operate on period-size chunks.

That is the minimal amount of frames that ALSA should start with.  This is what
I want hidden beneath GCP=0.  When that much is hidden, ALSA will bear being
fed one mmdevapi period of frames at every period callback, i.e. the
XAudio2/Rage scenario without underrun (well, disregarding clock shift and
timer differences).

You are right that an explicit lead-in is easier to handle than an ALSA
start_threshold larger than mmdevapi_period.  It's also easier to apply to OSS
which knows no such condition.

The lead-in precondition seems to be:
if (in_alsa == 0 // does that cover the recover from underrun case?
   && initial_held_frames < threshold)

-- 
Configure bugmail: http://bugs.winehq.org/userprefs.cgi?tab=email
Do not reply to this email, post in Bugzilla using the
above URL to reply.
------- You are receiving this mail because: -------
You are watching all bug changes.


More information about the wine-bugs mailing list