2013年10月9日水曜日

Desktop環境(Mac)でJava上のlibpd


ハマり中~

PdBase.openAudio 等のオーディオ系のメソッドは,libpdに同梱されたJNIのNative関数を呼んでいます.
  1. 生のlibpdをデスクトップ環境向けにビルドするとNative関数の中身はカラッポ.jni/z_jni_plain.c
  2. Android向けにビルドすると,これが jni/z_jni_opensl.c に置き換えられる.
  3. PortAudio branch版のlibpdでのデスクトップ向けビルドでは, jni/z_jni_pa.c に置き換えられる.



一方,Java標準のサウンドAPIであるJavaSoundを使用してPdを鳴らすサンプルプログラムが,libpdのプロジェクト内に同梱されてます.
samples/com/noisepages/nettoyeur/libpd/sample/JavaSoundSample.java

これを1で実行すると,エラーは起きないけど何も鳴らない.まぁこれは正常な動作.
しかし3で実行すると,PdBase.openAudio と AudioSystem.getLine(info) がかち合った所でフリーズ.
前者を消すとPdから信号が流れてこないし,後者を消すと信号をオーディオデバイスに乗せられない.両方動かさないと意味がない.
うーむ?

  • PortAudioが正常にインストールできていない可能性
  • PortAudioのライブラリや実行ファイルがJNIでうまくリンクされていない可能性
  • そもそもPortAudioを使う場合に適用できる手法ではない可能性
が考えられる。一個ずつつぶしていくか…

  • make嫌い
  • JNIむつかしー
  • PortAudioっていうかサウンドドライバ使ったことない
と三拍子そろってて苦行状態です…
JavaやPdそのものは「触るの初めて!たのしそう!」的にやる気が出ますが,
今まで意図して避けてきたものに囲まれるのはキツいっすな…

Cocoa向けlibpdビルドってのを提供してる人も居るようですが,今回はあくまでもAndroidアプリのテスト環境構築という前提があるので,ぜひともPortAudioで実現させたいところ.

あとで読む:http://www.ibm.com/developerworks/jp/linux/library/l-posix2/

0 件のコメント :

コメントを投稿