Current Version 2.20 (25 Sept 12)|
Too many changes to list or remember them all...
New streaming protocol, partly based on the old one, but with a lot of changes.
Better congestion control. Lossy connections are detected and throttled, and
dumped if they don't recover well enough. Hosts with consistently poor upload
gradually lose their reputation, and get shunted to the edges of the network.
Congestion response paramaters for individual hosts can be tweaked, so for example
a broadcaster with really bad wimax (20%-50% packet loss) can sucessfully broadcast.
Much better tunneling / firewall / NAT traversal. Upnp is used if it is available on the router.
Otherwise a several stage process detects the behaviour of the firewall/NAT,
and one of several forms of multi stage port prediction and hole opening is used,
depending on the NAT behaviour of both connecting users.
The toughest it can manage is directly connecting two users who both have incremental symmetric NAT's.
It can't do random-port NAT (yet, could do, but it would look like a port-scan).
It is skinnable, by the broadcaster or user (with some patience). There is an example skin for guidance.
All stations have a small list logo and a larger top-banner for when their stream is playing.
The stream's embedded website is much better, can have multiple pages, all downloaded by p2p, no web server needed.
Chat is essentially the same. It could do with being skinned too.
The URI has changed, new uri is 'streamerp2p2://', instead of 'streamerp2pbeta://'. The old uri of 'streamerp2p://' still works for v1.47.
Except for with firefox, the coders of whom, in their infinite wisdom, decided to
ignore the uri-handler associations stored in the registry.
Instead, firefox presents a list of candidate programs and asks the user to choose one,
and generally the user won't know which one to choose, or that the 'winamp' option is really not
going to work at all. Which leads directly to tech support issues.
Bittorrent detection, attempts to detect if any other p2p programs are running on the pc,
by looking at the titles of windows, and then warning the broadcaster.
You can't torrent and broadcast at the same time if you want your broadcast to actually work, unless you really really know what you are doing.
It can handle HD video, so far we have tested it with up to 3Mbit h264 streams, and it looks perfect.
It can do NSV video, with some messing about on the part of the user to play the stream in winamp. the NSV codecs are not yet in the LibVlc components installed with Streamer.
It can to WMV video, using the WMP library for playback, that is built into most versions of windows.
Most, but not all, due to an anti-competiton lawsuit in the EU, which ruled the removal of not just Windows Media Player the program, but also the WMP library that is essentially part of the OS.
Playback is in a seperate window to the main Streamer window. I may change this sometime.
WMV can either be relayed from an existing source, if you can find the raw stream URL (not just the asx file), but the source must be able to supply an 'mms-framed' stream by http.
Or you can use Windows Media Encoder, which is a resource hog, and the download for which has been removed from the microsoft site.
And best of all, it can do H264 video + aac audio, for proper HDTV.
Playback uses LibVlc, which is part of VLC, now licenced under the LGPL which means it can be used in non-GPL programs.
LibVlc gets installed in a 'vlc' subfolder, and is a stripped down version where I removed a lot of the plugin dll's,
by trial end error and guesswork. It was 80M to begin with, I got it down to 12M.
Encoding is done using FFmpeg, which is a GPL/LGPL project with some restrictive licencing.
But, I am not actually linking to it with my code at all, or building it into Streamer, or even providing an interface, and I am not supplying a download of it.
I am just using it as a stream source to feed a stream server, as other commercial TV broadcasters do. Youtube also use it.
1.47 (17 Nov 06)
When using streamer to serve unicast, the url can now be simply ip:port with
no stream name. This only works with mp3 or aac(+) streams as ogg
requires a mountpoint.
Broadcast config wil now stay intact when upgrading versions.
Stream relay now has both autostart and retry options.
Changed the way Streamer detects if it is firewalled or on a LAN and thus
needs a proxy. It is imperfect so check it to be sure it's set properly..
lock if necessary.
Http connections are now handled better and will return 404 style error
messages if appropriate.
Station discovery should be a lot faster now, faster initial list population
and faster updates.
Fixed the 'sending to port 0' bug that alarms some firewalls and security
Fixed the in-stream listener count. This is the value that gets posted to
the YP, so all your AHQ graphs should be correct now. Also, listeners
on the same lan are no longer counted as listeners. Most of these
'listeners' were not really listeners but casters trying to artificially
inflate their listener counts.
Tuning a copy of Streamer to a stream, setting it to use an external player,
then telling it not to automatically connect will no longer inflate the
listener count. This change allows the caster the option to 'sprinkle' p2p
relay Streamers around on other IP subnets in order to help out with their
overall available base level bandwidth. Also, this allows casters to connect
a copy of Streamer on another machine remote to their streaming server to
allow for connection to their own DJ Chat for participation during a live
event without adversly increasing the listener counts.
1.46 (5 Aug 06)
All in all, these changes should make the listener counts much more accurate
than they ever have been in the past.
Changed the ogg header parsing/handling (again). If the dsp sends a
malformed header, the broadcast just aborts instead of just hanging. The fix
is to enable metadata in the dsp. This seems to make it produce ogg headers
that are correctly marked.
Found and fixed a memory leak that was causing Streamer to continue to use
more memory with each automatic station list save. There was also a
small one (8 bytes or so) that was occurring with each new ogg feed.
Both of these have been fixed. Stability should be greatly improved.
1.45 (14 July 06)
Found a bug that caused Streamer to take a long time to figure out it's own
Chatroom ignore function is re-enabled.
The code that communicates with the YP has been rewritten to be more
efficient. Also status messages for the YP are displayed in the song
title area as they occur.
Fixed a problem where the stations list scroll position would become
'sticky' and keep scrolling back to the first set position on refresh.
Changed the timing of host polling and stations so that it slows down and
limits differently than before. This needs some more tuning.
Background traffic seems ok after it is running for a bit but when reseeking
a station it sends out more data than it should.
1.44 (20 April 06)
Ghost IP problem is fixed, so the
associated connection/buffering problems should stop. Released lockout on
chat name changes.
Also fixed a crash bug caused by deleting the wrong old bookmarked stations
from a list, and this may also have fixed the long wait times for some
stations to appear.
1.43 (19 Mar 06)
Maintenence release to fix ping system for listener counts. This
should also remedy the website listener counts as well. Also updated
the version displayed in the installer to the proper value.
1.42 (14 Mar 06)
it's been a while since the last version, and there are a load of new
For listeners it should appear and work mostly as before. If you are
just going to use it to listen to stations, read no further.
There are a few bug fixes and tweaks to existing things, but I honestly
can't remember them all.
The GUI has changed a little bit, configuration options have moved around
and are now on multiple tabs. More to come soon/eventually. (I tried
skinning once, using a nice wood texture to make 'wooden radio', with
different wood for buttons with brass inserts. But some parts of Window's
windows are not very 'sticky' and veneers fall off easily)
Tuning a station should always be fast now. I know it usually seems pretty
instant anyway, but now the station info internal to Streamer contains a few
IP's of other listeners, and replies to feed requests also contain a few
IP's. This will allow a listener's Streamer to very quickly gather some
AAC/+ is now supported, but can only be played using an external player.
Broadcasting directly from line-in is now supported, in Ogg Vorbis format
only. (I could probably 'borrow' Winamp's encoding dsp's to support more
formats). There is currently no VU display though, which is not ideal. If
you want to try this special line-in direct version, look for it in the
Downloads section. It's just the Streamer executable file named
StreamerW.EXE and will be posted soon.
There is an ActiveX version of Streamer, which can be 'embedded' on a web
page, to make listening very simple without anything having to be installed.
This isn't strictly new in 1.42 having been originally published some time
There is also now a Winamp plugin version. This also makes listening
simpler, by allowing 'url's for Streamer broadcasts to be put in the
standard '.pls' files that winamp uses. A .pls file can contain normal
unicast url's and Streamer url's, and Winamp tries each url in turn until it
finds one that works. So if you put a Streamer url after a bunch of unicast
url's Streamer will act as an 'overflow' for a Shoutcast broadcast. Or by
putting the Streamer url first and the unicast url's second, you have
unicast act as a backup to Streamer if it fails or isn't installed. This 'Shoutcast
overflow' function should be quite usefull, integrating Streamer with
Shoutcast in a single url. Users without Streamer won't notice anything
There are a couple of experimental swarming systems intended to supercede
the old tree tolopogy. 'Phase swarm' almost works, but became too
complicated in trying to prevent some problems happening and can still get
into a logjam situation and fail, and I have abandoned it for now. 'Elegance
swarm' is my second and more promising attempt, and is intended to replace
'tree' when it works properly, and will be able to do many clever and
wonderfull things. I hope. Such as allowing 'bandwidth booster' servers that
can provide extra feeds into many station's networks, etc. But just use
'tree' to broadcast with for now please because the swarming doesn't work
Streamer now has public key crypto (ography?, ology?), which is used to
digitally sign various things to prevent them being altered. Stream blocks
and station info's can be signed by optional 'station keys', which are
generated by broadcasters. These are in turn signed by a 'network key'
(owned by a network administrator, more later), or Streamer's own 'master
key', (owned by me). Generation and signing are done through the broadcast
'security' tab, and the signing is done either by a Streamer 'superseed' or
by the network's 'gatekeeper'. Signing of objects is checked by each
Streamer, using the station's public key for stream data and station info's,
and the signing of keys themselves is checked against the network public key
or streamer's own built in master public key. Signing cannnot be done
without the secret private half of a key, thus preventing forgery.
Independent networks can now exist, seperately from the 'open' public
network we have currently. The purpose of this is to allow organisations to
have their own set of stations without all the rest showing up, and in the
future to allow branding etc. The purpose is also so I can charge commercial
broadcasters for the privilige :)
These independent networks can be either open to all listeners, or require a
login with a typed username/password or a token passed through a secure web
page. This could be as part of a subscription system tied to an ecommerce
server, or the usernames/passwords can just be in a static text file with no
automation. The security is done using public/private keys again, and the
'network key' responsible is generated and signed by my master streamer, so
only I can create them. These networks are not just intended for paying
customers of course.
The ability of the 'tuning url' to control how Streamer will appear has been
extended a bit. You can force it to start minimised as just a systray icon,
and lock it that way, or allow only a small simplified display (station
name, song name, stop/volume), + various other options that will be detailed
in the online help here soon. Forcing it minimized is an attempt to appease
those who think it's too complicated for listeners when they see the main
window. If a user has Streamer already open, these options are ignored.
And finally, as a spin-off from the main Streamer, is an STL or 'Studio to
Transmitter Link' system. The job of an STL is rather obviously, to get an
audio signal from a studio to a transmission site, or to a set of affiliate
stations, in an ultra reliable way. Streamer also does this with a
configurable fixed delay, rather than the more usual 'minimum delay possible
at all times' approach. The sensible minimum is about 3 seconds at the
moment, allowing for some losses and resending. Restructuring the Ogg Vorbis
stream, by not using Ogg and just sending the smaller Vorbis blocks, + some
other tweaks, could reduce this to maybe 2 seconds.
Streamer STL works with just software rather than with dedicated hardware,
but a hardware system is not out of the question given that I developed this
on a 300MHz PII, so it should run happily on something cheap you can stick
in a rack. I believe a satellite link to do the same job costs rather a lot.
1.41 (not released to the public)
First Swarm Version
1.40 (18 Sept 04)
Hosts stuff: (hosts = other users in gnutellaspeak)
Host gathering polling is now variable speed. It goes fast (500ms between polls) if replies contain all new hosts,
and slows down to 5000ms if replies contain all already-known hosts. This will make it fill the hosts list fast when
first run, and then slow down when it has got them all. Current fixed-speed polling is about 2500ms, so it should halve
the background traffic due to host polling. Background traffic is a bit high at the moment. There is also a 'coders
corner' config option 'fast host polling', that makes it poll at 80ms for debug purposes.
Removed a bug where the live hosts list used in host poll replies was only renewed once every 3.5 mins.
It renews every 6 seconds now.
Much better choosing of which hosts to send in host poll replies, more random and probably faster code. It picks random
slots in the live hosts list, instead of scanning the main hosts list, which has usually got a big empty space at the
Removed the code that periodically scans all the hosts and counts the live/dead/not sure ones. Counting is now done
when a host changes state, which is a much better way to do it. Next I will add a binary tree to the hosts list
structure, to vastly speed up searching for a host in the list. There may be a bug in the counting code though, the
really alive count doesn't seem to change sometimes.
Fixed a benign all hosts being marked as seeds bug.
Added flags in host info for has answered a question and has asked a question. Info is not used yet.
Added some code to gradually filter out hosts who are sending bad port reference hosts, then removed it again when I
found the real cause of the problem (see proxying below).
Removed host lookup for replies, as it is not actually needed. Added lookup and reply port update for proxied messages
on proxy and for acked messages.
Improved next host in list finding, so a null host is never returned unless there are genuinely no useful hosts.
Previously a null host was retuned at the end of each list scan.
Added a selected host in hosts display, and made hosts list keep the same entry at the top when redrawing. Did the
same for the stations list, but it doesn't seem to work.
Station gathering polling also varies its speed in a similar way to host polling. This will speed up list filling, but
will slow down propogation of changed station info.
New station to forward chosing code in reply to a stations poll is much more random, and probably evenly distributed
now. It was very uneven before, with one or two stations getting many many more forwards than usual. It is also biased
toward rare (i.e. new) stations. A station that has not been seen much in a reply to a station poll request will be
sent in station poll replies more. This should speed up the initial propogation of new stations.
Checking station age before sending. The bookmarked dead stations where still being forwarded, even though they where
Changed way station you are tuned to is marked as alive, so it doesn't get stuck alive on local display when it is not
broadcasting but you are tuned to it.
Fixed updates to broadcasting station info. Name change is immediate, bitrate change gets put to station info, (but may
get changed again by autolevel)
Removed possible crash bug when stopping listening with no stream data received yet and then immediately transmitting.
Added a warning when chosing not to auto detect stream type on broadcast config page, as doing this is the only way I
know to make an mp3 stream that won't play, and a few broadcasters make mp3 streams that won't play.
Update button points to install.htm and not download.htm, and all the other web buttons point to the
www.streamerp2p.com domain now. The saved url.txt also has the www. subdomain instead of the yp.
one now. Changed the url for the default image in the web/view display. Changed the url's for my game to point to my new
domain for it, www.spheresofchaos.com.
Chat buttons obey the config setting for flash for leavejoin. They should not flash for leavejoiin messages if the titlebar
is set to not flash. Or they shouldn't, but this doesn't seem to work.
Streamer version number is now added to questions/replies messages, so old versions of streamer can be excluded from the
network in the future, for when they cause problems. The version number in the replies isn't acted on yet.
The version number is also optionally stored in hosts, so I can see what versions are in use.
Revised all the quick index stuff. For all unknown quidx's scanning is done instead. Quick index is a way to speed
up finding which particular thing out of several possible things is involved in a connection with a
particular host. Instead of scanning all the things until the relevant one is found, the messages from the
other host contain the index of the thing that you gave it earlier, so you can get the correct slot instantly.
Added a strict deshout that strips all non-alphanumerics in station names. But it needs improving so it is currently
Made polling for feeds happen 8 times a second, much faster than before. Tuning in is now almost instant.
Fixed one of possibly several bugs in the proxying code, that caused the presence of bad-port aliases in the list. The
sender of a message through a proxy would be added to the target's host list with a random port, creating a dud entry
cluttering the list up, and probably making the NAT/firewall tunneling stuff broken. This meant connections into NAT
hosts probably didn't work, and direct connections between NAT hosts almost definitely didn't work (and they
used to when the code was first added). The dud hosts are also one cause of the wacky listener counts in
the stations list.
Messages to hosts needing proxies are now always sent to the host's reply port, even if it has timed out, as well as through the
proxy, which should improve NAT tunneling a bit more.
Fixed a small stream data block bug. Data blocks are supposed to be about 1370 bytes long. When the broadcasting
streamer reads the data coming from the stream encoding dsp (oddcast etc), it should wait until there is enough data in
the buffer to make one stream block. But this was not happening, and a stream block was being made when there was any
data at all available. The smallest blocks I saw were 170 bytes. Sending small blocks causes more bandwidth to be used
for their headers, which are fixed size. It also causes more bandwidth to be used for acks, which is how I noticed the
problem in the first place. This bug did not affect Ogg streams.
1.39 (10 Aug 04)
Oops... Found another mistake in the Ogg handling code, which caused the header to be repeatedly
sent incomplete, causing the stream not to play for a while.
Fixed chat nickname entry so it works even if you have used the cursor-left key. It used to truncate the name.
The 'get update' button now closes Streamer when clicked.
1.38 (8 Aug 04)
Complete rework of Ogg header capture and handling.
Ogg has been a right pain since I first put it in Streamer, with it 'just not playing' far too often. This time I have
thorougly gone over and rewritten much of the header parsing and handling code, and fixed lots of cases where things
could go awry...
The audio output code now waits for the header to be complete before sending it to the player.
A header received at stream startup is buffered until complete before being copied into the main stream buffer.
Headers in close sucession won't be missed. The correct most recent header should always be sent for any start
position in the stream.
The 'serial number' hack is still being done by the broadcast Streamer, but since this makes
fast forward and rewind of the playing data much simpler I'll leave it in.
The broadcast Streamer will show an error if it sees no header within a certain time, or gets a deformed header. This
happens if you use sam2 or the sam2 winamp plugin, and don't enable titles.
All of these changes mean version 1.38 is not compatible with previous versions for Ogg Vorbis.
There was more too...
It's got Video now, using Nullsoft Streaming Video NSV format, and playing in Winamp 5. Enjoy.
More formats to follow...
Fixed the annoying click when pressing return to send chat.
Added more chat channels, without needing to change protocol. You can't add your own yet.
Changed 'Chat 2' to 'DJ Chat'. Forgot to change 'Chat 1' to something else, I just noticed. It now reopens the most
recently displayed chat, or the chat channels list.
A broadcaster auto-joing their stream chat, so I can tell them if something is wrong mostly. If no chat nick is set the
station name is used as the nick.
Added 'ignore user', toggle it on/off by clicking a name.
When a chat closed, the most recently displayed or created one is shown, except when detuning from a station.
User count displayed in chat, as users/connections next to the 'leave' button.
Changed the layout a bit, did a hack to make the font small for the buttons, added a row of buttons at the top
to open each channel display.
Added a chat message integrity check, to make sure the sub messages have sensible sizes etc, and can't be 'poisoned' by
Made messages word-aligned within message block, to assist porting to future processor platforms.
Some error messages appear in the song title dsiplay area. The number on the left is a timestamp, so you can see if
the same error is being repeatedly reported.
Added a broadcast help web button, and changed the top help button to goto the web help page instead of the main page.
Made the sub panes not resizeable, and put borders on some of them.
The hosts display shows the last reply to a tuning request, for debugging.
The currently highlighted station stays highlighted when the list is reopened. There is also now a right-click menu for
the stations list, which allows you to play, bookmark, or 'favorite' a station. A bookmarked station just has a *,
and never vanishes from the list. The favourite station has a #, and automatically plays when streamer is run (unless
you disable it in the config). This is part of the new 'click-to-install-and-play', see below.
Reinstated and ad for my Psychedelic game Spheres of Chaos, on the configure page. make a donation and get a game!.
Or just make a donation, there's a button for that too.
Added a mini window that pops up from systray right clicks if the main window is not open, and just contains a volume control,
the stream name, status, and current song.
Removed the 'selected' dotted box from clicked buttons. Added 'owndc' to window template to maybe speed up drawing. Removed
painting background in main window. Changed 'EndDialogue's to 'DestroyWindow's (apparently it should have been used
the way I used it, but it worked anyway). Added a bunch of 'UpdateWindow' calls after the 'InavlidateRect' calls,
then removed them all again :)
New 'Favourite Station' / 'click to download and tune' system.
If you click the 'save url' button, and then look at the url.txt, you will see a chunk of html. Paste this into
a web page to show a button. When this is clicked, a custom install.exe will be downloaded, which installs streamer,
which then automatically plays your stream. :-)
It isn't quite one click yet, it's three clicks...
Fixed zombie looping (I hope). Dead receive and feed timeout is lower, and it never goes from 'reseeking' back to plain
'seeking'. The situation where a dead station could have a lot of listeners all recirulating the last few
seconds of a broadcast should not happen now. Reseeking didn't seem to work before anyway.
Fixed conventional stream relaying, at least for mp3.
Sending a message through proxy a also sends the message direct, to open return hole if the sender is firewalled. It
Should always work for back-to-back firewalls now.
NAT tunneling still needs improving, and supertunneling needs implementing.
Put a timeout flag in all tcpin closes to prevent half closed connections hanging around forever.
Changed resend/ping calculation. Now uses a 2nd order function with a faster time constant. The initial assumed ping is
8 seconds, and the max is now 12 seconds. And I really did see a ping time of 10 seconds in the real world, betwen my pc
and one halfway round the planet, running wine. Some of this delay is inside streamer, but only 2 seconds worth I think.
Hosts now report that they have stream only if data has arrived recently, to stop zombie loops holding stations in the
Port changes in config now happen immediately, no need to close and reopen Streamer. If the config port is unavailable
Streamer searches for one that is, for up to 250 retries.
'Question' buffers are now reused properly in 2-stage questions, which means a question won't stop halfway because it can't
find a buffer for the second part.
Changed the way a tuning url is sent between 2 copies of the same streamer. A sensible windoze message is used now, instead of
sending the url 4 bytes at a time.
Hacked the internal mp3 playback bug. If the output freq drops to 0, it is reset to what it should be, every 150ms.
This appears to be a bug in the fmod.dll I am using for the internal player.
Enabled the forward/backward buttons. They move the playback position by approx 10 seconds, and sometimes go awry and
jump it randomly by a long way. Iy you want to reduce the delay in the audio you are hearing, repeatedly click the
forwards '>>' button. There is a delay between clicking << or >>, and the actual change in what you hear, due to buffering.
To reduce this delay when using the internal player, it's buffer is only ever filled to 60%, which is why the indicator
at the bottom hangs around 60%.
If the playback is so far behind the fresh data that it falls off the end of the buffer, it gets bumped forward by
Bandwidth testing(the current bane of Streamer)
Test doesn't ask for an initial value, but defaults to 128k.
If 'blocking' happens it just uses the amount of data sent when blocked. By blocking I mean when the net connection
tells windows it can't send any more data, as a modem does, instead of just merrily dumping the excess data, as an
ethernet connection does.
A message is shown in the song title are when the test finishes, and it has a time limit to stop it hanging around
The modem 56k button defaults the upload to 24k and not 33k anymore.
You can listen to a station while the test happens, which should ease a lot of the greif people have with this
Streamer weak point.
The download speed is not allowed to be greater than 1.5 times the upload speed.
Moved the 'skip bandwidth' checkbox to advanced config, to stop people using it!
Stations should reliably appear on the YP list now.
The IP is looked up through DNS properly.
The size of the station blurb/streamer web page is now 1300-ish bytes, allowing for much more stuff than the previous
400 bytes. I will finish the streamed web site stuff one day...
Added a hack to prevent very long song names and blurbs without spaces from accidentally 'page widening' the YP web page.
'Page widening' is a favourite hobby of slashdot trolls.
There is an initial delay of 30 seconds before Streamer tries to list its station on the YP, to stop broken stations
hammering the server when their dsp is set to auto reconnect. A broadcast has to work properly for 30 seconds before
it even tries to list. Also put a minimum retry time of 4 mins when Streamer fails to connect to the YP.
1.37 (17 March 04)
Added an integrated player!.
Streamer can now play back the audio itself, without the need for another player.
No more problems with media players fighting over ownership of audio, or realplayer stealing the job of playback
and then being unable to actually play Ogg streams. It works for ogg and mp3, but won't decode mp3pro yet, and I may have
to remove mp3 support because of licencing issues. Ogg sounds better anyway.
There are two config options to use
the external player for ogg and mp3. Sometimes mp3 playback will just stop at the end of a song, so the internal
player is disabled by default for mp3. The internal player is Fmod
Redesigned the display.
It should now be simple enough to not scare the newbie listeners. On the top is the station info and tuning state
(seeking stream etc), the current song title, and just 5 buttons for station list, chat, config, web help,
and a -> button to show the advanced stuff and side status bar.
On the bottom is a standard bunch of play, stop etc buttons, (two of which actually do something). Plus volume
control, stream chat, and streamed station web site view. And some numbers so you can see what is going on internally:
internal player state and buffer %, feeds in/out, data in/out, and average data in/out.
The play button will tune to the currently selected station in the list if Streamer is not tuned to anything, or it
will restart playback of the currently tuned station at the start of it's internal buffer if there is a currently
tuned station, introducing a delay of up to 2 mins.
If you use an external player and don't have auto start enabled, you will need to
click it twice to start the player.
The forward and rewind buttons will let you skip backwards and
forwards (when I implement them). The currently selected station in the list now stays selected between
The config screen is reorganised and simplified, basic stuff at the top, advanced stuff at the bottom. I was told some
listeners are actually scared of all the config options, so I hid them, click 'advanced' to reveal.
Edit IP has been removed because it was silly, and options added to choose the nic adapter to bind to, and the preferred
LAN IP. Four nics are looked for now. Who has 4 nics?.
Added a trayicon, and an option to hide the taskbar icon. This was often demanded for some reason. The taskbar icon
doesn't hide when the window is open though, sorry.
Hacked ogg so it will always play!. This is done by rewriting the serial number in the ogg header so it matches the
following data and the player doesn't just dump the stream. And coming next, an even better hack so all the header
and stream block have the same serial, so rewinding in the stream is easy. The fix for non-playing streams was to
disable metadata, but no matter how many times I told people to do this, they left metadata on because 'it works on
my pc'. Doh!
Fixed YP dropouts (possibly), and song titles for ogg update on the YP faster.
Fixed streamid=0 in pls files. Removed the empty fields in the stream header sent to the player.
Now use ice protocol for ogg, icy for mp3.
Put 'Host: hostname' in relay GET's. Relaying still doesn't work properly though.
Optimised redraws a bit.
Coming next-ish: Skinning. Mesh/Swarm network protocol to replace the tree system. Nat/firewall supertunneling.
1.36 (19 Feb 04)
Found and corrected a bug that would sometimes cause a receiving Streamer to misreport a
stream from behing NAT as being on port 0. This would cause the stream to keep stopping and reseeking.
Fixed the bandwidth test bug, so it should give more sensible results than '0' and testing forever now, also reinstated the 'skip test'
option. But only use it if the test is being silly please, as setting your upload bw too high and skipping the test
causes other problems.
Fixed mp3pro titles, for both reading from the dsp and sending to winamp. Fixed icecast2 protocol so the very
well encrypted password is now checked properly. The 'allow icecast input' option is now redundant and has been removed.
I seem to have broken dsp connections in a random sort of way, the random sort of way where it always works ok on my pc. Broadcasters
should use version 1.35 if 1.36 gives problems. 1.35 has the NAT port 0 problem though.
Do Not Use ogg with sam2. It may connect ok, but the stream is not sendable because the ogg headers seem to be marked differently
to how other dsp's mark them, and Streamer can't parse the stream. And as always, Don't use metedata in ogg, because it makes the
stream not play for your listeners. You have been warned...
1.35 (3 Feb 04)
Fixed problem with multiple lan adapters that would cause Streamer to crash on
1.34 (2 Feb 04)
New hardwired seed hosts. Extra seeds can also be placed in a seeds.txt file, format is domain/IP:port, with ':port' optional.
Dead stations are again sorted with the most recently alive at the top.
Lan IP range 10.x.x.x is now recognised correctly. This should fix connectivity problems from/to these LAN pcs.
Seperated the IP and bandwidth tests, they don' both get retested when you change something in config.
Doesn't retest bandwidth when the IP has changed from last time it was run.
It should detect loss of network connection, and a changed IP, to cope with when your underresourced UK ISP disconnects you every 2 hours 'in
case you forgot to disconnect yourself'...
IP should no longer keep toggling between two values like it did
ocassionally, and the LAN IP can only now contain genuine LAN IP's
(i.e. in the unroutable ranges).
Broadcasters auto-join their own chat channel, so I can tell them their stream is silent etc.
Your identity in chat is now governed by a session random number
instead of your pc's IP's, which should stop the repeated 'vanished'
Fixed the 'relay conventional stream' port bug. You should be able to relay from any port instead of just 8000.
Proxy allocation improved. If it needs a proxy, and there is a streamer
on the same LAN that also has full un-NAT-ed net access, it will try
and use that one since it could give better incoming access.
Connections to same-lan hosts now definitely don't try and use a proxy.
Config option to un-capitalise 'shouted' station names in the stations list.
Chat display options to hide join/leave/vanish, and to not flash for them.
Changed 'web' button to 'help'.
Show 'Testing Bandwidth, Please wait' on the titlebar.
Added station info and bitrate updates on YP listing.
Broadcast config opens large enough to see the 'save station info' button.
Firewalled/need proxy status now kept between sessions if locked.
The 'not enough bandwidth to send and receive stream' message now contains the station name and bitrate.
Removed the skip bandwidth test button because people where using it and causing buffeing streams.
Listeners using conventional client-server streaming should now be counted properly.
1.33 (9 Oct 03)
Fixed the station list.
1.32 (8 Oct 03)
Added message timestamps to the chat system and sorted them in the display.
Old messages should not keep circulating now. The initial bunch you get when
first connecting seem to be sorted backwards though. There will also be some
apparently corrupt messages whilst people change over from 1.32 to 1.32.
Changed the way timestamps are held in station info, so the timezone setting
on the PC doesn't matter anymore. It could cause no stations to be listed
if it was wrong. 1.31 and 1.32 cannot see each other's stations.
1.31 (15 Sept 03)
Improved the chat system, now mostly complete, but it does odd things sometimes.
It has a userlist, and leave/join messages. It uses a gnutella-like network
to distribute the messages, which would seem to be an ideal method to do
a decentralised server-less chat system.
1.30 (4 Sept 03).
Added a simple chat system. There is a 'lobby' channel accessible from the
'chat' button on the right. Each stream also has it's own chat channel, accessible
from the button that appears with 'play' etc. There is no online users list,
or join and part messages yet. Broadcasters please open the chat for your
stream, so I can tell you when it's not working :)
1.29 (29 Aug 03).
Another big overhaul in lan/nat/firewall handling, and it actually works this
time!. Streamers without proper net access on seperate lans can connect directly,
i.e. both are having the 'from' port translated by the nat on the way out
of the lan. Both net adapter IPs are read if present and individual Streamers
no longer get confused as to who they or other Streamers are, which was the
cause of all the clones and silly listener numbers in 1.28.
Port forwarding is no longer needed, but it can help if you can do it. Lan
PC's need a proxy that relays messages to them from other pc's who they are
not currently talking to directly. If one pc on a lan is accessing the outside
net without port translation, then it is the best possible proxy for all
other hosts on the lan.
Streamer determines if it needs a proxy based on the 'from' port that other
Streamers are seeing in messages from it. If its not the configured port
then Streamer decides its on a lan and needs a proxy. If it is the configured
port then it doesn't need a proxy, even if it's on a lan. This test fails
for ordinary firewalls, so you have to lock the setting and change it yourself.
But only if you are using a firewall that blocks incoming connections, and
zonealarm for example can be set to not block.
If a proxy is on a pc outside the client's lan it should theoretically be
less able to open direct channels between pc's on seperate lans, because
the port used by the connection-initiator in sending messages to the proxy
could be different to the one it uses to send messages to the proxy's client.
But it seems to work, probably because the initiator's nat is not matching
the source ip with the target port in incoming messages, so its accepting
replies from any IP on the port it originally used to send the message to
the proxy. I think...this is a badly explained guess here :)
Streamers on the same lan no longer need to use different ports, but in some
cases it can help as each streamer may in some cases get normal untranslated
port access to the outside net. It depends on the nat/router you are using.
Your stream can now have a web page that displays in Streamer (or not if
you are using w2k, sorry). This is the beginnings of some enhancements to
make it more than just audio. You could for example have your logo, web cam
pics, or advertising banners to make revenue without having to resort to
those dreadful audio commercials.
Images etc must be on a real web server because they are accessed from there
by normal http. Only the root page is embedded in the stream at the moment,
but I intend to embed all the other files and pages in the stream as well.
The root pages are cached locally so they display quickly for streams you
have recently listened to.
Links to pages must have the '_target' tag so they open in a new window.
The embedded web page will follow links, but it will keep resetting to the
root page once a minute. Its also limited to 400 characters at the moment.
The embedded web code is provided by
this library by Jeff Glatt. It crashes on w2k at the moment, so you
will get a substitute plain text display instead.
The gui has been simplified a bit, things have been moved around and the
advanced' stuff moved more out of sight. That was the intention anyway. The
new status display shows some of what is going on internally, and the flow
display shows what individual feeds are doing in more detail. But it flashes
horribly and doesn't erase the lines at the bottom properly.
Ogg may be working properly now, possibly. Every time that I announce I have fixed it, it breaks again.
There is a speed test when you first run Streamer, or increase the configured
bandwidth. It asks some other Streamers to accept data from it, and then
sends at various speeds to determine what the available upload bandwidth
really is. This is necesarry to ensure a streamer doesn't try and send data
faster than its net connection allows. Sometimes this test messes up because
its a bit of a hack. You can repeat it, or skip it, but try not to skip it
unless its being really silly. Sometimes it will sit there 'paused', this
is when there are not enough volunteers to accept the test data at the needed
rate. You cannot tune in to a stream until this test has finished.
Feeds to other Streamers are now speed managed better. The resend logic is
now much more sensible (and simple), based on a timestamp with variable resend
delay based on the ping time. All the feeds are put through a common bottleneck
to smooth out the flow out. The congestion slowdown code was removed because
it was silly, and Streamer muscles tcp out of the way. Or that's what seems
to happen anyway. Feeds that are lagging a lot get automatically closed.
Test now happen for situations where Streamer can't relay a stream because
of low bandwidth. Listeners get dumped (they should not be able to tune in
in the first place really). Sometimes the bitrate of a stream will drift
upwards and cause this. A broadcast will also stop if it can't be sent because
of low bandwidth, instead of just being alive but unavailable. This is usually
the cause of unobtainable streams. The broadcast will also end if the dsp
stops sending data for 2 minutes. This is the cause of streams that won't
play and have a supposed 0 bitrate.
There should not be much repeated buffering when first listening to a stream.
This was caused by not waiting for missing data blocks for long enough.
Auto-play when the stream first starts, and auto-retry when the player disconnects,
are now seperate options. There's also an auto-view to display the stream's
embedded web page when the stream starts.
Hope you like it :-)
1.28 (8 July 03)
A big overhaul in the way IP's and ports are handled, which should now cope
with evil address-mangling devices such as Routers, NAT (Network Address Translation), LAN's (Local Area Network) etc.
Both the internet address and lan address of a host are propogated now. Same-lan
hosts use the lan address to communicate, and outside-lan hosts open a channel
in to a lan host by sending a 'push' message to an also-outside-lan proxy
that maintains a permanent connection to the lan host. Messages emerging
from lans usually have the 'from' port in them changed by the router/nat,
and replies from outside must be sent back to this port or the address-mangler
won't know where to forward the massage to (this is why a proxy is needed).
This translated port is now used properly and won't cause lots of aliases
of a host as happens in v1.27. These changes should mean lan hosts now connect
transparently, without needing to configure port-forwarding. Hosts on seperate
lans may also be able to connect directly in some cases (like TCP can't,
and this should improve in the next version)
The reverse-firewall effect' has been patched by a little hack. This is where
a streamer seems unable to send any UDP messages until is has received one,
which is a very silly thing for a firewall/etc to do, so it must be my bug
but I can't find it. If no messages are received at all for 30 seconds after
starting streamer, it makes an http connection to one of the seed hosts and
asks to be sent a UDP 'kick' message, which then fixes the problem.
Broadcasts have their bitrate measured rather better than before. The totals
are counted over one minute periods, which should eliminate overestimates
caused by the dsp stream coming in bursts.