MemoryView関連の考えたこと
#MemoryView #Ruby
オーディオデータをRubyのMemoryViewで扱う時のこと
MemoryViewを扱う時のメモリーの解放について
RubyのMemoryView入門
困ったこと
rb_memory_view_available_pやrb_memory_view_getがfalseを返す際に理由を伝える方法
今だと標準エラーに出力するか、
インスタンス変数に入れるか
そもそもこれらの関数の中から例外起こしていいのか分からない
実装を読んで判断することはできるが、それは規約と思っていいのか
同じ意味のフォーマットが複数ある時どうしたらいいか
厳密に同じでなくても、エンディアン違いとか
勿論列挙するのがいいのだが、コンシューマー側のチェックで漏れそう
GStreamerより
24ビットのアイテムとかのエクスポート
formatなのかアイテムサイズなのかそれ以外なのか
複数のフォーマット文字列の組み合わせ(CCCとか)で実質対応できそうだが、説明を読むと意味は違ってしまう
イテレーター
メモリー上連続じゃないことがあり得る
等間隔で並んでいないかもなのでsub_offsetsではだめ
いやいけるのか……?
RBS対応
code:txt
今日は。
ここ二、三年、細々とMemoryViewを触る開発としてきたので、二件、実際のユースケースを報告したい、と思って投稿します。
問題を伝える方法が分からない
-----------------------
rb_memory_view_available_p_func_tは、問題がある時にfalseを返すことになっていますが、フラグによる要求には応えられない、オブジェクトの状態に問題がある、など、問題の種類もユーザー側に伝えられると嬉しいと思いました。Rubyでは通常例外を使うと思いますがrb_memory_view_available_p_func_tの中では例外を起こしてはいけないと理解しています。現在はrb_warnで問題を出力してからfalseを返すようにしていますが、例えば例外を受け取るポインターを引数に追加するのはいかがでしょうか:
`c
typedef bool (*rb_memory_view_available_p_func_t)(VALUE obj, int flags, VALUE *error);
`
対応フォーマットが足りない
----------------------
GStreamer gemのデータをMemoryViewとしてエクスポートしようとした際、フォーマットが足りませんでした。
GStreamerではリトルエンディアンの24ビット整数(S24_LE)などがサポートされています( https://gstreamer.freedesktop.org/documentation/audio/audio-format.html?gi-language=c#GstAudioFormat )が、これらはMemoryViewのフォーマット用の文字列では表現できませんでした。サイズだけならcccのように既存フォーマットの組み合わせで表現可能ですが、意味が違ってしまいます。
更に、有効なアイテムサイズは24ビット単位だが、ストライドは32ビット単位で、余った8ビットは無効、というデータも存在します。これは現在のMemoryView仕様では表現できません。
僕自身はこれらのフォーマットは使わないですし、GStreamerはかなり汎用的に定義されているようなので、他の人もあまり使わないのではないかと思うのですが、対応できなかったのは事実なので報告しておきます。
フォーマット文字列を増やすか、符号、型、大きさ、エンディアネスの組み合わせ(S24_LEなど)でアイテムの特徴を表現するのはいかがでしょうか。
以上です。
狭い範囲で、断続的にやってきているだけなので、視野の狭い提案かも知れませんが、今後の開発の何らかの参考になったら嬉しいです。
詳しく書いた方がいいことがあれば遠慮なく言ってください。
Feature #22066: MemoryView feedbacks: error reporting and lack of formats - Ruby - Ruby Issue Tracking System