Raspberry Pi MoOde CD/DVD-RW Tools

前回まではコマンドラインから正常にDVD-RWメディアに書き込むことができました。
linuxもGUIがずいぶん使いやすくなりました。但しコマンドラインによる操作は基本ですので現在もこれからも変わることはないと思います。
ですがDVDの書き込みは簡単と言いますが少し慣れが必要ですね。物覚えの悪い当サイトの管理人はしばらく使わないとすぐ忘れてしまいます。

そんな訳でコマンドラインの操作を少しだけヘルプするツールを考えてみました。
コマンドラインからの操作を一通りマスターすればかなり便利に使えるものと思います。

dvd関連のコマンドはターミナルから操作できるものとします。
表示にはwebサーバーとSkyBlue CSSが必要です。
radiko playerが設定してあれば後述するdvd.phpを作成するのみです。

当サイトの環境
Pi1B + moode audio 3.1
CD/DVDドライブ I・Oデータ DVRPU8NKA
samba,NFSサーバー
ここでは以前作成したradiko playerが動く環境があるという前提にします。
(特にradiko player自体は必要ありません)

http://moode:8080/dvd.php


デフォルトの画面です。

デバイスは/dev/sr0で設定しています。

現時点ではdvd-rwのメディアのみで確認しています。


Infoボタンをクリックするとコマンドdvd+rw-mediainfo /dev/sr0を実行します。
メディアがマウントされているとMount欄に赤字で表示
フォーマットや書き込みはできないので使用しているマシンやサーバー側でマウントを解除しておきます。

Media欄には下のAllにもありますがgrepしてモードを表示しています。


Allはテキストボックスの右下をドラッグすると引き伸ばしすることができます。


メニューからFormat DVD-RWをクリック
Overwriteボタンをクリック
フォーマットが終わるとページの先頭に戻ります。
この時点で変更されたモードが確認できます。
再度メニューからFormat DVD-RWをクリック
文字化けしていますがこれはアニメーションしているキャラクタのようです。


音楽アルバムの書き込みをしてみます。/path/to/albumは各自の環境に合わせます。
書き込みするファイルはディレクトリalbumに入れておくという仕様です。先ほどのディスクはSequentialモードでフォーマット、さらにRestricted Overwriteモードに変更したものですので最初の書き込みになります。
Album-Zボタンをクリック
書き込み中ブラウザは接続中になります。
書き込みが終わるとディスクをejectしてページの先頭に戻ります。


ALBUMに戻ると履歴が残っています。
こちらは文字化けはありません。
メニューのTOPボタン、Ejectボタン先頭のInfo,Clesrボタンをクリックで履歴はクリアされます。


データファイルもディレクトリ単位でバックアップするのに便利ですね。
すべてを検証してはいませんが上書きしてもちゃんと変更されたファイルは記録されています。
同期している訳ではないので元ディレクトリから削除したファイルはディスクには残っています。
ブラウザからはwww-dataユーザーとしてアクセスします。
パーミッションは-Rオプションで引き継ぎますがアクセス権が640などのファイルは読み込み不能のため記録されません。パーミッションを変更するかユーザー権限でコマンドラインから書き込みをすることになります。

参考 dvd.php.sample
ファイルはdvd.phpにして/var/www/htmlにおきます。
実際のコマンドはphpの
$command = (‘dvd+rw-format -force /dev/sr0’);
を実行します。
その下のコメント扱いになっている
// $command = (‘whoami’);
を有効にすると最初のコマンドは実行しないのでブラウザでの動作確認等に利用できます。

本ツールあくまでコマンドラインからの実行を補助するためのツールですので試用にあたっては各自の自己責任において使用してください。


Radiko Playerからも呼び出せるようにしておくと便利ですね。

最近はBDドライブが気になります。
DVD-RWの4.7Gはデータ用途としては少し中途半端な感じがします。
BDドライブもgrowisofsを利用しますのでこのまま応用ができそうです。

Raspberry Pi DVD-RWを使ってみる(Samba共有)

当サイトのCD/DVDドライブは通常はCDのリッピングをメインに使用していますがバックアップ用途としてDVD-RWを使ってみました。

想定としては日常使うデータファイル、リッピングした音楽データのバックアップを考えています。

参考サイト
arch linux 光学ディスクドライブ
LinuxでのDVD±R/RW書込み実践(改訂)

環境
samba,NFSサーバー
CD/DVDドライブ I・Oデータ DVRPU8NKA
Pi1B+MoOde Audio 3.1

MoOde Audioはjessie-liteをベースにしたディストリビューションですのでraspbianでも同様に動くはずです。

デバイスの確認

$ dmesg | grep CD-ROM
[    4.984403] scsi 1:0:0:0: CD-ROM            MATSHITA DVD-RAM UJ8E0    1.00 PQ: 0 ANSI: 0
[   13.673548] cdrom: Uniform CD-ROM driver Revision: 3.20
[   13.721854] sr 1:0:0:0: Attached scsi CD-ROM sr0

デバイスはsr0

$ ls -la /dev | grep sr
lrwxrwxrwx  1 root root         3  2月 16 11:49 cdrom -> sr0
lrwxrwxrwx  1 root root         3  2月 16 11:49 cdrw -> sr0
lrwxrwxrwx  1 root root         3  2月 16 11:49 dvd -> sr0
lrwxrwxrwx  1 root root         3  2月 16 11:49 dvdrw -> sr0
brw-rw----  1 root cdrom  11,   0  2月 16 11:49 sr0

正常に認識できていればデバイスが生えているはずです。
書き込みの際など/dev/dvdとしても/dev/sr0を指していることになります。

パッケージのインストール

# apt install dvd+rw-tools wodim
# apt install eject # jessie-liteの場合

大雑把には
cd-r,cd-rw wodim
dvd dvd+rw-tools(growisofs)
のように使い分けるようです。

消去、書き込みは一般ユーザーで実行します。
DVD-RW を消去

手元には2枚のディスクが見つかりました。
このディスクをフォーマットしてみます。

古いデータを完全に消去

$ dvd+rw-format -blank=full /dev/sr0
* BD/DVD±RW/-RAM format utility by <appro@fy.chalmers.se>, version 7.1.
* 4.7GB DVD-RW media in Sequential mode detected.
* blanking 100.0|

2xで30分かかりました。
新品のディスクはSequentialモードになっていると思います。

$ dvd+rw-mediainfo /dev/sr0
INQUIRY:                [MATSHITA][DVD-RAM UJ8E0   ][1.00]
GET [CURRENT] CONFIGURATION:
 Mounted Media:         14h, DVD-RW Sequential

追加上書き可能にするためOverwriteモードに変更

$ dvd+rw-format -force /dev/sr0
* BD/DVD±RW/-RAM format utility by <appro@fy.chalmers.se>, version 7.1.
* 4.7GB DVD-RW media in Sequential mode detected.
* formatting 95.7/

こちらは1分もかからず完了します。

$ dvd+rw-mediainfo /dev/sr0                                       
INQUIRY:                [MATSHITA][DVD-RAM UJ8E0   ][1.00]
GET [CURRENT] CONFIGURATION:
 Mounted Media:         13h, DVD-RW Restricted Overwrite

Overwriteモードになりました。

書き込んでみる
試しに音楽アルバムを書き込んでみましょう。アルバムのあるディレクトリに移動します。
cd /home/share/music
ディレクトリ Art_Blakey-A_Night_In_Tunisia_(Blue_Note_4049)

最初の書込み

$ growisofs -Z /dev/sr0  -J -R -graft-points 'Art_Blakey-A_Night_In_Tunisia_(Blue_Note_4049)'=/home/share/music/'Art_Blakey-A_Night_In_Tunisia_(Blue_Note_4049)'

*1回目の書き込みはgrowisofs -Z を指定します。
*デフォルトの動作は指定したディレクトリ自体は記録されません。その下の階層から記録します。
そのため-graft-pointsオプションを用いてdir=/home/share/music/dirのように指定します。
*コマンドから指定するディレクトリ名やファイル名に括弧などの記号が含まれるとエラーを返します。
このような時にはシングルクォーテーションで囲みます。

追加の書込み
さらに次のアルバムを書き込んでみます。

$ growisofs -M /dev/sr0  -J -R -graft-points dir=/home/share/music/dir

*2回目以降はgrowisofs -M を指定します。

無事書き込めたら確認してみましょう。

マウントする
マウントポイントの作成(名称は適当に)

# mkdir /mnt/sr0
# mount /dev/sr0 /mnt/sr0
mount: /dev/sr0 is write-protected, mounting read-only
$ ls -la /mnt/sr0
Art_Blakey-A_Night_In_Tunisia_(Blue_Note_4049)/

書き込みについては基本コマンドラインから操作することになるのですが読み込みはもう少しスマートにしたいですね。

Sambaで共有
/etc/fstabの設定(追記)

/dev/sr0    /mnt/sr0    iso9660 exec,noauto,user,ro    0       0

再起動してユーザー権限でマウント、アンマウントできることを確認

$ mount /mnt/sr0
$ umount /mnt/sr0

sambaインストール、設定
moodeOSはデフォルトでインストール済ですがjessieは新規にインストール

# apt install samba

/etc/samba/smb.conf編集
CD-ROMセクションを追記

[CD-ROM]
    comment = CD-ROM
    path = /mnt/sr0
    read only = Yes
    guest ok = Yes
    preexec = /bin/mount /mnt/sr0
    postexec = /bin/umount /mnt/sr0
    fake oplocks = Yes

samba 再起動

# systemctl restart smbd nmbd

Pi3(ディスクトップ)からアクセスしてみる
Pi3にはsambaをインストールしておきます。(smb.confデフォルト)
pcmanfmは設定からネットワークを表示しておきます。

ネットワークをクリックするとサーバーのアイコンが出てるはずです。
サーバーを選択するとCD-ROMが見えてきました。
CD-ROMを選択するとsmb.confで設定したpreexecによりオートマウントされます。
書き込みをしたアルバムが見えていますね。


さて先で試した1枚のアルバムをディレクトリ付きで書き込みするのは大変骨が折れます。
growisofsのデフォルトは指定したディレクトリの下位のファイルを書き込むので書き込み専用のディレクトリを用意すればコマンドは簡単になります。
サーバーの設定次第ですが書き込みするファイルを自由に移動することが可能なら同じコマンドを実行すれば良いことになります。

適当な位置に書き込み専用のディレクトリを作成します。
ここではcd-rwというディレクトリを作成してみました。
1回目の書き込みであればコマンドラインからは
$ growisofs -Z /dev/sr0 -J -R dvd-rw
と-graft-pointsオプションなしで実行します。
容量をオーバーしていると:-( write failed: No space left on deviceと怒られます。
比較的容量の少ないアルバムなので1枚のディスクに16タイトル入りました。
flacであれば最低でも10タイトルくらいは入ると思います。
書き込みが終わった音楽データはまた元の場所に戻します。

smb/NAS/musicから見えるディレクトリは読み込み専用となるようです。


Windowsからも問題なく見えています。

Radiko Player CDダイレクト再生(その2)

デフォルトの再生開始番号を1から0に変更してみました。

これは最初に送りのスキップボタンを押した時CD PLAY2になってしまうため、CD PLAY1から順に移動するほうがより自然かなと思います。

デフォルトの状態でPLAYした場合0から再生することになりますがmplayerは0以下の数字を指定しても必ず1曲目から再生を開始するので動作は変わりません。

case “stop”と case “eject”の項を変更します。(1 -> 0)

$_SESSION['track'] = 0;


Single Playボタンの文字と色を変更しました。

mplayerとMoOde PlayerのCD再生の違い
mplayerはUAC3552A USB,MoOde PlayerはES9023P I2Sと音質の多少の違いはありますが通常のCDはどちらも正常に再生します。

GEOの50円レンタルCDをリッピング、その中にあきらかにリトライしていると思われるCDが1枚ありました。
それでもリッピングはDone,finishを返したので正常に終了しています。
リッピングしたflacも正常に再生できます。
データの整合性が取れない時は一晩中でもリトライを繰り返しています。
そんな時は強制中断するしかないのですが。

そのCDをMoOde Playerでダイレクト再生するとその箇所あたりから音が途切れ始めます。
時間は正常に刻んでいますがあきらかに無音になる時があります。
何度か試してみましたがやはり同じ所で発生します。


Radiko Player(mplayer)で再生してみました。
こちらでは何事もなかったように再生できていますね〜。
こちらでも何度か試してみましたが聴感上は正常に再生できてるようです。

以上からmplayerは通常のCDプレーヤー同様エラー訂正機能が備わって正常に再生できているものと思います。
一方MPD(MPC)はほかに有効にするオプションがあるのか単にまだ現時点で実装していないだけなのかもしくは敢えてエラー訂正をしないのかはよくわかりません。

*投稿したあとに何か忘れていると思ったのですが肝心な点を確認していませんでした。
理論上のことはあまり理解していないのですが上記の問題はやはりハード側で制御するのかなと思いDACの切り替えをしようと思っていたところすっかり失念していました。

そんな訳でMoOde Playerの設定からAudio deviceをUSB DACに切替、mpd.confの出力先をdevice “hw:1,0″に変更してMPDからの音をUSB DACから出してみようと思ったら肝心のCDが返却済みでした。

また次の機会に試してみようと思います。

Radiko Player CDダイレクト再生

前回はRadiko PlayerにCD再生ボタンとイジェクトボタンを付けただけの中途半端な結果になってしまいましたが今回はトラック移動ボタンとシングルプレイボタンを設けてみました。

mplayerはコマンドラインでは豊富なオプションで大変強力なツールですが素人にはGUIの操作はなかなか思ったとおり動かすことはできません。

多少変なところがありますが最低限トラック間の移動をできるようにしてみました。
当サイトの使用環境ではこのくらいで十分実用的かなと思っています。

mplayerで再生するには前回のとおりmplayer -quiet -ao alsa:device=hw=1.0 -cdrom-device /dev/sr0 cdda://とコマンドを打てば1曲目から再生を開始します。
本来はここでオーディオCDにアクセスしてトラック情報が取得できれば良いのですがそれが可能かどうかもわかりません。
そこで変数を用意してcdda://1-99のように値をセットして再生することにしました。


送りボタンは1回クリックするごとに+1します。
2曲目から連続再生するときはcdda://2-99とします。
99は決め打ちとしています。
2曲目からの連続再生はCDPlayボタンを押します。


シングル再生時はcdda://2となるようにセットします。
中央のSボタンを押すことでシングル再生。
表示はCD Playing 2 と番号付きにしています。
連続再生は番号なし


実際にはトラック情報を取得している訳ではないので送りボタンを押すとどんどん番号は増えてしまいますが5曲しかないアルバムでは10を指定しても最後の5トラック目を再生するだけです。
シングル再生時表示はずれてしまいますがこれは仕様です。
戻りボタンの方は先頭は1曲目と決まっているので1で止めています。

また送り、戻りボタンを押した時は再生を停止しています。
これは再生したまま曲が進んでいくと実際のトラックと変数の値にずれが生じ送りのはずが戻りとなってしまうことがあるため改めて再生ボタンを押すようにしています。

index.php
ボタン表示(html)
送り、戻りボタンの”< >”は全角を入れています。

<p style="margin-top:1em;"></p>
<a class="btn btn-empty btn-sm btn-success" href="index.php?id=cdp">CDPlay</a>
<a class="btn btn-empty btn-sm btn-light" href="index.php?id=rwd"><</a>
<span style="margin-right:5px;"></span>
<a class="btn btn-empty btn-sm" href="index.php?id=single">S</a>
<span style="margin-right:5px;"></span>
<a class="btn btn-empty btn-sm btn-light" href="index.php?id=fwd">></a>
<span style="margin-right:5px;"></span>
<a class="btn btn-empty btn-sm btn-dark" href="index.php?id=eject">EJECT</a>

実行(php)
session_start();が必要(先頭付近)

<?php
/**
MoOde Radiko Player
**/
session_start();

case “stop”:に追加(break;の前に)

$_SESSION['track'] = 1;

cd実行 phpの適当なところ

// cd play
case "cdp":
    $ff=$_SESSION['track'];
    exec("nohup mplayer -quiet -ao alsa:device=hw=1.0 -cdrom-device /dev/sr0 cdda://$ff-99 > /dev/null &");
    $_SESSION['broad']="CD Playing";
    break;

    case"single";
        $ff=$_SESSION['track'];
        exec("nohup mplayer -quiet -ao alsa:device=hw=1.0 -cdrom-device /dev/sr0 cdda://$ff > /dev/null &");
        $_SESSION['broad']="CD Playing"." $ff";
        break;

    case "fwd";
        exec("nohup killall mplayer > /dev/null 2>&1");
        if (!isset($_SESSION['track'])) {
            $_SESSION['track'] = 1;
            } else {
            $_SESSION['track']++;
        }
        $ff=$_SESSION['track'];
        $_SESSION['broad']="CD PLAY"." $ff";
        break;

    case "rwd";
        exec("nohup killall mplayer > /dev/null 2>&1");
            if (!isset($_SESSION['track'])) {
               $_SESSION['track'] = 1;
               } else {
               $_SESSION['track']--;
               if ($_SESSION['track'] < 1) {
                  $_SESSION['track'] = 1;
               }
            }
            $ff=$_SESSION['track'];
            $_SESSION['broad']="CD PLAY"." $ff";
            break;

    case "eject":
        exec("nohup killall mplayer > /dev/null 2>&1");
        exec("nohup eject > /dev/null &");
        $_SESSION['track'] = 1;
        break;

phpは文法上の誤りがあると真っ白になってしまいます。
もし試す時は必ずバックアップを取りましょう。

MoOde Audio オーディオCDをダイレクト再生する

通常はオーディオCDをリッピングしてMoOde Playerから再生していますが音飛びの確認や聴き比べで確認したいなどCDドライブからダイレクトに再生したい時があります。

環境
MoOde audio 3.1
USB-CDドライブ I・Oデータ DVRPU8NKA
UAC3552A USB-DAC
ES9023P I2S DAC

まずは予備知識として以下のページを参考にしましょう。
(音楽)AudioCDをlinuxのFileSystem(ファイルシステム)にmount(マウント)するには・・・

オーディオCDは連続したデータでファイルシステムは無いのでマウントすることはできないということですね。
曲情報はネット上のCDDBサーバーから取得。AudioTrack〇〇と表示するのはあくまでプレーヤーやファイルマネージャーなどの機能ということになります。

当サイトの環境でダイレクトに再生するには2つの方法があります。
mplayerからalsa経由のUSB-DACを利用する方法とMPDからMoOde Playerで再生する方法があります。

mplayerから再生
moodeにログインします。
mplayerのコマンドライン指定は以下のサイトを参考にしました。
Raspberry Pi でCD-ROMドライブ経由CD再生
ドライブを確認

$ dmesg | grep CD
[    5.000508] scsi 1:0:0:0: CD-ROM            MATSHITA DVD-RAM UJ8E0    1.00 PQ: 0 ANSI: 0
[   10.969691] cdrom: Uniform CD-ROM driver Revision: 3.20
[   10.976620] sr 1:0:0:0: Attached scsi CD-ROM sr0

/dev/sr0で認識されています。
CDをセットして再生

$ mplayer -quiet -ao alsa:device=hw=1.0 -cdrom-device /dev/sr0 cdda://
MPlayer2 2.0-728-g2c378c7-4+b1 (C) 2000-2012 MPlayer Team

Playing cdda://.
Found audio CD with 6 tracks.
CD-Text (CD):

Track 1
CD-Text (track):

Detected file format: rawaudio
Selected audio codec: Uncompressed PCM [pcm]
AUDIO: 44100 Hz, 2 ch, s16le, 1411.2 kbit/100.00% (ratio: 176400->176400)
AO: [alsa] 44100Hz 2ch s16le (2 bytes per sample)
[AO_ALSA] Unable to find simple control 'Master',0.
Video: no video
Starting playback...

停止はCtrl+c
2局目のみ再生、3曲目から5局目まで再生はそれぞれ次のように指定します。

$ mplayer -quiet -ao alsa:device=hw=1.0 -cdrom-device /dev/sr0 cdda://2
$ mplayer -quiet -ao alsa:device=hw=1.0 -cdrom-device /dev/sr0 cdda://3-5

MoOde Playerから再生
MPDはCDDAもサポートしているのでMoOde Playerからも再生可能です。
但しCDドライブのパーミションの関係からこのままではMPCはアクセスできません。
一般ユーザーからもアクセスできるよう設定します。
デバイスの確認

$ lsusb
Bus 001 Device 006: ID 04bb:022b I-O Data Device, Inc.

CDドライブは上記のように認識されています。(ドライブによってIDは違うと思います)
/etc/udev/rules.dに99-cd.rulesを新たに作成します。

# vi /etc/udev/rules.d/99-cd.rules
ATTRS{idVendor}=="04bb", ATTRS{idProduct}=="022b", GROUP="pi",MODE="0666"

作成したら再起動

$ ls -la /dev/sr0
変更前 brw-rw---- 1 root root 11, 0  1月  1  1970 /dev/sr0

変更後 brw-rw-rw- 1 root pi 11, 0  1月  1  1970 /dev/sr0

ログインして以下のコマンドを実行

$ mpc add cdda://


プレイリストにはcdda://が追加されています。

再生すると冒頭に述べたとおりMPDは全曲1ファイルの形式で表示再生します。
MPCでトラックごとのスキップ機能が可能かは調べていません。
但し円形の進捗バーをクリックすることで任意のタイムに移動可能なのでこれで充分かなと思います。


プレイリストのcdda://は編集してBrowseに登録しておけば以降CDをセットするのみでいつでも使用可能となります。

リッピングする前に試聴したい時などにも便利ですね。

99-cd.rulesを設定する以前はちょっとした拍子にCDドライブデバイスが/dev/sr0から/dev/sr1に変わってしまうことがあったのですが設定後は/dev/sr0に固定されるようになりました。

再生はMoOde Playerからもmlayerでも問題なく再生できます。

Radiko PlayerにもCD再生とeject機能のみ追加してみました。

選曲機能は面倒そうなのでやめときました。

/var/www/html/index.php

php部
case "cdp":
     exec("nohup sel_radiko.sh > /dev/null 2>&1");
     exec("nohup mplayer -quiet -ao alsa:device=hw=1.0 -cdrom-device /dev/sr0 cdda:// > /dev/null &");
     $_SESSION['broad']="CD PLAY";
     break;
case "eject":
     exec("nohup eject > /dev/null &");
     break;

html部
<a class="btn btn-empty btn-sm btn-success" href="index.php?id=cdp">CD PLAY</a>
<a class="btn btn-empty btn-sm btn-light" href="index.php?id=eject"> Eject </a>

Top