2025/2/4(火)

今週の胎界主を読んだ。ソロモンの癇癪マジでカスすぎる。さすがにこの中で一番有能なのメフィストだろうに、真っ先に壊そうとなるの何にも後先見えてない。「凡夫の中ではまだマシ」って、能力的にはかなりの上玉ですよこの三人。

というかそもそもソロモンとアスを統合するという点においてはサタナキアとソロモンの思惑は一致してるんだよな。ピュアが自由過ぎる。


なんかlibsoundioが静的ライブラリとしてビルドしてリンクしてるはずなのにdllに依存するようになるなあと思っていたのだが、vcpkgのものを勝手に取りこんでいたらしいことが分かった。もう金輪際vcpkg integrate installはしないしマニフェストモードでしか使わん。

vcpkgに頼らない方法を一応確認したく、WindowsMSVC環境での正しいビルド方法を探っては見たがよく分からない。一応以下の対応は以前にやっていた。

  • exampleやtestでPOSIXのunistd.hをインクルードしているのでビルドしないようにする。
  • /experimental:c11atomicsをオプションに加える。

しかしIID_IAudioClientやらが存在しないというリンカエラーに困った。

wasapi.cを覗いてみたところ、C++でコンパイルすればIIDを定義してくれるっぽいので、C++でコンパイルするのが正規ルートのようだった。コンパイルオプションで/Tpを加えると.cでもC++としてコンパイルしてくれる。しかしそうするとリンカエラーが起きてしまって結局ビルドが通らないのだった。dumpbinでオブジェクトファイルを覗いてみると、いずれも自分の所の関数をCリンケージで公開しているのにC++リンケージで取り込もうとしている。これではビルドが通るはずがない。

ライブラリのソースコードに手を加える訳にはいかないので、結局ライブラリを利用する自分側のコードにIID定義を貼り付けてビルドを通した。絶対こうじゃないと思う。

それはそうと、簡単な効果音を流すようなデモを作れた。最大64msの遅延がどの程度不自然に感じるかを確かめる目的だ。端的に言って、強く意識すれば不自然だし、意識しなければ聞き流すような遅延だ。これならまあ個人的には強いて対処しなくてもいいかなと思う。

Windowsだと64ms遅延にしないと安定しなかったのだが、Macだと20msで行けるしなんならwrite_callbackに渡される値の都合から20ms固定だった。本当にWindowsのオーディオはカスなんだな。

折角GLFWとlibsoundioというマルチプラットフォームのためのライブラリを使っているのでMacOSでもすんなりビルド通るかなと思ったが、見通しが甘かった。

  • libsoundioの2.0.0ではビルドが通らない。最新のmasterブランチを取り込んだらビルドが通った。kAudioObjectPropertyElementMasterkAudioObjectPropertyElementMainになる変更があったらしい。
  • 一部のライブラリがリンクできていないようなエラーが出た。以下の記述を加えなければいけなかった。(参考)
if(APPLE)
        find_library(CORE_AUDIO CoreAudio REQUIRED)
        find_library(AUDIO_TOOLBOX AudioToolBox REQUIRED)
        target_link_libraries(
                app PRIVATE
                ${CORE_AUDIO}
                ${AUDIO_TOOLBOX}
        )
endif()

この程度の改修で通るのだから儲けものと言えば儲けものなのだが、もうちょっとlibsoundioちゃんとして欲しいとは思った。glfwは何も引っかからなかったのに。


libsoundioがCリンケージのせいでビルド通らない問題について粘ったところ、コマンドラインオプションで/Tpを追加するのではなくVisual Studioのプロジェクトプロパティで「C/C++」→「詳細設定」→「コンパイル言語の選択」→「C++コードとしてコンパイル(/TP)」を選択したらなんと通った。あとはこれをCMakeから設定できると良いのだが。

ChatGPTを苛み続けたところ、VS_SETTINGSというプロパティが存在することが分かった。これでCompileAs=CompileAsCppとすればソースファイル単位では設定可能だが、残念なことにターゲット=VSプロジェクト単位では設定できないらしい。

https://cmake.org/cmake/help/latest/prop_sf/VS_SETTINGS.html

そこで調べを進めたところ、どうやらVS_xxというようなプロパティがかなり大量にあることが分かった。もちろんVisual Studioだけが優遇されている訳ではなく、個別のツールに依存した設定を操るプロパティが結構あるみたいだ。

https://cmake.org/cmake/help/latest/manual/cmake-properties.7.html

この中でVS_USER_PROPSというプロパティに目を付けた。これは今まで知らなかったのだが、VisualStudioにはプロパティシートという仕組みがある。これはプロジェクトのプロパティを部分的に保存してファイルに切り出して取って置ける仕組みだ。これを上手く使えないかと思った。

CompileAsの設定をしたプロパティシートをファイルとして取っておき、VS_USER_SETTINGSで設定する。すると思惑通り、CompileAsの設定をぶっこむことができた。何とすがすがしい気分だ。

コンパイルは無事通った。完全勝利である。

その他、ビルドしたものを友人にも試してもらおうとしたらVisualStudioの再頒布可能パッケージへの依存問題が発生した。これもCMakeのプロパティで解決して、MSVC_RUNTIME_LIBRARYの設定で解決した。

https://cmake.org/cmake/help/latest/prop_tgt/MSVC_RUNTIME_LIBRARY.html

依存ライブラリについてもこれの設定をするのがミソだ。しかしこいつだけVC_でなくMSVC_なのはなぜなのか。

Categories: