Cable TV Setup

This page describes a cable TV system I've setup for my house, which is a regular old analog cable TV system, with multiple channels each with content from an iTunes library.

Table of Content


This setup uses content located in an iTunes Library, which is made accessible via HTTP, then converted from digital to analog signal using the composite output of a raspberry pi per channel, each feeding into an agile modulator, which puts each pi's output onto its own cable TV channel, which then feeds out using existing house cable tv cabling to every TV in the house.

The raspberry pi runs OpenELEC, which is a distribution that includes XBMC. Each pi has an m3u playlist with URLs to that channel's content in the iTunes library. The pi runs the playlist on shuffle and repeat-all.

Two of the channels are provided by original xboxes running xbmc4xbox.

The agile modulators I'm using are a combination of Cabletronix CTARM-2LT, CTARM-3, and a ChannelPlus SVM-24.

I'm also using a Titanium PowerBook G4 (which has s-video out) as the channel guide.


This project started off as an extension of my HTTP TV project where I have different "channels" continuously playing like TV channels, except using HTTP Live streaming.

I've been doing on-demand streaming from a central file server in one form or another for over 10yrs now, and have not had outside cable television for about 7 years. On-demand streaming is nice when you know what you want to watch and can sit down and watch from the beginning However, I found I end up rarely using the on-demand system after a couple years, at least in part because 1) I don't necessarily want to commit to watching something from start to end, and 2) when I want to just relax, I really don't want to make decisions about what to watch. Just having something on and being able to veg out at the end of a long day isn't really something on-demand viewing solutions provide.

The HTTP TV project was the initial attempt to solve this problem. Content was continuously playing, so I just picked a stream and watched it. This was great initially, but it lacked something.

Channel flipping! The thing regular old TV has all over current digital distribution is channel flipping. The HTTP TV project made channel flipping a little more cumbersome than regular old TV. To channel flip, you'd have to go back in the browser, then select a different stream. That seems trivial, but 1) it's definitely more involved than the finger twitch of channel up/down on a TV remote, 2) it's a level of decision making to choose the next channel, and 3) going back to the channel list is disruptive to the viewing process. It's like going back to the channel guide every time you want to flip a TV channel. In theory, all of this could be added to an HTML5 app to allow HTTP Live Streaming to flip betwen streams.

Raspberry Pi Configuration

The pis are just running stock OpenELEC. I have ethernet plugged in w/DHCP, composite out, analog audio out, and USB power. I currently have 5 pis on this configuration, "mounted" in a lego case. The playlist is scp'd into ~root/.xbmc/userdata/playlists/video.

Playlist Generation

To generate the playlists, I am creating one directory per channel on the iTunes file server, then symlinking in files and directories of content for that channel. Once all the content is linked in, I generate the playlist with a script along the lines of:
find -L . -type f | grep -v AppleDouble | sed -e 's/^\./http\:\/\/fileserver\/path\/Podcasts/' | sed -e 's/\ /\%20/g' | sort -R
This traverses the symlinks, creating a list of all the files. I'm excluding AppleDouble because the iTunes library is also shared via netatalk and the .AppleDouble directories are for its use only.
XBMC really doesn't like spaces in the URL, so this escapes the spaces.

Agile Modulators

I primarily use the Cabletronix CTARM-2LT and CTARM-3 agile modulators. They take composite video and stereo input. The 'LT' suffix means Loop Through, to allow composite output of the channel to another input source. However, if you're not feeding the output to another device, you need a 75 Ohm terminator on the video signal, otherwise it tends to look washed out. All of my CTARM devices have also needed their input power filtering capacitors replaced. This is pretty simple, it's just a 100uF 50V radial capacitor. All take 12V center positive power inputs.

The ChannelPlus SVM-24 modulator has 4 s-video inputs. I feed the original xbox and tibook outputs into this one. I have had no problems with this. The only odd thing about it is it takes 15V power. And since it is s-video, it's not usable with the raspberry pis.

Power Supply

All of these devices take 5V or 12V power, plus the ethernet switch which also takes 12V power. Rather than having a dozen or so wall warts, I am currently using an ATX PSU. The PSU is just jumpered on, with a paperclip from ground to the green wire on the ATX connector. For the pis, I am using 4pin molex to USB converters like this. For the Cabletronix devices and the switch, I made 4pin molex to 2.1x5.5mm DC power plugs. 2.1x5.5mm seems to fit nearly all consumer electronics devices that take a barrel jack.

Channel Guide

The Channel guide is a simple web page showing the channel number, "network" or type of content on the channel, and what is currently playing, similar to:
ChannelGenreNow Playing
19Channel Guide This!
21Adult Swim
23Kids Doctor Who (2005) 3-08 Human Nature (1)
25Disney The Wild Bunch
27SciFi Aqua Teen Hunger Force 6-01 Gene E.
29Movies Indiana Jones and the Last Crusade
The channel guide is generated by using the XBMC JSON-RPC interface in the case of the OpenELEC rpis. The original xboxes are using an older version of XBMC that lacks the newer JSON-RPC interface, so those retrieve the currently playing information using the XBMC HTTP API.

The Channel Guide is displayed by the tibook.


Here is a picture from early in the project. It has more pis now, and the AT PSU in the picture has been replaced with the ATX PSU described above, and one of the CTARM-2LT's has been replaced with a CTARM-3.

Updated July 6 2013