Hello Mike,

We are not on the same page. What you hear is not what I tell you.
Either you don't understand what happens in your commit, or I don't understand
what happens in the driver.

Hopefully somebody in the community can comment here.

On 10/24/18 21:54, Mike Brady wrote:
>>>> You modify the function, which is called `snd_bcm2835_pcm_pointer`. Here 
>>>> you are
>>>> supposed to increase `alsa_stream->pos` with the proper offset. Instead, 
>>>> you
>>>> imitate a delay, but in fact the delay is not increased.
>>>>
>>>> So, the proper solution should be to fix the reported pointer.
>>>
>>> I think there is a difficulty with this. The “pos” pointer looks to have to 
>>> be modulo the buffer size. This causes a problem, as I see it, in that if 
>>> the calculated (pos + interpolated delay in bytes) is longer than the 
>>> buffer size
>>
>>
>> There is no "interpolated delay". The concept of "interpolated delay" is
>> incorrect.
> 
> Yes, my language here is wrong. What I mean is the estimated number of frames 
> output since the pointer was last updated — let’s call it the `interpolated 
> frame count`.
> 

That's not what I mean. From my perspective, the problem is not in language, but
in the concept which you introduce here.

>> When you play sound - the pointer increments.
> 
> Unfortunately, when you play sound, the pointer does not actually increment, 
> for up to about 10 milliseconds. I know of no way to actually access the true 
> “live” position of the frame that is being played at any instant; hence the 
> desire to estimate it.
> 

Your vision of situation in the opposite from my vision. What you see as a
symptom - I see as a root cause. As I see, you should fix the
pointer-not-incrementing. Why do you think that it's okay that the pointer is
not updating during sound play? Why do you insist that there is a delay? I don't
understand why we are so stuck here.

> What actually seems to be happening is that when `bcm2835_playback_fifo` is 
> called, the pointer is updated, but as frames are individually output to the 
> DAC, this pointer does not increment. It is not updated until the next time 
> `bcm2835_playback_fifo` is called.
> 
>> But in this commit you increment the delay, as if sound doesn't play.
> 
> It is true that the patch does make use of the  snd_pcm_runtime structure’s 
> “delay" field (aka "runtime->delay” here). That field is defined for: “/* 
> extra delay; typically FIFO size */”. Clearly it is not being used for that 
> here — it is being used simply because it is part of the calculation done in 
> snd_pcm_calc_delay(), as you point out. At present, it looks like that field 
> isn’t being used –– it’s set to zero –– and not modified anywhere else in the 
> driver, AFAICS. If it was necessary, it would be a simple matter to preserve 
> whatever value it was given.
> 

That's not what I am talking about. Somehow we don't understand each other.

>>>> As a result,
>>>> userspace will recieve the correct delay, instead of these crazy 10 ms.
>>>
>>> Just to point out that with the proposed patch, it appears that the correct 
>>> delay is being reported, (apart, possibly, from any delay originally set in 
>>> the snd_pcm_delay field, as mentioned above).
>>
>>
>> Then I would like to point out the alsa-lib function `snd_pcm_avail()` - it 
>> will return the wrong value.
> 
> It is already the case that snd_pcm_avail() does not return the true delay. 
> The ALSA documentation states: "The value returned by that call [i.e. the 
> snd_pcm_avail*() functions] is not directly related to the delay…” 
> 

Do you mean, that you are submitting the patch into the upstream kernel without
reading the code?

snd_pcm_avail() is calculated based on:

* hw_ptr
* buffer_size
* appl_ptr
* boundary

If you fix hw_ptr - it will fix both snd_pcm_delay() and snd_pcm_avail().
Instead, you invent the "interpolated delay", which in fact only compensates the
wrong hw_ptr instead of fixing it.

Best Regards,
Kirill


_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to