[00:12.060 --> 00:13.040] Well, hi. [00:13.240 --> 00:14.360] Yeah, we'd like to get started. [00:15.720 --> 00:42.180] This is the team from Radio Volta and WPEB, also the Philadelphia Independent Media Center, that has been working on a Hacking for Community radio project, where we're basically trying to develop some software that will make make a lot of things possible for community radio that weren't possible before. [00:42.540 --> 00:48.180] My name is Pete Tridish, and I'm from the Prometheus Radio Project, and also from Radio Volta. [00:49.100 --> 01:00.980] We've got Josh from Philly IMC, Josh Marcus, and Dave Ernie, and Christina Clare. [01:02.460 --> 01:03.200] Wow. [01:04.060 --> 01:05.220] We're really fancy. [01:07.220 --> 01:13.940] And we wanted to tell you about a project we've been working on over the course of the past year or two. [01:15.280 --> 01:17.520] Just a little bit of background about the project. [01:19.100 --> 01:27.900] Outside of the software project, Radio Volta is an internet-only radio station that was started during the Republican National Convention in Philadelphia. [01:27.940 --> 01:32.940] It rose from the ashes of Radio Mutiny, which was the pirate radio station. [01:33.200 --> 01:37.920] That was confiscated by the FCC about three years, four years ago now. [01:39.060 --> 01:59.200] And a bunch of the staff of Radio Mutiny plus the Income Media Center people came together to put together this internet station, because we knew the whole world would be watching Philadelphia while the Republicans came to sully our city for a few days in the year 2000. [02:00.640 --> 02:13.900] We had such a good time putting on Radio Volta, the temporary station, that we decided to just keep it going, even though the main audiences that we wanted to reach were people that didn't have computers, people that didn't listen to web radio. [02:13.900 --> 02:21.180] We decided we were going to find a way to do community radio and make internet radio into community radio. [02:22.160 --> 02:26.160] And so we got the station going as an internet station. [02:26.540 --> 02:39.900] And then we got into an arrangement with a local community station, WQB, which was a station that was almost about to go bankrupt. [02:39.900 --> 02:46.400] It's a station with a 25-year history, and it was having financial problems. [02:47.060 --> 02:49.520] And so we cut a deal with it. [02:49.600 --> 03:05.500] And they had a really hard technical problem, which, as it turns out, it's a lot easier, it's a lot easier, as I learned as a pirate, to broadcast on FM than it is, and a lot cheaper. [03:05.500 --> 03:09.880] You know, you can put up a pirate station for, you know, 500, 800 dollars. [03:11.300 --> 03:25.000] It's a lot easier and cheaper to broadcast on FM than to get a single audio stream from place to place reliably with high enough quality for FM. [03:25.000 --> 03:33.400] And regular radio stations spend, you know, ten, fifteen thousand dollars in the course of making a microwave link between two points. [03:34.280 --> 03:40.480] And that was going to be something that WPEB was not going to be able to do anymore. [03:40.700 --> 03:43.260] They had to move their transmitter from its original site. [03:43.260 --> 03:51.800] And they needed to separate the studio and the transmitter in order to meet the FCC's rules. [03:52.080 --> 04:13.380] So we decided that Radio Volta, in exchange for having some of our programming go out over the FM for about 40 hours of the week, we were going to set about the problem of developing software that could create reliable streaming, streaming that was good enough for FM broadcasting, [04:13.720 --> 04:26.360] that it could be used as a studio transmitter link with a couple of, with a few cheap computers and without investing the fifteen thousand dollars in commercial quality microwave. [04:28.640 --> 04:33.000] So, I came to this as, I am this much of a nerd. [04:33.520 --> 04:40.160] And I made this decision about five years ago that I was not going to learn anything else about computers. [04:40.180 --> 04:41.300] I was just going to learn radio. [04:41.960 --> 04:48.440] And I was just going to make sure that I had friends that knew how to handle the computer end of things. [04:48.440 --> 05:06.200] But I have to say that in the course of this project, you know, people started, you know, explaining that, you know, if you use Microsoft Windows to do your computing, it's about as good as getting your news from ABC or NBC or the corporate media. [05:06.820 --> 05:15.860] When it comes down to it, what we needed to do was not take the easy solutions that were buggy from Winamp and all that sort of thing. [05:15.860 --> 05:24.560] And we needed to go into Linux to be able to customize something that would be the right thing for what we needed to do. [05:25.760 --> 05:31.580] We didn't just need something that was capable of streaming from one place to another. [05:31.700 --> 05:47.680] But actually we needed to have the Radio Volta Studio and the WPEB Studio both able to reliably and in a regular fashion deliver streams to the transmitter site and to be able to broadcast from there. [05:48.580 --> 05:55.040] So that is, that's the nature of the challenge that we, that we faced when we started. [05:55.460 --> 05:57.900] And I think, I'll just turn it over to you guys. [05:58.500 --> 05:58.780] Okay. [06:08.620 --> 06:23.300] So, we're going to talk about the project in general, focusing primarily on our work getting Radio Volta and WPEB reliably on the air at 88.1 FM, a project that's still an ongoing project very much. [06:23.300 --> 06:31.820] And also the project to try and develop an open source software package, sort of a turnkey solution to get community radio on the air. [06:32.840 --> 06:40.860] So, I thought we'd begin by talking about why the whole idea of a studio transmitter link is interesting and also why it's important. [06:45.980 --> 06:46.480] Okay. [06:47.160 --> 06:58.040] I mean, Pete Tri talked about the fact that a studio transmitter link is often very important because a studio and a transmitter can't always be at the same location. [06:58.420 --> 07:02.420] Especially under the low power FM rules, that seems like it's very often the case. [07:03.520 --> 07:09.620] At first, it seems like a somewhat easy problem because there's a lot of software out there that will do this, right? [07:09.620 --> 07:17.280] You download whatever audio decoder program you use and you download audio off of the internet and then you can listen to it. [07:17.700 --> 07:23.740] And then there's also all sorts of software that will encode it and put it on the internet or transmit it directly if you want to do that. [07:24.340 --> 07:31.840] It turns out that that's a little bit deceptively simple because all of the pieces of that puzzle end up being rather unreliable. [07:32.960 --> 07:39.420] And we've gone through a lot of trials trying to find a combination of pieces that are reliable. [07:39.960 --> 07:41.660] Another factor in that is cost. [07:42.080 --> 07:47.100] We had very, very little money to start with and no money, no money. [07:47.300 --> 07:50.840] And when we began, we were using dial-up modems. [07:50.980 --> 07:55.300] And we'll go through a little bit of the history of the technical project of setting it up and the stages we went through. [07:55.300 --> 08:01.700] But without... you could spend many thousands of dollars on a commercial link or even reasonable connectivity. [08:02.140 --> 08:04.580] But when you can't do that, it becomes more and more difficult. [08:04.780 --> 08:11.180] Or when there are actually obstacles like the need to use a satellite internet connection, which happened with another station we'll talk about. [08:11.440 --> 08:22.460] So the initial problem was to get broadcast quality audio from place to place using a dial-up modem and have it be reliable enough so that we wouldn't drop off the air for 30 seconds and get fined by the FCC. [08:24.960 --> 08:31.600] Okay, so the slide here is about the original plan, which we are very far from. [08:32.420 --> 08:38.260] And the plan was to make a turnkey solution to get a community radio station that needed a studio transmitter link on the air. [08:38.860 --> 08:40.960] Something that was easily installable. [08:40.980 --> 08:45.640] So we're thinking like a bootable CD or a Linux disk image or something like that. [08:46.000 --> 08:49.780] Something that would manage both the encoder computer and the decoder computer. [08:49.780 --> 08:52.820] You have one computer that's connected directly to the studio. [08:53.020 --> 08:55.560] And another computer connected to the transmitter. [08:56.040 --> 09:00.040] And you want the software to manage both sides of that equation. [09:00.880 --> 09:02.660] Something that will do content scheduling. [09:03.080 --> 09:07.560] So they'll schedule different pieces of audio and different shows as it goes on. [09:07.940 --> 09:09.540] And then there are other pieces of that. [09:09.680 --> 09:11.960] Like we wanted something that would manage the network. [09:11.960 --> 09:14.520] Because say the studio is on the DSL. [09:14.680 --> 09:16.580] You might want to use that DSL for other things. [09:16.820 --> 09:18.520] Or control the bandwidth usage. [09:18.780 --> 09:20.580] So we want the software to do some networking. [09:20.940 --> 09:22.920] And also something that people can actually use. [09:24.460 --> 09:28.080] We want to have a CD that we can send to somebody who's never used Linux before. [09:28.340 --> 09:31.980] And they can put it in their drive, boot it up, and have a studio transmitter link that works. [09:32.860 --> 09:35.000] Maybe enter a few configuration things. [09:35.160 --> 09:36.380] And we're floppy or something. [09:36.820 --> 09:37.600] I've got to get in. [09:37.700 --> 09:38.220] I'll be right back. [09:38.440 --> 09:38.840] Thanks. [09:41.400 --> 09:43.540] We really don't want to get called in the middle of the night. [09:48.660 --> 09:50.860] This is where we begin the proselytizing section. [09:51.640 --> 09:55.140] One of the reasons why we're here is we really need help on this project. [09:55.310 --> 09:56.740] So we don't get called in the middle of the night. [09:57.670 --> 10:01.040] And it's a really worthwhile project for a lot of reasons. [10:01.040 --> 10:13.430] An interesting story is that when Radio Volta was just beginning, it was during the Republican National Convention, and the last HOPE conference happened just that weekend previous. [10:14.040 --> 10:25.880] And in fact, Jella Biafra, who spoke here at length about the need for people to get involved in using their technical powers for good, actually came and was one of our first interviews on the station. [10:27.330 --> 10:32.810] Personally, I've thought long and hard about sort of the hacker maxim, information wants to be free. [10:33.020 --> 10:35.550] And the question is, what does that mean in sort of a practical sense? [10:35.780 --> 10:38.480] And this is a very practical project that reflects that. [10:38.660 --> 10:43.790] We're actually working directly to give the means of communication to communities that want to use it. [10:44.210 --> 10:52.780] And maybe you don't like commercial radio or, you know, you don't like the way that the media is now, but you don't want to go out and start your own radio show or go interview people or things. [10:52.920 --> 10:56.090] But you can do what you're good at and write some code that'll really make a difference. [10:56.540 --> 11:01.540] You know, you can spend an afternoon writing a script for somebody, and it's something they can never do on their own. [11:01.740 --> 11:05.120] It'll make a huge difference in their day-to-day lives and make it something very much easier. [11:06.520 --> 11:07.800] And it's a good way to help out. [11:07.940 --> 11:19.320] Yeah, and then another thing that Dylan and Pete had talked about earlier was that, you know, like a lot of radio stations want to get started, but, you know, they just have the, like, easy solutions. [11:19.640 --> 11:23.020] That's, you know, the proprietary software, like, using Windows. [11:23.460 --> 11:29.300] And something that I think a lot of, kind of, community organizations would like to do is use open source software. [11:29.620 --> 11:33.180] And so it's good to be able to go in and help them get off their feet doing that. [11:34.250 --> 11:39.360] Yeah, we found a lot of places that have heard of open source software, think it's a good idea, but have no idea where to start. [11:39.900 --> 11:45.260] So we can show up with some CDs, set something up, show them how to use it, and leave them, and hopefully they won't call us. [11:49.410 --> 12:01.590] Another cool thing to do with an STL is, you know, say you've got, you want to stream audio, and for some reason you've got a transmitter somewhere that you want to go to and you don't want it to be traceable back, or you want to stream on the web to people, [12:01.830 --> 12:03.440] and you don't want it to be traceable back. [12:03.580 --> 12:05.440] This is, sort of, an interesting problem. [12:06.480 --> 12:07.960] I don't think it's quite solved yet. [12:10.100 --> 12:10.500] Right. [12:10.760 --> 12:12.690] So, when you divide... [12:13.500 --> 12:27.830] An idea has been, sort of, a meme has been floating through the atmosphere, that if the content providers are legal in publishing on the web, then that opens up the possibility of all sorts of places, all over the world, to rebroadcast that content signal. [12:27.940 --> 12:32.000] Whether they be FM stations, or low-power FM stations, or pirate stations. [12:32.440 --> 12:39.540] So, while a given transmitter might get knocked down, a community project that's actually producing content won't get knocked down. [12:39.980 --> 12:49.640] An STL, a student transmitter link, is an interesting way of making that possible, but you need it to be flexible, and you might have to deal with whatever restraints that you have. [12:49.640 --> 12:53.180] You probably have limited resources if you have a pirate antenna somewhere. [12:54.900 --> 13:02.180] There are some interesting possibilities, which are, sort of, which are now, sort of, just research questions, that one of you could actually follow up on. [13:02.830 --> 13:05.020] For example, there is... [13:05.020 --> 13:14.630] A bunch of people have been talking about at the conference, a new software that was just released called Open DJ, which is a peer-to-peer system, which you can use to, sort of, run your own... [13:15.320 --> 13:22.680] Like, do your own show, and have people listen to it all over, and, um, the audio content actually comes from another peer who's listening to it. [13:23.300 --> 13:35.400] And, actually, if you go to the page, which is OpenDJ.org, they discuss some of the same issues we're discussing here, which is that it's, as we said, sort of easy to get on the air, but it's very hard to keep yourself reliably up. [13:35.620 --> 13:41.320] And this system is designed to make it really easy for people to have a show, and really easy to keep it up. [13:41.320 --> 13:47.020] And so, interesting question would be whether we can integrate that in some meaningful way into this sort of project. [13:50.200 --> 13:52.060] Here's some information on Radio Volta. [13:52.640 --> 13:58.060] I think Pete went over, but there's our web address that we'll plug, RadioVolta.org. [13:58.210 --> 13:59.700] You can listen to our stream there. [13:59.940 --> 14:02.180] Also, WPEV.org. [14:02.180 --> 14:04.300] I think there's a stream there. [14:07.630 --> 14:10.750] So, this is the very simple concept, right? [14:10.950 --> 14:12.470] We have two stations. [14:13.390 --> 14:20.770] One of the interesting obstacles that we had to face with the Volta station is that we were actually combining two projects. [14:21.010 --> 14:29.910] One is Radio Volta, the Indian Media-based radio internet project in WPEV, which had its own studio and was a separate, independent radio station. [14:29.910 --> 14:37.730] So, here we had an additional concern, which is that we needed to switch from one content provider to another, and we need to do that on a schedule. [14:38.530 --> 14:50.070] This is also the kind of thing that you might want to do, say, if you had your own transmitter and maybe you broadcasted during certain parts of the night and you actually had shows, but for the rest of the time you want to draw on other content. [14:50.210 --> 14:52.710] And there's a tremendous amount of great content on the internet. [14:52.990 --> 14:55.150] So, that is kind of an interesting functionality. [14:55.150 --> 15:03.830] So, it's just Radio Volta and WPP and it goes over DSL to a central server and then the transmitter picks it up from that server. [15:04.250 --> 15:19.330] I should point out, too, that one of the big problems that we had originally was that several of the locations that, even if we had the money at the moment to pay for DSL for them, they were on the other side of the digital divide. [15:19.330 --> 15:23.290] They were in neighborhoods in Philadelphia that were not served by DSL yet. [15:25.010 --> 15:44.150] And one of the things that we spent a lot of time on was dealing with the low bandwidth issues precisely because it's not uncommon for us to want to cite a transmitter or cite one of the studios in a place that the phone companies choose not to serve with their high bandwidth applications. [15:44.710 --> 16:04.310] And the other problem in a station that we built in Maryland where we used the same system was that the only place that the FCC would allow us to put the transmitter and have a legal station was on an island across the Chesapeake Bay. [16:04.310 --> 16:21.630] And we sort of snuck our way into getting a license for a town across the bay by citing the transmitter someplace that was far enough away from the major cities that we were able to get the permit for them. [16:21.770 --> 16:27.390] But there was definitely no other form of connectivity there except for dial-up. [16:27.390 --> 16:40.630] And what we ended up using in a bizarre twist of fate was a satellite connection out there, which we are still stunned that it's actually functioning. [16:41.070 --> 16:45.150] Actually, there wasn't even a dial-up ISP that was a local phone call there. [16:46.270 --> 16:56.770] I was quite amazed that the FCC restrictions were so intense that for them to be able to broadcast their signal 10 miles across the Chesapeake Bay. [16:56.890 --> 17:06.810] It was necessary to send their information to wherever the satellite company is, maybe, you know, from the East Coast to the West Coast, and then up into space so that we could get the signal a couple of miles. [17:07.590 --> 17:10.930] It made for some interesting ping times and latency problems. [17:11.310 --> 17:21.990] Yeah, that was one of the motivating factor and very difficult where we're trying to deal with the management of the transmission of the signal is that the latency were, like, seconds, right? [17:22.070 --> 17:28.770] It took seconds for a packet to get from one place to another, and that made a lot of the players very, very unhappy. [17:31.410 --> 17:33.510] Here's the real picture for radio voltage. [17:34.650 --> 17:38.850] We don't really... maybe you can read that if you're sitting close and have good vision. [17:39.290 --> 17:40.410] But probably not. [17:40.910 --> 17:43.250] The point is just that there's a lot of pieces. [17:43.250 --> 17:44.330] They're all interconnected. [17:45.310 --> 17:47.490] Sort of shows lots of random things. [17:49.090 --> 17:52.530] So, maybe I'll just talk a little bit about the technical... [17:52.530 --> 17:55.970] what the pieces of the puzzle are and the technical history that got us here. [17:57.270 --> 18:06.910] When we first started on the project, we had the two sites, the Radio Volta site and the WPB site, and there was the transmitter. [18:07.090 --> 18:10.150] And the question was, how do we get the signal and how do we do the switching? [18:10.590 --> 18:13.370] The connectivity was a real problem for us at first. [18:13.510 --> 18:16.990] One, because one of the studio sites didn't have... [18:16.990 --> 18:18.890] we couldn't get DSL even if we wanted it. [18:19.350 --> 18:20.330] And also, we didn't have the money. [18:20.370 --> 18:23.150] So, we had three dial-ups in all those locations. [18:23.710 --> 18:29.030] The first thing we did was use LiveIce, which is an open source MP3 streaming software. [18:29.970 --> 18:33.330] And we found... and what we discovered was that... [18:35.330 --> 18:39.290] What we discovered is that LiveIce is very, very unreliable. [18:39.810 --> 18:41.070] It would die all the time. [18:41.190 --> 18:41.990] It was very problematic. [18:41.990 --> 18:48.150] And another problem we faced is that the MP3 software wouldn't function under... [18:48.150 --> 18:52.570] We couldn't broadcast under very, very low bit rate. [18:52.810 --> 18:53.390] It just wouldn't work. [18:53.510 --> 18:55.170] Over a modem, it just wouldn't... [18:55.170 --> 18:56.890] It just wouldn't broadcast MP3. [18:58.610 --> 19:02.770] And we were forced, at a certain point, to experiment with different kinds of solutions. [19:02.770 --> 19:09.950] And we ended up actually having to go with real audio and real producer. [19:10.290 --> 19:10.810] And this is... [19:11.930 --> 19:15.130] This is where we hope to rile you up into anger. [19:15.490 --> 19:21.010] Because we were forced to go to the proprietary solutions, which was very upsetting. [19:21.170 --> 19:22.950] So, this is what we call the codec travesty. [19:24.090 --> 19:25.750] So, we wanted to use MP3. [19:25.930 --> 19:27.270] We wanted to use Ogg Vorbis. [19:27.410 --> 19:31.310] And it turns out that they're just really not very good at low bit rates. [19:31.510 --> 19:31.830] And we're... [19:32.890 --> 19:35.470] This is the part where you should just throw the rotten fruit. [19:35.670 --> 19:37.130] Because we're saying MP3 sucks. [19:37.530 --> 19:38.150] It's okay. [19:40.750 --> 19:45.590] The real producer was built to deal with... [19:45.590 --> 19:46.810] It was built a long time ago. [19:46.930 --> 19:48.490] And was built to deal with low bit rates. [19:49.310 --> 19:51.150] The MP3 streaming software... [19:51.150 --> 19:53.810] And it turns out that there is better software than LiveIce. [19:53.950 --> 19:57.030] There's software called DarkIce, which works relatively well. [19:57.190 --> 20:01.010] And there's also an XMMS plugin that's very easy to use. [20:01.150 --> 20:02.130] What about Shoutcast? [20:03.510 --> 20:04.030] Shoutcast... [20:04.030 --> 20:06.570] We ended up not using Shoutcast. [20:06.790 --> 20:12.190] And it's possible that Shoutcast works well under low bit rate solutions. [20:12.490 --> 20:15.690] And if that's true, then we should look into that and we should use that. [20:15.830 --> 20:18.590] I haven't personally tried Shoutcast with a modem. [20:18.590 --> 20:22.450] Yeah, there's also a command line script you can use. [20:22.670 --> 20:24.190] And I've used in the past free stream. [20:24.750 --> 20:26.090] And that works really well. [20:26.210 --> 20:30.030] It's a Perl script that takes MP3 data on standard input. [20:30.170 --> 20:32.510] And then sends it to a nice cast server. [20:33.550 --> 20:36.690] But again, we had good connectivity when we used it, so... [20:36.690 --> 20:37.250] Bernard? [21:08.140 --> 21:11.980] If you have comments, please come up, use the mic. [21:12.240 --> 21:16.120] I'll turn the mic to the back on as well, so we'll be chill when it's the closest to you. [21:16.560 --> 21:19.540] So everyone could hear, so we'll get on tape for posterity. [21:20.640 --> 21:28.940] In order to try and draw you in and incite your help on the matter, we have brought candy, which we wish to throw to people who have offered suggestions. [21:28.940 --> 21:31.280] So if you two would like candy, you wouldn't mind. [21:31.420 --> 21:32.940] We're going to throw you some candy, so... [21:34.720 --> 21:35.220] Watch out! [21:35.440 --> 21:35.660] Watch out! [21:36.980 --> 21:38.240] That's going to be good for being late. [21:38.780 --> 21:41.500] If you don't answer questions, we will hit you with candy. [21:43.260 --> 21:44.520] I'm looking forward to a candy. [21:46.120 --> 21:48.180] IRLP, which is the internet radio linking project. [21:48.380 --> 21:50.040] It's being done by the amateur radio community. [21:50.800 --> 21:56.160] It's a card and Linux and transmitter control through DTMF signals. [21:56.480 --> 22:01.480] Through my HT, I can dial up four numbers and be anywhere else in the world on a local transmitter. [22:02.020 --> 22:02.560] Oh, cool. [22:03.180 --> 22:05.200] Their site is IRLP.net. [22:05.640 --> 22:06.100] Okay. [22:06.340 --> 22:07.060] Yeah, we'll look into that. [22:07.300 --> 22:13.900] I think they charge about $100 Canadian for the card and a version of Linux, which you can toss out. [22:14.500 --> 22:18.260] It's at the bitrate's $8,000, but I'm sure it can be expanded. [22:18.260 --> 22:23.840] And that is straight, modulate, demodulate, audio, digital, digital audio. [22:24.260 --> 22:24.860] What's your name? [22:26.020 --> 22:27.060] IRLP.net. [22:27.620 --> 22:30.140] India, Romeo, Pima, Papa, .net. [22:31.360 --> 22:33.840] Just for, if you're wondering, by low bitrates. [22:34.780 --> 22:39.480] By low bitrates, we mean like 16, 24 kbps, something like that. [22:41.060 --> 22:48.520] Another interesting fact about the mp3 in real audio is that real audio sounds pretty good at 16k or 20k. [22:48.800 --> 22:51.720] I mean, like, audio files tell me it sounds horrible. [22:52.240 --> 22:55.040] But for us, it seemed okay. [22:55.400 --> 22:55.560] You know? [22:55.740 --> 22:57.500] You could listen to it on the radio. [22:58.020 --> 22:59.420] There was other distortion. [22:59.720 --> 23:04.960] And so the one distortion to us seemed like it canceled out the other distortion and made it what we called warm. [23:06.320 --> 23:11.620] But that was actually really, that certainly continues to be a disappointment for us. [23:12.080 --> 23:22.960] And dealing with a real producer has meant that we've had to deal with their player, which has its own little GUI and isn't really designed to be integrated into like a Unix application. [23:22.960 --> 23:28.160] Yeah, 128k mp3s sound great, you know, but we can't stream that, unfortunately. [23:32.480 --> 23:35.680] We have one additional candy challenge here at the moment. [23:36.380 --> 23:45.680] Another question, another issue we have is that our, we're using random commercial home connectivity, just because there's not a lot of money. [23:46.520 --> 23:50.020] Or maybe we're using our 802.11 link and it goes up and down. [23:50.860 --> 23:59.000] And one question we have is, how can we actually monitor the effective bit rate of a connection? [23:59.340 --> 24:00.880] It seems like there's software out there. [24:01.120 --> 24:09.120] But so if anyone has a solution as to how the best do that, we also were interested in perhaps switching, like having more than one type of connectivity at a time. [24:09.440 --> 24:11.960] Like having a dial up and having a DSL. [24:12.120 --> 24:14.940] So that, because we can't, we don't want to go down at any point. [24:15.060 --> 24:16.160] And the reliability is kind of crucial. [24:16.340 --> 24:17.260] Yeah, there's two catches. [24:17.260 --> 24:20.640] One catch is that, let's see, first catch. [24:21.440 --> 24:25.760] We don't want to find bandwidth by transferring large files and see how long it takes. [24:26.020 --> 24:27.020] Because our stream will go down. [24:28.960 --> 24:32.120] Second catch is that when we switch sources, we don't want the stream to go down. [24:33.900 --> 24:35.120] So, any suggestions? [24:38.090 --> 24:41.050] Are there multiple questions in there on switching sources? [24:41.690 --> 24:43.410] Actually, could you come up to the mic, please? [24:47.990 --> 24:51.490] I just wanted to mention that I'm part of running the network at the DRG IMC. [24:52.210 --> 24:56.130] And that recently I set something up where we're able to monitor the bandwidth through the firewall. [24:56.950 --> 25:00.210] That we set up and all the streaming does go through that firewall. [25:00.510 --> 25:04.350] And we did it with the accounting features of a program called IP filter. [25:04.710 --> 25:06.570] Which is what we use for our packet filtering. [25:06.570 --> 25:12.990] And we were able to produce a nice graph that lets us see the bandwidth utilization as we stream. [25:13.570 --> 25:22.550] And we're also able to use some quality of service tools like Alt-Q and dummy net to limit the bandwidth of other machines so that they don't take over the link. [25:23.610 --> 25:26.350] I wanted to throw out also just the thing of... [25:27.750 --> 25:31.110] There's ISDN, which is available in a lot of places where DSL isn't. [25:32.150 --> 25:37.510] And with that over voice, where you don't pay per minute charges to the phone company, you can still get 112K. [25:37.870 --> 25:45.270] And it's pretty reliable, so you could, you know, depending on encapsulation overhead, you could get 64K MP3 or maybe even more. [25:46.930 --> 25:50.410] And short of that, there's, you can do channel bonding with modems also. [25:50.630 --> 25:53.810] You can have multiple modems dialed to the same place and bond those channels. [25:54.110 --> 25:57.910] Yeah, we actually head towards channel bonding with modems when DSL became available. [26:00.350 --> 26:09.370] Also with ISDN, there is, there's, I don't know if you're, you said that you're using a satellite connection. [26:09.370 --> 26:26.910] Is that for TCP IP traffic or, if you're using, if you, if you want, one thing that's used commonly in radio is to use an ISD connection with a hardware codec to send your, your signal up to the satellite and send it to other radio stations. [26:27.390 --> 26:29.770] And those hardware codecs are really quite good. [26:30.410 --> 26:35.670] And they run over, you know, a single twisted pair, you know, dual channel, 112K. [26:36.210 --> 26:37.510] And the quality is quite good. [26:37.650 --> 26:40.150] Pacifica radio uses it up to distribute their programming. [26:40.930 --> 26:42.530] Democracy now, that sort of thing. [26:43.010 --> 26:47.950] Yeah, one thing we've heard about the hardware codecs is that they don't work well for 24-7 operation. [26:48.310 --> 26:51.370] And they also, you know, a few thousand dollars, which I guess isn't too bad. [26:51.670 --> 26:52.590] They're very pricey. [26:53.310 --> 26:54.830] That is a disincentive. [26:56.650 --> 27:13.550] The other comment I wanted to make was that on the switching of the sources, you're switching, you have two different locations sending into one LiveI server. [27:14.210 --> 27:15.870] Is that how you're doing it now? [27:15.870 --> 27:18.870] Right now, we were doing that. [27:19.150 --> 27:22.390] Now we've been trying, we've been forced to use the real audio solution. [27:22.610 --> 27:24.650] But, but we have been using a LiveI server. [27:25.130 --> 27:29.750] Is there, I mean, the IceCast server is a, you can, what's the way to do it? [27:29.870 --> 27:32.010] If we have two streams going into one IceCast server? [27:34.550 --> 27:40.330] My experience with that tells me that you have to bring one down before you bring the other one up. [27:40.330 --> 27:49.690] You can, I believe that IceCast has, you can configure it so that it doesn't drop listeners during that period. [27:50.570 --> 27:58.430] There is a little bit of a problem with the prior build, not IceCast 2, but, you know, the one that everybody's been using for years. [27:59.490 --> 28:04.930] That the next connection, that there's something about overriding the default. [28:04.930 --> 28:11.310] As long as you're using mount points and you're using LiveIce or DarkIce to send to a mount point, you should be okay. [28:12.310 --> 28:21.890] And I think there's also, IceCast 2 has a feature where it can play something between sources. [28:22.690 --> 28:26.470] You point it at a directory and it starts playing MP3 files from there. [28:26.670 --> 28:30.610] I haven't looked at it in a long time and I might be confusing it with another server like ShoutCast. [28:31.270 --> 28:32.890] But you might want to look at that. [28:33.410 --> 28:35.830] But so it takes coordination to... [28:35.830 --> 28:43.830] The other way to do it is to send those two sources into one computer, generate an audio feed and, you know, re-encode that. [28:43.950 --> 28:47.290] But that gets messy because then you start ending up with artifacts from compression. [28:51.870 --> 28:52.950] That's pretty interesting. [28:54.830 --> 28:58.270] The switching has been a real issue of concern. [28:58.490 --> 29:02.610] And also it seems like it should be much easier than any solutions we found. [29:03.030 --> 29:13.470] But, I mean, if we had sort of these flow demons, which we've envisioned living on these computers, then they could communicate back and forth and coordinate switch-offs, which would also be good for timing. [29:13.470 --> 29:16.570] So, maybe we should go in that direction. [29:16.770 --> 29:20.710] Though it's slightly more complicated than I would hope, but... [29:23.530 --> 29:31.890] I was going to mention that Comrex has come out with a new hardware codec for a plain old telephone service, just dial-up. [29:31.890 --> 29:35.610] And I had to laugh when they came out with the product because they called it the blue box. [29:35.990 --> 29:37.350] And it's in the blue box. [29:37.570 --> 29:43.830] And the pair is only about $3,000, so it's a fairly reasonable price solution, I would think. [29:44.050 --> 29:48.090] And one of the commercial stations I take care of is considering it for a backup. [29:48.710 --> 29:53.410] They wound up being... it's a little... it's not a big one, one of these big commercial chains like Clear Channel. [29:53.550 --> 29:54.910] It's a little mom-and-pah station. [29:55.430 --> 30:00.710] And they couldn't do an RF-STL because there's a mountain in the way between the studio and the transmitter site. [30:00.710 --> 30:07.550] So we went with ISDN on that, but the trouble is, every once in a while, the ISDN just dies, and they're off the air. [30:07.990 --> 30:13.430] So we're going to put in one of these as a backup system, but even for a community station, it might work. [30:13.550 --> 30:19.070] But you still have the problem of leaving a dial-up connection up all the time, which phone companies really don't like. [30:20.050 --> 30:23.830] That was actually one of the things we looked at. [30:23.990 --> 30:30.250] We contacted Comrex, and they're an awful nice-sounding bunch, and I've heard a lot of people like their products. [30:30.250 --> 30:38.910] But when we asked them, when we said that we wanted to use it for our studio transmitter link, what they told us was, we think that we're suitable for a backup. [30:40.270 --> 30:50.670] But we don't feel... and we feel like our... they said that they felt like their products were built tough enough to run 24-7, and that they wouldn't overheat, and they wouldn't do all that sort of thing. [30:50.670 --> 30:56.090] But it really wasn't what they designed them for, and they had a lot of concerns about line quality. [30:56.770 --> 31:11.840] And the example that the woman there gave me was, you know, especially for their plain old telephone line box, is that, you know, that line, it's going to be sitting in the sun all day, and, you know, there's... [31:12.810 --> 31:19.690] the two ends of the pair are going to have to renegotiate, and you're going to end up... [31:19.690 --> 31:26.880] every time the line gets a little shorter or a little longer, electrically, you'll end up with a situation where you'll just have dropouts. [31:26.880 --> 31:31.160] And so they couldn't recommend it as a solution. [31:32.160 --> 31:37.240] Not that they discouraged us from trying it, but they couldn't recommend it. [31:39.280 --> 31:43.260] Yeah, buffering is another question, but maybe we should keep our... [31:44.900 --> 31:45.380] Okay. [31:45.660 --> 31:50.220] Yeah, we've been playing with wireless, and everybody's been asking us about this antenna. [31:51.800 --> 32:01.500] So, a lot of you have probably heard about it, so we thought we'd put some pictures up and just say that wireless is biffy and keen, and here's our antenna in its housing, pointing across Philadelphia. [32:02.320 --> 32:03.520] And that's actually worked pretty well. [32:03.620 --> 32:10.120] It gets us, you know, lots of speed, and we're looking forward to trying it as a 24-7 kind of solution. [32:10.320 --> 32:11.020] What's the difference? [32:11.580 --> 32:12.420] About two miles. [32:12.720 --> 32:14.140] A mile and a half, two miles, something like that. [32:15.980 --> 32:17.880] It's an 18 dB gain antenna. [32:18.160 --> 32:21.900] We're using Cisco 100 milliwatt stuff on both ends. [32:22.340 --> 32:23.080] 80 to 11B? [32:23.460 --> 32:24.440] Yeah, 80 to 11B. [32:28.070 --> 32:31.550] So, this is the station that we used the satellite with. [32:31.950 --> 32:33.890] And, like we were saying, the satellite was fun. [32:35.170 --> 32:40.990] Yeah, one issue that came up under the satellite link is that, like we said before, the latency was huge. [32:41.610 --> 32:49.190] And so, again, we tried using real player and real producer because it could deal with the blackouts really well. [32:49.190 --> 32:55.790] So, like MP3, you get periods of silence and the real player will degrade the signal badly, but it will kind of keep slogging through. [32:56.630 --> 33:01.030] And we came up with just some weird Linux-y type questions that people have ideas about. [33:01.230 --> 33:01.970] They'd be appreciated. [33:02.610 --> 33:04.010] You can come talk to us or whatever. [33:04.010 --> 33:09.030] But the problem is we have to use the gooey little real player application. [33:09.450 --> 33:14.130] And when it loses the signal that the application doesn't die, it just stops. [33:14.490 --> 33:16.830] And so the question arose, how do we watch that? [33:16.910 --> 33:17.770] How do we restart it? [33:17.770 --> 33:20.730] And it turns out that we could watch the number of children processes. [33:21.010 --> 33:23.270] And if it dropped to five, we knew it wasn't playing. [33:23.390 --> 33:24.930] And if it was at seven, it was playing. [33:25.130 --> 33:29.110] But this seems like a kind of a random way to keep track of the application. [33:29.330 --> 33:35.930] So if people have ideas about how to manage sort of an application that's designed for gooey, we'd love to hear it maybe in person. [33:38.810 --> 33:47.810] So, Flow is our studio transmitter link software project, which is a collection of Perl scripts that basically keep real player up and going. [33:48.390 --> 33:50.190] And it's been working reasonably well. [33:53.430 --> 33:56.050] Yeah, this is just a quick overview of a code base. [33:56.250 --> 33:57.510] It's a Perl application. [33:57.510 --> 33:58.790] It's not real... [33:59.610 --> 34:00.830] It's not really involved. [34:01.010 --> 34:03.050] It's an easy thing for someone to jump into and get involved with. [34:03.470 --> 34:07.650] The eventual goal is the sort of turnkey solution that we discussed in the beginning. [34:08.650 --> 34:12.630] Right now, what it is, is it's a daemon. [34:12.730 --> 34:14.350] It runs on the transmitter computer. [34:14.350 --> 34:20.110] For the encoder computers, we've just been using other tools to keep the player going. [34:21.110 --> 34:27.250] We use a software package called Daemon Tools, which is written by Daniel Bernstein. [34:27.770 --> 34:30.610] And there's a program called Supervised, and it keeps a daemon up. [34:30.770 --> 34:38.010] We were talking earlier with the New York IMC, who has a Perl script that they run on the crontab that keeps their player going. [34:38.010 --> 34:47.370] And also they keep XMMS going, because apparently XMMS will die after a whole bunch of hours. [34:47.630 --> 34:54.550] And one thing you find is that a lot of these software packages that seem to work really well, work somewhat less well after 12 hours. [34:55.090 --> 34:56.290] Or over time. [34:56.530 --> 34:58.870] And they're reliable, but they're not really designed for production. [35:00.030 --> 35:02.390] The software here, it's kind of simple. [35:02.550 --> 35:03.630] There's a communicator. [35:04.490 --> 35:06.370] It's like an object-oriented Perl thing. [35:07.570 --> 35:14.810] The daemon listens at a particular port, and where it receives commands to switch the signal from one way to another. [35:15.250 --> 35:22.230] And we have a little CGI page that you can go to, and you can switch the signal from one station to the other. [35:22.230 --> 35:29.490] We also set up a little crontab that at a certain time will automatically send the signal to switch it. [35:29.990 --> 35:37.130] And then we have a process manager that just sort of spawns little child processes that actually run whatever the player is. [35:37.210 --> 35:42.530] Whether it's like MPG123, or XMMS, or the real play. [35:42.670 --> 35:43.930] And we haven't done Ogg Vorbis. [35:44.130 --> 35:45.010] We haven't really tested that. [35:45.410 --> 35:52.210] And then there's a little monitor object that checks to make sure the stream is up and checks to make sure the connection is up. [35:52.230 --> 35:57.230] Because basically you need to keep checking to make sure the stream is up. [35:57.430 --> 36:02.510] And if the stream goes down, then you know that once the stream goes back up on the other side, you need to restart the player. [36:04.930 --> 36:10.690] There is some future... the future code is not too much more involved. [36:10.910 --> 36:16.430] We'd like to integrate a scheduler, which is one of the things that almost all radio stations need. [36:16.990 --> 36:25.970] And something that can be configurable externally from a webpage so that you could, you know, from wherever you are, you could set up your station to broadcast different streams. [36:26.190 --> 36:33.750] And often community radio stations, like in our experience, when big events happen or something, exciting is going on, you might want to pick up... [36:33.750 --> 36:41.870] What microradio.net has been calling these emergency community broadcasts, where there's intensive coverage of something going on somewhere else. [36:42.090 --> 36:44.150] And so it's fun to broadcast that on your own station. [36:44.690 --> 36:49.490] We also like to make a little GUI so that people can actually configure it. [36:49.650 --> 36:58.130] And there is like now you have to configure it by editing a little configuration file, which is fine if you're kind of Linux handy, but it's really arcane if you're not. [36:58.130 --> 36:58.630] So... [37:04.540 --> 37:08.260] The end menu of the player on, how do you get to the transmitter from that machine? [37:08.440 --> 37:13.240] Is it going up to the sound card, do you have an interface there, that actually physically gets it into the transmitter? [37:13.840 --> 37:14.540] Yeah, yeah. [37:15.160 --> 37:18.520] Yeah, so the question was, how do we get the sound from the computer to the transmitter? [37:18.780 --> 37:24.460] It actually goes out of the sound card, it goes through an audio processor, which does some compression and limiting. [37:26.100 --> 37:30.880] And at some point we add pre-emphasis, but I'm not sure if that's in the transmitter or the processor right now. [37:31.420 --> 37:34.380] But yeah, essentially it just goes out of the sound card into the transmitter. [37:35.300 --> 37:37.640] What are you using for software compression? [37:39.280 --> 37:43.120] Well, yeah, for compression we're actually not using software compression right now. [37:43.260 --> 37:45.420] We've got like an OptiMod audio processor. [37:46.140 --> 37:59.940] But that's actually a question that has plagued me for a long time, which is how to do effective software compression and limiting, which are basically just like dynamic signal processing things, ways you want to treat the sound before it goes out. [37:59.940 --> 38:10.820] And like recently I've played a little bit with PD and JMAX, which are digital sound processing applications for Linux, but it didn't really seem like the right thing. [38:11.040 --> 38:24.140] And I'm also not pretty clear about how to take a signal in from the sound card, process it, and then feed it to a program like RealProducer that expects to find the sound signal at /dev/dsp, the standard Linux place. [38:25.520 --> 38:28.980] Can you comment on doing software compression and limiting? [38:31.640 --> 38:39.540] I just stumbled across JMAX and the project that that came out of whose name is slipping me right now. [38:39.680 --> 38:47.320] But it seems like they've got this fairly comprehensive project now that covers a lot of things including compression and limiting and expansion. [38:48.500 --> 38:59.580] We haven't installed it and taken a look at it yet, but we're pretty excited about it because, you know, we've got a bunch of, you know, dumpster-dive computers, but we don't have money really for, you know, buying a nice rack-mount compressor. [39:00.360 --> 39:02.920] So we're kind of hopeful that there will be something in that direction. [39:02.920 --> 39:12.040] I think I also saw a project on SourceForge, which is a kind of a loop-back device for slash dev slash DSP. [39:13.080 --> 39:17.060] So there is the possibility of having it, you know, loop through a couple of times. [39:17.100 --> 39:20.780] I think you need enough of a, you know, enough megahertz in order to power that. [39:21.640 --> 39:28.240] But it seems like we're getting to the point where that may be possible one day soon if it's not possible right now. [39:29.720 --> 39:33.520] I added a couple of other comments, my friends, too. [39:35.360 --> 39:42.720] We were wondering if you've ever just tried MPG123 as a player because you have a little bit better control of the command line. [39:44.080 --> 39:47.600] I have great animosity towards MPG123. [39:48.420 --> 39:50.340] It was really kind of unreliable. [39:51.820 --> 40:03.560] It did a couple things, and I think it might have had to do just because it wasn't so happy about the ice cast, but I had experiences where it would misfire and it would pick up, it would like decide that it was at the wrong bit rate. [40:03.780 --> 40:06.420] It would also die on me at certain points. [40:06.540 --> 40:10.460] So I found MPG123 unreliable in a couple different ways. [40:11.220 --> 40:25.880] But, and what I ended up having to do, you know, when you see like in the Pearl, we had to open up MPG123 and read what it was producing on standard hour, and then like read what it would, what it said, what it, test, test. [40:26.400 --> 40:29.120] Read what it said it was doing and make sure that was actually what it was doing. [40:29.340 --> 40:32.780] So we were pretty, I was, I'm kind of disappointed with that. [40:32.960 --> 40:40.040] And XMMS, it seems better and more reliable, but again, but then it's hard because I can't read from the GUI interface. [40:40.040 --> 40:53.960] So this is like, I want to put out a call, maybe making a codec is something, maybe an open source codec is a very difficult project that would be, so I mean, so I mean, it's a little bit much to make a call for someone to do that, though that would be great, [40:54.280 --> 40:56.400] but not realistic, but we'll give you candy. [40:56.620 --> 40:57.400] We'll give you lots of candy. [40:58.240 --> 41:12.760] But, but someone hacking MPG123 or XMMS to do a little bit better buffering or to integrate some of the, just make it more reliable for production is not such a huge project and something we would love to see. [41:14.560 --> 41:23.440] About the software compression and audio processing, we've been told that if we can come up with a product, we can start a company and sell it for thousands of dollars, like by many different people. [41:23.660 --> 41:24.240] You really could. [41:24.980 --> 41:28.760] There's a huge demand for it and it's never been satisfied, so. [41:30.600 --> 41:39.440] One more comment, which is with Daemon Tools, that sounds, I've never had a look at that, but it sounds like it's a, it's doing what our Perl script for XMMS does. [41:39.660 --> 41:41.680] It gives you tools for doing various things like that. [41:41.760 --> 41:59.900] And I was wondering if perhaps it has, or maybe just like a plain old, you know, Perl server script could handle your, your two sources by, you know, accepting socket connections, you know, perhaps on, you know, 8020 and 8021 for the two streams. [42:00.480 --> 42:14.680] And then it would just sort of mitigate which one is scheduled to be the correct stream at that time and generate a third outbound stream, you know, just on the local machine, that's, that's doing the, the playing or is doing the encoding actually. [42:15.760 --> 42:17.980] That seems like it wouldn't be that difficult. [42:18.220 --> 42:21.360] That seems like kind of what I first thought we would be able to do. [42:21.360 --> 42:24.960] The problem is that we have to use these players. [42:25.180 --> 42:31.200] So maybe we could do with MPG123 or something, like take in the MP3, they take in the two MPG streams and then produce one out. [42:32.040 --> 42:44.980] I don't quite know how to do all the redirecting of the, like the loopback, the loopback software we're talking about where you can create these imaginary sound cards and type things in through one and out through another, or something like PD might be the way we could do that. [42:45.160 --> 42:50.940] For something like real play, it's a lot harder because you need to actually run these two little applications. [42:51.340 --> 42:53.280] Like we don't have access to the library code. [42:53.440 --> 42:55.680] So we have to run the real play player. [42:56.560 --> 43:01.520] And so, I mean, if you can create an imaginary sound card, then maybe you can play into that, but I can't do it. [43:01.940 --> 43:03.700] Yeah, we're starting to run a little low in time. [43:03.860 --> 43:06.320] So why don't we plan on going and getting some beer tonight? [43:06.920 --> 43:08.760] Whoever wants to talk about this. [43:09.080 --> 43:11.840] And we'll cram as many more of these slides down your threads as we can. [43:12.020 --> 43:12.680] We'll bring Ken. [43:13.400 --> 43:20.440] Yeah, one comment is we, as it's shown, these are issues that we're really thinking about and we're learning as we're going. [43:20.440 --> 43:27.400] And there's some things that are kind of exciting that we've just discovered, like the PD software, which is short for pure data, which is basically... [43:27.400 --> 43:32.080] And people that do computer music know all about these things, but we're just learning about them now. [43:32.600 --> 43:42.220] And we basically are like, it's a graphical thing that represents sort of like, the audio components that you plug together to do different sorts of effects. [43:42.480 --> 43:43.980] So, you know, it's a fun research project. [43:44.140 --> 43:52.700] So if you want a handout sitting over there at that table, and if you want to, you can just come talk to us, but also just give us your email address, if you'd be interested in just getting email about the ongoing project. [43:53.680 --> 43:56.340] Now, I'm sorry, a quick note about G-Max. [43:57.520 --> 44:00.940] I'm basically one of the developers of that software. [44:01.160 --> 44:02.900] He's a fairly good friend of mine. [44:03.580 --> 44:11.880] And unfortunately, because he's a member of an art collective, they're actually aiming that software at a little bit different market. [44:11.880 --> 44:17.000] They're aiming at the musicians or the new media artists, I guess. [44:17.620 --> 44:20.720] So it's... well, it's main problem is this is Java. [44:21.320 --> 44:21.560] Yeah. [44:22.000 --> 44:26.260] And as a result, I doubt that there's really broadcast quality or as good as... [44:26.260 --> 44:33.860] It's not really something that can, at the moment, be app for 24-7, for at least a couple of weeks without interruption. [44:34.560 --> 44:37.160] Especially on the Linux for summary, well... [44:37.160 --> 44:37.180] Yeah. [44:38.760 --> 44:41.780] Hopefully, in the next little while, but not yet. [44:42.240 --> 44:42.440] Yeah. [44:42.500 --> 44:45.400] When real-time Java for Linux becomes better. [44:46.200 --> 44:48.240] That makes a lot... that's very, very true. [44:48.580 --> 44:52.940] PD is a something based off of Max, which is what G-Max is based off of. [44:53.100 --> 44:56.460] And PD seems a little more practical for use. [44:56.740 --> 44:59.600] But I don't know if it's really up to the production quality yet either. [44:59.800 --> 45:02.240] But PD seems like the way to go, as opposed to G-Max. [45:02.240 --> 45:04.980] Or if someone knows how to actually review the coding... [45:14.670 --> 45:15.070] Sorry. [45:15.250 --> 45:16.490] Can't hear you at all. [45:16.630 --> 45:18.650] Could you walk up to the mic kindly, please? [45:19.250 --> 45:21.050] He... he... he was just coming that... [45:21.050 --> 45:23.730] MSP is a commercial alternative to Max. [45:23.890 --> 45:26.610] G-Max that comes out of the same project and people. [45:27.490 --> 45:29.370] So, we have some quick slides. [45:29.650 --> 45:36.330] So, if you know some Perl and you want to get involved, there are all sorts of small little projects that you can do that would be very, very helpful. [45:37.330 --> 45:39.770] And so, for example, here is a happy... [45:39.770 --> 45:41.830] A happy little Perl slide. [45:42.110 --> 45:45.690] And, you know, this line here is where we open the command. [45:45.810 --> 45:47.150] Would be the command to start a player. [45:47.490 --> 45:48.790] And there's a little pipe at the end. [45:48.870 --> 45:50.230] And that means that... [45:50.870 --> 45:53.550] That file handle... you can read from that file handle. [45:53.650 --> 45:55.810] And you can get whatever it's pumping out. [45:55.810 --> 46:06.030] So, for example, if you're opening MPG123, we could read the lines coming from MPG123 and make sure that it says that it thinks the stream is the bit rate it really is. [46:06.870 --> 46:15.410] So, if you download our software from flow-stl.sourceforge.net, you'll see that in the process manager. [46:15.590 --> 46:16.610] And there's not a lot of code. [46:16.770 --> 46:20.150] So, you could get in and take a look at it and understand it effectively. [46:23.030 --> 46:24.370] Here's a scary... [46:26.230 --> 46:26.630] Okay. [46:27.090 --> 46:29.450] This is a scary code slide. [46:29.610 --> 46:30.590] But it's actually not that scary. [46:30.830 --> 46:31.350] It's just... [46:31.350 --> 46:32.710] It takes that file handle. [46:32.850 --> 46:35.690] It means that if you try and read from it, it won't wait there forever. [46:36.210 --> 46:37.930] It makes a non-blocking socket. [46:38.150 --> 46:40.110] That's the scariest thing in the whole code. [46:40.250 --> 46:42.350] And now that you've seen it, you don't have to be scared by it. [46:43.730 --> 46:44.130] So... [46:45.970 --> 46:46.770] There's some... [46:46.770 --> 46:47.990] It's a happy kitten, see? [46:49.510 --> 46:54.550] There's a bunch of Perl questions that are interesting to me to have the answers to. [46:55.010 --> 46:56.970] So, for example, we're doing... [46:56.970 --> 47:01.410] To watch to make sure that the players are actually going, we do some sort of... [47:01.410 --> 47:02.670] Kind of... [47:02.670 --> 47:03.050] I don't know... [47:03.050 --> 47:04.530] Brute-force process checking. [47:04.790 --> 47:06.490] And there might be better ways to do it. [47:06.610 --> 47:08.470] And there are certainly more portable ways of doing it. [47:08.530 --> 47:11.830] Since I doubt that this would work on FreeBSD. [47:11.930 --> 47:13.470] And it certainly wouldn't work under Windows. [47:13.850 --> 47:14.730] And we've had... [47:14.730 --> 47:16.970] People really would like it to work under Windows. [47:17.550 --> 47:18.810] Though we don't really care. [47:19.450 --> 47:19.810] So... [47:20.250 --> 47:21.290] So, for example... [47:21.290 --> 47:25.050] If you want to see if a process is there, we just look in the proc file system. [47:25.210 --> 47:26.430] Under Linux, there's a directory. [47:26.710 --> 47:29.810] And that directory has informational files about each process. [47:29.910 --> 47:30.830] And we actually check those. [47:31.510 --> 47:33.270] And I don't think that's the best way to do it. [47:33.330 --> 47:34.430] But that's how we've been doing it. [47:34.710 --> 47:46.950] And then there's the weird issue of like seeing whether... [47:46.950 --> 47:48.530] in a X virtual buffer. [47:48.730 --> 47:50.570] Which is sort of like an imaginary graphical interface. [47:50.990 --> 47:51.790] Not imaginary. [47:51.990 --> 47:52.890] But you just don't actually see it. [47:53.110 --> 47:55.130] And so we actually have to look at the number of real play processes. [47:55.770 --> 47:57.750] So, lots of fun little projects. [47:58.230 --> 48:01.770] And if people have like a higher level suggestion, that would be great. [48:01.770 --> 48:02.370] Thank you. [48:07.070 --> 48:07.430] Yeah. [48:07.570 --> 48:08.550] My suggestion is... [48:08.550 --> 48:09.990] How come you don't have just like... [48:10.490 --> 48:11.630] You know, to see if the player is playing. [48:11.790 --> 48:17.070] Obviously, the person at the studio that's transmitting, they can have a way of detecting the power level. [48:17.510 --> 48:22.910] And if it's not transmitting, they can really quick SSH into the remote machine and restart the player again. [48:23.010 --> 48:23.870] Why don't you just do that? [48:24.190 --> 48:24.570] Essentially. [48:26.310 --> 48:28.330] Well, you could train them to be able to quickly. [48:28.550 --> 48:29.570] I mean, it takes two seconds. [48:29.830 --> 48:30.270] Sure you could. [48:30.270 --> 48:32.330] No, I mean, that's actually a really good suggestion. [48:32.350 --> 48:35.350] And we have a webpage where they can click restart. [48:35.550 --> 48:36.890] And it will restart the player. [48:37.050 --> 48:38.490] So, that is a good suggestion. [48:39.490 --> 48:43.070] On the other hand, that we can't really rely on... [48:43.070 --> 48:44.410] We want it to work reliably. [48:44.410 --> 48:47.110] And we can't count on them always being there. [48:47.290 --> 48:50.590] We don't want to have like a human or train a monkey to do it. [48:50.650 --> 48:51.690] We'd like it to actually work. [48:51.690 --> 48:54.590] But that is a really good suggestion when we did do that. [48:55.810 --> 49:00.190] Couldn't you just pipe the audio stream into an input and check the decibel level? [49:00.350 --> 49:04.190] And if the decibel level reaches zero for like three seconds, just restart the player? [49:04.470 --> 49:09.270] If you could write us a little tiny thing that did that, then we'll buy a bottle of wine. [49:09.750 --> 49:11.410] So, just do it and send it to me. [49:11.730 --> 49:15.250] Because it seems like we should be able to do that to be really simple. [49:15.450 --> 49:16.710] And I just don't know how to do it. [49:16.950 --> 49:21.510] So, if anyone can do that in this room, we will log your praises. [49:21.510 --> 49:22.490] All right. [49:22.590 --> 49:23.650] Sign up over here! [49:26.150 --> 49:26.990] Let's skip that. [49:28.170 --> 49:30.350] Here's an exciting zombie picture. [49:30.570 --> 49:33.450] Because, again, talking about process management. [49:34.050 --> 49:40.270] To see if a process dies, say you're playing MPG123 and it dies, it becomes what's called a zombie process. [49:40.490 --> 49:42.550] It lives on, but it's not doing anything. [49:42.670 --> 49:44.930] But because it spawned off of another process, it exists. [49:45.910 --> 49:50.130] And so, we actually parsed this file to see whether it has the word zombie in it. [49:50.290 --> 49:51.650] And there must be a better way of doing it. [49:51.830 --> 49:53.210] You know, I did learn something recently. [49:53.470 --> 50:03.470] There's a way that when you open a pipe with a command, there's something that you can pass the pipe that tells it to kill any zombie processes. [50:03.470 --> 50:04.850] That, like, it finds. [50:04.990 --> 50:07.170] And it will monitor and, like, kill them all. [50:07.230 --> 50:08.430] I'll have to look that up when I get back. [50:08.790 --> 50:09.590] But I did... [50:13.800 --> 50:14.120] Probably... [50:18.070 --> 50:23.090] Oh, and this is a quick slide about external monitoring, other things the software does. [50:23.090 --> 50:24.990] It just, like, goes... [50:24.990 --> 50:37.610] You know, if it's an MPG stream, it will just, you know, go to port 8000 and send the get command and checks to see whether it gets back the IC200 okay, which shows it's fine, or it says it's not found. [50:37.950 --> 50:39.750] And for real player, it does something similar. [50:40.050 --> 50:43.650] And so, we need to add support for Ogg Vorbis, and that sort of thing. [50:43.770 --> 50:45.570] And I bet that's not too hard for someone to add. [50:49.130 --> 50:51.250] Okay, so, we're wrapping it up. [50:51.250 --> 50:56.310] But I guess we should just end now with a final call for whoever wants to get involved. [50:56.530 --> 50:57.950] Please come give us your email address. [50:58.550 --> 51:00.450] It's really a great project. [51:00.610 --> 51:10.570] I've been doing volunteer technical work for a couple years now, and it's been really rewarding and a great way to use, like, my technical ability in a kind of practical and interesting and rewarding way. [51:10.730 --> 51:11.770] So, I urge you to get involved. [51:12.450 --> 51:15.550] We also have listserv called... [51:15.550 --> 51:16.610] What is it? [51:16.890 --> 51:19.510] No, STL at phillyinc.org. [51:19.510 --> 51:27.810] And that's where we do, like, some of the principal work of, you know, of throwing out these sorts of questions. [51:27.810 --> 51:36.010] Not only with the flow, but also with 802.11 and all the different solutions that we've tried over the years. [51:36.570 --> 51:39.290] So, that's about it. [51:39.950 --> 51:40.970] Thank you very much. [51:44.830 --> 51:46.410] We do have excess candy. [51:46.430 --> 51:46.490] Oh really?