見出し画像

ラズパイによるデスクトップオーディオ環境構築 その4

mpd_gui以外ないのか?

その後、暫くはVolumioのマイナーアップのたびに、必要ライブラリがインストールできるようになったんじゃないかという根拠のない期待と失望を繰り返し、平行してmpd_gui以外に同じようなものがないか探す日々が続きました。で、前者は断念。後者は根気よく探していたらVolumioの「Pirate Audio」なるプラグインが使えそうなことをようやく発見し、試してみました。

Pirate Audio プラグイン

Pirate AudioはST7789 LCDとボタン、オーディオアウトがついた小さいボードみたいなんだけど、このVolumioプラグインはPythonで書かれているので手を加えやすいんで、ソースからLCD関連以外の部分はごっそり削って動かしてみました。うーん、なんだかダサい。。。何故ダサいのか。。。
そうね、動きがないのよ、画面から溢れる長いタイトルみたいなのもスクロールしないし。まぁ、動かないってことは、それだけCPU負荷も高くないってのはいいんだけどね。それ以外にも、画面レイアウトをサムネールを画面いっぱいに表示して文字をオーバーラップさせてるんだけど、なんか見づらい。

一応、タイトルはスクロールするように改造してみたものの、そうするとCPUも結構喰っちゃうんでイけてないなぁ。。。なんか、許せない。せっかくソースいじくって改造したんだけど、これ以上改善が見込めないのでお蔵入り。

Rust

やっぱり、比較的非力なマシンで、ぐるぐるずーっと回しっぱなしのプログラムをpythonみたいなインタプリタ言語で動かすのって、アセンブラ、C言語で育って貧乏が身に染みついている昭和生まれのおじさんには抵抗あるんだよね。といっても、今更C/C++でラズパイ用のプログラム作るのはしんどいしなぁ(プログラム本体というよりも、使えるライブラリ揃えたりするのが大変そう)と諦めていました。
そんな折、本件とは関係なく最近Rustなるコンパイラ言語がポストC/C++として流行ってるってのをきいて、面白そうなので勉強し始めました。環境構築も楽だし、必要なライブラリもCargo.tomlに書いておきゃ、コンパイル時に勝手にとってきてくれるし、環境もそれ程汚さないし、こりゃいいや。で、さらに調べると、ラズパイ用のクロスコンパイル環境もPC上に簡単に構築できるじゃん。これ、使えないかな?と、閃いたわけです。

結局ほぼ一から作ることに

最初にRustでst7789表示用のライブラリってあるのかな?って調べたら、ちゃんとあるじゃない。(後述するが、これが甘かった。。。)

https://crates.io/crates/st7789

じゃあ、アプリ本体の動作部だけ作ればよいか。さらに上記のライブラリにPC環境で疑似的にLCディスプレイ動作を確認できるシミュレータウィンドウも付いているので開発中の確認も楽だし。
つーことで、本体のプログラムを書き始めます。レイアウトはmpd_guiの見た目を丸々パクリました。mpd_guiクローンって言ってもいいかも。ただし中身の処理は完全オリジナル。というか、mpd_guiのソースを解析しながら、C++をRustにポーティングするよりも、作り直した方が早い。ただね、動作自体は単純なので、悩むことないんだけど、新しい言語はなかなか手ごわいわぁ。C/C++の自由度故の不具合を削減するため、色々な概念と制約増やした言語なんでコンパイルなかなか通らん。それもあって、プロシージャ間で共有したり状態保存しておいたりするデータ設計もこれまでと発想換えにゃならんしね。。。パフォーマンスを重視しつつ構造化をどこまでやるかっていうデータ、モジュール設計は腕の見せ所ってわけで。でも、なんとかできた。PC上での動作確認もできた。
さぁ、じゃあ、シミュレータウィンドウではなく、対象をst7789に切り替え、ラズパイ用にコンパイル!何?ライブラリのリンクが失敗するぞ、なんじゃこりゃ?うーん、どうやらこのst7789ドライバ、組み込み用でラズパイやPC上での動作意図したものではないらしい(というか、最初に確認しておけっていう話なんだな)。。。がちゃがちゃと色々試してみたがだめだ。。。事態が好転しない。。。どうする、ここまでやって断念か。。。「しかたない、ST7789の表示制御部分も自作するか。。。」

st7789制御部のコーディング

幸い、st7789を制御するためのGPIO、SPI通信のためのラズパイ用のライブラリはまともそうなのがあったので、こいつを使ってやろう。

実はGPIOとかSPIって何よ?ってとこから始めたので、なかなか苦労しました。rppalライブラリの仕様も英語でさぐりさぐりなので、どうも上手く動かんと思ったら、SPIにデータ送る部分でCSの制御をせっせと書いていたけど、実はライブラリ側でそこはやってくれてたのでいらなかったとかね。さらにPCでコンパイルしてはラズパイに転送して動かして確認を繰り返すって感じなので。。。なかなか面倒。
まずはディスプレイに絵が表示できたときはホッとしたなぁ。これで進めると。で、よくST7789のデータシートみたら、画面ローテーションはディスプレイ側でできるじゃん。本体アプリ側でLCD転送用のイメージに変換する際に回転させる処理入れてたけどH/Wでやってくれるってんならその方が速いわ。で、回転させるコマンド送ってやってみたら、あれぇ、絵がずれるじゃないの。データシート見ても書いてないし(英語なので隅から隅まで読めてるわけでもないが)、俺の個体が不良品?しかたなく、グーグル先生に「st7789 orientation fail」あたりのワードで検索を繰り返し、やっと該当する症状の人に遭遇し、そもそもの仕様で回転するときはこのシリーズのそれぞれの画面サイズに合わせて表示位置のオフセット調整しなきゃならんことが判明。しらんわ、そんなん。でも解決。

どうっすか?なかなかCoolでしょ? ラズパイにターミナルで入ってtopで見たら、mpd_guiでは30%近かったCPU不可が7~8%に!おぉぉ、作ったかいあったわぁ。mpd_guiで結構CPU喰ってたんだなぁ。mpd_guiはc++で実装してたけど、opencvのライブラリ使ってたからその辺りで結構重かったのかなぁ。
ということで、こちらについても下記のGitHubで公開しているので、よろしければご自由にお使いください。
ちなみに、ほぼ初めてRustで作ったプログラムなので、コンパイル時に死ぬほどワーニングが出ます。また、モジュール化もイケてない気がしますが、その辺りはお許しくださいませ。

さて次は…

はい、ということで4回に渡って、私のラズパイ+Volumio環境と拡張について紹介しました。いかがだったでしょうか?
ラズパイが手に入りづらい状況がまだ暫くは続くようで、これから始めてみようって方には却って歯がゆい思いをさせてしまうかもしれませんが、その点はごめんなさい。
次ですが、表示部分に隙間があるのでスペクトラムアナライザみたいな視覚エフェクトでも出してみたいなぁ。どうやるか、さっぱりわからんが、ちょっと探したらパクれそうなのは見つけました。
それ以外にも、もし「こんなことできないの?」ってのがあれば、今後の参考にしようと思いますので、お寄せください。ではではwww


この記事が気に入ったらサポートをしてみませんか?