Medoly ver.1.1.5

Medoly – Google Play の Android アプリ

Medoly Ver.1.1.5をリリースしました。
オマケ機能を追加したので、バージョンを0.0.5飛ばしました。(オマケなので…)

LOOPSTART / LOOPLENGTHによる疑似ループ処理追加(Android 4.1以降)

音楽ファイルにLOOPSTART / LOOPLENGTHというタグが含まれていた場合、ループを行う処理を追加しました。特殊な音楽ファイルなので、普通の人がお目にかかる機会はあまり無いと思います。分かる人にだけ分かっていただければ…。
使い方としては、設定から「タグによるループ制御」をONにして、曲の再生順を単体再生に切り替えると有効になります。ループ可能な曲の場合、メイン画面の「プロパティ」タブにループという項目が表示されます。
なお、この機能は擬似的なもので、ループ時に正しく曲が繋がりません。というのも、単純にシークさせてループさせているためです。シークの指定はミリ秒単位です。正しく曲を繋げるためには、波形データをきちんと繋げて、再生ストリームに流し込んでやる必要があると思いますが、現在のところそれを実現させる上手い方法が思いつきません。音楽ファイルを展開して処理するライブラリをファイル種別毎に用意して、色々やると出来るような気がしますが、面倒臭いし、現状のアプリと互換性がとれるかどうかも分からないので保留。
というわけでその辺は置いておいて、これはオマケ機能として割り切って、ループが多少不格好でも構わないという人(主に私)向けです。その代わり、ループの位置を調整する設定を儲けてありますので、これで多少の差異は吸収できるような気がします、多分。あと、LOOPSTART/LOOPLENGTHタグ以外に、コメントに「LOOPSTART=***」「LOOPLENGTH=***」という内容が含まれていた場合、勝手に読み取ってループ可能なファイルと判定します。なので、Vorbisファイル以外に、MP3やAAC等でも使えます、一応。
なお、ループの開始にはAndroid4.1以降でMediaPlayerクラス追加された、字幕トラック関連のメソッド(addTimedTextSourceや、selectTrack等) を利用しています。字幕の出現イベントで、ループを実行している感じです。この処理、一旦SRT形式の字幕テキスト(ループ情報を書いたテキスト)をファイルとして書き出す必要があります。そんなわけで、一時的(一瞬だけ)テンポラリファイルが外部に書き出されますので、ご了承ください。
そのうちその辺のコード解説とかも書きたいけど、とりあえず後で。

設定画面にループ関連の設定を追加

上記に関連した、ループ関連の設定を設定画面に追加しています。ループのON/OFF切換と、ループ開始位置、ループ終了位置の微調整ができます。

再生キューのメニューを「選択中の曲へ移動」から「自動スクロール」のチェックボックスに変更

元々、設定画面に「キューの自動スクロール」というものがありましたが、これをタブのメニューに移動させました。これは、再生曲に合わせてスクロールさせる/させないを切り替えるものです。再生キューを自分でスクロールさせている時に曲が切り替わると、強制的に曲まで勝手に移動するのが鬱陶しいので、ON/OFFできるように設けてあります。設定画面にあっても使いにくいので、メニューまで移動させました。

メイン画面のタイトルをタップした際の挙動を、再生キューの選択中の曲に移動するように変更

上記変更に合わせ、元々あった「選択中の曲へ移動」という機能は、メイン画面のタイトルをタップさせた際に実行するようにしました。元々、 タイトルをタップさせた際は表示タブへの切り替えでしたが、それはタブをタップすれば済む話なので、少々持て余していました。そんなわけで、機能の置換えです。


画像読み込み処理の変更

サイズの大きな画像を読み込むとアプリが落ちる問題があったので、その対処です。

ソート時に再生位置が追従しない問題を修正

再生キューの先頭の曲を再生している際にソートをかけると、再生中の曲の表示が追従しない問題があったため、修正しました。「<」と「<=」の間違いです…。

プレイリストで重複データが含まれていた場合に、内容とカウントが一致しない問題を修正

プレイリストに重複した曲が存在した場合、検索画面の曲数カウントに齟齬が生じる問題があったので、修正しました。ContentResolver の projectionに「distinct」を追加しただけです。
今回の変更は以上のような感じになります。
いい加減、ウィジェット機能付けないとなぁ…。