2014-02-16

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」を追加しただけです。

今回の変更は以上のような感じになります。
いい加減、ウィジェット機能付けないとなぁ…。

2014-02-14

Medoly ver.1.1.0 & 1.1.1

Medoly - Google Play の Android アプリ

Medoly Ver.1.1.0及び1.1.1をリリースしました。
バージョンを1.1.10にしようとも思いましたが、機能が追加されたのでバージョンを 0.1あげました。
主な変更点は以下の通り。

終了タイマーの追加

終了タイマーを追加しました。画面右上のメニュー→「終了」を選択するとダイアログが表示されます。


このダイアログで終了時のタイミングを決定します。
任意の項目をチェックし、値を入力した後に「タイマー設定」でタイマーを実行します。再度ダイアログを開き「タイマー解除」を選択すると、設定したタイマーを解除します。再度タイマーを設定すると、以前のタイマーは上書きされます。
また、「すぐに終了」でアプリをそのまま終了します。
終了タイミングは以下の物があります。
  • 再生キュー完了時
    再生キューの再生が最後まで終わった時点で終了します。最後の判定は再生キューの再生済状態と、再生順の設定によります。タイミング最終曲で「先頭に戻る」と設定していた場合も、先頭に戻らず終了します。「1曲のみ」の場合は終了まで到達しませんので、必然的に無効となります。
  • 残り曲数
    設定した残り曲数を再生毎にカウントダウンし、0になった時点で終了します。カウントダウンは曲が再生し終わった段階で行われますので、曲をスキップしたり、再生キューで選択した場合はカウントダウンされません。先に再生キュー完了時の条件に達した場合も終了となります。「1曲のみ」でループする場合もカウントダウンします。
  • 残り時間・終了時刻
    終了時間になった時点で終了します。設定する方法が違うだけで、何れも同じものです。途中で再生が停止しても、タイマーが切れたり終了したりはしません。
大体機能としては以上のような感じです。
ちなみに、1.1.1は1.1.0のバグフィックスです。非常に初歩的なミスにより、時間のタイマーを解除しても終了時間に達した時点でアプリが終了するという問題があったためで…。

2014-02-05

Medoly ver.1.0.9

Medoly - Google Play の Android アプリ

Medoly Ver.1.0.9をリリースしました。今回は割と色々。

修正内容

メディア読込み時に進捗ダイアログを表示

メディアの読み込み時に進捗ダイアログを表示するようにしました。具体的には、検索画面からメディアの登録時、起動時の再読込時、プレイリスト読込み時の3点です。起動時以外は進捗バーが出ます。なお、ダイアログ表示中にキャンセルを押すとキャンセル可能です。
今までは、全てのメディアを読み込むまで一切の操作ができなかったため、曲数が多いとアプリが固まってしまう事象への対策です。 ちなみに、再生キューに一気に数百曲とか放り込むような無茶な使い方をするような自分のための機能です。
画面の表示更新とメディアの読込でマルチスレッドで動かす必要があり、これに対応させるために読み込み処理部分を大幅に組み直しました。正直、1.0.8から大分組み直してます。感覚的には1.2か1.3ぐらいでも良いような気がしますが、表面的に目だって異なるのはこのダイアログぐらいなので、1.0.9です。個人的に、バージョンの付け方はユーザーが感じる機能向上に合わせて付けるものと思ってますので…。
恐らく、これに伴って再生キューに2重に登録される 不具合が解消されたと思います。多分そんな気がします。…されてるといいなぁ。
また、この変更によって何かしらの不具合が発生する可能性がありますが、その場合は、ご報告いただけると幸いです。
なお、何となく想像はつくかと思いますが、現在は再生キューの中身を丸ごとアプリで保持してます(サムネイル除く)。本当はSQLiteデータベースを用いて、逐次読み込みで対応させるところだと思いますが、最初に作った時にそこまで考えていなかったので…。この方法なら恐らく、今の起動時の読み込み処理は無くなり、キュー追加も早くなるかもしれません。ただ一方で、再生キューのスクロールが引っかかるような動きになるかもしれません…が、そこまでキューにたくさん曲を入れる人はそんなにいないような気がするので、その辺の影響はあまり考えなくても良いような。
とりあえず、その辺りはまた組み直すつもりですが、今はこのままで。

プレイリストやジャンルを含む検索のエラー対応

検索条件にプレイリストやジャンルが含まれていた場合、検索に失敗してアプリが落ちる場合があった問題を修正。これは、プレイリストやジャンルのキーの列名が「_id」となっており、さらに曲のキーも「_id」となっていたため、これらを組み合わせると列が重複してしまいSQLがエラーを吐くというものです。
これに対し、曲の検索条件に「title_key」キーを使用したり、名前にテーブル名を含めたりして、問題が起きないように修正しました。

ちなみにAndroidのデータベースは、一つの曲が複数のプレイリスト/ジャンルに所属でき、アーティストやアルバム等のプロパティとは処理が少し異なります。それらを上手く処理するために、一部でSQLを直接書いています(本来、プログラムの安全性の観点からあまり好ましくはないのでしょうが…)。その結果、内部ではなかなかに面倒なSQLが組み上がってます。
なお、下記サイトによると、テーブル名が一部異なる端末も世の中には存在するようで、そういった端末では確実にエラーが起きます。もしそのような端末があった場合は御一報ください。(下記の情報はAndroid 2.x端末の話なので、最初から本アプリは動作しません。)
Android携帯に登録されているプレイリストを取得する時の罠 - 理ろぐ


リピート再生時の次へ/前へボタンの挙動変更

リピート再生(単曲再生)している時に、次へ/前へボタンを押した際に、再度同じ曲を再生する動きだったのですが、よく考えたらその動きおかしい…というわけで、次へ/前へを押したら再生キューの次/前の曲を再生するよう変更。ちなみに、再生キューの動きは全部自前で制御してるので、わざわざそういう動きを作ってたということになります。
…あんまりきちんと考えてなかった。

プロパティタブメニューの対象に無い項目を非表示

プロパティのタブを押した際に出る検索メニュー。今までは全部の項目を表示していたのですが、検索対象のメタ情報が存在しない場合は、その項目を表示しないようにしました。そういえば、なんで今までそうしてなかったんだろう。

その他

一部メッセージ変更など。
色々弄ったので細かいの忘れた。

現在把握してる問題

  • Android 4.4 (KitKat)で、スクロールのつまみが表示されない。これはAndroid側の問題臭い。
  • ごく希に、何もしてない時にプロセスが暴走してる事がある模様。再現性がなくて確認できない。多分、上記の読込処理に関連した問題だと思ってる。バックグラウンドのサービスが起動した時に読込処理が走って、何かやってるのかなぁ、と推測。とりあえず、上記に書いた読み込み処理の変更した後で考えることにする。