iPhoneでOSC

aka.iphone2OSC (OpenSound Control) というプロトコル(下位レイヤーはUDP/IP)を使って通信しています。Maxではお馴染みの方法で、udpsendやudpreceiveで一発OKですね。

でも、Maxとは違ってiPhoneではOSCが標準じゃないから、自分でケアしなければなりません。もちろん、スクラッチから書くのは大変なので、私が利用したのはChandrasekhar “Sekhar” Ramakrishnan氏が開発したObjCOSCというObjective-C用のOSCライブラリ。

それで、ObjCOSCを使ったOSCの送信はとっても簡単。Objective-Cのコードはちょっとクセがあるけど、なんとなく分かるでしょ?

OSCPort* port = [OSCPort oscPortToAddress: address portNumber: portNumber];
[port sendTo:"/foo" types:"f", 0.2061f];

受信もコールバック関数を登録しておくだけ。

OSCInPort* portIn = [[OSCInPort alloc] initPort: inportno];
[portIn newMethodNamed: "foo" under: [portIn topLevelContainer]
callback:fooCallback context: myController];

だけど、受信にはハマりまくりました。コールバック関数が呼び出されるところまでは問題ないんだけど、その後がダメダメです。全然うまくいかなかったので、現在公開しているaka.iphone2は送信だけなのね。

ハマった箇所は2つあって、ひとつはエンディアン問題。OSCは数値をビッグ・エンディアンで扱っているのに対して、iPhone(あるいはIntel Macなど)はリトル・エンディアンみたいです。ObjCOSCのサンプル・コード(main.c)なら、PrintOSCArgs()で整数と実数をエンディアン変換する必要があったわけです。変換する部分だけ抜き出しておきます。

int intValue;
intValue = CFSwapInt32BigToHost(intValue);

float floatValue;
CFSwappedFloat32 swappedFloatValue;
swappedFloatValue.v = floatValue;
floatValue = CFConvertFloat32SwappedToHost(swappedFloatValue);

ただ、送信は変換ナシに扱えてるんだから、受信だけ変換が必要ってのはイマイチなんじゃない?って思いますけどね。シンボル(文字列)の受信は問題ないです。

もうひとつのポイントは、受信のコールバック関数から他のインスタンスのメソッドを呼び出すには、メイン・スレッドから行なう必要があるみたいってこと。これをやるのがperformSelectorOnMainThreadね。myControllerというインスタンスがあるとして、そのtest:メソッド(パラメータはNSNumber)をメイン・スレッドから呼び出すのは、こんな感じ。

[myController performSelectorOnMainThread:@selector(test:)
withObject:[NSNumber numberWithFloat:floatValue] waitUntilDone:NO];

以下のように、直接呼び出すとiPhoneがフリーズします(笑)。こっちがフツーなんですが…

[myController test:[NSNumber numberWithFloat:floatValue]];

このあたりは、永野哲久くんがヘルプ&ヒントをくれました。多謝多謝。彼はObjective-Cでオーディオ・ビジュアル系の作品を作っていて(大雑把ですまない〜)、こーゆー人がIAMASに在学しているのは有り難いです。どっちが先生で、どっちが生徒だ?って気もしますけどね(笑)。彼の記事にトラックバックを入れておきます。

6 thoughts on “iPhoneでOSC

  1. micono

    初めまして、miconoといいます。むか〜し、マルチメディアプログラミングの本、買わせて頂きました。今も大事に持ってます。

    で、本題なんですが、ObjCOSCを使ってみたいと思っているのですが、リンクも切れてますし、どこを探しても引っかかってくれません。どうにか手に入れる方法はありませんでしょうか?よろしくお願い致します。

    返信
  2. 赤松 正行

    あ、リンク切れますね。確か作者はCNMATの学生だったそうで、卒業したとかでアカウントがなくなっちゃったんでしょうね。

    OSCのサイトにも載っていないようなので、もう使ってくれるな、ってことかもしれませんね。他のライブラリを試されてはどうでしょうか? そこのフォーラムで質問してみるとか?
    http://opensoundcontrol.org/guide-osc-libraries

    返信
  3. micono

    早々にコメントありがとうございます。
    OSCのサイトにある、CocoaSCの中に、ObjCOSCのプロジェクトが入っているみたいですが、プロジェクトが「.pbproj」なんで、Xcode3.xでは開けないみたいです(汗)
    「.pbproj」を開く方法ってないのでしょうか?

    返信
  4. 赤松 正行

    CocoaSCってどれのことですか? 新しくプロジェクトを作って、ソースコードのフォルダをプロジェクトに登録すれば、いいような気がしますが….

    返信
  5. micono

    すいません、あれこれダウンロードしてて、JavaOSCと勘違いして、
    OSCのサイトにあったと思ってしまいました。
    もう一度、検索して見つけました。
    これ(Websiteのリンクに入れました)!でした。CocoaSCイコールObjCOSCなんですかね?ダウンロードするとCocoaSCという名前になっています。。

    返信
  6. 赤松 正行

    なるほど、http://www.illposed.comが作者の現在のサイトみたいですね。サイトの作りが雑ですが。
    で、ObjCOSCフォルダがライブラリで、SimpleSCExampleフォルダがそれを利用するサンプルみたいです。

    記事のリンクを更新しておきました。

    返信

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

This blog is kept spam free by WP-SpamFree.