傍迷惑な優等生?
作者的には、数日前に今年の2月に発売開始されたMac mini M2 Proを購入したのだが、インストールされていたOSは、当時の最新OSである所のmacOS Ventura 13だった。
今現在のmacOSの最新バージョンは、macOS Sonoma 14になるので、既に、古いバージョンになっていたので、Sonomaに更新しようかなあ、とも、思ったのだが、最新OSには色々と不具合があるかもしれないので、暫くは、Venturaで運用する事にした。
しかし、これからリリースしようとしているTiExtender Ver1.4.3については、巷の最新OSである所のSonomaでの動作確認は必要なので、MacBook Pro 13インチ M1モデルは、Sonomaにアップグレードした。
なので、Mac mini M2 Proを使って開発していたバイナリは、MacBook Pro 13インチ M1モデルでも、動作確認したのだが、カスタムビュー関連の描画が異常になり、マトモに使えない事が判明した。
もっとも、現行バージョンは、Sonoma登場以前に開発し、公開していたのだが、そのバイナリだと、そんな現象は発生していない。
と、いう事なので、SonomaでOSの仕様が変わってしまって従来のソフトが動作しなくなったのか、というと、そんな感じでも無かった訳だ。
しかしまあ、前述の異常というのは、描画されるビューが、本来なら、親ウインドウの一部に表示されなければならない所が、その全体に表示されてしまっている様な感じだった訳だ。
なので、座標系か何かの処理関数が、最新OS用にビルドされたバイナリに限り、変更されたのかなあ、と、思ったりもしたのだが、デバッガで表示すべき座標計算の結果を見てみると、正常に計算されていた。
にも関わらず、描画用の処理関数を呼び出すと、異常な表示になってしまったので、どうしたモノかなあ、と、焦ったのだが、ネットで調べてみると、以下の様なページが見つかった。
drawRect broken in Xcode 15/Sonoma
なので、Xcodeで前述のWindowに載せているカスタムViewのプロパティを見たりしてみたのだが、そこには、「Clips Bounds」という項目が追加されていて、その値は「Default (No)」になっていた。
このため、その値を「Yes」に変更してビルドしてみた結果、従来通りの表示が行われる様になったので、事なきを得たのだが、上記のプロパティは、同じXcode 15.0.1を使っていても、Ventura環境では出てこない。
つまり、Xcode的には、動作中OS用のSDKを利用していて、上記のプロパティ変更はSonoma用のSDKから適用されるので、Ventura環境では、問題となるプロパティは表示されない訳だ。
と、いう事で、Ventura環境でビルドしていると、Sonoma用のセッティングが出来ない! という事になってしまったので、今回の公開バイナリは、せっかく購入して使い始めたMac mini M2 Proモデルではなく、MacBook Pro 13インチ M1モデルでビルドしたモノになる予定だ。
ちなみに、今回、もう一つ、可笑しな現象をなくしたのだが、その現象というのは、以下のページに書かれている現象に酷似していた。
iOS 16 RemoteIO: Input data proc returned inconsistent 2 packets
具体的には、mp4形式でエンコードすると、以下の様なメッセージがXcodeのコンソールに山の様に出力される! というモノだった。
CompositeAudioConverter.cpp:1,236 Input data proc returned inconsistent 1 packets for 4,096 bytes; at 4 bytes per packet, that is actually 1,024 packets
上記の様なメッセージは表示されるものの、エンコード自体は正常に行われていたので、作者的には、上記はワーニングの一種で、特に気にする必要はないかなあ、と、思ったりもしていたのだが、前述のページでは、これはエラーだ! みたいな扱いをしていた訳だ。
なので、作者的にも、こんなメッセージが山の様に表示されると、問題が出る場合もあるかもしれない、と、いう事で、何とかしようとしたのだが、前述のページや、似た様な同じ問題のページを見ていると、原因は、macOS内部での音声データのデフォルトが、従来はshortだったのが、あるタイミングで、floatに変更されたために、macOS内部の処理系のバグが顕在化する様になったのが原因だ! みたいに書かれていた。
つまり、作者的にも、音声データはshortデータとして扱っていたのだが、macOS的には、それを受け取ってfloatデータに変更する処理ルーチンにバグがあり、上記の様なワーニングメッセージが発生する様になったんだなあ・・・、と、思ったので、与えるデータを考えられる限りのfloatデータに変更してから、渡す様にしてみた。
しかし、表示されるメッセージは微妙に変わったものの、returned inconsistent 1packets for の部分については変わらなかった。
と、いう事で、どうしたモノかなあ、と、思ったのだが、作者のコードを真面目に調べてみると、macOSに音声データを与える場合に作成するサンプルバッファ(CMSampleBuffer)生成用の処理関数である所の「CMAudioSampleBufferCreateWithPacketDescriptions」の引数の一つである「numSamples」に、固定値で、「1」を設定していた。
この引数の説明はAppleのDeveloper向けDocumentによると「Number of samples in the CMSample. Must not be 0.」、と、だけ書かれていた。
なので、「Must no be 0.」の部分に注目すれば、別に、「1」でも問題はない筈で、実際、Mac mini Late2014の「macOS Monterey 12」で、同じコードをビルドして実行してみても、上記の様な警告メッセージは表示されなかったし、多分、作者的には、上記のコードは、ネット上にあったサンプルプログラムか何かからコピーして使っていた筈だ。
でなければ、固定値を使用したりはしていなかった筈で、つまり、少なくとも、何年前かには、上記の様な処理関数のパラメータ設定は正しいモノとして巷に出回っていた筈な訳だ。
もっとも、同じ警告メッセージは、「macOS Ventura 13」のMac mini M2 Proモデルでは発生したので、この問題については、Sonomaではなく、Ventura以降の問題なのか、Appleシリコン搭載デバイスでのみ発生する問題なのかは切り分けできていない。
何にしても、上記の「1」をサンプルバッファに入る事になるサンプル数に変更してみると、上記の警告は発生しなくなったので、macOS的には、ある時点から、元々は0ではない事だけを確認していたnumSamplesの値を真面目に検証する様になり、正しくない場合には、警告メッセージを表示する様にした感じだ。
と、いう事で、前述のデフォルト値変更だとか、この長らく無視していたパラメータの値をチェックする様にした! なんて行為は、この方が正しいでしょ? みたいな優等生的な行為に思えるのだが、実際問題としては、殆どの開発者的には、傍迷惑でしかない筈の今日この頃だ。

