aplayexを使います。
see http://www.geocities.jp/onsei2007/kousaku/PI_I2S_DAC.html,
and http://www.nakata-jp.org/computer/freesoft/aplayex/ (I introduce these cites,for anyone to use aplayerex on raspberry pi.)
通常の24ビットのwavファイルは、LRそれぞれ3ビットずつで記述されているのに、これまで紹介してきたbcm2708-i2s.cは、これを受け付けない。
つまり、通常はwavファイルは、3バイト形式(SNDRV_PCM_FMTBIT_S24_3LE)で記録されているので、このデバイスを用いると、aplayでは再生できません。
このデバイスでは、不便なことに4バイト形式のファイル、つまり32ビットのアライメントに直し、足りないビットは0で穴埋め(padding)されている形式のファイルしか再生できないのです。
そこで、ubuntuで使われているaplayexを使います。
ラズパイではそのままでは使えませんから、ソースをコンパイルする必要があります。
(you need compile aplayex sources. )
以下は、「Raspberry Piを使ってI2S DACのTDA1543の音楽再生」の完全な真似です。ありがとうございます。感謝します。
ただ、これだけでは一般人には難しいので、私が試行錯誤して、誰でもできるように、解説しました。
<STEP1:aplay本家のソースをコンパイルすることが可能であることの確認>(check compiling the original aplay modules enable )
STEP1-1:そのバージョンにあったaplayモジュールのインストール>(installing aplay bin modules)
sudo apt-get install libasound2 libasound2-dev
STEP1-2:aplayモジュールのバージョン確認>(installing aplay bin modules)
nano /usr/include/alsa/version.h
これにより、バージョンを確認する。
なお、上記STEP1-1を行って初めて、/usr/include/alsa/のディレクトリが出現する。
(STEP1-1make the /usr/include/alsa/ folder available)
例えば、以下のようになる。
「#define SND_LIB_VERSION_STR “1.0.25”」
<STEP1-3:このバージョンに対応するaplayのソースをインストールする。>(install the aplay sources correspond to the aplay version of STEP1-3)
A:alsa-project-pub-utils をパソコンへダウンロード(download alsa-project-pub-utils to your PC)
B:ラズベリーパイへ、ダウンロードしたファイルをコピーする。(copy the downloaded alsa-project-pub-utils file from PC to raspberry pi.)
sshのファイルタブ→ssh scp→コピーする。(On Tera term,click file tab,and ssh scp tab.)
/home/pi/にコピーされる。(The file is copied to /home/pi/ .)
mkdir /root/alsaex_source
cp /home/pi/alsa-utils-1.0.25rc2.tar.bz2 /root/alsaex_source (1.0.25はバージョンにより異なる。)
cd /root/alsaex_source
C:解凍&解凍フォルダへ移動 (decompress &move to the decompressed folder)
tar jxvf alsa-utils-1.0.25.tar.bz2
dir
cd alsa-utils-1.0.25
dir
<STEP1-4:./configure>
A:configureコマンドを打つ。
./configure
これは、makeを自動作成するコマンド。これがエラーだと、makeは、モジュールの対象が特定されていないなどとエラーが出る。
B:エラーが出るので修正する。(fix errors)
ほとんどのエラーは、必要なモジュールが足りていないことが原因である。
(「./configure」、「make」、「make install」の意味」参照)
エラーのほとんどは誰かが経験しているので、検索すれば出てくることが多い。
ここに記載のないエラーは、ネットで検索してみてください。
C:lpanelwのエラー (lpanelw err)
checking for new_panel in -lpanelw… no
configure: error: panelw library not found
対策1: (taking steps 1st)
sudo ln -s libpanelw.so.5 /usr/lib/libpanelw.so
sudo ln -s libformw.so.5 /usr/lib/libformw.so
sudo ln -s libmenuw.so.5 /usr/lib/libmenuw.so
sudo ln -s libncursesw.so.5 /lib/libncursesw.so
しかしこれでは動かない。
対策2: (taking steps 2nd)
./configure –with-curses=ncurses
./configureに代えて、./configure –with-curses=ncursesとする。
(「少しずつできたらいい。」さんの「ubuntuのサウンド設定」、)
<STEP1-5:make>
make
このコマンドでもエラーが出る。(the command make errors.)
A:xmltoがないとのエラー (xmlto err)
「xmlto man alsactl_init.xml
/bin/bash: xmlto: コマンドが見つかりません」となる。
sudo apt-get install xmlto
1Gbのファイルをインストール。約20分。(20 minutes)
その後、./configure –with-curses=ncursesからやり直し。
B:ta-ja.gmoがないとのエラー
apt-get install gettext
その後、./configure –with-curses=ncursesからやり直し。
(「サウンドカード SoundBlaster Live 24bit を使う」http://www.geocities.jp/gokuraccoon/SBLive.html参照。)
<STEP1-5:make install>
make install
<STEP1-6:エラーがないことの確認>
aplay
を実行する。
また、aplayを検索する。(finding aplay bin file)
find / -name “aplay”
/usr/bin/aplayが実行ファイルである。
ls -l /usr/bin/aplay
-rwxr-xr-x 1 root root 142894 8月 6 19:33 /usr/bin/aplay
となり更新されたことが分かる。
<STEP2:aplayexのソースをインストール>
<STEP2-1:aplayexのソースをPCへダウンロード>(downloading the aplayex source)
http://www.nakata-jp.org/computer/freesoft/aplayex/からソースを取る。
「aplayexのライセンスは、GPLです。ソースコードを aplayexソースコードのリンクに置きます。」とあるところのものをダウンロードする。
一番下のものは、バイナリ形式のもので、ラズパイでは動かない。
<STEP2-1:aplayexのソースをラズパイへコピー>
sshのファイルタブ→ssh scp→コピーする。
/home/pi/にコピーされる。
sshでコピーすると/home/piに入るので、
cp aplayex_src.tgz /root/alsaex_source
でコピーする。
<STEP2-2:aplayexのソースを解凍>
cd /root/alsaex_source
tar zxvf aplayex_src.tgz
cd root/alsaex_source/aplayex
dir
<STEP3:aplayexのソースをコンパイル>(compile)
make
make install
すでにメークファイルが用意されているので、そのままmakeをすればよい。(you need not ./configure must not merge aplay source.)
aplayのソースフォルダと合体(マージ)する必要もないし、してはならない。
<step4:動作確認>
find / -name “aplayex”
のコマンドを打つ。
・・・・
/usr/bin/aplayex
と出るから、ここに実行ファイルがインストールされる。(aplayex bin file is installed in /usr/bin/aplayex .)
ls -l /usr/bin/aplayex
-rwxr-xr-x 1 root root 156434 8月 7 07:57 /usr/bin/aplayex
で新しくなっている。(check a new aplayex file)
どこからでも、aplayexコマンドを打つことができるはず。(you can aplayex from any folder.)
aplayex
やめるには、ctrl+Cとする。
<再生>(playing music)
音楽データがあるフォルダへ移動。(moving to music folder)
cd /home/pi/nas_all
aplayex -D hw:1.0 xxxx.wav
flacファイルのi2sでの再生(playing flac file through i2s)
flac -d test.flac -c | ./aplayex -vD hw:1,0
flacコマンドをaplayexコマンドへ接続している。(connecting flac command to aplayex command)
hw:1.0は、i2sデバイスを指す。
aplayex -D hw:1.0 xxxx.wav
I/O format is “signed 24bit Little Endian in 3bytes format”.
Device format is “signed 32bit Little Endian“.
再生中に自動的に32ビットに変換されて、再生される。
これで、SNDRV_PCM_FMTBIT_S24_3LEの問題は、解決した。
ちなみに、bcm2708-i2s.cで、SNDRV_PCM_FMTBIT_S24_3LEを追加する必要はなく、これを追加するとエラーで止まる。
次にやることは、bckとマスタークロックを同じにして、74f161を省略できるかということと、
gpioを操作して、フォルダ操作できるようにすることと、
表示機に現在再生中のファイル名を表示させることである。
BCM2835マニュアルのp119で、FLENとは、bclkと、LRCKの比率を表し、FSLENがその半波長を表している。
bcm2708-i2s.cの566行目で、
mode |= BCM2708_I2S_FLEN(bclk_ratio – 1);
mode |= BCM2708_I2S_FSLEN(bclk_ratio / 2);
これは、modeというレジスタ設定用のバイト変数のうち、FLEN,FSLENというレジスタの値を入力するもの。
|は、論理和を表し、BCM2708_I2S_FLENは、
#define BCM2708_I2S_FLEN(v) ((v) << 10)
#define BCM2708_I2S_FSLEN(v) (v)
と定義されており、FLENは、10ビット左へシフトするようになっている。
以上により、その下位ビット20桁をここで定義する。
regmap_write(dev->i2s_regmap, BCM2708_I2S_MODE_A_REG, mode);
これにより、モードAレジスタが、まとめて記録される。
ここで、bclkの内容としてMckを直接入力し、サンプリング周波数ごとに変えれば、
bckを生成するために、周波数を変更する74f161を用意することが、不要になる可能性がある。