閉じる

MediaPlayer.OnCompletionListenerで onCompletionが呼ばれない件

サービス内で「MediaPlayerを作成&OnCompletionListenerを登録して再生&OnCompletionListener.onCompletionにて次の曲を再生。」ってなコードを組んだのだけど、特定の環境*1 にて再生終了から onCompletion呼び出しまでの間隔が 10分とか開くことがあった。
電源につないでいると発生しないので省電力の関係かとも思って色々調べたけどそうでもないらしい。
停止したタイミングと logcat出力を付き合わせてゆくと必ず以下のようなログに行き着く。

01-29 10:32:05.403: E/MP3Extractor(263): Unable to resync. Signalling end of stream.
01-29 10:32:11.409: W/AudioSink(263): Event underrun
01-29 10:32:11.409: D/AudioSink(263): Callback!!!
01-29 10:32:11.469: E/AudioTrack(263): mdirect track flush
01-29 10:32:11.471: E/AudioHardware7x30(263): fsync failed.
01-29 10:32:11.472: W/AudioPolicyManager(263): stopOutput() refcount is already 0 for output 978
01-29 10:32:11.475: W/AudioFlinger::PatchPanel(263): releaseAudioPatch() bad playback I/O handle 978
01-29 10:32:11.476: D/AudioHardware7x30(263): AudioSessionOutLPA::standby()
01-29 10:32:11.477: D/AudioHardware7x30(263): AudioSessionOutLPA::reset()
01-29 10:32:11.477: D/AudioHardware7x30(263): Deroute lpa playback stream
01-29 10:32:11.482: D/AudioHardware7x30(263): Removing from empty Q
01-29 10:32:11.482: D/AudioHardware7x30(263): Removing from empty Q
01-29 10:32:11.482: E/AudioHardware7x30(263): Removing input buffer from Buffer Pool
01-29 10:32:11.482: E/AudioHardware7x30(263): Removing input buffer from Buffer Pool
結局、SDカードからの読み込みが間に合って無くてバッファアンダーランになっているだけなのか?*2
ソレはソレで仕方のないことかもしれんけど、どうにかしてハンドリングできないもんかね。
ちなみに MediaPlayer.OnErrorListenerは駄目だった。

試しに曲データを mp3から Ogg Vorbisに変換してやったら起こらなくなったのでその線でいくことに。
非可逆圧縮済みのマスターデータをさらに非可逆圧縮なんてしたくなかったので転送時に変換をかますようにして解決。
当然、転送時のサーバ負荷は増えたけど、ファイルサイズは 3割ほど減った。

onCompletionが呼ばれず、分単位で途切れるのは確かに解消したのだけど、今度は単純に音途切れるのが耳に付くようになったな。
アプリを切り替えたときなどに顕著なので SDカードも含めて単純にスペックの問題かな。
電池のもちの問題*3 もあるし、BGM用と端末を分けるかなぁ


*1 Xperia ray(SO-03C) + cm-12.1-20151206-UNOFFICIAL-LegacyXperia-urushi.zip

*2 確かに rayは CM12.1を入れた段階でシステム領域を SDカードに取っているので忙しくはあるんだよな。

*3 基本的に 13時間/日ほど流しっぱなしなのだけど、70%程度電池を消費する。

コメントを残す

メールアドレスが公開されることはありません。必須項目には印がついています *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)