I never heard from anyone at fiio about the scroll wheel issue.
the issue is that rotary encoders have 4 states as you turn the knob and a lot of the wheel devices out there only seem to track the 2 obvious main states, but by taking that short-cut you miss the middle states and those help stabilize the wheel.
you also need to be able to get interrupts OR poll the wheel (2 digital lines) fast enough. if they are polling and their big poll loop can't 'come around' fast enough, you'll lose events and there may not be much that can be done about it.
otoh, if they have coded the wheel with 2 states and are willing to try it with 4, its not a lot of code and I'd be happy to help out if that's possible.
here is the big hint:
https://www.circuitsathome.com/mcu/reading-rotary-encoder-on-arduino
and the special sauce:
Code:
[COLOR=993333]int8_t[/COLOR] read_encoder[COLOR=009900]([/COLOR][COLOR=009900])[/COLOR]
[COLOR=009900]{[/COLOR]
[COLOR=993333]static[/COLOR] [COLOR=993333]int8_t[/COLOR] enc_states[COLOR=009900][[/COLOR][COLOR=009900]][/COLOR] [COLOR=339933]=[/COLOR] [COLOR=009900]{[/COLOR]0[COLOR=339933],-[/COLOR][COLOR=0000DD]1[/COLOR][COLOR=339933],[/COLOR][COLOR=0000DD]1[/COLOR][COLOR=339933],[/COLOR]0[COLOR=339933],[/COLOR][COLOR=0000DD]1[/COLOR][COLOR=339933],[/COLOR]0[COLOR=339933],[/COLOR]0[COLOR=339933],-[/COLOR][COLOR=0000DD]1[/COLOR][COLOR=339933],-[/COLOR][COLOR=0000DD]1[/COLOR][COLOR=339933],[/COLOR]0[COLOR=339933],[/COLOR]0[COLOR=339933],[/COLOR][COLOR=0000DD]1[/COLOR][COLOR=339933],[/COLOR]0[COLOR=339933],[/COLOR][COLOR=0000DD]1[/COLOR][COLOR=339933],-[/COLOR][COLOR=0000DD]1[/COLOR][COLOR=339933],[/COLOR]0[COLOR=009900]}[/COLOR][COLOR=339933];[/COLOR]
[COLOR=993333]static[/COLOR] [COLOR=993333]uint8_t[/COLOR] old_AB [COLOR=339933]=[/COLOR] 0[COLOR=339933];[/COLOR]
[I][COLOR=808080][I]/**/[/I][/COLOR][/I]
old_AB [COLOR=339933]<<=[/COLOR] [COLOR=0000DD]2[/COLOR][COLOR=339933];[/COLOR] [I][COLOR=666666][I]//remember previous state[/I][/COLOR][/I]
old_AB [COLOR=339933]|=[/COLOR] [COLOR=009900]([/COLOR] ENC_PORT [COLOR=339933]&[/COLOR] [COLOR=208080]0x03[/COLOR] [COLOR=009900])[/COLOR][COLOR=339933];[/COLOR] [I][COLOR=666666][I]//add current state[/I][/COLOR][/I]
[COLOR=B1B100]return[/COLOR] [COLOR=009900]([/COLOR] enc_states[COLOR=009900][[/COLOR][COLOR=009900]([/COLOR] old_AB [COLOR=339933]&[/COLOR] [COLOR=208080]0x0f[/COLOR] [COLOR=009900])[/COLOR][COLOR=009900]][/COLOR][COLOR=009900])[/COLOR][COLOR=339933];[/COLOR]
[COLOR=009900]}[/COLOR]
I use that code, myself, in my own devices and firmware and even without interrupts, I never miss any rotary events, no matter how fast the user turns the wheel.
perhaps the fiio guys could look at this and see if its how they do their decoding of the rotary. otoh, if they are already doing this, then they could be limited by lots of other reasons.
sure wish the rotary 'feel' was given first priority when spec'ing out the system architecture. crispness of a UI seems to be a forgotton or lost art in today's consumer electronics ;(