Launchorasince 2014
← Stories

Music Player With Buildroot and Raspberry Pi

This is a description of my first project using buildroot. Nothing spectacular, but since I encountered some issues, a solution is presented in this post.

I had a spare Raspberry Pi, and I wanted it to play some music as soon as it gets plugged on a wall. First and foremost, rpi-buildroot is a great repository where you’ll have all you need to have a booting Pi. You’ll need a couple of things to be set with a music player.

Once the repository is cloned, do a quick configuration:

make raspberrypi_defconfig

make menuconfig

Under “System configuration”, you’ll be able to set a root password, should you need to log it to debug or do anything. Otherwise, make sure that inside “Target packages”, you add every alsa-utils packages, mpg123 and alsa-lib libraries. You can then save your configuration.

The music playing scripts I had needs shuf, so I enabled it in busybox.

# edit package/busibox/busibox.config

CONFIG_SHUF=y

I also need to activate the raspberry’s sound card.

# edit package/rpi-firmware/config.txt

dtparam=audio=on

And then, I need some scripts that will start at boot to play music. The first one is a script that will be installed under /etc/init.d. S50 was chosen because I wanted it to start late in the boot process.

Also read-dead by daylight wont start

# S50-playmusic-daemon-service

#!/bin/sh

PATH=/sbin:/bin:/usr/bin

DAEMON="/usr/bin/playmusic-daemon"

test -f ${DAEMON} || exit 0

startdaemon(){

echo -n "Starting ${DAEMON}: "

modprobe snd-bcm2835 #This will wire up the sound card with alsa

start-stop-daemon -b --start --quiet --exec ${DAEMON}

echo "${DAEMON} started."

}

stopdaemon(){

echo -n "Stopping ${DAEMON}: "

start-stop-daemon --stop --quiet --exec ${DAEMON}

echo "${DAEMON} stopped."

}

case "$1" in

start)

startdaemon

;;

stop)

stopdaemon

;;

force-reload)

stopdaemon

startdaemon

;;

restart)

stopdaemon

startdaemon

;;

*)

echo "Usage: $0 { start | stop | restart}" >&2

exit 1

;;

esac

The other one is a daemon that will keep running as long a the system is running. When it detects a usb drive, it will mount it and start the music player near the mountpoint.


# playmusic-daemon

#!/bin/sh

set -e

PLAYER="/usr/bin/playmusic"

test -f ${PLAYER} || exit 1

while true; do

if ! df | grep -q "/dev/sd"; then

partitions="$(fdisk -l /dev/sd* | awk '/^\/dev\/sd/ {print $1}')"

for partition in "$partitions"; do

mountpoint="/media/$(basename $partition)"

mkdir -p $mountpoint

mount $partition $mountpoint

done

fi

if ps -p $(pidof $(basename $PLAYER)); then

sleep 10

else

$PLAYER /media

fi

done

The last script is the music player in itself. Pretty basic stuff. Find the mp3 songs, shuffle them, and plays them.


# playmusic

#!/bin/sh

SEARCH_PATH="$1"

find $SEARCH_PATH -iname "*mp3" | shuf | while read song

do

mpg123 "$song"

done

These three scripts were small, so there was no real need to create a buildroot package for that. I simply dropped these scripts under board/rapberrypi/playmusic and I edited the post-build.sh script that was sitting there with the following lines.


# install playmusic

cp $(dirname $0)/playmusic/playmusic* ${TARGET_DIR}/usr/bin/

cp $(dirname $0)/playmusic/S50-playmusic-daemon-service ${TARGET_DIR}/etc/init.d/

Finally, we only have to compile the buildroot image, and flash it on an SD card.

sudo ./board/raspberrypi/flashsdcard /dev/sdf

Video after the break.

Enjoy!

Keep reading-dead by daylight not launching