gp_widget~関連関数の取り扱いについての覚書。
概要
gp_widget関連関数は、PTP経由でカメラを制御(オペレーション)するための、属性(オペレーションコード)とその値を取得、設定するためのものになる。
属性は、わかりやすいように名前(文字列)で管理されている。
属性の型はgphoto2では9種類に分類されており、それぞれの型に対して取り扱える値の型が決まっている。
属性の型はCameraWidgetTypeで表されているが、実際プログラムで使うのは、GP_WIDGET_MENU、GP_WIDGET_RADIO、GP_WIDGET_TEXT、GP_WIDGET_RANGE、GP_WIDGET_DATE、GP_WIDGET_TOGGLEになると思う。
GP_WIDGET_MENU、GP_WIDGET_RADIO、GP_WIDGET_TEXTはchar*、GP_WIDGET_RANGEはfloat、GP_WIDGET_DATE、GP_WIDGET_TOGGLEはintが値として設定可能な型になる。
カメラからのデータ取得・反映
以下の2種類ある。
- gp_camera_get_single_config、gp_camera_set_single_config
こちらは1属性のみ、カメラから取得・反映することができる。 - gp_camera_get_config、gp_camera_set_config
こちらはカメラで設定可能な全属性を取得・反映させることができる。
両方とも受け取りはCameraWidget構造体だが、この構造体でリスト管理が行われ、後者の全属性取得ではCameraWidgetのリンクリストが作成される。
CameraWidgetのライフ管理(注意点点)
実装を見ると、結構雑な感じがしている。
一応、以下のような感じ。
- 生成
gp_camera_get_single_config、gp_camera_get_config - 破棄
gp_widget_free
ただ、生成用関数内で既存の変数のチェックはしていないので、生成関数ですでに生成済みのCameraWidget変数を渡すことは厳禁。メモリーリークのもとになる。
必ずgp_widget_freeで開放する必要がある。
あとCameraWidgetには参照ポインタらしきものが実装されているが、ライブラリ中では全く使用されていないので使わない方がいいかもしれない。
gp_camera_get_single_configで1属性取り出すための実装の一部には、gp_camera_get_configで全体を取り出したのちCameraWidgetのリンクリストから1属性を見つけ出し上位側に返すことをしているのだが、リンクリスト中の1つを参照形式で渡せば処理も楽だと思ったのだが、コピーを作成して渡しているのが見て取れた。
属性情報のカメラ側への反映
gp_camera_get_single_config、gp_camera_get_configでは、CameraWidgetという属性管理用の箱が用意される。
CameraWidgetに対して、値設定を行うのだが、カメラ側に反映させるにはgp_camera_set_single_config、gp_camera_set_configを呼び出す必要がある。
gp_widget_set_valueではCameraWidget内への反映でしかない。
カメラ側で変更された情報の反映
取得後、カメラ側でも属性が変わる可能性がある。
例えば、シャッタースピードや絞り値など。
これら変更があっても既存のCameraWidgetに直接伝わるわけではなく、gp_camera_get_single_config、gp_camera_get_configで再取得する必要がある。
この際に注意するのがライフ管理。変数の使いまわしをする場合は、事前にfreeをしておく必要がある。
もしかしたらgp_camera_wait_for_eventで検知可能かもしれない。
GP_EVENT_UNKNOWNイベントで属性が変更された際のイベントを拾えるようなことがサンプルで定義されていた。
ただ実装が結構特殊すぎるようだったので実際に利用するのは難しいかもしれないが。
補足
サンプルソースのfocus.cのcamera_eosviewfinderで属性の名前として”eosviewfinder”を使っていたが実際は”viewfinder”。
2.5.6で変更が入ったようだけど、サンプル側の追従はされなかったのね。
コメント