Setup network streaming player (네트워크 스트리밍 플레이어)

배경

요즘 Audiophiler 들에게 각광받고 있는 기기는 단연 network stream player (a.k.a network player)이다. 마치 신개념을 무장한 기기로 보일 수도 있으나, 알맹이를 보면 기존 기기에 networking 기능을 더한 것이다. 네트워크 환경이 좋아지고, 편리한 부가기능들이 표준화 되면서 오디오 기기에 부가기능들이 추가되는 자연스런 행보라 하겠다. 하지만 역시나 오디오 기기에 그러한 기능들이 들어오면 가격이 무척 비싸 직딩에게는 그림의 떡일 뿐이다. 🙁

나는 바쁜 일상에서도 소중한 음악을 언제 어디에서나 쉽게 찾아 들고 싶었고, 네트워크 사운드 서버를 구성하여 집에있는 스피커를 최대한 활용해보고 싶었다. 지난 2년 동안 시행착오를 겪고 난 뒤 나름 만족할 만한 network streamer 를 구축하게 되었다. 그리하여 NAIM의 ND5 XS 처럼 멋있는 기기를 사용하고 싶지만,  자금이 넉넉지 않은 audiophiler 에게 기존 오디오 기기들을 100% 활용하면서 적은 비용으로 network stream player 를 구축하는데 도움이 되고자 포스팅을 시작한다.

naim_ND5_XS
NAIM ND5 XS

목적

  • streaming music server
    • 언제 어디에서나 음악을 들을 수 있어야 한다.
  • jukebox
    • 집에서는 고음질의 음악을 들을 수 있어야 한다. (a.k.a PC-FI)
  • network sound server
    • 쇼파위에서 맥북으로 youtube 볼 때, 스피커로 소리를 들을 수 있어야 한다.

Overview

구축 환경

  • Ubuntu Server 14.04.1 LTS (GNU/Linux 3.13.0-36-generic x86_64)
  • openjdk 7
  • nginx 1.4.6 (option)

Network sound server

여기서 pulseaudio 를 설치하는 가장 궁극적인 목적은 network sound server 를 구축하기 위함이다. pulseaudio 외에도 다른 방법이 존재하지만, 경험상 가장 간편하고 깔끔하였다. 엮으로 pulseaudio 가 작성된 이유이기도 하다. network sound server 기능이 필요 없다면 alsa 로 음악을 재생하는것이 음질면에서 더욱 유리하다.

1. install pulseaudio

sudo apt-get install pulseaudio pulseaudio-esound-compat alsa-tools alsa-utils

2. configuration

대부분 alsa usb audio hotplug 로 DAC를 연결할 텐데,  hardware index 가 정상적으로 등록되어 있는지 확인해보자.

april1024@ns01:~$ sudo aplay -l
**** List of PLAYBACK Hardware Devices ****
Home directory not accessible: Permission denied
card 1: CODEC [USB Audio CODEC], device 0: USB Audio [USB Audio]
 Subdevices: 0/1
 Subdevice #0: subdevice #0

* /etc/asound.conf

pcm.!default {
    type hw
    card 1
}
ctl.!default {
    type hw
    card 1
}

* start pulseaudio

sudo service pulseaudio start

* speaker test

pulseaudio daemon 이 system mode 로 동작할 때에는 “pulse-access” group 에 속하지 않은 user 는 소리를 재생할 수 없다.

april1024@ns01:~$ speaker-test

speaker-test 1.0.27.2

Playback device is default
Stream parameters are 48000Hz, S16_LE, 1 channels
Using 16 octaves of pink noise
ALSA lib pulse.c:243:(pulse_connect) PulseAudio: Unable to connect: Access denied

Playback open error: -111,Connection refused

user를 pulse-access group 에 추가한다.

april1024@ns01:~$ sudo usermod -a -G pulse-access april1024
april1024@ns01:~$ speaker-test

speaker-test 1.0.27.2

Playback device is default
Stream parameters are 48000Hz, S16_LE, 1 channels
Using 16 octaves of pink noise
Rate set to 48000Hz (requested 48000Hz)
Buffer size range from 192 to 2097152
Period size range from 64 to 699051
Using max buffer size 2097152
Periods = 4
was set period_size = 524288
was set buffer_size = 2097152
0 - Front Left
Time per period = 10.948270
0 - Front Left
^CTime per period = 10.953592

network를 통하여 sound를 재생하기 위해서는 pulseaudio에서 제공하는 module을 적재해야하며, ACL 추가가 필요하다.

* /etc/pulse/default.pa, /etc/pulse/system.pa

# ESD protocol 설정
.ifexists module-esound-protocol-tcp.so
load-module module-esound-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.0/16
.endif

# PulseAudio native protocol 설정
.ifexists module-native-protocol-tcp.so
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.0/16
.endif

3. add client

soundflower (Mac 10.9.5)

pulseaudio 는 ESD 를 지원하여 외부에서 ESD protocol 로 송신만 해주면 pulseaudio 는 그 소리를 수신하여 재생시킬 수 있다. soundflower 라는 mac 용 프로그램을 이용하여 ESD protocol 로 pulseaudio 에 전달해보자.

soundflower 를 설치하고나면 sound preferences 에서 soundflower device 가 추가된 것을 볼 수 있다.  output device 에서 soundflower device 를 선택한다.

ss_soundflower1

이제 mac 의 모든 소리를 sound server 로 전송할 차례만 남았다. 간단한 shell script 하나 작성해두고 두고두고 사용하자.

* ~/bin/send_sound_to_esound_server.sh

#!/bin/sh

SOUND_SERVER="192.168.0.101"

esd -tcp -bind ::1 &
sleep 2;
esdrec -s ::1 | esdcat -s ${SOUND_SERVER}

Streaming music server

1. install subsonic

subsonic 공식페이지의 설치 가이드를 참고하여 설치한다.

2. configuration

* /etc/default/subsonic

# tomcat의 context path 설정
#
# 아래 context-path 는 service URL 이 http(s)://hostname/subsonic 이라고 가정했을 때의 예이다.
# 만약 service URL 을 http(s)://hostname 으로 하고 싶다면, context-path=/ 로 설정하면 된다.
SUBSONIC_ARGS="--max-memory=128 --context-path=/subsonic"
# subsonic process 의 owner,group 설정
#
# audio files 에 접근 할 수 권한으로 process 를 실행해야 한다.
SUBSONIC_USER=share

* /etc/nginx/nginx.conf

nginx 에 연동하지 않고 직접 http://hostname:4040/subsonic 으로도 접근이 가능하다.

...
# subsonic default running port number 는 4040 이다.
# /var/subsonic/subsonic.properties 에서 변경 가능하다.
location /subsonic {
    proxy_pass    http://localhost:4040/subsonic;
}
...

* start subsonic & restart nginx

sudo service subsonic start
sudo service nginx restart

* add audio file paths

http(s)://hostname/subsonic 에 접속하여 admin 권한을 가지는 계정을 생성한다.

그리고나서 admin 계정으로 로그인하여 “Settings > Media folders” tab 에서 audio files 이 있는 directory 를 추가한다.

ss_subsonic_media_folders

3. add client

subsonic 은 많은 device 를 지원한다. 자신의 device 에 맞는 app 을 설치하고나서 subsonic server 를 추가하면 audio files 를 재생할 수 있다.

* iSub (iphone app)

iSub 는 cache (pre downloading) 기능이 있어, off line mode 에서도 음악을 들을 수 있다.

ss_isub

Jukebox

1. install mpd

sudo apt-get install mpd

2. configuration

* /etc/mpd.conf

# audio files path
music_directory "/mnt/share/media/music"
playlist_directory "/var/lib/mpd/playlists"
# audio files 에 접근 권한이 있는 group 을 지정한다.
group "audio"
# NIC 에 bind 할 address 를 지정한다.
bind_to_address "localhost"
bind_to_address "192.168.0.101"
port "6600"
follow_outside_symlinks "yes"
follow_inside_symlinks "yes"
# audio output 지정
# cf. 음질을 위해서는 alsa 에 직접 붙히는것을 추천함
audio_output {
    type "pulse"
    name "MPD"
}

* pulseaudio-access group 에 mpd 추가

sudo usermod -a -G pulse-access mpd

* start mpd

sudo service mpd start

3. add client

mpd 도 많은 device 를 지원한다. mpd clients 를 보고 자신의 구미에 맞는 것을 고르자.

* MPoD (iphone app)

ss_mpod

 

Leave a comment

Your email address will not be published. Required fields are marked *