CDやらメモリーやらの再生機の調子が悪いので、もっとちゃんと音が出てお手軽でしかも安いのが出来ないか?というのが発端です。
結果としては、動くことは動くがあまりよろしくない部分が大きいので、現状ではボツです。
時々、カーネルエラーで動かなくなる。
起動してしばらくするとfsckエラーが出る。ノイズあり。その後普通に使える。
時々、エンコードエラーが出る。その後普通に再生できる。
起動が遅い。
で、資料として置いときます。色々改善されたらまた引っ張りだすかも。
raspberry pi2にVolumioを入れる。
USB DACから音を出す。
GPIOにつけたスイッチからコントロールする。
空いているSDの領域に/USBを作る。
Ramdiskを作る。
/USBをsambaで公開する。
ファイルを/USBに入れる。
ブラウザでアクセスして諸設定。
以下のコードをmy_btn_ctrl.pyとして自動起動するようにする。
#/usr/bin/python
#-*- coding: utf-8 -*-
import time
import subprocess as SP
import re
B_ON = 0
B_OFF = 1
DEB_TIME = 0.05
SHORT_TIME = 0.5
HALT_TIME = 2
RE_PLAY = re.compile(r'\[playing\]')
RE_TIME = re.compile(r'\d{1,3}:\d{2}')
box=lambda *x:x
unbox=lambda x:x[-1]
do=box
switch=unbox
is_debounced = (lambda last_push , now , deb_time = DEB_TIME :
now - last_push < deb_time
)
is_short = (lambda last_push, now, short_time= SHORT_TIME:
is_debounced(last_push, now, short_time)
)
near_head=(lambda limit_second=5:
(lambda s= SP.check_output("mpc", shell = True):
(lambda a=RE_TIME.search(s):
(lambda time_list=[int(x) for x in re.split(':',a.group()) ]:
switch(
a is not None and do(time_list[0] is 0 and time_list[1] <= limit_second )
or do(True)
)
)()
)()
)()
)
is_head=(lambda :
near_head( limit_second = 0 )
)
is_playing =( lambda :
(lambda s= SP.check_output("mpc", shell = True):
(lambda a=RE_PLAY.search(s):
(a is not None)
)()
)()
)
play_func =(lambda:
switch(
is_playing() and do(SP.call("mpc next" , shell = True ))
or do(SP.call("mpc play" , shell = True ))
)
)
pause_func=(lambda:
SP.call('mpc pause',shell=True)
)
playpause_update =(lambda cur_state, new_state, last_push, now, func :
switch(
cur_state is B_OFF and new_state is B_ON and do( (func() , now ) )
or do( last_push )
)
)
prev_func=(lambda :
switch(
is_head() and do(SP.call('mpc play;mpc prev;mpc pause',shell=True))
or do(SP.call('mpc seek 0;mpc pause',shell=True))
)
)
rew_func=(lambda :
switch(
near_head() and do(SP.call('mpc seek 0;mpc pause',shell=True))
is_head() and do(True)
or do(SP.call('mpc seek -00:00:05',shell=True))
)
)
fwd_func=(lambda :
SP.call('mpc next;mpc pause',shell=True)
)
ff_func=(lambda :
SP.call('mpc seek +00:00:05',shell=True)
)
prevfwd_update=(lambda cur_state, new_state, last_push, now, skip_func, seek_func :
(lambda short=is_short(last_push, now) :
switch(
cur_state is B_OFF and new_state is B_OFF and do( last_push )
or cur_state is B_OFF and do( now )
or new_state is B_OFF and short and do(skip_func() , last_push )
or new_state is B_OFF and do( last_push )
or short and do( last_push )
or do( seek_func(), last_push )
)
)()
)
halt_func=(lambda:
SP.call('halt',shell=True)
)
halt_update=(lambda cur_state, new_state, last_push, now :
(lambda flag_halt = (now - last_push) > HALT_TIME :
switch(
new_state is B_OFF and do( (last_push, False ) )
or cur_state is B_OFF and do( (now, False ) )
or not flag_halt and do( (last_push, False ) )
or do( (last_push, True ) )
)
)()
)
if __name__ == '__main__':
setup=(lambda :
SP.call('cp -rp /mnt/USB /run/shm/;mpc update;mpc volume 100',shell=True)
)
def main() :
import RPi.GPIO as GPIO
setup()
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings( False )
PIN_PREV = 8
PIN_PLAY = 10
PIN_PAUSE = 7
PIN_FWD = 12
PIN_HALT = 11
GPIO.setup(PIN_PREV, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(PIN_PLAY, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(PIN_PAUSE, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(PIN_FWD, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(PIN_HALT, GPIO.IN, pull_up_down=GPIO.PUD_UP)
prev_cur=B_OFF
play_cur=B_OFF
pause_cur=B_OFF
fwd_cur=B_OFF
halt_cur=B_OFF
do_halt=False
now=time.time()
prev_last=now
play_last=now
pause_last=now
fwd_last=now
halt_last=now
while not do_halt:
now=time.time()
prev_new = GPIO.input(PIN_PREV)
fwd_new = GPIO.input(PIN_FWD )
play_new = GPIO.input(PIN_PLAY)
pause_new = GPIO.input(PIN_PAUSE)
halt_new = GPIO.input(PIN_HALT)
prev_last = prevfwd_update( prev_cur, prev_new, prev_last, now, prev_func, rew_func )
fwd_last = prevfwd_update( fwd_cur, fwd_new, fwd_last, now, fwd_func, ff_func )
play_last = playpause_update( play_cur, play_new, play_last, now, play_func )
pause_last= playpause_update( pause_cur, pause_new, pause_last, now, pause_func )
halt_last, do_halt = halt_update( halt_cur, halt_new, halt_last, now)
prev_cur = prev_new
fwd_cur = fwd_new
play_cur = play_new
pause_cur = pause_new
halt_cur = halt_new
time.sleep(DEB_TIME)
GPIO.cleanup()
halt_func()
main()
コメント
コメントを投稿