2011年06月

2011年06月27日

WindowsPhone7:音楽プレイヤーの作り方(その1)

以前に「Windows Phone 7:自作メディアプレイヤーを作成する方法」として、XNAのMediaPlayerクラスを利用するサンプルページを紹介しましたが、まだまだ足りない機能があるので補足しています。

 完成はこんなイメージ、

ScreenDump_2011-33-26 11 33 20 3460 PM


 再生中のポジションと、曲の長さ、
 あと、画像からはわかりませんが、Activateイベント時(別アプリなどから戻ってきたとき)に再生中の情報を取得しなおす処理を追加してあります。

 スライダーで再生位置をコントロールしたいところですが、MediaPlayerクラスのPlayPositionの値がReadOnlyで設定方法がわかりませんでした(というかWP7デフォルトのプレイヤーも曲をシークできないから不可能なのかな?)。

MediaPlayerクラスはバックグラウンドで動作する



 既存のMusic&Videosがアプリ終了後も音楽が鳴り続けるのと同様に、
 XNA.Framework.Media.MediaPlayerクラスを使った音楽再生アプリもアプリから抜けても音楽の再生を続けます。
 それどころか、自作の音楽プレイヤーアプリを抜けて、Music&Videosを起動すると、同じ音楽を再生している状態から始まります。

 「Windows Phone 7:自作メディアプレイヤーを作成する方法」のリンク先で紹介されているアプリをそのまま動かしてもこの動作は確認できますので、ぜひ体験してみてください。

ScreenDump_2011-33-26 11 33 32 8660 PM
(Music&Videosアプリも同じ曲を再生した状態から再生する)

Application_Activatedで再会する



 「Windows Phone 7:自作メディアプレイヤーを作成する方法」は一度アプリを抜けてから再開すると、音楽は再生し続けるのですが、曲の情報や画像は空の状態になってしまいます。

 WindowsPhone7のライフサイクルはアプリケーションのライフサイクルを参考にしてもらうとして、アプリの再会時にはAppクラスのApplication_ActivatedかApplication_Launchingがコールされます。

 MediaPlayerクラスを動かすために、DispatcherTimerクラスで一定時間毎にイベントを起こすようにしてあげているので、そのイベントで状態を判定できるようにしましょう。

 WindowsPhone7アプリケーションでは永続的なデータ保存はIsolationStrageを一時的なデータはPhoneApplicationServiceを使うのが作法ですので、PhoneApplicationServiceクラスを使いましょう。

 App.xaml.csに以下のコードを追加します。

private void Application_Launching(object sender, LaunchingEventArgs e)
{
PhoneApplicationService.Current.State["state"] = "";

if (MediaPlayer.Queue.ActiveSong != null)
{
PhoneApplicationService.Current.State["state"] = "Activated";
}
}

private void Application_Activated(object sender, ActivatedEventArgs e)
{
PhoneApplicationService.Current.State["state"] = "Activated";
}


ループタイマー側では以下のように判定します。

var str = (string)PhoneApplicationService.Current.State["state"];
if (str == "Activated")
{
this._updateCurrentSongInformation(true); // データを再取得する処理(サンプル参照)
PhoneApplicationService.Current.State["state"] = "";
}


現在再生中の時間と曲の長さの取得、スライダーの表現



現在の再生位置はMediaPlayer.PlayPositionクラスから、曲の長さはMediaPlayer.Queue.ActiveSongから取得できます。

先ほどもチョロっと書きましたがPlayPositionクラスは読み込み専用なので、曲をシークすることができません。
(これ他に方法があるなら教えてください)


var duration = MediaPlayer.Queue.ActiveSong.Duration;
var play_position = MediaPlayer.PlayPosition;

this.Duration_text.Text = string.Format("{0:00}:{1:00}:{2:00}", duration.TotalHours, duration.Minutes, duration.Seconds);
this.PlayTime_text.Text = string.Format("{0:00}:{1:00}:{2:00}", play_position.TotalHours, play_position.Minutes, play_position.Seconds);

this.Slider.Value = Slider.Maximum * (play_position.TotalSeconds / duration.TotalSeconds); 


今後の予定



 画像にもあるのですがTwitter投稿機能とか、歌詞を取得する(できるのかな?)と面白いですねぇと思いながら実装を進めております。
 後、デザインもちゃんとしなきゃ!!

 この編の細かい解説及び顛末は7月30日(土)のHokuriku.NET勉強会で話す予定ですので、お楽しみに!!

2011年06月25日

第37回「WEB TOUCH MEETING」のスライド公開

 本日6月25日開催のWeb Touch Meetingの私のセッションスライドを公開いたします。
 参加者向けの公開なので、説明は壇上で口頭で話す部分が多いので、勉強会に参加されない方は、こういう話をするんだなぁというふうにとらえてください。

 開発者向けにぶっちゃけた部分も多いので、
心優しいロックオンの方は、
「見なかったこと」にしていただけると幸いです。

 WTM用EC-CUBE紹介スライド

SkyDriveはこちら
https://skydrive.live.com/?wa=wsignin1.0#!/view.aspx/.Public/WTM%E7%94%A8EC-CUBE%E7%B4%B9%E4%BB%8B%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%89.pptx?cid=de62232cc07e8bc3&sc=documents

 会場で聞きたいという広島の方は飛び込みもOKということですので申し込みページから登録してご来場ください!!

2011年06月23日

激白!! マイクロソフトの真実

なんとなく週刊誌風タイトル。

 これが全体の方向性になるとちょっと困るけど、この程度なら許せるお遊びかなぁ。

 お馴染み(?)台湾のSilverlightサイト

001


 Silverlightの技術が学べるようにはとても見えないのはご愛嬌。

 日本も負けてませんね、WindowsAzureがわかる漫画(漫画じゃなくて後半の文字だらけの説明が初心者な私にはためになります)。

002


 完全なネタの素材も配布されています。

 TVでも取り上げられています。
 これでMSの株価も上昇・・・とは決して言ってないでしょうね。
 
 
 うん、技術系を自認する私のブログが・・・

6月25日のWeb Touch Meetingでお話します

 こんにちはiPad2を買ってから生活のスタイルが色々変わってしまったcoelacanthです。
 楽しいですねiPad2!!

 iPad2の楽しさは後程お伝えするとして、
 今週末のWeb Touch Meeting勉強会に登壇します。

 今まではFlexかSilverlight近辺のお話がメインだったのですが、
 今回は珍しくPHPのオープンソースEC-CUBEについてお話します。

 広島で7月7日にEC-CUBEの本家ロックオンさんの主催でセミナーをやる宣伝も兼ねてなのですが、
 せっかくなのでロックオンさんがいると話せないあれやこれ(w)について色々話してみようかなぁと思います。

 とはいえ、EC-CUBE歴が浅いので、広島のEC-CUBE開発者のみなさん、意見交換や私のおぼつかないセッションのフォローとかも兼ねて参加してみてくださいね!!

 7月7日はヒーロー島勉強会もありますので、
 どちらかで見かけたら話しかけてやってください。


 Web Touch Meetingの申し込みはこちら

2011年06月02日

Windows Phone 7:アプリの申請状況が文字化け

001


 前にもこういう表記になって、放っておいたら進行無しだったので、取り消したんですよね・・・

 ソースをそのままのせると以下

[Package verified Eğ倪İЂ]


 とりあえず今回もしばらく様子見(他どうすればいいのか不明なだけともいいますが・・・)。

 追伸:

@kazuakixさんから助言いただき、英語表示に切り替え

001


 表示されたのは「Package verified」・・・化けた後半の文字はなんだったんだ???

2011年06月01日

Windows Phone 7:"Mango"タスクの挙動が違う?

 エミュレーターでCameraCaptureTaskPhotoChooserTaskを利用して写真を撮ったり、画像を選択した後に元のページに戻るはずが、

 Resueming・・・

 と表示した後に初期画面に戻ってしまう(アプリが再起動している?)症状に遭遇しました。

 WPDT7.1環境でエミュレーターを使ってデバッグ接続している際に発生するようで、
 同じエミュレーターでもデバッグトレースを取得していない状態だと発生せず、実機に転送した場合も問題なし。

 プロジェクトのバージョンは7.0だったけど多分7.1でも発生するんじゃないかなぁ。

 WPDT7.1自体がβなのでWPDT7の開発環境は一つ残しておいた方が良さそうですね。
 

Profile

シーラカンス

Recent Comments
QRコード
QRコード
livedoor Readerに登録
RSS
livedoor Blog(ブログ)