2014年6月3日火曜日

Chromecast

ちょっと脇道にそれますがChromecastを買ってみました。

私の持っている、TVチューナーと組み合わせると、
凄く良い感じです。

録画サーバーにしてあるUbuntu上では、TV番組を mp4(H.264)に
変換しつつ録画。それを apache + h264 streaming mod で配信。

Chromecast SDKのサンプルをちょっと改造しアプリを用意。

無事、Chromecastを接続したテレビで録画データが再生できました。


ビエラジャンプリンクとか目じゃない位、いい感じです。

というか、私はビエラジャンプリンク対応前のビエラなので、
そんな機能は使ったことありませんが...^^;


ただ、このソフトを真っ当な手段で公開するためには、
DRMの仕組みを勉強しないといけません。

widevineとか言う奴が使えるとか使えないとか...
まだ全然分かってません。

よって、お蔵入りというか私の趣味の範囲で
使用する事になるのだと思います...

2014年5月7日水曜日

avcodec_open2でエラー(-1)

ある日、こんな不思議なエラーが発生するようになって、なんでかなぁ~って
avcodecのソースを眺めてみました。

すると...以下のようなソースが

/* If there is a user-supplied mutex locking routine, call it. */
if (lockmgr_cb) {
if ((*lockmgr_cb)(&codec_mutex, AV_LOCK_OBTAIN))
return -1;
}

entangled_thread_counter++;
if (entangled_thread_counter != 1) {
av_log(avctx, AV_LOG_ERROR, "insufficient thread locking around avcodec_open/close()\n");
ret = -1;
goto end;
}

えっ、排他制御を勝手にやってくれないの?
av_lockmgr_registerで排他制御用の関数を登録したら解決しました。

pthread使って勝手にやってくれれば良いのに、何か拘りがあるのかなぁ?
不思議です。

2014年4月19日土曜日

sys_config.fex の ir_para で ir_addr_code を指定出来るようになった。


新しいCubieのSDKでは、今まで使えていたリモコンが使えなくなりました。
今更ビルドミスも無いだろうと思い、ドライバの違いを確認していたら、やっぱりありました。

if(SCIRPT_ITEM_VALUE_TYPE_INT != script_get_item("ir_para", "ir_addr_code", &ir_addr_code)){
pr_err("%s: ir_addr_code script_get_item error. \n",__func__ );
ir_addr_code = 0x9f00;
}

ふーん。今までの #define で値を指定する方式では無くなって、
sys_config.fex で変更できるようになったんだね。

折角、今更こんな機能をご丁寧に作りこんだと言うのなら、sys_config.fex には...

「オプション増えたぜー!、ひゃっほー!、俺最高ー!」

ってコメント書いといてよ。

一番新しいと思われるSDK


本職でテンパっていて、音楽再生アプリ開発はとん挫してますが...
cubieboard2は、地道に使ってます。

Cubieの公式サイトには、一番新しいSDKでビルドしたと思われるCubietruckの
イメージがアップされているようなのですが、ソースがアップされてません。

http://cubieboard.org/2014/01/13/upgrade-new-android-for-cubietruckv1-01

Allwinnerからの正規のルートで、これと同じと思われるSDKのソースは入手してはいるのですが、
やっぱりCubieboard用の正規の物も比較用に配布して欲しいなぁと思ってました。

とは言っても、無い物は無いので、諦めていたのですが、全然関係無い調べ物をしているときに見つけました。

Cubietechの中の人のブログっぽいとこにSDKがアップされてる。

https://plus.google.com/+HuangBenn/posts/h2Q1KhWyPdo

なんでこんな所???
ちゃんとリソースのサイトで公開すれば良いのに...

ただし、注意点として、これビルドしてもCubieboard2では起動しませんでした。
多分、カーネルのconfigがcubietruck用になっているようです。

とりあえず、cubietruckで追加されたようなH/W絡みの設定(BTとBroadcomのWIFIとGMAC)
を削除したら起動しました。

本当の所、何が原因だったかは、まだ追及してません。

2013年9月29日日曜日

Cubie Juke Box


とりあえず適当に色々触っていましたが...
この記事を見て「2倍の楽しさ秘めた、高音質ネットワーク機 CD-N500」、なんとなく目標が決まりました。

Cubie Juke Box

[機能]

1) CDのリッピング

cdparanoia を使用する。CDDBからデータを取得する部分をどう実現するか悩み中。

2) AAC or AC3 (DollyDigital?) へのエンコード

libav を使用する

3) SATA接続のHDD搭載

NTFSは、NTFS-3gを使っているので性能がイマイチです。
FATは4Gの制限があるから後々の事を考えるとダメ。

なので、Androidをちょっと改造して、ext4形式でHDDをマウントした。

4) S/PDIF でのパススルー出力

実験中。AC3で圧縮したデータをデコードせずに、そのままアンプに送りたいなぁ...

5) DLNA サーバー & クライアント

サーバーは minidlna を移植して実現できた。
クライアントは、FireAir Receiverというアプリが標準でインストールされていて動作するけど、ソースが公開されているものを探してます。

とりあえず現状で、Skiftaと言うアプリを使って、ソースとレンダラをCubieboard2にすると、スマホで再生操作ができた。
この話題は、また今度。

6) LCDにステータス表示

将来的には漢字が表示できるLCDが欲しいけど、そう言うのがまだ見つからない。

7) 再生・設定アプリ

一応操作できるように自前アプリを作る。Cubieboard2は、IRリモコンも使える。

操作するために、HDMIで画面を出すのもイマイチなので、Skiftaみたいにスマホからも操作できるようにしたい。

こんな感じです。

2013年9月27日金曜日

cubieboard2 + SPDIF + Passthrough


実はこれが一番の目的でした。

パススルー!!です。

折角SPDIFで外部のオーディオ機器と接続しているのですから、PCMに変換せず、そのままのDTS形式でデータを投げたいのです。
でも方法が分からず色々悩みましたが、やっとその答えが見えつつあります。

1.ドライバのソースをひたすら眺める。

A20 の SPDIF のドライバを以下のディレクトリに見つけました。

lichee/linux-3.3/sound/soc/sun7i/spdif/

この中のソースを眺めていると、気になるソースを発見!!

/*add the pcm and raw data select interface*/
switch(params_channels(params)) {
case 1:/*pcm mode*/
case 2:
fmt = 0;
break;
case 4:/*raw data mode*/
fmt = 1;
break;
default:
return -EINVAL;
}

う~ん。そんな物なのでしょうか?
チャンネル数が4ならRAWモード??

なんか微妙ですが、たぶんこれです。

2.再生する術を考える。

externalの下を眺めていると、使えそうなツールがありました。

その名も tinyalsa です。

そこで、先ほど得た知識を元に、tinyplay.c にパッチを...
チャンネル数を無理やり 4 に変えます。

// config.channels = channels;
config.channels = 4; // RAWモード

最後に、どっかのWEBサイトで拾ってきた DTS の WAV ファイルをこのツールで再生してみます。

# tinyplay test.wav -D 2

すると...わたくしの所有する SONY MDR-DS5100 (古っ!!)の DTS のインジケータが光輝きました。

なんとなく、音質が良くなった気がしますが、それ以上に、この方法で音楽を再生すると、Androidの操作音とMixされることが無くなるので、とても良い感じです。
操作音とMixされると、雑音っぽいのが混ざるのが気になったので...

とりあえず、パススルーっぽいものは動いています。
ですが、実用に至るまでには、もう少し調べることが残ってます。

何故ならDTSのデータの作り方が分かってません。

2013年9月21日土曜日

cubieboard2にI2C液晶をつける


トスリンクを買うときに、一緒にStrawberry LinuxのLCD液晶を買ってましたので、今日はそれを接続してみました。

接続方法は...

[LCD] 1 - [Cubieboard2] U14 44 (VCC 3.3V)
[LCD] 2 - [Cubieboard2] U15 6 (TWI1-SCK ※1)
[LCD] 3 - [Cubieboard2] U15 7 (TWI1-SDA ※1)
[LCD] 4 - [Cubieboard2] U14 42 (GND)
[LCD] 5 - [Cubieboard2] U14 44 (VCC 3.3V)

※1 I2Cの2つは3.3KΩの抵抗を使って、VCCにプルアップ接続してます。
毎度のことながら、これで正解かは、一切自信ありません。

動作確認...

テスト用に i2c-tools をビルドしてインストールします。
これも、いつもの事ながら、externalにコピーしてAndroid.mkを用意してビルドします。
特に、エラーもなくすんなりとビルドできました。

無事にLCDをcubieboard2から認識できているか確認します。

# i2cdetect -y 1

結果は...

0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3e --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

第一関門突破です。
無事に認識しているようです!!

次にOkiraku Programmingさんのスクリプトを参考にして、以下のコマンドを入力しました。

# i2cset -y 1 0x3e 0 0x38 0x39 0x14 0x78 0x5e 0x6c i
# i2cset -y 1 0x3e 0 0x0c 0x01 0x06 i
# i2cset -y 1 0x3e 0x40 0x31 0x32 i

すると、LCDに "01" と表示されました!!

これで動作確認できたので、今度は自分でプログラムを組んでみたいと思います。