Building my own Tivo replacement

The Tivo service is coming to an end in my part of the world, so I’m trying to create an equally wife/child-friendly option for recording free-to-air, over-the-air TV and playing it back.

I already have Raspberry Pi’s connected to the various TVs in the house, and I know that Kodi has good support for tvheadend, so I figured I’d give that a go.

I bought a Hauppauge dual tuner USB stick as I thought that it is a good brand, with good Linux support, and I was keen to run the whole thing on an old Raspberry Pi (model B+, 1st generation) if I could.

Good idea, but a bit tricky in the end, because while Raspbian (and LibreElec) detected the card just fine, they would only detect one tuner on the card.

The fine people over in the LibreElec forums helped me out with patching the kernel to allow for dual tuner support.  To do this, I set up a virtual machine running Ubuntu 16.04 and got it ready to act as a cross-compiler for Raspberry Pi.  The instructions to do so are here – just make sure that you remember what kind of Raspberry Pi you are building for!

The summary of steps I took:

1. I got the toolchain and copied the right (64-bit) bin path into my .bashrc (specifically :/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin)
2. I then downloaded the 4.9 kernel with git clone --depth 1 -b rpi-4.9.y https://github.com/raspberrypi/linux
3. I then got patch from a user called Puffin Chunks and followed their instructions
4. I applied the patch as per instructions (i.e. patch -p1 < ../hauppage_winTV_dualHD_DVB_PuffinChunks_4.9.y.diff)
5. I then followed the rest of the Raspberry Pi instructions for cross-compiling, paying attention to when to use sudo and when not to!
6. Because my VM (Hyper-V) won’t do USB pass-through, I put the SD card in a USB card reader and plugged it into another Linux machine on my network. I then mounted it using sshfs, specifically:
On the machine with the USB card plugged in:
mount /dev/sdc1 /mnt/fat32/ -o umask=000 mount /dev/sdc2 /mnt/ext4-2 bindfs -u -g users /mnt/ext4-2/ /mnt/ext4 
(That last bindfs was due to the fact that ext4 partitions don’t mount with read/write permissions properly.)Then, on the cross-compiling machine:
sudo sshfs @:/mnt/ext4 mnt/ext4 sudo sshfs @:/mnt/fat32 mnt/fat32 
This was all in the linux/ folder that I was working within.)
7. After doing this, the modules install line worked fine:
sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install
8. Then, making sure that I had put KERNEL=kernel, I copied the kernel across:
sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img sudo cp arch/arm/boot/zImage mnt/fat32/\$KERNEL.img sudo cp arch/arm/boot/dts/*.dtb mnt/fat32/ sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/ sudo cp arch/arm/boot/dts/overlays/README mnt/fat32/overlays/ sudo umount mnt/fat32 sudo umount mnt/ext4I actually called the kernel a new name and then added kernel=.img in /boot/config.txt.
9. Put the card in, booted it up and we were away to the races!  I was now able to boot the RPi, run raspi-config to get things set up, then SSH on and load all the firmwares from the forum into the /lib/firmware/ folder.
10. Installing tvheadend was pretty simple – instructions are here, but apt-get worked for me after adding deb http://apt.tvheadend.org/unstable/ jessie main to /etc/apt/sources.list

Updated: getting Shairport-sync working on Raspberry Pi

Things have moved along quite a way since my first forays into getting AirPlay-compatible Raspberry Pi devices on my home network!

Thanks to Rui’s post here, it was pretty easy to get going on my old Raspberry Pi B+ with a USB Creative Live DAC.  All I did was follow the instructions using W32 Disk Imager to put a Raspbian Lite image on a 4GB sound card.  Then, I followed Rui’s instructions, which are truncated below:

# NOTE:run these as root (or prefixed with sudo)

# install required packages apt-get install alsa-utils autoconf libtool libdaemon-dev libasound2-dev libpopt-dev libconfig-dev avahi-daemon libavahi-client-dev libssl-dev

# grab the source git clone https://github.com/mikebrady/shairport-sync.git

# build it cd shairport-sync autoreconf -i -f ./configure --with-alsa --with-avahi --with-ssl=openssl --with-metadata --with-systemd make

# create a user account for it and add it to the audio group groupadd -r shairport-sync useradd -r -M -g shairport-sync -s /usr/bin/nologin -G audio shairport-sync

# install and enable service make install systemctl enable shairport-sync

Then I edited /usr/local/etc/shairport-sync.conf and added in the name of my AirPlay device that I wanted to appear on the network, and added in these two lines (which I got from using aplay -l to figure out what my USB sound card was coming in as):

(Under the alsa =  section)
 output_device = "hw:1"; mixer_control_name = "USB Audio"; 

Done. I also tried adding in the dwc_otg.speed=1 line to /boot/cmdline.txt but found that there was no real need for it as I don’t have any crackling or popping like I used to (after making sure the mic input was muted using alsamixer). Plus, when I do have that line in, USB keyboards and the like don’t work, so be careful with that one.

QED. 🙂

Ping not resolving on Linux?

Weird one, but sometimes some of my virtual machines can’t resolve external web addresses. Ping 8.8.8.8 fine, but ping http://www.google.com and you get an ‘unknown host’ error.

Seems to be a problem with resolv.conf – always check /etc/resolv.conf and see if it is pointing to 127.0.0.1 as the DNS.

Clearing unused space from a virtual hard disk

If you’re using Hyper-V, and you have a dynamic virtual hard disk (VHDX), then when you delete files from it, the file size won’t shrink automatically.

A great, quick way of getting things downsized is here: https://fiddley.wordpress.com/2014/01/27/dynamically-expanding-vhd-not-compacting-in-hyper-v/

Specifically:

 Run an administrative command prompt Type “Diskpart” (No Quotes) Type the following commands: select vdisk File=”I:\path\to\your.vhd” attach vdisk readonly compact vdisk detach vdisk 

Airplay with Shairport on Raspberry Pi

The fun I had with this one!

The goal: to get Airplay working on my Raspberry Pi.

The rationale: turns out that my HP Microserver (N40L) doesn’t support the hardware extensions needed to pass-through a USB sound-card to VMWare ESXi 5.5, in order for it, in turn, to pass that to the VMs.  So, my goal of having a Windows VM running iTunes, Spotify etc. and playing that through a long (15m) 3.5mm cable in a #8 fencing wire approach to extending my media upstairs has come up short.  Ha, ha.

So, my backup plan?  I have a Raspberry Pi sitting right beside the Microserver (with a very long HDMI cable for extending same said video media upstairs).  Maybe I could use that, I thought.

The plan: the Raspberry Pi is running RaspBMC (an awesome distro), and I thought it worthwhile to use a USB soundcard (specifically, a Creative Sound Blaster USB stick) to improve on the not-so-flash audio that comes out of the native 3.5mm jack.

Enter Shairport – a port of Airplay that can run on a Pi.

This site has most of the instructions needed to download and compile the Shairport source, including the additional instructions when using Raspbmc as a base.

From there, the gotchas I uncovered:

1. The SoundBlaster seemed to have dramas with rubbish sound when the analog input (default) was selected, but no problems when what ALSA identifies as the S/PDIF input.  So, to use that, I had to create a /etc/asound.conf file that contains the line pcm.!default front:U0x41e0x30d3 and nothing else.  The U0x… is the identifier of the SoundBlaster that I got from using the aplay -L command, along with the iec958 which is the identifier of the S/PDIF input.
2. I found I didn’t need to have the options snd-usb-audio nrpacks=1 line in the /etc/modprobe.d/alsa-base.conf file, so that’s good.
3. Still some noise coming through the soundcard, so I used alsamixer and alsactl store 0 to mute and save the changes to the Mic input.
4. The final key to getting rid of the noise as best I could was to add the line dwc_otg.speed=1 to the /boot/cmdline.txt file which, I think, slows down the USB ports to cut back noise.

What a drama! But now I have it (mostly) sorted and stable, and receiving pretty good sound from a VM with a hi-fi virtual audio cable and AirFoil.

vmkfstools -z /vmfs/devices/disks/[long weird name of disk got from ls -l in /dev/disks] /vmfs/volumes/[name of datastore]/[sub folder]/[name of disk].vmdk