Future Digital Norfolk

FuturePlus+ Test Transmissions

This afternoon (Sunday 01st November 2015) we ran some test tone and royalty free music transmissions on the FuturePlus+ DAB channel.  These tests were to check the operation of our ‘Airtime’ programme audio play-out system and its compatibility with ‘BUTT’ (Broadcast Using This Tool) which we plan to use of live outside broadcasts.

Airtime is a Linux based broadcast radio automation package (details here) and BUTT is a simple streaming tool (details here) and they generally play nicely with each other, or at least they did until version 0.1.14 of BUTT (current) was released!  This version includes the very useful Opus audio standard (details here).  Unfortunately, as our in-house tests have discovered, the way version 0.1.14 of BUTT attempts to “handshake” with Airtime (current version as at November 2015) when setting up a connection is broken.  After wasting far too much time thinking we were doing something wrong (!) a trawl around the web finally revealed why BUTT 0.1.14 doesn’t like talking to Airtime (with thanks to Max Krüper for getting to the nub of this!):

I wrote with the developer, he said that butt sends a PUT request to the server to test if it is icecast 2.4 or earlier. A real icecast server before version 2.4 does not respond to a PUT, so the client will then try to send a SOURCE. The problem now is that airtime’s liquidsoap harbor answers with a 404 which butt doesn’t expect. So it hangs. Maybe this could be fixed in airtime.

To make it work with airtime, you just need to comment out the if.

src/icecast.cpp:

//if (i == 0)
//{
// Try PUT method first. Supported since icecast 2.4.0
//    if(cfg.srv[cfg.selected_srv]->mount[0] != ‘/’)
//        snprintf(send_buf, sizeof(send_buf), “PUT /%s HTTP/1.1\r\n”,
//                cfg.srv[cfg.selected_srv]->mount);
//    else
//        snprintf(send_buf, sizeof(send_buf), “PUT %s HTTP/1.1\r\n”,
//                cfg.srv[cfg.selected_srv]->mount);
//}
//else
//{

if(cfg.srv[cfg.selected_srv]->mount[0] != ‘/’)
snprintf(send_buf, sizeof(send_buf), “SOURCE /%s HTTP/1.0\r\n”,
cfg.srv[cfg.selected_srv]->mount);
else
snprintf(send_buf, sizeof(send_buf), “SOURCE %s HTTP/1.0\r\n”,
cfg.srv[cfg.selected_srv]->mount);
//}

Post edited by Max Krüper at 2015-02-19 15:31:43

Interesting that this has been going on since February of this year and is still a problem…. We might try that edit at some point, but in the meantime we move on…

In light of the above, we are not yet able to use Opus encoding for outside broadcasts – we have to put up with the coding delays of MP3, not terrible but rather annoying nevertheless.  We’re not planning on major two-way OB work, and DAB off-air delay is MUCH worse, so….).

Airtime has some really good features, but it doesn’t seem to have been designed by people with a great deal of experience of professional broadcasting.  In some ways that’s a very good thing, as it means they’re not locked into established ways of doing things, but it does mean that really obvious things that broadcasters might / will want to do, such as duplicating a whole show for repeat broadcast, take far too many clicks / actions to achieve.

With the play-out system just about working now, we can really pay attention to the programme ingest side of things, which has to be as fully automated as possible because we all have other jobs!

Before we start playing copyright material on-air we also have to pay some serious copyright / royalty fees to the Performing Right Society and Phonographic Performance Limited (a four figure sum), but that’s another story….

==ENDS==