System setup @ petli

Peter Liljenberg edited this page Jan 16, 2016 · 21 revisions

Hardware

Actual stuff:

  • RaspberryPi B with 5.25V 2A power supply
  • Cambridge Audio DacMagic (0d8c:000c C-Media Electronics, Inc. Audio Adapter)
  • SATA Bluray reader
  • USB-SATA adapter with external power
  • Wifi USB dongle with external antenna (148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter)
  • A small wireless USB mouse (as remote control)
  • USB-hub, 4 ports, no external power

Conceptual setup:

The DAC is connected to one of the two onboard USB ports of the RPi. The DVD and the wifi dongle are connected to the USB hub which is in turn connected to the other RPi USB port. (Always a good idea to reduce the signal path for the time-critical USB audio).

A proper CD/Bluray reader with a USB-SATA adapter is much better than typical USB DVD readers. The latter are fiddly, the slim drive wears the discs, and can take a long time to figure out how to start ripping.

Software

The following steps sets up a plain Raspbian to run codplayer with a USB DAC, WIFI network and accessing the disc database over NFS.

General system setup

This assumes that a standard Raspbian has already been installed and is running.

If the system no longer boots properly after one of the steps, you can always mount the SD card in a Linux box and try to fix the botched files.

Configure network

Change /etc/network/interfaces:

auto lo
iface lo inet loopback
# auto eth0
iface eth0 inet dhcp
auto wlan0
iface wlan0 inet dhcp
wpa-ssid ABC
wpa-psk XYZ

Replace ABC and XYZ with the wifi network and password. eth0 is disabled to not waste boot time attempting to get a dhcp lease.

Update the Raspbian packages

sudo apt-get update
sudo apt-get upgrade

Disable CPU low-power modes

Force performance CPU scaling by adding this line to /etc/rc.local (before any exit 0):

echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

Setup NFS

Install and enable the necessary daemons:

sudo apt-get install nfs-common
sudo update-rc.d rpcbind enable
sudo update-rc.d nfs-common enable

Add the mountpoints to '/etc/fstab` (do not remove any existing lines, and change server names and paths to match your system):

my.nfs.server:/data/music/coddb /mnt/coddb nfs noatime,rw,nodev,nosuid 0 0

Disable hourly cron jobs

To avoid hourly cron jobs messing with playback, change /etc/crontab to make them daily:

# m h dom mon dow user	command
17 5	* * *	root cd / && run-parts --report /etc/cron.hourly
25 5	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 5	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 5	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Disable some services

These are no use:

sudo update-rc.d dbus disable
sudo update-rc.d triggerhappy disable

Sound-specific setup

Ensure that the DAC is always ALSA card 0. Create the file /etc/modprobe.d/usb-dac.conf with this line:

options snd slots=snd-usb-audio

And comment out this line in /etc/modprobe.d/alsa-base.conf:

# Keep snd-usb-audio from beeing loaded as first soundcard
# options snd-usb-audio index=-2

Create ~/.asoundrc to set the default card to the USB card:

pcm.0 { type hw; card 0; }
ctl.0 { type hw; card 0; }
pcm.!default pcm.0
ctl.!default ctl.0

LCD/IR-specific setup

If you intend to use the codlcd or codlircd daemons, additional packages are needed:

apt-get install python-smbus lirc

Add this line to /boot/config.txt to activate the lirc kernel module, listening on the GPIO pins used by the control board:

dtoverlay=lirc-rpi,gpio_out_pin=8,gpio_in_pin=4

Use these settings in /etc/lirc/hardware.conf:

DRIVER="default"
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"

Install a /etc/lirc/lircd.conf that matches your remote. A config file for Cyrus Commander is available at https://github.com/petli/codplayer/blob/master/etc/lirc/cyrus-commander.conf

codplayer setup

Following the steps in INSTALL.md to install all dependencies and install codplayer in a virtualenv with pip.

Install the /etc/udev/rules.d/99-codplayer.rules script to trigger playback when a CD is inserted. This also requires that codctl is found in PATH, easiest with a symlink:

sudo ln -s ~/cod/bin/codctl /usr/local/bin/codctl

Install the /usr/local/bin/trigger_rpi_cdrom_udev.sh script.

Start codplayer by adding these lines to /etc/rc.local (before any exit 0 line):

mkdir -p /var/run/codplayer
chown pi.pi /var/run/codplayer
sudo -u pi /home/pi/cod/bin/codplayerd
sudo -u pi /usr/local/bin/trigger_rpi_cdrom_udev.sh >/var/run/codplayer/trigger.log 2>&1 &

Since codplayer logs a lot and continuously updates state files, these are stored in ramdisk on /var/run to avoid wearing out the SD card with writes. Since it's a ramdisk, the dir must be setup on each boot.

Testing the setup

Run ~/cod/bin/codplayerd -d to run codplayer without forking it as a background daemon. See if it logs any errors. This line is OK if the USB DAC isn't connected yet:

c_alsa_sink: error opening card: No such file or directory
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

System setup @ petli

Peter Liljenberg edited this page Jan 16, 2016 · 21 revisions

Hardware

Actual stuff:

  • RaspberryPi B with 5.25V 2A power supply
  • Cambridge Audio DacMagic (0d8c:000c C-Media Electronics, Inc. Audio Adapter)
  • SATA Bluray reader
  • USB-SATA adapter with external power
  • Wifi USB dongle with external antenna (148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter)
  • A small wireless USB mouse (as remote control)
  • USB-hub, 4 ports, no external power

Conceptual setup:

The DAC is connected to one of the two onboard USB ports of the RPi. The DVD and the wifi dongle are connected to the USB hub which is in turn connected to the other RPi USB port. (Always a good idea to reduce the signal path for the time-critical USB audio).

A proper CD/Bluray reader with a USB-SATA adapter is much better than typical USB DVD readers. The latter are fiddly, the slim drive wears the discs, and can take a long time to figure out how to start ripping.

Software

The following steps sets up a plain Raspbian to run codplayer with a USB DAC, WIFI network and accessing the disc database over NFS.

General system setup

This assumes that a standard Raspbian has already been installed and is running.

If the system no longer boots properly after one of the steps, you can always mount the SD card in a Linux box and try to fix the botched files.

Configure network

Change /etc/network/interfaces:

auto lo
iface lo inet loopback
# auto eth0
iface eth0 inet dhcp
auto wlan0
iface wlan0 inet dhcp
wpa-ssid ABC
wpa-psk XYZ

Replace ABC and XYZ with the wifi network and password. eth0 is disabled to not waste boot time attempting to get a dhcp lease.

Update the Raspbian packages

sudo apt-get update
sudo apt-get upgrade

Disable CPU low-power modes

Force performance CPU scaling by adding this line to /etc/rc.local (before any exit 0):

echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

Setup NFS

Install and enable the necessary daemons:

sudo apt-get install nfs-common
sudo update-rc.d rpcbind enable
sudo update-rc.d nfs-common enable

Add the mountpoints to '/etc/fstab` (do not remove any existing lines, and change server names and paths to match your system):

my.nfs.server:/data/music/coddb /mnt/coddb nfs noatime,rw,nodev,nosuid 0 0

Disable hourly cron jobs

To avoid hourly cron jobs messing with playback, change /etc/crontab to make them daily:

# m h dom mon dow user	command
17 5	* * *	root cd / && run-parts --report /etc/cron.hourly
25 5	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 5	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 5	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Disable some services

These are no use:

sudo update-rc.d dbus disable
sudo update-rc.d triggerhappy disable

Sound-specific setup

Ensure that the DAC is always ALSA card 0. Create the file /etc/modprobe.d/usb-dac.conf with this line:

options snd slots=snd-usb-audio

And comment out this line in /etc/modprobe.d/alsa-base.conf:

# Keep snd-usb-audio from beeing loaded as first soundcard
# options snd-usb-audio index=-2

Create ~/.asoundrc to set the default card to the USB card:

pcm.0 { type hw; card 0; }
ctl.0 { type hw; card 0; }
pcm.!default pcm.0
ctl.!default ctl.0

LCD/IR-specific setup

If you intend to use the codlcd or codlircd daemons, additional packages are needed:

apt-get install python-smbus lirc

Add this line to /boot/config.txt to activate the lirc kernel module, listening on the GPIO pins used by the control board:

dtoverlay=lirc-rpi,gpio_out_pin=8,gpio_in_pin=4

Use these settings in /etc/lirc/hardware.conf:

DRIVER="default"
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"

Install a /etc/lirc/lircd.conf that matches your remote. A config file for Cyrus Commander is available at https://github.com/petli/codplayer/blob/master/etc/lirc/cyrus-commander.conf

codplayer setup

Following the steps in INSTALL.md to install all dependencies and install codplayer in a virtualenv with pip.

Install the /etc/udev/rules.d/99-codplayer.rules script to trigger playback when a CD is inserted. This also requires that codctl is found in PATH, easiest with a symlink:

sudo ln -s ~/cod/bin/codctl /usr/local/bin/codctl

Install the /usr/local/bin/trigger_rpi_cdrom_udev.sh script.

Start codplayer by adding these lines to /etc/rc.local (before any exit 0 line):

mkdir -p /var/run/codplayer
chown pi.pi /var/run/codplayer
sudo -u pi /home/pi/cod/bin/codplayerd
sudo -u pi /usr/local/bin/trigger_rpi_cdrom_udev.sh >/var/run/codplayer/trigger.log 2>&1 &

Since codplayer logs a lot and continuously updates state files, these are stored in ramdisk on /var/run to avoid wearing out the SD card with writes. Since it's a ramdisk, the dir must be setup on each boot.

Testing the setup

Run ~/cod/bin/codplayerd -d to run codplayer without forking it as a background daemon. See if it logs any errors. This line is OK if the USB DAC isn't connected yet:

c_alsa_sink: error opening card: No such file or directory
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

System setup @ petli

Peter Liljenberg edited this page Jan 16, 2016 · 21 revisions

Hardware

Actual stuff:

  • RaspberryPi B with 5.25V 2A power supply
  • Cambridge Audio DacMagic (0d8c:000c C-Media Electronics, Inc. Audio Adapter)
  • SATA Bluray reader
  • USB-SATA adapter with external power
  • Wifi USB dongle with external antenna (148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter)
  • A small wireless USB mouse (as remote control)
  • USB-hub, 4 ports, no external power

Conceptual setup:

The DAC is connected to one of the two onboard USB ports of the RPi. The DVD and the wifi dongle are connected to the USB hub which is in turn connected to the other RPi USB port. (Always a good idea to reduce the signal path for the time-critical USB audio).

A proper CD/Bluray reader with a USB-SATA adapter is much better than typical USB DVD readers. The latter are fiddly, the slim drive wears the discs, and can take a long time to figure out how to start ripping.

Software

The following steps sets up a plain Raspbian to run codplayer with a USB DAC, WIFI network and accessing the disc database over NFS.

General system setup

This assumes that a standard Raspbian has already been installed and is running.

If the system no longer boots properly after one of the steps, you can always mount the SD card in a Linux box and try to fix the botched files.

Configure network

Change /etc/network/interfaces:

auto lo
iface lo inet loopback
# auto eth0
iface eth0 inet dhcp
auto wlan0
iface wlan0 inet dhcp
wpa-ssid ABC
wpa-psk XYZ

Replace ABC and XYZ with the wifi network and password. eth0 is disabled to not waste boot time attempting to get a dhcp lease.

Update the Raspbian packages

sudo apt-get update
sudo apt-get upgrade

Disable CPU low-power modes

Force performance CPU scaling by adding this line to /etc/rc.local (before any exit 0):

echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

Setup NFS

Install and enable the necessary daemons:

sudo apt-get install nfs-common
sudo update-rc.d rpcbind enable
sudo update-rc.d nfs-common enable

Add the mountpoints to '/etc/fstab` (do not remove any existing lines, and change server names and paths to match your system):

my.nfs.server:/data/music/coddb /mnt/coddb nfs noatime,rw,nodev,nosuid 0 0

Disable hourly cron jobs

To avoid hourly cron jobs messing with playback, change /etc/crontab to make them daily:

# m h dom mon dow user	command
17 5	* * *	root cd / && run-parts --report /etc/cron.hourly
25 5	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 5	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 5	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Disable some services

These are no use:

sudo update-rc.d dbus disable
sudo update-rc.d triggerhappy disable

Sound-specific setup

Ensure that the DAC is always ALSA card 0. Create the file /etc/modprobe.d/usb-dac.conf with this line:

options snd slots=snd-usb-audio

And comment out this line in /etc/modprobe.d/alsa-base.conf:

# Keep snd-usb-audio from beeing loaded as first soundcard
# options snd-usb-audio index=-2

Create ~/.asoundrc to set the default card to the USB card:

pcm.0 { type hw; card 0; }
ctl.0 { type hw; card 0; }
pcm.!default pcm.0
ctl.!default ctl.0

LCD/IR-specific setup

If you intend to use the codlcd or codlircd daemons, additional packages are needed:

apt-get install python-smbus lirc

Add this line to /boot/config.txt to activate the lirc kernel module, listening on the GPIO pins used by the control board:

dtoverlay=lirc-rpi,gpio_out_pin=8,gpio_in_pin=4

Use these settings in /etc/lirc/hardware.conf:

DRIVER="default"
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"

Install a /etc/lirc/lircd.conf that matches your remote. A config file for Cyrus Commander is available at https://github.com/petli/codplayer/blob/master/etc/lirc/cyrus-commander.conf

codplayer setup

Following the steps in INSTALL.md to install all dependencies and install codplayer in a virtualenv with pip.

Install the /etc/udev/rules.d/99-codplayer.rules script to trigger playback when a CD is inserted. This also requires that codctl is found in PATH, easiest with a symlink:

sudo ln -s ~/cod/bin/codctl /usr/local/bin/codctl

Install the /usr/local/bin/trigger_rpi_cdrom_udev.sh script.

Start codplayer by adding these lines to /etc/rc.local (before any exit 0 line):

mkdir -p /var/run/codplayer
chown pi.pi /var/run/codplayer
sudo -u pi /home/pi/cod/bin/codplayerd
sudo -u pi /usr/local/bin/trigger_rpi_cdrom_udev.sh >/var/run/codplayer/trigger.log 2>&1 &

Since codplayer logs a lot and continuously updates state files, these are stored in ramdisk on /var/run to avoid wearing out the SD card with writes. Since it's a ramdisk, the dir must be setup on each boot.

Testing the setup

Run ~/cod/bin/codplayerd -d to run codplayer without forking it as a background daemon. See if it logs any errors. This line is OK if the USB DAC isn't connected yet:

c_alsa_sink: error opening card: No such file or directory
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

System setup @ petli

Peter Liljenberg edited this page Jan 16, 2016 · 21 revisions

Hardware

Actual stuff:

  • RaspberryPi B with 5.25V 2A power supply
  • Cambridge Audio DacMagic (0d8c:000c C-Media Electronics, Inc. Audio Adapter)
  • SATA Bluray reader
  • USB-SATA adapter with external power
  • Wifi USB dongle with external antenna (148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter)
  • A small wireless USB mouse (as remote control)
  • USB-hub, 4 ports, no external power

Conceptual setup:

The DAC is connected to one of the two onboard USB ports of the RPi. The DVD and the wifi dongle are connected to the USB hub which is in turn connected to the other RPi USB port. (Always a good idea to reduce the signal path for the time-critical USB audio).

A proper CD/Bluray reader with a USB-SATA adapter is much better than typical USB DVD readers. The latter are fiddly, the slim drive wears the discs, and can take a long time to figure out how to start ripping.

Software

The following steps sets up a plain Raspbian to run codplayer with a USB DAC, WIFI network and accessing the disc database over NFS.

General system setup

This assumes that a standard Raspbian has already been installed and is running.

If the system no longer boots properly after one of the steps, you can always mount the SD card in a Linux box and try to fix the botched files.

Configure network

Change /etc/network/interfaces:

auto lo
iface lo inet loopback
# auto eth0
iface eth0 inet dhcp
auto wlan0
iface wlan0 inet dhcp
wpa-ssid ABC
wpa-psk XYZ

Replace ABC and XYZ with the wifi network and password. eth0 is disabled to not waste boot time attempting to get a dhcp lease.

Update the Raspbian packages

sudo apt-get update
sudo apt-get upgrade

Disable CPU low-power modes

Force performance CPU scaling by adding this line to /etc/rc.local (before any exit 0):

echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

Setup NFS

Install and enable the necessary daemons:

sudo apt-get install nfs-common
sudo update-rc.d rpcbind enable
sudo update-rc.d nfs-common enable

Add the mountpoints to '/etc/fstab` (do not remove any existing lines, and change server names and paths to match your system):

my.nfs.server:/data/music/coddb /mnt/coddb nfs noatime,rw,nodev,nosuid 0 0

Disable hourly cron jobs

To avoid hourly cron jobs messing with playback, change /etc/crontab to make them daily:

# m h dom mon dow user	command
17 5	* * *	root cd / && run-parts --report /etc/cron.hourly
25 5	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 5	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 5	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Disable some services

These are no use:

sudo update-rc.d dbus disable
sudo update-rc.d triggerhappy disable

Sound-specific setup

Ensure that the DAC is always ALSA card 0. Create the file /etc/modprobe.d/usb-dac.conf with this line:

options snd slots=snd-usb-audio

And comment out this line in /etc/modprobe.d/alsa-base.conf:

# Keep snd-usb-audio from beeing loaded as first soundcard
# options snd-usb-audio index=-2

Create ~/.asoundrc to set the default card to the USB card:

pcm.0 { type hw; card 0; }
ctl.0 { type hw; card 0; }
pcm.!default pcm.0
ctl.!default ctl.0

LCD/IR-specific setup

If you intend to use the codlcd or codlircd daemons, additional packages are needed:

apt-get install python-smbus lirc

Add this line to /boot/config.txt to activate the lirc kernel module, listening on the GPIO pins used by the control board:

dtoverlay=lirc-rpi,gpio_out_pin=8,gpio_in_pin=4

Use these settings in /etc/lirc/hardware.conf:

DRIVER="default"
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"

Install a /etc/lirc/lircd.conf that matches your remote. A config file for Cyrus Commander is available at https://github.com/petli/codplayer/blob/master/etc/lirc/cyrus-commander.conf

codplayer setup

Following the steps in INSTALL.md to install all dependencies and install codplayer in a virtualenv with pip.

Install the /etc/udev/rules.d/99-codplayer.rules script to trigger playback when a CD is inserted. This also requires that codctl is found in PATH, easiest with a symlink:

sudo ln -s ~/cod/bin/codctl /usr/local/bin/codctl

Install the /usr/local/bin/trigger_rpi_cdrom_udev.sh script.

Start codplayer by adding these lines to /etc/rc.local (before any exit 0 line):

mkdir -p /var/run/codplayer
chown pi.pi /var/run/codplayer
sudo -u pi /home/pi/cod/bin/codplayerd
sudo -u pi /usr/local/bin/trigger_rpi_cdrom_udev.sh >/var/run/codplayer/trigger.log 2>&1 &

Since codplayer logs a lot and continuously updates state files, these are stored in ramdisk on /var/run to avoid wearing out the SD card with writes. Since it's a ramdisk, the dir must be setup on each boot.

Testing the setup

Run ~/cod/bin/codplayerd -d to run codplayer without forking it as a background daemon. See if it logs any errors. This line is OK if the USB DAC isn't connected yet:

c_alsa_sink: error opening card: No such file or directory
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

System setup @ petli

Peter Liljenberg edited this page Jan 16, 2016 · 21 revisions

Hardware

Actual stuff:

  • RaspberryPi B with 5.25V 2A power supply
  • Cambridge Audio DacMagic (0d8c:000c C-Media Electronics, Inc. Audio Adapter)
  • SATA Bluray reader
  • USB-SATA adapter with external power
  • Wifi USB dongle with external antenna (148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter)
  • A small wireless USB mouse (as remote control)
  • USB-hub, 4 ports, no external power

Conceptual setup:

The DAC is connected to one of the two onboard USB ports of the RPi. The DVD and the wifi dongle are connected to the USB hub which is in turn connected to the other RPi USB port. (Always a good idea to reduce the signal path for the time-critical USB audio).

A proper CD/Bluray reader with a USB-SATA adapter is much better than typical USB DVD readers. The latter are fiddly, the slim drive wears the discs, and can take a long time to figure out how to start ripping.

Software

The following steps sets up a plain Raspbian to run codplayer with a USB DAC, WIFI network and accessing the disc database over NFS.

General system setup

This assumes that a standard Raspbian has already been installed and is running.

If the system no longer boots properly after one of the steps, you can always mount the SD card in a Linux box and try to fix the botched files.

Configure network

Change /etc/network/interfaces:

auto lo
iface lo inet loopback
# auto eth0
iface eth0 inet dhcp
auto wlan0
iface wlan0 inet dhcp
wpa-ssid ABC
wpa-psk XYZ

Replace ABC and XYZ with the wifi network and password. eth0 is disabled to not waste boot time attempting to get a dhcp lease.

Update the Raspbian packages

sudo apt-get update
sudo apt-get upgrade

Disable CPU low-power modes

Force performance CPU scaling by adding this line to /etc/rc.local (before any exit 0):

echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

Setup NFS

Install and enable the necessary daemons:

sudo apt-get install nfs-common
sudo update-rc.d rpcbind enable
sudo update-rc.d nfs-common enable

Add the mountpoints to '/etc/fstab` (do not remove any existing lines, and change server names and paths to match your system):

my.nfs.server:/data/music/coddb /mnt/coddb nfs noatime,rw,nodev,nosuid 0 0

Disable hourly cron jobs

To avoid hourly cron jobs messing with playback, change /etc/crontab to make them daily:

# m h dom mon dow user	command
17 5	* * *	root cd / && run-parts --report /etc/cron.hourly
25 5	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 5	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 5	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Disable some services

These are no use:

sudo update-rc.d dbus disable
sudo update-rc.d triggerhappy disable

Sound-specific setup

Ensure that the DAC is always ALSA card 0. Create the file /etc/modprobe.d/usb-dac.conf with this line:

options snd slots=snd-usb-audio

And comment out this line in /etc/modprobe.d/alsa-base.conf:

# Keep snd-usb-audio from beeing loaded as first soundcard
# options snd-usb-audio index=-2

Create ~/.asoundrc to set the default card to the USB card:

pcm.0 { type hw; card 0; }
ctl.0 { type hw; card 0; }
pcm.!default pcm.0
ctl.!default ctl.0

LCD/IR-specific setup

If you intend to use the codlcd or codlircd daemons, additional packages are needed:

apt-get install python-smbus lirc

Add this line to /boot/config.txt to activate the lirc kernel module, listening on the GPIO pins used by the control board:

dtoverlay=lirc-rpi,gpio_out_pin=8,gpio_in_pin=4

Use these settings in /etc/lirc/hardware.conf:

DRIVER="default"
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"

Install a /etc/lirc/lircd.conf that matches your remote. A config file for Cyrus Commander is available at https://github.com/petli/codplayer/blob/master/etc/lirc/cyrus-commander.conf

codplayer setup

Following the steps in INSTALL.md to install all dependencies and install codplayer in a virtualenv with pip.

Install the /etc/udev/rules.d/99-codplayer.rules script to trigger playback when a CD is inserted. This also requires that codctl is found in PATH, easiest with a symlink:

sudo ln -s ~/cod/bin/codctl /usr/local/bin/codctl

Install the /usr/local/bin/trigger_rpi_cdrom_udev.sh script.

Start codplayer by adding these lines to /etc/rc.local (before any exit 0 line):

mkdir -p /var/run/codplayer
chown pi.pi /var/run/codplayer
sudo -u pi /home/pi/cod/bin/codplayerd
sudo -u pi /usr/local/bin/trigger_rpi_cdrom_udev.sh >/var/run/codplayer/trigger.log 2>&1 &

Since codplayer logs a lot and continuously updates state files, these are stored in ramdisk on /var/run to avoid wearing out the SD card with writes. Since it's a ramdisk, the dir must be setup on each boot.

Testing the setup

Run ~/cod/bin/codplayerd -d to run codplayer without forking it as a background daemon. See if it logs any errors. This line is OK if the USB DAC isn't connected yet:

c_alsa_sink: error opening card: No such file or directory
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

System setup @ petli

Peter Liljenberg edited this page Jan 16, 2016 · 21 revisions

Hardware

Actual stuff:

  • RaspberryPi B with 5.25V 2A power supply
  • Cambridge Audio DacMagic (0d8c:000c C-Media Electronics, Inc. Audio Adapter)
  • SATA Bluray reader
  • USB-SATA adapter with external power
  • Wifi USB dongle with external antenna (148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter)
  • A small wireless USB mouse (as remote control)
  • USB-hub, 4 ports, no external power

Conceptual setup:

The DAC is connected to one of the two onboard USB ports of the RPi. The DVD and the wifi dongle are connected to the USB hub which is in turn connected to the other RPi USB port. (Always a good idea to reduce the signal path for the time-critical USB audio).

A proper CD/Bluray reader with a USB-SATA adapter is much better than typical USB DVD readers. The latter are fiddly, the slim drive wears the discs, and can take a long time to figure out how to start ripping.

Software

The following steps sets up a plain Raspbian to run codplayer with a USB DAC, WIFI network and accessing the disc database over NFS.

General system setup

This assumes that a standard Raspbian has already been installed and is running.

If the system no longer boots properly after one of the steps, you can always mount the SD card in a Linux box and try to fix the botched files.

Configure network

Change /etc/network/interfaces:

auto lo
iface lo inet loopback
# auto eth0
iface eth0 inet dhcp
auto wlan0
iface wlan0 inet dhcp
wpa-ssid ABC
wpa-psk XYZ

Replace ABC and XYZ with the wifi network and password. eth0 is disabled to not waste boot time attempting to get a dhcp lease.

Update the Raspbian packages

sudo apt-get update
sudo apt-get upgrade

Disable CPU low-power modes

Force performance CPU scaling by adding this line to /etc/rc.local (before any exit 0):

echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

Setup NFS

Install and enable the necessary daemons:

sudo apt-get install nfs-common
sudo update-rc.d rpcbind enable
sudo update-rc.d nfs-common enable

Add the mountpoints to '/etc/fstab` (do not remove any existing lines, and change server names and paths to match your system):

my.nfs.server:/data/music/coddb /mnt/coddb nfs noatime,rw,nodev,nosuid 0 0

Disable hourly cron jobs

To avoid hourly cron jobs messing with playback, change /etc/crontab to make them daily:

# m h dom mon dow user	command
17 5	* * *	root cd / && run-parts --report /etc/cron.hourly
25 5	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 5	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 5	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Disable some services

These are no use:

sudo update-rc.d dbus disable
sudo update-rc.d triggerhappy disable

Sound-specific setup

Ensure that the DAC is always ALSA card 0. Create the file /etc/modprobe.d/usb-dac.conf with this line:

options snd slots=snd-usb-audio

And comment out this line in /etc/modprobe.d/alsa-base.conf:

# Keep snd-usb-audio from beeing loaded as first soundcard
# options snd-usb-audio index=-2

Create ~/.asoundrc to set the default card to the USB card:

pcm.0 { type hw; card 0; }
ctl.0 { type hw; card 0; }
pcm.!default pcm.0
ctl.!default ctl.0

LCD/IR-specific setup

If you intend to use the codlcd or codlircd daemons, additional packages are needed:

apt-get install python-smbus lirc

Add this line to /boot/config.txt to activate the lirc kernel module, listening on the GPIO pins used by the control board:

dtoverlay=lirc-rpi,gpio_out_pin=8,gpio_in_pin=4

Use these settings in /etc/lirc/hardware.conf:

DRIVER="default"
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"

Install a /etc/lirc/lircd.conf that matches your remote. A config file for Cyrus Commander is available at https://github.com/petli/codplayer/blob/master/etc/lirc/cyrus-commander.conf

codplayer setup

Following the steps in INSTALL.md to install all dependencies and install codplayer in a virtualenv with pip.

Install the /etc/udev/rules.d/99-codplayer.rules script to trigger playback when a CD is inserted. This also requires that codctl is found in PATH, easiest with a symlink:

sudo ln -s ~/cod/bin/codctl /usr/local/bin/codctl

Install the /usr/local/bin/trigger_rpi_cdrom_udev.sh script.

Start codplayer by adding these lines to /etc/rc.local (before any exit 0 line):

mkdir -p /var/run/codplayer
chown pi.pi /var/run/codplayer
sudo -u pi /home/pi/cod/bin/codplayerd
sudo -u pi /usr/local/bin/trigger_rpi_cdrom_udev.sh >/var/run/codplayer/trigger.log 2>&1 &

Since codplayer logs a lot and continuously updates state files, these are stored in ramdisk on /var/run to avoid wearing out the SD card with writes. Since it's a ramdisk, the dir must be setup on each boot.

Testing the setup

Run ~/cod/bin/codplayerd -d to run codplayer without forking it as a background daemon. See if it logs any errors. This line is OK if the USB DAC isn't connected yet:

c_alsa_sink: error opening card: No such file or directory
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

System setup @ petli

Peter Liljenberg edited this page Jan 16, 2016 · 21 revisions

Hardware

Actual stuff:

  • RaspberryPi B with 5.25V 2A power supply
  • Cambridge Audio DacMagic (0d8c:000c C-Media Electronics, Inc. Audio Adapter)
  • SATA Bluray reader
  • USB-SATA adapter with external power
  • Wifi USB dongle with external antenna (148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter)
  • A small wireless USB mouse (as remote control)
  • USB-hub, 4 ports, no external power

Conceptual setup:

The DAC is connected to one of the two onboard USB ports of the RPi. The DVD and the wifi dongle are connected to the USB hub which is in turn connected to the other RPi USB port. (Always a good idea to reduce the signal path for the time-critical USB audio).

A proper CD/Bluray reader with a USB-SATA adapter is much better than typical USB DVD readers. The latter are fiddly, the slim drive wears the discs, and can take a long time to figure out how to start ripping.

Software

The following steps sets up a plain Raspbian to run codplayer with a USB DAC, WIFI network and accessing the disc database over NFS.

General system setup

This assumes that a standard Raspbian has already been installed and is running.

If the system no longer boots properly after one of the steps, you can always mount the SD card in a Linux box and try to fix the botched files.

Configure network

Change /etc/network/interfaces:

auto lo
iface lo inet loopback
# auto eth0
iface eth0 inet dhcp
auto wlan0
iface wlan0 inet dhcp
wpa-ssid ABC
wpa-psk XYZ

Replace ABC and XYZ with the wifi network and password. eth0 is disabled to not waste boot time attempting to get a dhcp lease.

Update the Raspbian packages

sudo apt-get update
sudo apt-get upgrade

Disable CPU low-power modes

Force performance CPU scaling by adding this line to /etc/rc.local (before any exit 0):

echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

Setup NFS

Install and enable the necessary daemons:

sudo apt-get install nfs-common
sudo update-rc.d rpcbind enable
sudo update-rc.d nfs-common enable

Add the mountpoints to '/etc/fstab` (do not remove any existing lines, and change server names and paths to match your system):

my.nfs.server:/data/music/coddb /mnt/coddb nfs noatime,rw,nodev,nosuid 0 0

Disable hourly cron jobs

To avoid hourly cron jobs messing with playback, change /etc/crontab to make them daily:

# m h dom mon dow user	command
17 5	* * *	root cd / && run-parts --report /etc/cron.hourly
25 5	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 5	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 5	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Disable some services

These are no use:

sudo update-rc.d dbus disable
sudo update-rc.d triggerhappy disable

Sound-specific setup

Ensure that the DAC is always ALSA card 0. Create the file /etc/modprobe.d/usb-dac.conf with this line:

options snd slots=snd-usb-audio

And comment out this line in /etc/modprobe.d/alsa-base.conf:

# Keep snd-usb-audio from beeing loaded as first soundcard
# options snd-usb-audio index=-2

Create ~/.asoundrc to set the default card to the USB card:

pcm.0 { type hw; card 0; }
ctl.0 { type hw; card 0; }
pcm.!default pcm.0
ctl.!default ctl.0

LCD/IR-specific setup

If you intend to use the codlcd or codlircd daemons, additional packages are needed:

apt-get install python-smbus lirc

Add this line to /boot/config.txt to activate the lirc kernel module, listening on the GPIO pins used by the control board:

dtoverlay=lirc-rpi,gpio_out_pin=8,gpio_in_pin=4

Use these settings in /etc/lirc/hardware.conf:

DRIVER="default"
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"

Install a /etc/lirc/lircd.conf that matches your remote. A config file for Cyrus Commander is available at https://github.com/petli/codplayer/blob/master/etc/lirc/cyrus-commander.conf

codplayer setup

Following the steps in INSTALL.md to install all dependencies and install codplayer in a virtualenv with pip.

Install the /etc/udev/rules.d/99-codplayer.rules script to trigger playback when a CD is inserted. This also requires that codctl is found in PATH, easiest with a symlink:

sudo ln -s ~/cod/bin/codctl /usr/local/bin/codctl

Install the /usr/local/bin/trigger_rpi_cdrom_udev.sh script.

Start codplayer by adding these lines to /etc/rc.local (before any exit 0 line):

mkdir -p /var/run/codplayer
chown pi.pi /var/run/codplayer
sudo -u pi /home/pi/cod/bin/codplayerd
sudo -u pi /usr/local/bin/trigger_rpi_cdrom_udev.sh >/var/run/codplayer/trigger.log 2>&1 &

Since codplayer logs a lot and continuously updates state files, these are stored in ramdisk on /var/run to avoid wearing out the SD card with writes. Since it's a ramdisk, the dir must be setup on each boot.

Testing the setup

Run ~/cod/bin/codplayerd -d to run codplayer without forking it as a background daemon. See if it logs any errors. This line is OK if the USB DAC isn't connected yet:

c_alsa_sink: error opening card: No such file or directory
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

System setup @ petli

Peter Liljenberg edited this page Jan 16, 2016 · 21 revisions

Hardware

Actual stuff:

  • RaspberryPi B with 5.25V 2A power supply
  • Cambridge Audio DacMagic (0d8c:000c C-Media Electronics, Inc. Audio Adapter)
  • SATA Bluray reader
  • USB-SATA adapter with external power
  • Wifi USB dongle with external antenna (148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter)
  • A small wireless USB mouse (as remote control)
  • USB-hub, 4 ports, no external power

Conceptual setup:

The DAC is connected to one of the two onboard USB ports of the RPi. The DVD and the wifi dongle are connected to the USB hub which is in turn connected to the other RPi USB port. (Always a good idea to reduce the signal path for the time-critical USB audio).

A proper CD/Bluray reader with a USB-SATA adapter is much better than typical USB DVD readers. The latter are fiddly, the slim drive wears the discs, and can take a long time to figure out how to start ripping.

Software

The following steps sets up a plain Raspbian to run codplayer with a USB DAC, WIFI network and accessing the disc database over NFS.

General system setup

This assumes that a standard Raspbian has already been installed and is running.

If the system no longer boots properly after one of the steps, you can always mount the SD card in a Linux box and try to fix the botched files.

Configure network

Change /etc/network/interfaces:

auto lo
iface lo inet loopback
# auto eth0
iface eth0 inet dhcp
auto wlan0
iface wlan0 inet dhcp
wpa-ssid ABC
wpa-psk XYZ

Replace ABC and XYZ with the wifi network and password. eth0 is disabled to not waste boot time attempting to get a dhcp lease.

Update the Raspbian packages

sudo apt-get update
sudo apt-get upgrade

Disable CPU low-power modes

Force performance CPU scaling by adding this line to /etc/rc.local (before any exit 0):

echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

Setup NFS

Install and enable the necessary daemons:

sudo apt-get install nfs-common
sudo update-rc.d rpcbind enable
sudo update-rc.d nfs-common enable

Add the mountpoints to '/etc/fstab` (do not remove any existing lines, and change server names and paths to match your system):

my.nfs.server:/data/music/coddb /mnt/coddb nfs noatime,rw,nodev,nosuid 0 0

Disable hourly cron jobs

To avoid hourly cron jobs messing with playback, change /etc/crontab to make them daily:

# m h dom mon dow user	command
17 5	* * *	root cd / && run-parts --report /etc/cron.hourly
25 5	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 5	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 5	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Disable some services

These are no use:

sudo update-rc.d dbus disable
sudo update-rc.d triggerhappy disable

Sound-specific setup

Ensure that the DAC is always ALSA card 0. Create the file /etc/modprobe.d/usb-dac.conf with this line:

options snd slots=snd-usb-audio

And comment out this line in /etc/modprobe.d/alsa-base.conf:

# Keep snd-usb-audio from beeing loaded as first soundcard
# options snd-usb-audio index=-2

Create ~/.asoundrc to set the default card to the USB card:

pcm.0 { type hw; card 0; }
ctl.0 { type hw; card 0; }
pcm.!default pcm.0
ctl.!default ctl.0

LCD/IR-specific setup

If you intend to use the codlcd or codlircd daemons, additional packages are needed:

apt-get install python-smbus lirc

Add this line to /boot/config.txt to activate the lirc kernel module, listening on the GPIO pins used by the control board:

dtoverlay=lirc-rpi,gpio_out_pin=8,gpio_in_pin=4

Use these settings in /etc/lirc/hardware.conf:

DRIVER="default"
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"

Install a /etc/lirc/lircd.conf that matches your remote. A config file for Cyrus Commander is available at https://github.com/petli/codplayer/blob/master/etc/lirc/cyrus-commander.conf

codplayer setup

Following the steps in INSTALL.md to install all dependencies and install codplayer in a virtualenv with pip.

Install the /etc/udev/rules.d/99-codplayer.rules script to trigger playback when a CD is inserted. This also requires that codctl is found in PATH, easiest with a symlink:

sudo ln -s ~/cod/bin/codctl /usr/local/bin/codctl

Install the /usr/local/bin/trigger_rpi_cdrom_udev.sh script.

Start codplayer by adding these lines to /etc/rc.local (before any exit 0 line):

mkdir -p /var/run/codplayer
chown pi.pi /var/run/codplayer
sudo -u pi /home/pi/cod/bin/codplayerd
sudo -u pi /usr/local/bin/trigger_rpi_cdrom_udev.sh >/var/run/codplayer/trigger.log 2>&1 &

Since codplayer logs a lot and continuously updates state files, these are stored in ramdisk on /var/run to avoid wearing out the SD card with writes. Since it's a ramdisk, the dir must be setup on each boot.

Testing the setup

Run ~/cod/bin/codplayerd -d to run codplayer without forking it as a background daemon. See if it logs any errors. This line is OK if the USB DAC isn't connected yet:

c_alsa_sink: error opening card: No such file or directory