I'll be posting a tcpdump real soon now. I checked and the mtu setting
is 1500. I tried with pMTUd both on and off, there's no difference. I
wouldn't' expect any. There's a single, reasonably modern switch between
the server and the squeezeboxes (I've tried a couple, actually) and they
wouldn't be messing with packets. 

Implementing nonblocking writes made no difference, but I'd be horrified
if it had. As far as I can tell, LMS is single threaded (if so, not a
shock - threads are a horror show in perl, just like most everything
else in perl). So it was forced to use nonblocking I/O everywhere and
use select() to figure out what to do next. It wasn't because it was the
better choice or had special characteristics - they just didn't have
another option, and the LMS code is the spaghetti it is because they
didn't have better choices. They get credit for making it work at all,
but the code is littered with bug tracking and you can begin to see why
the product died. 

With the Classic at 131 and using my server, -many- songs hit the
dreaded empty play buffer condition almost immediately. In 131, when
that happens it just halts playing, so instead of stuttering it  stops
cold. These are all good things as far as my testing is concerned - the
stuttering was hard on my nerves, and so was waiting for over a minute
to see if things would fail each time. Plus I was getting very tired of
hearing the first 40 seconds of Benedictus over and over.

The new symptoms are interesting. Since I'm getting play buffer fullness
reports every 5 seconds now, I can see that initially the buffer gets
some trivial amount of data - 0.01 or so, then it rises a very little
but quickly crashes back to 0. How fast it crashes back to 0 depends on
the song. For some songs, though, it never hits 0, the buffer fullness
rises towards 0.99 and the song plays straight through. When I can see
the fullness starting to crash towards 0, if I'm quick enough I can
pause the stream, wait a few seconds, and continue, and things are
better for awhile.

There's an interesting aspect to that. When a song is paused, my server
keeps sending the song stream at the squeezebox. The local OS TCP buffer
is just about always maxed out or nearly, and it's obvious that the
squeezebox isn't "sipping" from the stream very quickly, though why I
don't know - it's got nothing else to do when the music is paused, and
you'd think it would drink the data at network speeds. But it doesn't,
and more interestingly... while the song is paused, I'm still queryng
the buffer fullness over and over and -it does not move-. Even though
it's taking in data from the TCP stream, it's not going into the play
buffer, or if it is it's forgetting to report that. And then I unpause
the stream and things get very weird - instead of the buffer fullness
jumping to a much higher number (due to all the previous sipping it was
doing), it instead -rises in steps over a number of seconds-. I don't
know where it was squirreling away the data I shipped (or why it read it
so slowly) but it doesn't seem to end up in the classic's play buffer
unless the song is playing!

When I'm doing now is running strace on LMS - the code is too messy to
follow, and all that matters is what system calls it's making anyway. I
can see, so far, that it's just sending stream data in a nonblocking
fashion in a way that's probably close to identical to what my server is
doing. But, while I have to dive deeper into this, I think it's sending
different strm commands at the very beginning of the song. It's possible
LMS is deliberately or accidentally delaying the start of playing until
there's more of the song shipped - in effect, pausing play for long
enough to let even the glacially slow classic's reads make a little
progress.

I'll strace my server, and LMS, and take a hard look at any differences.


I wish I could get my hands on the original coders for LMS - I bet they
have stories to tell. 


Funny note, unrelated to the problem - when I installed LMS, I gave it
exactly one song in the library. After fussing with getting everything
working, I navigated to it with the remote and played it - not hard when
there's just one song. It played fine - except the intro was longer! I
have no idea how it happened, but LMS had somehow jumped from the one
song in my local library to an online version of the same song... I had
a few horrible moments of wondering if my .flac file had been corrupt
all this time and the old firmware had just skipped part of the song for
years - but no, I just needed to restart things and make sure it was
really on the local library. I still have no idea how it found a
different version of Benedictus...


------------------------------------------------------------------------
ScottAM's Profile: http://forums.slimdevices.com/member.php?userid=69412
View this thread: http://forums.slimdevices.com/showthread.php?t=110986

_______________________________________________
unix mailing list
unix@lists.slimdevices.com
http://lists.slimdevices.com/mailman/listinfo/unix

Reply via email to