SVX日記
2013-10-23(Wed) チープなDTMアプリ・改二
ふと思い立って、三度、以前に自作したDTMアプリを引っ張り出してきた。2年半ぶりくらいだ。当時の環境はFedora12だったようだが、現在はMint15だ。Rubyも1.8から1.9になっている。そして……
$ padsp -d ./melod
utils/padsp.c: dsp_open()
utils/padsp.c: fd_info_new()
utils/padsp.c: dsp_open() succeeded, fd=5
utils/padsp.c: sample spec: u8 1ch 8000Hz
utils/padsp.c: fixated metrics to 12 fragments, 1024 bytes each.
7fff0009
utils/padsp.c: freeing fd info (fd=5)
utils/padsp.c: Draining.
./melod:24:in `ioctl': integer 3221508106 too big to convert to `int' (RangeError)
from ./melod:24:in `block in <main>'
from ./melod:17:in `open'
from ./melod:17:in `<main>'
まず、前回とエラーの内容が変わっている。発生箇所は、前回と同じく、サウンドデバイスへのioctlではあるが、サウンドデバイス側でなく、Ruby側でエラーこいている感じ。どうも、ioctlへ渡す引数が32bit intとして定義されているのが原因っぽい。
渡したいのは、0xc004500a(SNDCTL_DSP_SETFRAGMENT)等なので、unsignedでないと通りえない。前回は「勝手に64bit拡張して渡してしまうRuby」側の問題だと思いつつ、padsp側にパッチを当てて回避したが、これではRuby側に修正を入れるほかない……悪化しとるがな。
< p dsp.ioctl(0xc004500a, x) # SNDCTL_DSP_SETFRAGMENT
---
> p dsp.ioctl(0xc004500a - 0x100000000, x) # SNDCTL_DSP_SETFRAGMENT
$ padsp -d ./melod
utils/padsp.c: dsp_open()
utils/padsp.c: fd_info_new()
utils/padsp.c: dsp_open() succeeded, fd=5
7fff0009
utils/padsp.c: unknowned ioctl 0xffffffffc004500a
utils/padsp.c: freeing fd info (fd=5)
utils/padsp.c: Draining.
./melod:24:in `ioctl': Invalid argument - /dev/dsp (Errno::EINVAL)
from ./melod:24:in `block in <main>'
from ./melod:17:in `open'
from ./melod:17:in `<main>'
おぉ、前回と同じ結果になった。ゴマかして通すことには成功したといえよう。あとは前回と同じくpadspにパッチを当てれば回避できるだろう……が、Ubuntu系の修正ビルドはやったことがない。やってみる。
~ # cd /etc/apt/sources.list.d
sources.list.d # cp official-package-repositories.list official-package-repositories.sources.list
sources.list.d # vi official-package-repositories.sources.list
sources.list.d # apt-get update
sources.list.d # cd
~ # aptitude install dpkg-dev
~ # aptitude install devscripts
~ # mkdir build
~ # cd build
build # apt-get source pulseaudio-utils
build # cd pulseaudio-3.0/src/utils
utils # vi padsp.c
utils # cd ../..
pulseaudio-3.0 # dpkg-source --commit
Enter the desired patch name: 9999-padsp4ruby.patch
pulseaudio-3.0 # dch -i
* Add patch to padsp for ruby.
pulseaudio-3.0 # debuild -uc -us
pulseaudio-3.0 # debuild -uc -us
pulseaudio-3.0 # cd ..
build # dpkg -i pulseaudio-utils_3.0-0ubuntu7_amd64.deb
build # dpkg -i libpulsedsp_3.0-0ubuntu7_amd64.deb
パッケージを置いておく。しかし、Ruby1.9へのリライトもだいぶ慣れてきたな。