読者です 読者をやめる 読者になる 読者になる

音の鳴るブログ

鳴らないこともある

音の鳴るiPhone

http://mohayonao.herokuapp.com/d

時期を逸した感があるけど、ドッドドドリランドのやつをiPhoneでも使えるようにした。サーバー側でwavを作って転送しているだけなんだけど、分かってないことが多くてけっこう試行錯誤したことを書きます。

 

iPhoneがAudioファイルを読み込むときは一気にファイル全部を取得するのではなく、Content-Rangeというのを使って分割リクエストを何回か送る。つまり、サーバー側はリクエストを跨いでデータを保持しないといけない。

http://www.studyinghttp.net/range#PartialResponse

 

Heroku の Cedar stack には Ephemeral Filesystem というのがあって、ファイルの書き出しが行える。これは複数のインスタンス間では共有できないし、再起動すると以前のものは無くなる。一時的なファイル書き出しに非常に有効。

http://devcenter.heroku.com/articles/dyno-isolation#ephemeral_filesystem

 

リクエストごとにどのファイルを転送するかを決めないといけないので、セッションの管理が必要。リクエストヘッダーに X-Playback-Session-Idというそれらしき値があるのでそれをファイル名としていたのだけど、途中で変わったりするのでurlのパラメーターをハッシュ化したものを使った。

インスタンスが再起動するまでの間、ファイルは増えることになるので消したい。全部の転送が終わったかどうかはサーバー側ではよく分からなかったので、setTimeoutで最後のリクエストから15秒、新しいリクエストが無ければ消すようにした。

 

転送の処理
リクエストヘッダーの Range に bytes=0-1 みたいなのがあるので、wavの該当部分を送る。0-1 の場合なら0バイト目から1バイト目までの2バイトであることに注意が必要。レスポンスは206で Content-Range: bytes 0-1/1234 みたいなのをつける、スラッシュの後ろはファイル全体のサイズ。Content-Lengthには実際に送信するサイズを入れる。

あと、ファイル名に使ったハッシュを ETag にも使用する。ETag は同じリクエストに対するレスポンスであることをクライアントに示す。

https://github.com/mohayonao/dorilasound

あとは、パソコン版のほうにダウンロード機能をつける予定。