やまちゃんのオーディオブログ

既存のブログをこちらへ順次移動します。

ラズベリーパイB

ラズパイのi2sで一般的な24ビットファイルを再生するために・・・(aplayex, for playing general 24bit 3LE files(SNDRV_PCM_FMTBIT_S24_3LE),converting 24bit LE(SNDRV_PCM_FMTBIT_S24_LE) automatically while playing, on raspberry pi)

投稿日:2016年8月7日 更新日:

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を用意することが、不要になる可能性がある。

Follow me!

-ラズベリーパイB

執筆者:


comment

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

CAPTCHA


関連記事

no image

ラズベリーパイのi2s外部クロック、その後5(2018年度版)

とりあえず、デバイス:de0-soc、DAC:wm8731用のクロックジェネレータのプロジェクトを公開。de0-socの開発CDに含まれているmy first fpgaを参考にした。 (図をクリックす …

no image

コマンドラインで動く、汎用i2sハイレゾモジュールの作り方(これまでのまとめ)。 (How to make a general i2s hi-resolution play-module with external bck clock using command-line on raspberry pi. And you can use gpio for operation)

これまでののうち、コマンドをまとめました。 <2018.4.28 追記 以下は、24ピンのラズパイBノーマルバージョンかつ当時のカーネルを使うことが前提になります。 今のカーネルには、bcm2708- …

no image

ラズベリーパイ、volumioカーネル環境2 I2Sドライバのコンパイル

前回の「ラズベリーパイ、volumioカーネル環境をmakeなしクロスコンパイルなしで2時間で立ち上げる。クロスLAN接続」に引き続き、ラズベリーパイ、volumioカーネル環境で、I2Sドライバをコ …

no image

ラズベリーパイのi2s外部クロック、その後8(2018年度版)

やっと、外部クロックで、ラズパイを動かすことができました!!! ラズパイからは、GPIOでサンプリング周波数を指示し、これに基づいて、外部ボードであるde0-socが周波数を切り替え、マスタークロック …

no image

ラズベリーパイのi2s外部クロック、その後3-2(2018年度版)

11 カーネルソースの編集 編集すべきは、以下の3つ。 (1) rpi-dac.c  (snd_soc_rpi_dac) (2) bcm2835-i2s.c (snd_soc_bcm2835_i2s) …

[最近の記事]
2016年8月
« 7月   7月 »
 123456
78910111213
14151617181920
21222324252627
28293031  

3PR エリア3 タイトル