SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|

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系の修正ビルドはやったことがない。やってみる。

  まず、リポジトリの定義ファイルをコピーし、各項目の「deb」を「deb-src」と修正、リポジトリ情報を更新する。

~ # 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

  パッケージは直上にできているので、padspに関連するものをインストール。

pulseaudio-3.0 # cd ..
build # dpkg -i pulseaudio-utils_3.0-0ubuntu7_amd64.deb
build # dpkg -i libpulsedsp_3.0-0ubuntu7_amd64.deb

  完了。melodが動作することを確認。パッチ生成やリリース管理まで、スクリプトが誘導してくれるので、Fedora系よりUbuntu系の方が多少ラクかな。

  改めて、以前に作曲した曲をmidiファイル化して演奏してみたら、音が残ってしまうようになっていた。どうも、キーオフをサボっているのがマズいらしいので、ひょいひょいと修正。

  パッケージを置いておく。しかし、Ruby1.9へのリライトもだいぶ慣れてきたな。