openframeworksでカメラが使えなくなった

openframeworksでカメラが使えなくなった。
ofAVFoundationGrabber.mmの
[self.captureSession addInput:captureInput];
でエラーが出る。
QuickTimeなどではちゃんとカメラが動作するので、oFかXcodeの設定かなと踏んでいた。

open

結論としては、Macのシステム環境設定でセキュリティとプライバシーのカメラの設定で、oFのアプリのチェックが外れていた。
何がきっかけで外れたのか、何を思ったか昔の私がチェック外したのか。。

エラー内容は以下みたいな。

An uncaught exception was raised
~~
Terminating app due to uncaught exception 'NSInvalidArgumentException'
~~
libc++abi.dylib: terminating with uncaught exception of type NSException

ちょっと話は違うけど、以下を読んで、ふとプライバシーの設定のことを思い出した。
https://github.com/openframeworks/openFrameworks/issues/6193

コンソールのエラーログにもセキュリティ的な話がなく、
再起動しても、新しくoFの環境作ってVidoGrabberExampleをビルドしても、同様のエラーが出ていたので、悩みました。
気づいてみれば簡単なことなのに、、残念な経験は案外忘れているんですね。


iOSアプリの設定で変数など管理

iOSアプリを作ったときに、
アプリを入れたあとで、コンテンツの中身を書き換えたい場合。

たとえば、
OSCを使うためIPアドレスをアプリに設定したい。
アプリの向きを変えたい。
デバッグモードのトグルで切り替えたい。
などなど。

上みたいな設定ができると、作ったアプリにちょっと愛着わいてモチベ上がる。

サイネージのお仕事でiPadなどの端末からコンテンツを操作するということが
最近ふえたので、そのときにしておくと親切なTipsです。

openFrameworksでiOSを開発する際にはofxSettingsが便利でした。
https://github.com/prossel/ofxSettings

 


詳細な設定は文末の参考リンクにまるなげ。

設定の大体の流れは、
1. srcなど右クリックでSettings.bundleファイルを追加する。
2. Root.plistに表示したい項目を追加。
3. Keyの値を利用して、端末の設定画面で入力した値をアプリ起動時などに変数へ格納する。(ofxSettingsではSettings::get~()で取得)
4. 取得はせず設定画面に表示したいだけの場合はKeyの値を利用してSettings::set~()で。
5. ビルド時の情報を表示させたい場合は、BuildPhases

 

APP_VERSION=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" $PRODUCT_SETTINGS_PATH)
/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:9:DefaultValue ${APP_VERSION}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Settings.bundle/Root.plist"

date=$(date "+ @ %Y.%m.%d %H:%M")
BUILD_NUMBER=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" $PRODUCT_SETTINGS_PATH)$date
/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:10:DefaultValue ${BUILD_NUMBER}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Settings.bundle/Root.plist"

RunScriptで上のような記述をします。
1行目:APP_VERSIONという変数にxcodeで指定しているアプリのバージョンを代入
2行目:plistのitem9DefaultValueをAPP_VERSIONに書き換え
みたいな感じでしょうか。
何項目め、みたいな指定しかできないのかな。ちょっと調べてみたけどなさそう?

xcodeからAddRowとかして追加するとなんか表示変になっていたりすることがあるので、plistファイルを他のエディタで開いてxmlとして直接編集した方が無難かも。
xcodeで編集できる方がitemのナンバーとかわかりやすいけど。

'date=$(date "+ @ %Y.%m.%d %H:%M")' などを追加して
ビルド時の日時なども記載しておくとデバッグなどでは便利かも
http://goozenlab.com/blog/2015/02/06/versionning/


参考
https://dev.classmethod.jp/smartphone/iphone/settings-bundle-acknowledgements/
https://qiita.com/akatsuki174/items/392cb3be619fabfa4608

 

IPアドレスを取得する_oF_osx(C++)

openFrameworksなどでアプリを動かしているPCのIPアドレスを取得したい。

Mac OSXの話。
参考(というかほぼまるまる):
http://www.geekpage.jp/programming/linux-network/get-ipaddr.php

oFなどでofMain.hをincludeしていれば
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>
#include <arpa/inet.h>
のインクルードでOK

ネットに繋がっていない場合は
255.127.0.0
とか返ってきた。(要検証)

ネットに繋がっていない状態でも何かしらそれっぽいIPアドレスが返ってきたので、
[*] check good IP のところで、最後の値を見て、感でぽい処理を追加しただけ。

OSCを使うとき、IPアドレスで確認して接続+立ち上げするようにすれば、
とっても親切で徳が高い。

ちなみにiOSでも上のコードで取得できた!シンプルでよき。

WindowsではWinsockを使うとできそう。
個人的にはいまのところ需要ないので、またこんど。
https://clown.hatenablog.jp/entry/20081225/p1

 

 

openFrameworksよく使うスニペット

私がよく使うスニペット?定型?的なものをGistにまとめていきます。
今後も時々更新します。たぶんぜったいこうしんします。

参考になれば幸いですし、できれば人のものも知りたい。。
ちなみに環境はMac、oF0.10.0で使うものが多いですが、特に関係なく使えるものが多いはず。

 

ちなみに私はこういったものをポンと出せるように
Clipy(https://clipy-app.com/)というアプリを使って活用しています。
わりかし便利な気がしていますが、ほかにもオススメな方法があればぜひ教えていただければ幸いです🙇‍♂️

ofxGLSLSandboxファイル監視して更新したら自動で反映

openFrameworksでshaderを使いこなせるように勉強中です。

いろいろ試すのに、yoppa先生製のofxGLSLSandboxってアドオンがとても便利そうです。( https://github.com/tado/ofxGLSLSandbox
GLSL Sandbox( http://glslsandbox.com/ )ってサイトで誰かが描いたシェーダーをコピペでポンで動くみたいです。

 

至極恐縮ですが、ofxGLSLSandboxを少し改造して、自動でファイル監視してcmd+sとかでファイルを更新したら自動で描画に反映されるようにしました。https://github.com/shiyuugohirao/ofxGLSLSandbox

取り急ぎ、OSX oF0.10.0でのみテストしました。

以下シェーダー勉強しながら思ったことをメモしておきます。📝

openFrameworksでshaderを書く際は、bin/dataフォルダにshaderフォルダを作って、そこに.fragや.vertを置いておくことが多いと思います。私の場合は。

雑な紹介ですが、
以下みたいにXcode上でファイルを紐付けると同じプロジェクトファイル内でshaderも編集できるのでいい感じでおすすめです。


srcで右クリックー> Add Files to ~~~


shaderフォルダなどをAdd


oFのプロジェクト内で .frag .vertなど編集できる!

他にもっといいやりかたあるかもだけど。

 


ついでにopennFrameworksでファイル更新の監視プログラムについても。

調べてみたらC++のfilesystemライブラリの中にファイル更新時の取得ができる関数がありました。

string fileName =  ofToDataPath("absolutePath.ooo", true);
long latestUpdate = std::filesystem::last_write_time(fileName);

ポイントは絶対パスを指定するところ。恐らくこうしたほうが確実に更新日時取得できるはず。
ファイルパスをうまく指定できないと、last_write_timeが実行されたときに、ファイルが見つからず落ちてしまうので、パスが正しいかどうかのチェックを入れてから実行するべき。
今回は、ofFile::doesFileExist(fileName)) で一応チェックしてから更新日時取得するようにしてます。

あとは、update()のなかで毎フレームチェックするか、重そうならif(ofGetFramerate()%10==0) みたいにして数フレームごとにチェックするかすればよき。

ちなみに、last_write_time の戻り値は 例えば 1234205545 みたいな整数が返ってくる。
どうやら「1970-01-01 00:00:00からの経過秒数で最終ファイル更新日時」とのこと。(参考)

今回は更新日時に変化があるかどうかだけ見れば良いので、整数のまま比較して〜ごにょり。

詳しくは、改造しましたソースコード を見ていただけると。
ぇぃゃーで公開しているので何かあればコメントいただけると🙏

shaderいっぱい試してがんばります👩‍🎨

http://glslsandbox.com/e#45998.0