HOME
INSTALL NOW!
NEWS
About

Download
Instructions
Help
FAQ
Forum

How it works
LAN,NAT,etc
Advanced config

Broadcasting
Broadcast help
Get your Streamer Widget

>>> more Info <<<
Iain's BLOG
Donations
Version History

Spheres of Chaos



Links:

#Resistance is not futile
p2p radio
Current version 2.20 (26 Sep 12)
Status:  netstatus 12 stations, 17 listeners 
Changes log
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.

Video!

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.



Previous versions:

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 softwares.

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.

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.

1.46 (5 Aug 06)

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 IP address.

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)

The 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)

Ok, it's been a while since the last version, and there are a load of new features.

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 initial IP's.

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 after 1.40.

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 different.

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 properly yet.

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 end.
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.

Stations stuff:
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 old.
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.

Broadcast stuff:
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.

Misc stuff:
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 disabled.
Made polling for feeds happen 8 times a second, much faster than before. Tuning in is now almost instant.

Bug fixes:
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...

Video
It's got Video now, using Nullsoft Streaming Video NSV format, and playing in Winamp 5. Enjoy.
More formats to follow...

Chat
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 l33t h4k0r2.
Made messages word-aligned within message block, to assist porting to future processor platforms.

Gui
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...

Network
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 alive list.
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.

Audio
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 10 seconds.

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 forever.
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!

Yellow Pages
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 redraws.

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. And more...


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 startup.


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' messages.
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.




© Iain McLeod 2003-2012.
"And the meek shall inherit the Earth" (Rush/2112)

Hosting by KMeat Hosting