[musikcube] r369 committed - PlayControlls starting to work.

0 views
Skip to first unread message

codesite...@google.com

unread,
Aug 6, 2009, 6:25:23 PM8/6/09
to musikc...@googlegroups.com
Revision: 369
Author: onnerby
Date: Thu Aug 6 15:24:39 2009
Log: PlayControlls starting to work.
http://code.google.com/p/musikcube/source/detail?r=369

Modified:
/trunk/src/android/res/layout/play_control.xml
/trunk/src/android/src/org/musikcube/PlayerControl.java
/trunk/src/android/src/org/musikcube/TrackList.java
/trunk/src/android/src/org/musikcube/core/Player.java
/trunk/src/android/src/org/musikcube/core/TrackPlayer.java

=======================================
--- /trunk/src/android/res/layout/play_control.xml Wed Aug 5 16:16:30 2009
+++ /trunk/src/android/res/layout/play_control.xml Thu Aug 6 15:24:39 2009
@@ -7,20 +7,25 @@
android:paddingRight="8dp" android:gravity="center_vertical|
center_horizontal">

<LinearLayout android:id="@+id/LinearLayout01" android:layout_weight="0.5"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:gravity="left">
-<ImageView android:id="@+id/ImageView01"
android:layout_width="wrap_content" android:src="@drawable/album"
android:layout_marginTop="5sp" android:layout_marginBottom="5sp"
android:layout_height="wrap_content"></ImageView>
-<TextView android:id="@+id/TextView04" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Track"
android:textSize="24sp"></TextView>
-<TextView android:id="@+id/TextView01" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Genre:"></TextView>
-<TextView android:id="@+id/TextView02" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Album:"></TextView>
-<TextView android:id="@+id/TextView03" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Artists:"></TextView>
+<ImageView android:id="@+id/ImageView01" android:src="@drawable/album"
android:layout_marginTop="5sp" android:layout_marginBottom="5sp"
android:layout_height="200sp" android:layout_width="200sp"
android:scaleType="fitXY"></ImageView>
+<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:textSize="24sp"
android:id="@+id/TrackTitle" android:text="Title:"></TextView>
+
+<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Album:"
android:id="@+id/TrackAlbum"></TextView>
+<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="Artists:"
android:id="@+id/TrackArtist"></TextView>
</LinearLayout>
<LinearLayout android:id="@+id/LinearLayout02"
android:layout_weight="0.5" android:layout_width="wrap_content"
android:layout_height="wrap_content"></LinearLayout><LinearLayout
android:id="@+id/LinearLayout01" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:orientation="horizontal">
- <ImageButton android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/MediaPrev"
android:clickable="true" android:src="@drawable/ic_media_previous"
android:adjustViewBounds="true"></ImageButton>
- <ImageButton android:layout_width="wrap_content"
android:layout_height="wrap_content" android:adjustViewBounds="true"
android:id="@+id/MediaPause"
android:src="@drawable/ic_media_pause"></ImageButton>
- <ImageButton android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/MediaNext"
android:adjustViewBounds="true"
android:src="@drawable/ic_media_next"></ImageButton>
+ <ImageButton android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/MediaPrev"
android:clickable="true" android:src="@drawable/ic_media_previous"
android:adjustViewBounds="true" android:padding="15sp"></ImageButton>
+ <ImageButton android:layout_width="wrap_content"
android:layout_height="wrap_content" android:adjustViewBounds="true"
android:id="@+id/MediaPause" android:src="@drawable/ic_media_pause"
android:padding="15sp"></ImageButton>
+ <ImageButton android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/MediaNext"
android:adjustViewBounds="true" android:src="@drawable/ic_media_next"
android:padding="15sp"></ImageButton>
</LinearLayout>


-<SeekBar android:id="@+id/SeekBar01" android:layout_height="wrap_content"
android:layout_width="fill_parent" android:max="1000"
android:progress="300" android:secondaryProgress="100"></SeekBar>
+<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content">
+ <TextView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="0:00"
android:id="@+id/TrackPosition" android:typeface="monospace"></TextView>
+ <TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="0:00"
android:id="@+id/TrackDuration" android:typeface="monospace"
android:gravity="right"></TextView>
+
+</LinearLayout>
+<SeekBar android:layout_height="wrap_content"
android:layout_width="fill_parent" android:max="1000"
android:progress="300" android:secondaryProgress="100"
android:id="@+id/TrackProgress"></SeekBar>
</LinearLayout>
=======================================
--- /trunk/src/android/src/org/musikcube/PlayerControl.java Wed Jul 29
17:06:47 2009
+++ /trunk/src/android/src/org/musikcube/PlayerControl.java Thu Aug 6
15:24:39 2009
@@ -1,14 +1,34 @@
package org.musikcube;

+import java.util.Timer;
+import java.util.TimerTask;
+
+import org.musikcube.core.IQuery;
+import org.musikcube.core.Library;
+import org.musikcube.core.MetadataQuery;
+import org.musikcube.core.Player;
+import org.musikcube.core.Track;
+import org.musikcube.core.IQuery.OnQueryResultListener;
+import org.musikcube.core.Player.OnTrackUpdateListener;
+
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
+import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
-
-public class PlayerControl extends Activity {
-
+import android.widget.SeekBar;
+import android.widget.TextView;
+
+public class PlayerControl extends Activity implements
OnTrackUpdateListener, OnQueryResultListener {
+
+ private int trackId = 0;
+ private Track track = new Track();
+ private int buffer = 0;
+ private int duration = 0;
+ private int secondsPlayed = 0;
+ private Object lock = new Object();

@Override
public void onCreate(Bundle savedInstanceState) {
@@ -36,6 +56,164 @@
startService(intent);
}
};
-
-
-}
+
+ public void OnTrackBufferUpdate(int percent) {
+ synchronized(lock){
+ this.buffer = percent;
+ }
+
this.callbackTrackPositionsUpdateHandler.post(this.callbackTrackPositionsUpdateRunnable);
+ }
+ public void OnTrackPositionUpdate(int secondsPlayed) {
+ synchronized(lock){
+ this.secondsPlayed = secondsPlayed;
+ }
+
this.callbackTrackPositionsUpdateHandler.post(this.callbackTrackPositionsUpdateRunnable);
+ }
+ public void OnTrackUpdate() {
+
+ synchronized(lock){
+ int newTrackId = Player.GetInstance().GetCurrentTrackId();
+ if(newTrackId!=this.trackId){
+ this.trackId = newTrackId;
+ this.track = new Track();
+
+ if(this.trackId!=0){
+ MetadataQuery query = new MetadataQuery();
+ query.requestedMetakeys.add("title");
+ query.requestedMetakeys.add("track");
+ query.requestedMetakeys.add("visual_artist");
+ query.requestedMetakeys.add("album");
+ query.requestedMetakeys.add("year");
+ query.requestedMetakeys.add("thumbnail_id");
+ query.requestedMetakeys.add("duration");
+ query.requestedTracks.add(this.trackId);
+ query.SetResultListener(this);
+ Library.GetInstance().AddQuery(query);
+ }
+ }
+ }
+ this.callbackTrackUpdateHandler.post(this.callbackTrackUpdateRunnable);
+ }
+
+
+ public void OnQueryResults(IQuery query) {
+ MetadataQuery mdQuery = (MetadataQuery)query;
+ if(!mdQuery.resultTracks.isEmpty()){
+ synchronized(lock){
+ Track newTrack = mdQuery.resultTracks.get(0);
+ if(this.trackId==newTrack.id){
+ this.track = newTrack;
+
this.callbackTrackUpdateHandler.post(this.callbackTrackUpdateRunnable);
+ }
+ }
+ }
+ }
+
+ @Override
+ protected void onPause() {
+ Player.GetInstance().SetUpdateListener(null);
+ this.timer.cancel();
+ super.onPause();
+ }
+ @Override
+ protected void onResume() {
+ Player.GetInstance().SetUpdateListener(this);
+ super.onResume();
+
+ this.timer = new Timer();
+ this.timer.schedule(new TimerTask() { public void run() {
+
callbackTrackPositionsUpdateHandler.post(callbackTrackPositionsUpdateRunnable);
+ } }, 100);
+ }
+
+ // Need handler for callbacks to the UI thread
+ final Handler callbackTrackUpdateHandler = new Handler();
+ // Create runnable for posting
+ final Runnable callbackTrackUpdateRunnable = new Runnable() {
+ public void run() {
+ OnUpdateTrackUI();
+ }
+ };
+
+ public void OnUpdateTrackUI() {
+ TextView titleView = (TextView)findViewById(R.id.TrackTitle);
+ TextView albumView = (TextView)findViewById(R.id.TrackAlbum);
+ TextView artistView = (TextView)findViewById(R.id.TrackArtist);
+ TextView durationView = (TextView)findViewById(R.id.TrackDuration);
+
+ synchronized(lock){
+ String title = this.track.metadata.get("title");
+ if(title==null){
+ titleView.setText("Title:");
+ }else{
+ titleView.setText("Title: "+title);
+ }
+ String album = this.track.metadata.get("album");
+ if(album==null){
+ albumView.setText("Album:");
+ }else{
+ albumView.setText("Album: "+album);
+ }
+ String artist = this.track.metadata.get("visual_artist");
+ if(artist==null){
+ artistView.setText("Artist:");
+ }else{
+ artistView.setText("Artist: "+artist);
+ }
+
+ String duration = this.track.metadata.get("duration");
+ if(duration==null){
+ this.duration = 0;
+ }else{
+ this.duration = Integer.parseInt(duration);
+ }
+ int minutes = (int)Math.floor(this.duration/60);
+ int seconds = this.duration-minutes*60;
+ String durationText = Integer.toString(minutes)+":";
+ if(seconds<10){ durationText += "0"; }
+ durationText += Integer.toString(seconds);
+ durationView.setText(durationText);
+ }
+ }
+
+ // Need handler for callbacks to the UI thread
+ final Handler callbackTrackPositionsUpdateHandler = new Handler();
+ // Create runnable for posting
+ final Runnable callbackTrackPositionsUpdateRunnable = new Runnable() {
+ public void run() {
+ OnUpdateTrackPositionsUI();
+ }
+ };
+
+ public void OnUpdateTrackPositionsUI() {
+ int msPosition = Player.GetInstance().GetTrackPosition();
+ int position = msPosition/1000;
+ int minutes = (int)Math.floor(position/60);
+ int seconds = position-minutes*60;
+ String positionText = Integer.toString(minutes)+":";
+ if(seconds<10){ positionText += "0"; }
+ positionText += Integer.toString(seconds);
+ TextView positionView = (TextView)findViewById(R.id.TrackPosition);
+ positionView.setText(positionText);
+
+ SeekBar seekBar = (SeekBar)findViewById(R.id.TrackProgress);
+ if(this.duration==0){
+ seekBar.setProgress(0);
+ }else{
+ seekBar.setProgress(msPosition/this.duration);
+ }
+
+ // Next callback in 0.5 seconds
+ this.timer.schedule(new TimerTask() { public void run() {
+
callbackTrackPositionsUpdateHandler.post(callbackTrackPositionsUpdateRunnable);
+ } }, 500);
+ }
+
+ private java.util.Timer timer = new java.util.Timer();
+
+ /*
+ gametimer.schedule(new TimerTask() { public void run() {
+ seconds+=0.1; updatecount();
+ } }, 100, 100);
+ */
+}
=======================================
--- /trunk/src/android/src/org/musikcube/TrackList.java Wed Aug 5 16:16:30
2009
+++ /trunk/src/android/src/org/musikcube/TrackList.java Thu Aug 6 15:24:39
2009
@@ -194,7 +194,7 @@
@Override
protected void onListItemClick(ListView l, View v, int position, long id){
Intent intent = new Intent(this, org.musikcube.Service.class);
- intent.putExtra("org.musikcube.Service.tracklist", this.query.trackList);
+ intent.putExtra("org.musikcube.Service.tracklist", this.trackList);
intent.putExtra("org.musikcube.Service.position", position);
intent.putExtra("org.musikcube.Service.action", "playlist");
startService(intent);
=======================================
--- /trunk/src/android/src/org/musikcube/core/Player.java Wed Aug 5
16:16:30 2009
+++ /trunk/src/android/src/org/musikcube/core/Player.java Thu Aug 6
15:24:39 2009
@@ -2,6 +2,8 @@

import java.util.ArrayList;

+import org.musikcube.core.IQuery.OnQueryResultListener;
+
import android.content.Intent;

public class Player implements TrackPlayer.OnTrackStatusListener{
@@ -13,6 +15,7 @@
private java.lang.Object lock = new java.lang.Object();

private ArrayList<TrackPlayer> playingTracks = new
ArrayList<TrackPlayer>();
+ private TrackPlayer currentPlayer;

public android.app.Service service;

@@ -58,9 +61,36 @@
TrackPlayer player = new TrackPlayer(url,true);
player.listener = this;
this.playingTracks.add(player);
+ this.currentPlayer = player;
+
+ if(this.listener!=null){
+ this.listener.OnTrackUpdate();
+ this.listener.OnTrackBufferUpdate(0);
+ this.listener.OnTrackPositionUpdate(0);
+ }
}

}
+
+ ///////////////////////////////
+ // Inteface for updated track
+ public interface OnTrackUpdateListener{
+ public void OnTrackUpdate();
+ public void OnTrackBufferUpdate(int percent);
+ public void OnTrackPositionUpdate(int secondsPlayed);
+ }
+ protected OnTrackUpdateListener listener = null;
+ public void SetUpdateListener(OnTrackUpdateListener listener){
+ synchronized(this.lock){
+ this.listener = listener;
+ if(this.listener!=null){
+ this.listener.OnTrackUpdate();
+ this.listener.OnTrackBufferUpdate(0);
+ this.listener.OnTrackPositionUpdate(0);
+ }
+ }
+ }
+

public void Next(){
synchronized(this.lock){
@@ -83,6 +113,7 @@

private void StopAllTracks(){
synchronized(this.lock){
+ this.currentPlayer = null;
int trackCount = this.playingTracks.size();
for(int i=0;i<trackCount;i++){
this.playingTracks.get(i).listener = null;
@@ -122,5 +153,24 @@
this.service.startService(intent);
}

+ public int GetCurrentTrackId(){
+ synchronized(this.lock){
+ if(this.position>=0 && this.position<this.nowPlaying.size()){
+ return this.nowPlaying.get(this.position);
+ }
+ return 0;
+ }
+
+ }
+
+ public int GetTrackPosition(){
+ synchronized(this.lock){
+ TrackPlayer player = this.currentPlayer;
+ if(player!=null){
+ return player.GetTrackPosition();
+ }
+ }
+ return 0;
+ }

}
=======================================
--- /trunk/src/android/src/org/musikcube/core/TrackPlayer.java Wed Jul 29
15:56:39 2009
+++ /trunk/src/android/src/org/musikcube/core/TrackPlayer.java Thu Aug 6
15:24:39 2009
@@ -17,7 +17,9 @@
private static final int STATUS_EXIT = 10;

public void run() {
- this.mediaPlayer = new MediaPlayer();
+ synchronized(this.lock){
+ this.mediaPlayer = new MediaPlayer();
+ }
try {

this.mediaPlayer.setOnCompletionListener(this);
@@ -141,5 +143,13 @@
return false;
}

+ public int GetTrackPosition(){
+ synchronized(this.lock){
+ if(this.mediaPlayer!=null){
+ return this.mediaPlayer.getCurrentPosition();
+ }
+ }
+ return 0;
+ }

}

Reply all
Reply to author
Forward
0 new messages