電子辞書Brainをいじる (3) BrainuxでX11(X window system)とUSBサウンドデバイスで遊ぶ


BrainuxとX環境への接続について

Brainuxには、標準でX環境(X11[X window system])が利用できます。

X環境(X11[X Window system])の1つの特徴として、アプリケーションと表示するシステムが独立していて、アプリケーションを動かすサーバと、画面描画するサーバが別でも構わないことです。

X11はクライアント/サーバモデルで提供しているのですが、
あくまで画面描写が主体となっているため、一般的な認識とは逆になります。

・ここでの「クライアント」は、GUIを表示するプログラム(Xアプリケーション)になります。
・ここでの「サーバー」は、クライアント(Xアプリケーション)からの要求を受け付けて、画面に表示する内容を管理するプログラム(X11[X window system])になります。

Brainの画面でX11アプリケーションを利用するには、いくつかのパターンがあります。

  1. Brainを直接操作して、Brain上でXアプリケーションを起動し、Brainの画面で操作する
  2. Brainから他PCにsshでログインして、他PC上でXアプリケーションを起動し、Brainの画面で操作する
  3. 他PCからsshでBrainにログインして、Brain上でXアプリケーションを起動し、Brainの画面で操作する
  4. 他PCでログインして、他PC上でXアプリケーションを起動し、Brainの画面で操作する

起動操作Xアプリケーション実行Xアプリ表示(操作)
1.Brainを直接操作して、Brain上でXアプリケーションを起動し、Brainの画面で操作するBrainBrainBrain
2.Brainから他PCにsshでログインして、他PC上でXアプリケーションを起動し、Brainの画面で操作するBrain->他PC他PCBrain
3.他PCからsshでBrainにログインして、Brain上でXアプリケーションを起動し、Brainの画面で操作する他PC->BrainBrainBrain
4.他PCでログインして、他PC上でXアプリケーションを起動し、Brainの画面で操作する他PC他PCBrain

ここでは、以下を想定して、それぞれの方法での接続例を紹介します。

brain(IP:192.168.29.11) Brainux環境
他PC(IP:192.168.29.19) X11環境を持ったLinuxを想定

今回の環境的には、USBホストアダプタを使って、USBネットワークアダプタ経由でネットワークに接続しています。
(USBでホストPCを経由してネットワークに接続する(USB Ethernet Gadget)だと、他PCからBrainへの通信について制限が出てくるので、ホストPCがX11導入したLinuxであればいけるかもといったところ)


1.Brainを直接操作して、Brain上でXアプリケーションを起動し、Brainの画面で操作する

起動操作Xアプリケーション実行Xアプリ表示(操作)
BrainBrainBrain

これがBrainuxでの一般的な操作になります。
Brain上でBrainuxを起動する際には、「xinitrc」か「jvm」を選択して起動すれば、X環境が立ち上がります。

あとは、terminalを起動し、Xアプリケーションを起動してください。
DISPLAY環境変数にはすでに:0は設定されているので、明示的に設定する必要はありません。(xeyesは、マウスカーソルの方向を向く目玉のアプリケーションです。)

xeyes &

その他デフォルトで、x11-appsというパッケージが導入されているようです。
xeyes(目玉アプリ)以外にも、oclock(アナログ時計),xclock(アナログ時計),calc(電卓)、xedit(エディタ)、xmore(ビューア)あたりは普通に使えると思います。

2.Brainから他PCにsshでログインして、他PC上でXアプリケーションを起動し、Brainの画面で操作する

起動操作Xアプリケーション実行Xアプリ表示(操作)
Brain->他PC他PCBrain

Brainから、他PCにSSHログインして起動したXアプリケーションを、Brainの画面に出す方法です。
Terminalを立ち上げて、sshでログインする際に、-X オプションを設定することで、アクセス元のX環境に画面表示のリダイレクトをしてくれます。(DISPLAY環境変数は自動設定されます。)

ssh -X user@192.168.29.19
xeyes &

3.PCからsshでBrainにログインして、Brain上でXアプリケーションを起動し、Brainの画面で操作する

起動操作Xアプリケーション実行Xアプリ表示(操作)
他PC->BrainBrainBrain

他PCからsshでBrainにログインして、Brain上でXアプリケーションを起動する方法です。
他PCはWindows上でもputty等でのsshアクセスでもかまいません。問題ありません。
Brainのキーボードで直接入力すると、特殊なキーバインドの違いや反応の悪さなどで、他PCでアプリの起動をする場合等に使用できます(デバック向けかな)。

以下の通り、画面表示先を指定する、DISPLAY環境変数を手動で設定すればOKです。

export DISPLAY=:0
xeyes &

4.他PCでログインして、他PC上でXアプリケーションを起動し、Brainの画面で操作する

起動操作Xアプリケーション実行Xアプリ表示(操作)
他PC他PCBrain

これは、Xアプリケーションの実行ウィンドウのみを、Braiに表示させるものです。
ただし、Brain上で、X11側で、Xアプリケーションからの接続を許可させる必要があるため、通常と違う手順が必要です。

接続許可は、xhosts というコマンドを利用します。
ただし、Brainux標準では、xhostは導入されていないようです。

まずは、BrainにXアプリケーションからの接続を許可すためのコマンド(xhost)を導入します。
(一度導入すれば、大丈夫です。)

sudo apt update
sudo apt show x11-xserver-utils

次に、BrainでBrainuxを起動する際に、「shell」で起動してください。
(そのまま「xinitrc」か「jvm」で起動してしまうと、X接続用のポート(:0の場合6000)が閉じているため接続できません。)

shellが起動したら、以下のコマンドでXを起動します。

Brain上でXが起動したら、terminalを起動して、アクセス許可を設定します(X起動毎に設定が必要です。)
(今回は、”192.168.29.19″からのアクセスを許可するものとします。)

xhost +192.168.29.19

(なお「xhost +」とすると、すべての接続を許可する設定になってしまいます。セキュリティ的には非推奨になります。)
+はBrainのキーボードでは、「シフト+記号+F」ですが、入力がしずらい場合があります。

ここまで終われば、他PC(Linux)でTerminalを立ち上げて、
DISPLAY環境変数を上書き設定します。
(BraiのIPは192.168.29.11とした場合)

export DISPLAY=192.168.29.11:0
xeyes &

 

X環境への接続についての補足

上記の接続の組合せでも、X環境を利用することができます。
例えば、3の後に2をやることで、疑似的に4の接続にすることも可能です。
(4.の特殊なXnの立ち上げや設定が不要)

起動操作Xアプリケーション実行Xアプリ表示(操作)
他PC->Brain->他PC他PCBrain

2.Brainから他PCにsshでログインして、他PC上でXアプリケーションを起動し、Brainの画面で操作する
4.他PCでログインして、他PC上でXアプリケーションを起動し、Brainの画面で操作する

ssh user@192.168.29.11

export DISPLAY=:0
ssh -X nasubi@192.168.29.19

xeyes &

実際にやってみると、他PC上でXアプリケーションを起動する以下の方法では、
速度的にも問題なくアプリケーションを利用することができます。

これらは、俗にいう「シンクライアント」運用になります。
別PCに処理をさせて、結果のみBrainに表示させ、
BrainにUSBキーボードとマウスを付ければ、ハンドヘルドPCの出来上がりです。

また、これまでの説明の中のサーバ指定を逆にすれば、別サーバのX画面に、Braiux上で起動したアプリケーションを表示することもできますが、ここでは割愛します。

難点をいれば、現状Sound再生はされないといったところぐらいでしょうか・・・

参考
ローカルからリモートのXサーバにウィンドウを飛ばす

 

xterm の設定変更について(Xリソースファイルの管理)

lxterminaiは 40MB程度と結構メモリを消費するので、
メモリ消費量が比較的少ない(8MB)ターミナルとして
xtermも使えるようにしておきます。

ただxtermのデフォルトでは、白地に黒文字で目が痛いので
黒地に白文字に変更するためには、
xtermの設定変更として、Xのリソースファイルに追記します。

Xのリソースファイルは、アプリごとに以下のフォルダにまとめられています。
/etc/X11/app-default/

xtermの場合、/etc/X11/app-default/XTerm に追記します。

黒地に白文字に変更するには、ファイルの最後に、以下の行を追加します。

$ sudo vi /etc/X11/app-default/XTerm
xterm*reverseVideo:on

なお、ユーザ単位での設定では一般的に
~/.Xresourcesに追加するように書かれている資料もありますが、
Brainuxでは、このファイルを参照する様にはなっていないので、
もしユーザ単位でリソースファイルを切り替えたいのであれば、
~/.xprofileに、以下のような行を追加してみてください。
起動時に、~/.Xresourcesが読み込みされるようになります。

$ vi ~/.Xresources
xtermreverseVideo:on
x-terminal-emulatorreverseVideo:on

$ vi ~/.xprofile
xrdb -merge ~/.Xresources

 

JWMのメニューにアプリケーション(xterm)に追加する

現状JWMのメニューには、Terminal(lxterminal)しかアプリが登録されていないので、
xtermを追加してみます。

調べてみると、JWMのコンフィグは、以下にありました。
/etc/jwm/system.jwmrc

なお、ユーザごとにカスタマイズしたいのであれば、
先ほどのファイルを、~/.jwmrcにコピーすれば、これらの設定が優先的に使われます。

/etc/jwm/system.jwmrcファイルの先頭部分を確認してみると、
以下のようになっていました。

<?xml version=”1.0″?>
<JWM>
<!– The root menu. –>
<RootMenu onroot=”12″> <Include>/etc/jwm/debian-menu</Include>
<Program icon=”terminal.png” label=”Terminal”>lxterminal</Program>
<Separator/>
<Program icon=”lock.png” label=”Lock”> xlock -mode blank </Program>
<Separator/>
<Restart label=”Restart” icon=”restart.png”/>
<Exit label=”Exit” confirm=”true” icon=”quit.png”/>
</RootMenu>

ここで、メニューに、xtermの定義を追加してみます。
ついでに、Includeの行の下に<Separator/>も追加しています。
<Program label=”xterm”>xterm</Program>

$ sudo vi /etc/jwm/system.jwmrc

<Include>/etc/jwm/debian-menu</Include>
<Program icon=”terminal.png” label=”Terminal”>lxterminal</Program>
<Separator/>
 ↓
<Include>/etc/jwm/debian-menu</Include>
<Separator/>
<Program icon=”terminal.png” label=”Terminal”>lxterminal</Program>
<Program label=”xterm”>xterm</Program>
<Separator/>

設定に間違いがないか、以下のコマンドでチェックします。
jwm -p

最初は /etc/jwm/debian-menu ファイルがないため、そこは失敗しますが、
今回はその分はエラーでOKです。それ以外にエラーが出ないことを確認します。

では以下のコマンドで、設定をリロードします。
jwm -reload

すると、xtermが追加されました。

xtermをクリックすると、、定義したxtermが起動しました。

 

OSに登録されたアプリケーションをJWMに表示する

BrainuxはDebian11ベースのOSですので、DebianにAptコマンドでアプリをインストールすると、以下のフォルダにアプリケーション登録ファイル(*.desktop)が登録されています。
/usr/share/applications

この登録ファイルを元に自動でJWMの設定ファイルに変換してくれるツールを導入します
xdgmenumaker

$ cd
$ mkdir xdgmenumaker
$ cd xdgmenumaker
$ git clone https://github.com/gapan/xdgmenumaker.git
$ cd xdgmenumaker/
$ sudo apt install txt2tags
$ make
$ pip install pyxdg
$ make install
$ sudo touch /etc/jwm/debian-menu
$ sudo chmod 666 /etc/jwm/debian-menu
$ xdgmenumaker -n -i -f jwm > /etc/jwm/debian-menu

これで、以下のコマンドで、設定をリロードします。
jwm -reload

すると、apt経由でインストールしたアプリケーションの分のメニューが追加されました。


ただ、この状態だとaptでアプリを追加しても自動でメニューへの反映がされません。
JWM起動時に自動的に反映させてもいいのですが、起動してからJWMが操作できるまでにかなり時間がかかるため、「メニューの反映」をreload menuとして登録して、手動で登録できるようにします(アイコンが不要であれば-iオプションを消すとMenu動作が軽くなります)。

$ sudo vi /etc/jwm/reloadjwmmenu

#!/bin/sh
xdgmenumaker -n -i -f jwm > /etc/jwm/debian-menu
jwm -reload
exit

$ sudo chmod 755 /etc/reloadjwmmenu


作成したスクリプトをsystem.jwmrcに登録します。
<Program label=”ReloadMenu”>sh /etc/jwm/reloadjwmmenu</Program>

ついでに、VirtualKeybordも追加しておきました。
これで「.profile」で自動起動しなくてもよくなります。
<Program label=”VirtualKeybord”>xvkbd</Program>

$ sudo vi /etc/jwm/system.jwmrc

<!– The root menu. –>
<RootMenu onroot=”12″>
<Include>/etc/jwm/debian-menu</Include>
<Separator/>
<Program icon=”terminal.png” label=”Terminal”>lxterminal</Program>
<Program label=”Xterm”>xterm</Program>
<Program label=”VirtualKeybord”>xvkbd</Program>
<Separator/>
<Program icon=”lock.png” label=”Lock”>
xlock -mode blank
</Program>
<Separator/>
<Program label=”ReloadMenu”>sh /etc/jwm/reloadjwmmenu</Program>
<Restart label=”Restart” icon=”restart.png”/>
<Exit label=”Exit” confirm=”true” icon=”quit.png”/>
</RootMenu>

これで、ReloadMenuをクリックすれば、メニューの反映が行われます。

なお、標準ではxlockが入っていないので、不要であれば、Lockの行は消してください。
多分もっといい方法がありそうだけど、とりあえず動いたということで良しとします。

今は、Lockの行の代わりに、以下のように「OS Reboot」を設定すると、
JWMから再起動できるようにしています。

$ sudo vi /etc/jwm/system.jwmrc

<!– The root menu. –>
<RootMenu onroot=”12″>
<Include>/etc/jwm/debian-menu</Include>
<Separator/>
<Program icon=”terminal.png” label=”Terminal”>lxterminal</Program>
<Program label=”Xterm”>xterm</Program>
<Program label=”VirtualKeybord”>xvkbd</Program>
<Separator/>
<Program label=”OS Reboot”>
/usr/bin/x-terminal-emulator -e sh -c ‘echo run Reboot;sudo reboot’
</Program>

<Separator/>
<Program label=”JWM ReloadMenu”>sh /etc/jwm/reloadjwmmenu</Program>
<Restart label=”JWM Restart” icon=”restart.png”/>
<Exit label=”Exit” confirm=”true” icon=”quit.png”/>
</RootMenu>

 

X11画面のスクリーンショットを撮る方法

X11画面のスクリーンショットは、「scrot」コマンドで取得できるようです。

scrotは、以下のコマンドでインストールできます。
sudo apt install scrot

コマンドオプションでいろいろ取得方法をカスタマイズできるようです。

scrot     画面全体のスクリーンショットを撮ります。
scrot -ub   タイトルバー+アクティブウインドウのスクリーンショットを撮ります。
scrot -sb   カーソルの形が+に変わるので、
       その後ウインドウをクリックすると、タイトルバー+クリックしたウインドウ
       のスクリーンショットを撮ります。(ウインドウ範囲外だと全画面)
       左クリック長押しで範囲指定すると、その範囲のスクリーンショット
       を撮ります。

また、scrot -d 10 のように、-dで秒数を指定すると、10秒後に取得されます。

スクリーンショット取得先は、、
指定がなければ、カレントディレクトリに
「2025-12-18-204617_854x480_scrot.png」といった名前で保存されます。

出力先を指定する場合は、以下のようにしてみてください。
scrot ‘scrot_%Y%m%d-%H%M%S_$wx$h.png’ -e ‘mv $f ~/screenshot/’

これで~/screenshot/に「scrot_20251218-212923_854x480.png」のような名前で保存されます。

また、リモートPCからssh -X(Xリダイレクトオプション付)でログインしている場合、
リモート側でscrot コマンドを実行して、遠隔実行することも可能です。
ssh -Xでログインしていない場合は -D :0 のようにBrain側のDiskplay番号を追加でOKです。

 

これでスクリーンショットが取れるようになりましたが、毎回コマンドを打つのも面倒です。
今回は、JWMのキーバインド設定をして、USBキーボードの”PrtSc(PrintScreen)”キーでスクリーンショットが取得できるように設定してみます。
参考:JWM設定)(参考:JWMConfig

sudo vi /etc/jwm/system.jwmrc

ファイルの最後のほうに、キーバインド設定がありますので、ここの最後に追記します
(mask設定は、Shift=”S”,Ctrl=”C”,ALT=”A”が対応します。ただSAとしたときにALTの認識に不具合出る場合もあるそうなのでこの辺は調整が必要かもしれません。)

<Key key=”Print”>exec:scrot ‘scrot_%Y%m%d-%H%M%S_$wx$h.png’ -e ‘mv $f ~/screenshot/'</Key>
<Key mask=”A” key=”Print”>exec:scrot -ub ‘scrot_%Y%m%d-%H%M%S_$wx$h.png’ -e ‘mv $f ~/screenshot/'</Key>
<Key mask=”CA” key=”Print”>exec:scrot -sb ‘scrot_%Y%m%d-%H%M%S_$wx$h.png’ -e ‘mv $f ~/screenshot/'</Key>

これで、以下のようなキーバインドになります。
(ただし、jwmのメニュー表示中は、このキーバインドは聞かないようです。)

・PrintScreen      で全画面のスクリーンショット
・ALT+PrintScreen   でアクティブウインドウのスクリーンショット
・Ctrl+ALT+PrintScreen でウィンドウ選択 or 範囲指定のスクリーンショット

もし、Brainのキーボードでスクリーンショットを撮りたいのなら、
キー指定を <Key mask=”CA” key=”s”> とかにすればCtrl+ALT+”s”がキーバインドになります。(“exec:xdotool key ctrl+alt+Print”に割当でキー入力のエミュレートでもいけます)[参考]

JWMのコンフィグファイルを変更したら、jwm -pで構成チェックをした後で、
JWMメニューのRestartをクリックするか、jwm -restart コマンドを実行で設定が反映されます。

 

あと今回気づいたのですが、JWMのキーバインド使えば
タッチパネルでの右クリック対応はxbindkeys使わなくてもいけますね
これで500kbぐらいメモリ消費量を削減できます。
/etc/jwm/system.jwmrc 追加&JWMリスタート
<Key mask=”CA” key=”z”>exec:xdotool click 3</Key>
~/.xprofile 一部コメント化
# bash xbind_keys_autostart

/etc/jwm/system.jwmrc 例

  

BrainuxでのSound再生について

標準の環境では、Brainuxではサウンドデバイスを認識していないため、Sound再生されません。
Brain に内蔵されているスマートアンプには大きく分けて Yamaha 系と Rohm 系があるとのことで、現状Brainux上でのSound再生は、現状解析中で非対応だそうです。

試しにUSBサウンドデバイスを付けてみたところ、OSとしては認識しました。

Bus 001 Device 004: ID 0d8c:000c C-Media Electronics, Inc. Audio Adapter

ターミナル上でのコマンド上では使用できましたが、一部ノイズが乗ります。

ALSAを使っているaplayではノイズが出るにせよ音が鳴るし、
amixerや、alsamixerも動いています。

なお、plusaudioは初期未導入っぽいので、この辺が影響してそうです。
この辺もう少しし調べたいのですが、正直勉強不足です。

まあ、USBサウンドデバイスつけないといけないから、おま環ではあります。

この辺が参考になるのだろうか?
Linux の Audio 機能をコマンドラインで設定
X11 Forwarding で音声を再生する

音楽・動画再生は?

音楽・動画再生としては、mplayer や smplayerが apt経由でインストール可能です。

・mplayer コマンドラインの音楽・動画再生プレイヤーです。
・smplayer mplayerのラッパーで、GUI操作インターフェイスを提供します。

sudo apt update
sudo apt install mplayer
sudo apt install smplayer

mplayerで、再生したファイルを指定すれば、そのままALSAで再生されました。
(USB Audioデバイスを付けている場合)
mplayerでの音声再生では、ほとんどノイズは気になりませんでした。
[CUI,X11環境両方で実行可能]

mplayer pianos-by-jtwayne-7-174717.mp3

smplayerでも音声再生OKです。

smplayer pianos-by-jtwayne-7-174717.mp3
[X11環境時で実行可能]

同様に動画ファイル(mp4ファイル)も試しましたが、
安定して音声・動画再生はされました。

ただ、さすがにマシンパワー不足で、
動画と音声の同期がうまくいっていませんでした。
(音声が先行する)
再生時パラメータや、動画ファイルの作成パラメータの調整が必要かもしれません。
(-autosync 30 -cache 8192 -framedropのオプションを付けてみたけど、やっぱり遅い)

mplayer -vo fbdev2 /dev/fd0 ./file.mp4
[CUI上で実行する場合、-vo fbdev2 /dev/fd0 オプションを付け得れば再生されました。]

mplayer ./file.mp4
[X11環境上で実行可能]

smplayer file.mp4
[X11環境上で実行可能]

PulseAudio導入について

ALSAに引き続き、PulseAudioの導入も検討していますが、
結構重いそうだし、ALSA強制指定で動くものも多いので、いったん保留。
音楽のリダイレクトはあとで試してみたい。

fmsx,openMSX関連で、Brainuxに「pulseaudio」を入れてみました。

インストール: sudo apt install pulseaudio

インストール直後はサービスが起動していないのですが、以下のコマンドで実行できます。
pulseaudio –start

起動状況確認コマンドは、pactl info
pilseaudioの停止コマンドは、pulseaudio -k

ただし、自動実行が設定されてしまっているため、再起動しても自動的に起動してしまします。

$ systemctl –user status pulseaudio.service
● pulseaudio.service – Sound Service
Loaded: loaded (/usr/lib/systemd/user/pulseaudio.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2025-12-20 14:18:53 JST; 30min ago
TriggeredBy: ● pulseaudio.socket
Main PID: 472 (pulseaudio)
CPU: 4.902s
CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/pulseaudio.service
└─472 /usr/bin/pulseaudio –daemonize=no –log-target=journal

自動機能の無効化は以下です。これで自動起動しなくなります。
$ systemctl –user mask pulseaudio.service pulseaudio.socket

もし、一時的にpulseaudioを起動したいのであれば、
pulseaudio –start
で起動できます。


結果としては,Pulseaudioが無効との時うまく動くアプリと、
逆にPulseaudioが有効の時うまくいくアプリがあるっぽい。

ALSAを直接叩いているようなアプリでは問題なく聞ける音楽でもPulseaudioが有効だと、ぶつ切りでまともに聞けなくなるし、
逆に、Pulseaudio経由で音楽を鳴らしているアプリでは、Pulseaudioが起動していたほうがちゃんとうまくなる気がしてます。

Pulseaudioが起動していると、メモリも10MB以上消費するので、
Brainuxでは通常Pulseaudioを利用しないで、必要なときのみ起動するほうがいいでしょう。

openMSXとかだと、PulseAudioを起動したほうが音がちゃんと出ることもあるので、
いったんは必要に応じて手動起動で運用してみます。

 

カテゴリー: Brainux パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です