mieki256's diary



2021/08/14() [n年前の日記]

#1 [ruby][dxruby] Rubyのfiddleを勉強中

bassrb (Bass.rb) を fiddle を使って動くように修正しようとしているけれど、そもそも Ruby の fiddle の使い方だの、C言語のデータ型がよく分からないので、そのあたりを勉強しつつ作業中。

Ruby の fiddle は、.dll, .so 等のダイナミックリンクライブラリを扱うためのライブラリ、だそうで。

_library fiddle (Ruby 3.0.0 リファレンスマニュアル)

とりあえず分かってきたことをメモ。

boolとBOOLは違う。bool はC言語(?)のデータ型、boolean型で、BOOL は Visual C++ で使うデータ型だそうで。実際には BOOL は int で、false が 0、true が 1 になっているっぽい。bass.h の中で、戻り値が BOOL の関数? メソッド? がたくさんあるけれど、その場合戻り値は int として扱っていいらしいなと…。

DWORD は int か uint32_t で置き換えることができる。

QWORD というデータ型が bass.h に出てきたけど、uint64_t で置き換えればいいらしい。

fiddle/types を使えば、BOOL や DWORD をそのまま記述できるようになるっぽい。ただ、dlload をした後で include Fiddle::Win32Types を記述しないとダメらしい。
module M
  extend Fiddle::Importer
  dlload "bass.dll"
  include Fiddle::Win32Types
  ...

fiddle の dlload "bass.dll" で .dll をロードできるはずが、Ruby のバージョンによっては「そんなファイルは見当たらない」とエラーになってしまう。Ruby のバージョンによっては、.dll を探す場所が違うという話を見かけた。とりあえず、以下のような書き方をして、「スクリプトファイルのある場所に .dll もあるはず」という前提で絶対パスを渡して誤魔化してみたけど、これで合ってるのかどうか…。
  module Bass
    bassdllpath = format("%s/%s", File.expand_path("..", __FILE__), "bass.dll")

    extend Fiddle::Importer
    dlload bassdllpath
    ...

bass.h の中で float が出現するけれど、C言語の float と Ruby の float は違うようで…。 オリジナル版 Bass.rb では、ひとまず引数として int を受け取るという記述をしておいて、以下のような書き方をして引数を渡していたけれど。
    BASS_ChannelSetAttribute = Win32API.new("bass", "BASS_ChannelSetAttribute", "III", "I")

    ...

        ::Bass.err if BASS_ChannelSetAttribute.call(@ch, 2, [v].pack("f").unpack("I")[0]) == -1
fiddle の場合はどう記述するのが妥当なのだろう…。とりあえず、以下のような書き方をしてみたけど…。
    extern "int BASS_ChannelSetAttribute(int, int, float)"

    ....

        ::Bass.err if ::Bass.BASS_ChannelSetAttribute(@ch, 2, [v].pack("f").unpack("f")[0]) == 0

Bass.rb の中に出現する「::」が分からない…。何だコレ…。ググってみたら「トップレベル」云々という言葉が出てきたけど…。よく分からないけど、module Bass の中のメソッドを呼びたい時は、::Bass.hoge() と書けば呼べる、ということでいいのだろうか。

参考ページ。 :


以上、1 日分です。

過去ログ表示

Prev - 2021/08 - Next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project