Language:EN / NE / AE / DE / IT

안녕하세요. 이번에는 U5PVR 에 MPD 를 설치해 보겠습니다.


MPD 운용시 ALSAMIXER 를 통해 USB DAC 과 연동이 가능합니다.


저도 실은 정확하게 MPD 에 대해서 모르기 때문에 USB DAC 을 통해서 원음 재생이 가능하게 설정하는 방법을 정확하게 모릅니다. 차후 보충하도록 하겠습니다.


시작합니다.



1. MPD 및 의존성 패키지 설치하기


아래의 명령으로 MPD 를 설치합니다.


root@u5pvr-debian:~# apt-get install mpd alsa-base alsa-oss alsa-utils


다음으로 MPD 가 정상적으로 동작하게 하기 위해서 설정파일을 살짝 수정합니다.


root@u5pvr-debian:~# nano /etc/mpd.conf



# Files and directories #######################################################
#
# This setting controls the top directory which MPD will search to discover the
# available audio files and add them to the daemon's online database. This
# setting defaults to the XDG directory, otherwise the music directory will be
# be disabled and audio files will only be accepted over ipc socket (using
# file:// protocol) or streaming files over an accepted protocol.
#
music_directory         "/mnt/sda/sda1/music"        <-- 음악이 들어있는 위치를 지정합니다.
#


# General music daemon options ################################################
#
# This setting specifies the user that MPD will run as. MPD should never run as
# root and you may use this setting to make MPD change its user ID after
# initialization. This setting is disabled by default and MPD is run as the
# current user.
#
user                            "root"        <-- 실행 계정을 root 계정으로 설정합니다.
#
# This setting specifies the group that MPD will run as. If not specified
# primary group of user specified with "user" setting will be used (if set).
# This is useful if MPD needs to be a member of group such as "audio" to
# have permission to use sound card.
#
group                          "root"        <-- 실행 그룹을 root 그룹으로 설정합니다.
#
# This setting sets the address for the daemon to listen on. Careful attention
# should be paid if this is assigned to anything other then the default, any.
# This setting can deny access to control of the daemon. Choose any if you want
# to have mpd listen on every address
#
# For network
bind_to_address         "0.0.0.0"        <--스마트폰이나 다른 클라이언트와 연동하기 위해서 바인드를 0.0.0.0 으로 설정합니다.


대략적으로 수정이 끝났습니다. 정상적으로 동작하는지 체크를 해 봅니다.


root@u5pvr-debian:~# netstat -nlp | grep mpd

tcp        0      0 0.0.0.0:6600            0.0.0.0:*               LISTEN      23392/mpd

root@u5pvr-debian:~#


정상적으로 동작이 되고 있네요 ㅎㅎ



2. 출력 장치 설정하기


기본적으로 MPD 를 통해서 HTTP 출력을 하게 하여 음악 스트리밍 서버로 사용할 수 있습니다.


그런데 이번에는 물리 장치로 출력을 내보내는 설정을 해 보겠습니다.


다음 명령어로 재생할 장치 이름을 확인합니다.


root@u5pvr-debian:~# aplay -l

**** List of PLAYBACK Hardware Devices ****

card 0: HISIAIAO [HISI-AIAO], device 0: Playback aiao-hifi-0 []    <- 찐하게 된 부분이 장치 이름입니다.

  Subdevices: 1/1

  Subdevice #0: subdevice #0

root@u5pvr-debian:~#


위에 뜨는 장치는 U5PVR 에 장착된 기본 장치입니다. USB 로 DAC 을 연결하면 다른 장치가 추가적으로 뜰 것입니다.


다시 MPD 설정을 수정하여 장치에 대한 설정을 추가합니다.

root@u5pvr-debian:~# nano /etc/mpd.conf


#
#audio_output {                                    <-- 기본적으로 세팅이 들어가 있는데 # 으로 코멘트 시킵니다.
#       type            "alsa"
#       name            "HISIAIAO"
#       device          "default"       # optional
#       mixer_type      "hardware"      # optional
#       mixer_device    "default"       # optional
#       mixer_control   "PCM"           # optional
#       mixer_index     "0"             # optional
#}
#

# 아래의 구문을 추가합니다.
audio_output {
        type "alsa"
        device "default"
        # The name of the card
        name "HISIAIAO"            <-- 앞서 보았던 장치 이름을 넣어줍니다.
        use_mmap "yes"
        auto_resample "no"
        auto_channels "no"
        auto_format "no"
        mixer_type "software"        <-- DAC 이 자체적으로 볼륨 조절을 할 수 있다면 disabled 로 입력합니다.
        period_time "50000"
        buffer_time "2500000"
        # dsd_usb "yes"                <-- DSD 를 지원하면 코멘트 아웃해 줍니다.
}


저장 후, 다시 mpd 서비스를 재시작 합니다.


root@u5pvr-debian:~# service mpd restart

[ ok ] Stopping Music Player Daemon: mpd.

[ ok ] Starting Music Player Daemon: mpd.

root@u5pvr-debian:~#




3. MPD 클라이언트 - MPDroid


일단 스마트폰에서 U5PVR 의 재생을 원격 컨트롤 하기 위해서 아래의 앱을 설치합니다.


https://play.google.com/store/apps/details?id=com.namelessdev.mpdroid&hl=ko



설치를 하고 나서 아래의 설정을 진행합니다.


기본 연결 설정으로 이동합니다.



호스트를 U5PVR IP 입력합니다.


(나머지는 설정하신 대로 입력하시면 됩니다.)



U5PVR 기본 오디오가 잘 물려 있음을 알 수 있습니다.




스마트폰에서 재생을 누르게 되면 U5PVR HDMI 나 혹은 AV 단자로 소리가 나갑니다.




동영상으로 보시면 아래와 같습니다. (U5PVR 이 물린 HDMI 모니터에서 음악이 나오는 중입니다.)



추가적으로 MPD 가 음악 재생중일때는 U5PVR 안드로이드에서 DAC 우선순위가 밀리기 때문에 영상 재생이 원활이 되지 않고 유튜브의 경우에는 재생이 시작되지 않습니다.


MPD 재생을 정지하면 U5PVR 안드로이드 앱 이용이 정상화 됩니다.


AV 짹에 이어폰 꼽아 보시면 음악이 나오는 것을 확인하실 수 있습니다. 고음질 플레이가 필요없으시면 그냥 내장 DAC 을 쓰셔도 무방합니다. 


기본 구성품에 AV 단자도 포함되어 있으니 잘 활용해 보시면 될듯 합니다.





[위 두 사진은 블루님께서 찍어서 보정을 한 것으로 블루님 허락 외에는 무단 사용하실 수 없습니다. 이 게시글은 허락을 받았습니다.]


S/PDIF 단자로 음악이 나가는지는 잘 모르겠네요.




4. MPD 웹 클라이언트 - ympd


실제로 Volumio 웹 UI 를 따고 싶었지만 이게 Volumio 는 하나의 운영체제로 배포되는 것이라 따로 설치가 어렵네요. 그래서 대체 웹 UI 를 설치해 봅니다.


의존성 패키지를 설치합니다.


(build-essential 안에 의존성의로 cmake 가 포함되어 있을 수 있습니다. 빌드 중에 에러가 나서 가이드를 약간 수정했습니다.)


(SSL 연결을 사용하시려면 openssl 도 같이 설치하시길 바랍니다.)


root@u5pvr-debian:~# apt-get install cmake git build-essential libmpdclient-dev libssl-dev pkg-config


소스를 받고 빌드합니다.


root@u5pvr-debian:~# git clone https://github.com/notandy/ympd.git

Cloning into 'ympd'...

remote: Counting objects: 861, done.

remote: Total 861 (delta 0), reused 0 (delta 0), pack-reused 861

Receiving objects: 100% (861/861), 629.50 KiB | 335.00 KiB/s, done.

Resolving deltas: 100% (544/544), done.

Checking connectivity... done.

root@u5pvr-debian:~#


받은 위치로 이동하여 빌드합니다.


root@u5pvr-debian:~# cd ympd/

root@u5pvr-debian:~/ympd# ls

CMakeLists.txt  LICENSE  README.md  cmake  contrib  htdocs  src  tools  ympd.1

root@u5pvr-debian:~/ympd# mkdir build

root@u5pvr-debian:~/ympd# cd build

root@u5pvr-debian:~/ympd/build# cmake .. -DCMAKE_INSTALL_PREFIX:PATH=/usr

-- Found PkgConfig: /usr/bin/pkg-config (found version "0.28")

-- Configuring done

-- Generating done

-- Build files have been written to: /root/ympd/build

root@u5pvr-debian:~/ympd/build# make && make install

Scanning dependencies of target mkdata

[ 12%] Building C object CMakeFiles/mkdata.dir/tools/mkdata.c.o

Linking C executable mkdata

[ 12%] Built target mkdata

[ 25%] Generating assets.c

Scanning dependencies of target ympd

[ 37%] Building C object CMakeFiles/ympd.dir/src/ympd.c.o

[ 50%] Building C object CMakeFiles/ympd.dir/src/mpd_client.c.o

[ 62%] Building C object CMakeFiles/ympd.dir/src/mongoose.c.o

[ 75%] Building C object CMakeFiles/ympd.dir/src/json_encode.c.o

[ 87%] Building C object CMakeFiles/ympd.dir/src/http_server.c.o

[100%] Building C object CMakeFiles/ympd.dir/assets.c.o

Linking C executable ympd

[100%] Built target ympd

[ 12%] Built target mkdata

[100%] Built target ympd

Install the project...

-- Install configuration: ""

-- Installing: /usr/bin/ympd

-- Installing: /usr/share/man/man1/ympd.1

root@u5pvr-debian:~/ympd/build#


설치가 정상적으로 되었습니다. 실행은 아래와 같이 합니다.


root@u5pvr-debian:~# ympd -h 127.0.0.1 -p 6600 -w 0.0.0.0:7700

MPD Connecting to 127.0.0.1:6600

MPD connected.


ympd -h mpd주소 -p mpd포트 -w 웹UI주소:포트


따라서 http://u5pvr_ip_address:7700/ 으로 이동해 보시면 아래의 Web UI 가 열립니다.





간단히 웹 리모콘이 생겼습니다.



그런데 프로그램 실행을 매번 저렇게 할 수 없음으로 init.d 스크립트를 추가합니다. 

(귀찮으시면 nohup & 을 사용하셔도 됩니다.)


root@u5pvr-debian:~# nano /etc/init.d/ympd



#!/bin/sh
### BEGIN INIT INFO
# Provides:          ympd
# Required-Start:    $remote_fs mpd
# Required-Stop:     $remote_fs mpd
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Daemonized version of ympd.
# Description:       Enable service provided by ympd.
### END INIT INFO
#Author: Andrew Karpow <andy@ndyk.de>

. /lib/lsb/init-functions

PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="ympd Daemon"
NAME=ympd
DAEMON=/usr/bin/$NAME
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
LOG_OUT=/var/log/$NAME.out
LOG_ERR=/var/log/$NAME.err
YMPD_USER=root
MPD_HOST=localhost    <-- MPD 호스트 설정
MPD_PORT=6600        <-- MPD 포트 설정
WEB_PORT=7700        <-- webui 포트 설정


# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
[ -f /etc/default/rcS ] && . /etc/default/rcS

DAEMON_OPT="--user $YMPD_USER --webport $WEB_PORT --host $MPD_HOST --port $MPD_PORT"

do_start()
{
    start-stop-daemon --start --background --quiet --pidfile $PIDFILE --make-pidfile \
        --exec $DAEMON --test > /dev/null || return 1
    start-stop-daemon --start --background --quiet --pidfile $PIDFILE --make-pidfile \
        --exec $DAEMON -- $DAEMON_OPT || return 2
}

do_stop()
{
    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
    RETVAL="$?"

    [ "$RETVAL" = 2 ] && return 2
    rm -f $PIDFILE
    return "$RETVAL"
}

case "$1" in
  start)
    [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
    do_start
    case "$?" in
        0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
        2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
    esac
    ;;
  stop)
    [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
    do_stop
    case "$?" in
        0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
        2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
    esac
    ;;
  status)
    status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
    ;;
  restart|force-reload)
    #
    # If the "reload" option is implemented then remove the
    # 'force-reload' alias
    #
    log_daemon_msg "Restarting $DESC" "$NAME"
    do_stop
    case "$?" in
      0|1)
        do_start
        case "$?" in
            0) log_end_msg 0 ;;
            1) log_end_msg 1 ;; # Old process is still running
            *) log_end_msg 1 ;; # Failed to start
        esac
        ;;
      *)
        # Failed to stop
        log_end_msg 1
        ;;
    esac
    ;;
  *)
    echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
    exit 3
    ;;
esac



root@u5pvr-debian:~# chmod a+x /etc/init.d/ympd
root@u5pvr-debian:~# update-rc.d ympd defaults            <-- 부팅시 자동실행
root@u5pvr-debian:~# 

# service 명령이 잘 먹는지 확인 -> 잘 됩니다.
root@u5pvr-debian:~# service ympd restart
[ ok ] Restarting ympd Daemon: ympd.
root@u5pvr-debian:~# service ympd stop
[ ok ] Stopping ympd Daemon: ympd.
root@u5pvr-debian:~# service ympd start
[ ok ] Starting ympd Daemon: ympd.
root@u5pvr-debian:~#


++ 번외편


기본적으로 리눅스 펌웨어에는 음악 태그 깨짐을 해결할 수 있는 명령이 들어가 있습니다.


음악이 들어있는 폴더로 이동하여 mp3conv 라고 입력하면 태그를 cp949 바꾸어 태그가 깨지지 않게 해줍니다.


하위 폴더까지 모조리 싹 다 바꿔줍니다. (ogg mp3 flac 파일들)


root@u5pvr-debian:/# cd /mnt/sda/sda1/music

root@u5pvr-debian:/mnt/sda/sda1/music# mp3conv

('Updating', 'WINNER - REALLY REALLY.mp3')

('Updating', Marry Me.mp3')

..................


이렇게 DAC 과 연동을 하게 되면 나만의 오디오 시스템이 구축 가능합니다.


물론 SPI 통신을 통해 DAC 과 연동을 해 보고 싶지만 잘 모르겠네요 ㅎㅎ..


감사합니다.