2015年4月アーカイブ

先日のMCLK出力対応に加えて、Volumio 1.55 に改造を加えてみました。Firmwareファイルはここからどうぞ

オリジナルのVolumio 1.55 と比べてこんな違いがあります。

  • 再生時間の正確さと引き換えにジッターレス化されている
  • I2S出力時に、GPIO4ピンからMCLK信号が出力される
  • 左詰め24bit固定DACのドライバーが入ってる(GUI未対応)
  • I2C接続のLCD対応
  • RuneAudioで用いられている Arch Linux の Kernel Config でコンパイルした Kernel
  • Shift-JIS で記録された Wave(RIFF)ファイルのタグに対応
  • MPD Version 0.19.9

ジッターレス化から、左詰め24bitまでの話は、Volumio 1.4のものと同一なので、そっちを参照してくださいませ。
ほかの機能については、ちと説明しましょう。


I2C接続

new_westan_elecさんのページその1その2の内容をそのまま取り込んだだけです。スクリプトも丸々コピーしただけです。GPIO2/GPIO3をI2Cインターフェースとして利用しますので、これに対応したハードウェアが必要です。

何やってるかは、new_westan_elec さんのページをみてください。


RuneAudioっぽいKernel

Volumioとよく似たサウンドサーバとして、RuneAudioというのがあって、Volumioより音がいいといわれています。
Arch Linux というディストリビューションを元にしているのですが、そのコンセプトは、「シンプル、軽量なディストリビューション」だそうです。どうやって軽量にしているのかまでは調べてないんですが、とりあえずは Kernel の .config ファイルをもってきて、これで Kernel をコンパイルしてみました。

不思議なことに、これだけで音が変わったように感じます。

Kernel の Source は何も触ってないので、処理はさほど変わってないはずなので、おそらくは機能モジュールが削られているのではないかと。
もうすこし詳しく調べないとダメですね。


Shift-JIS 対応の MPD 0.19.9

Windows Waveファイル(RIFF形式)の曲名タグは鬼門です。

Waveファイルにはもともと曲名タグが仕様に入っていませんでした。それをいつの間にやらMSが拡張して、タグを入れられるようにしたみたいです。ただ、その拡張を行った当初は、Shift-JIS を使用していたのですが、いつの間にやら UTF-8 に変更してやがります。

んなわけで、MPD は RIFF ファイルを読み込むとき、UTF-8 を想定します。とーぜん、S-JIS でタグ打ちされたファイルは、文字化けします。
なんだよ、Volumio つかえねーな!って声があったので、文字コードを判定して読み込めるようにしてみました。

なお、MPD のバージョンが上がったことで、機能が増えてるはずなんですが、そっちはまだ追いきれてません

Twitter APIには、コマンドを投げたら、応答が一回帰ってくるだけのREST APIと、一度接続するとダラダラとデータが流れてくる Stream API があります。

REST API は専用ライブラリーがあって、そんなに考える必要はないんですが、Stream API は TCP ちうか、SSL セッションをつないでソケット読み出しをハンドルしてあげないといけない。

とまぁ、ここまでは紹介してあるページがあったりするわけですが、実際にこれを動かしてみたところ、たまにツィートを取りもらすのですよ。別のStream 対応 Twitterクライアントで Home を垂れ流しつつ、スクリプトの結果を流してみると、たまに欠損するわけです。

なので、変数ダンプだなんだして調べてみたところ、fgets() を使って変数に読み込むデータが途中で途切れてることが発覚しました。サーバは一塊のデータとしてデータを送ってるんですが、TCPストリームにはデータの区切りという概念がないので、受信側で勝手にデータを途切れさせて、fgets() が中途半端な位置で返ってしまうんですね。これは C で recv() した時にも起こります。

ちうわけで、読み込んだデータが、途中で途切れてないかを調べて、途切れてたらつなぎ合わせるという処理が必要になります。あと、なんでか分からんのですが、一個のツィートデータが途切れてしまと、続きのデータが来る前に「あと何バイト残ってるよ」という数字だけが書かれた情報が送られてくる。これは読み飛ばさないと、データとして壊れちゃうんですね。

そんなわけで、つなぎ合わせ処理を入れたスクリプトはこんな感じ

require_once('config.php');
$url = 'https://userstream.twitter.com/1.1/user.json';
#$url = 'https://userstream.twitter.com/1.1/statuses/firehose.json';
$method = 'GET';

$oauth_parameters = array(
    'oauth_consumer_key' => CONSUMER_KEY ,
    'oauth_nonce' => microtime(),
    'oauth_signature_method' => 'HMAC-SHA1',
    'oauth_timestamp' => time(),
    'oauth_token' => ACCESS_TOKEN ,
    'oauth_version' => '1.0',
);

$a = $oauth_parameters;
ksort($a);
$base_string = implode('&', array(
    rawurlencode($method),
    rawurlencode($url),
    rawurlencode(http_build_query($a, '', '&', PHP_QUERY_RFC3986))
));
$key = implode('&', array(rawurlencode(CONSUMER_SECRET) , rawurlencode(ACCESS_TOKEN_SECRET)));
$oauth_parameters['oauth_signature'] = base64_encode(hash_hmac('sha1', $base_string, $key, true));

$fp = fsockopen("ssl://userstream.twitter.com", 443);
if ($fp) {
  fwrite($fp, "GET " . $url . " HTTP/1.1\r\n"
         . "Host: userstream.twitter.com\r\n"
         . 'Authorization: OAuth ' . http_build_query($oauth_parameters, '', ',', PHP_QUERY_RFC3986) . "\r\n"
         . "\r\n");
  while (!feof($fp)) {
    $read = fgets($fp);
    if(strlen($read) > 5)
    {
      if(preg_match('/^\{/' , $read))
        $line = $read;
      else
        $line .= $read;
    }
    $line = preg_replace('/[\s\n]+$/' , '' , $line);
    if(preg_match('/\}$/' , $line))
    {
      $res = json_decode($line, true);
      if($res["id_str"])
      {
        echo $res["id_str"] . ":";
        echo $res["user"]["screen_name"] . ":";
        echo $res["text"] . "\n";
      }
      $line = "";
    }
  }
  fclose($fp);
}

MCLK出力対応Volumio1.55

| コメント(0) | トラックバック(0)

Raspberry PI 2 は、CPUが変わっております。BCM2835から、BCM2836に変わってるんですが、アーキテクチャがARM6からARM7に変わってるわけで、Linux Kernel のバイナリー互換がなかったりするんですね。

系列も、BCM2708から、BCM2709に変わってるし。

ちうわけで、VolumioもVer 1.55 からしかRaspberry PI 2には対応できないので、I2SからMCLKを出力するFirmwareも作り直しです。

Linux KernelはVer.3.18.10、ARM6とARM7の両方で起動可能なはずです。


MPDのバージョンとかも調べないとなぁと思いつつ、とりあえずはKernelのみ対応

このアーカイブについて

このページには、2015年4月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2015年3月です。

次のアーカイブは2015年5月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。