Indeed. When you press the Next button, MC should convert that into a Seek() command. And the renderer should convert that to a Byte-based GET for the respective seek offset. However on many types of file, MC a) does not provide enough information to the renderer to calculate its Byte-based seek offset, or b) does not support the respective seek GET call.
It is a known weakness in MC, and I have been campaigning for JRiver to fix it for years..
Not that we are
only taking about files sent in "Original Format" here. Cue/bin files sent as say 24 bit PCM work fine already.
When MC provides a content-directory entry to the rendering device you will see something like this:
Track 1:
audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000
duration=0:02:20.000
size=40050359
nrAudioChannels=2
sampleFrequency=44100
bitsPerSample=16
bitrate=29875
http://192.168.131:52104/Music/F100469.mp3Track 2:
audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000
duration=0:00:56.000
size=40050359
nrAudioChannels=2
sampleFrequency=44100
bitsPerSample=16
bitrate=29875
http://192.168.131.131:52104/Music/F100470.mp3and so on.
Some particular renderer does a request like this:
GET /Music/F100469.mp3 HTTP/1.1
Host: 192.168.131.131:52104
User-Agent: NSPlayer/8.0.0.3801
transferMode.dlna.org: Streaming
getcontentFeatures.dlna.org: 1
Range: bytes=0-
Connection: close
We reply with:
HTTP/1.1 200 OK
transferMode.dlna.org: Streaming
Content-Type: audio/mpeg
contentFeatures.dlna.org: DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000
Server: Windows, UPnP/1.1 DLNADOC/1.50, JRiver/21
Content-Length: 40050359
Accept-Ranges: bytes
Connection: close
Date: Mon, 20 Jun 2016 17:24:24 GMT
Followed by the data...
Now the only difference between the 2 content directories are the Duration and the File to retrieve. Of course in the second case the file is the same but it's entry in MC's database contains a playback range (which is time based of course).
The renderer being unable to support time based seeks (90% or so of them) can only get one thing back that might work as far as I can see and that is a byte range into the file which we need to calculate for all of the different possible file types (since we can't give it a middle of a frame).
So when the renderer asks us for bytes 0- on the second track we will need to return something like 123456-40050358/40050359 and hope it can deal with it.
Does this sound correct?
Also note that we return the complete length of the bin file since it can continue to play gapless through the track transitions...
Does this sound right to you Andrew?