• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.musicvis.vis1;
18 
19 import com.android.musicvis.AudioCapture;
20 
21 import android.graphics.Canvas;
22 import android.graphics.Paint;
23 import android.graphics.Rect;
24 import android.media.MediaPlayer;
25 import android.os.Handler;
26 import android.os.SystemClock;
27 import android.service.wallpaper.WallpaperService;
28 import android.util.Log;
29 import android.view.MotionEvent;
30 import android.view.SurfaceHolder;
31 
32 import java.util.Arrays;
33 
34 public class Visualization1 extends WallpaperService {
35 
36     private final Handler mHandler = new Handler();
37 
38     @Override
onCreate()39     public void onCreate() {
40         super.onCreate();
41     }
42 
43     @Override
onDestroy()44     public void onDestroy() {
45         super.onDestroy();
46     }
47 
48     @Override
onCreateEngine()49     public Engine onCreateEngine() {
50         return new CubeEngine();
51     }
52 
53     class CubeEngine extends Engine {
54 
55         private final Paint mPaint = new Paint();
56         private float mOffset;
57         private float mTouchX = -1;
58         private float mTouchY = -1;
59         private long mStartTime;
60         private int mWidth;
61         private float mCenterX;
62         private float mCenterY;
63         private AudioCapture mAudioCapture;
64         private int [] mVizData = new int[1024];
65 
66         private final Runnable mDrawCube = new Runnable() {
67             public void run() {
68                 drawFrame();
69             }
70         };
71         private boolean mVisible;
72 
CubeEngine()73         CubeEngine() {
74         }
75 
76         @Override
onCreate(SurfaceHolder surfaceHolder)77         public void onCreate(SurfaceHolder surfaceHolder) {
78             super.onCreate(surfaceHolder);
79 
80             final Paint paint = mPaint;
81             paint.setColor(0xffffffff);
82             paint.setAntiAlias(true);
83             paint.setStrokeWidth(2);
84             paint.setStrokeCap(Paint.Cap.ROUND);
85             paint.setStyle(Paint.Style.STROKE);
86 
87             mStartTime = SystemClock.elapsedRealtime();
88         }
89 
90         @Override
onDestroy()91         public void onDestroy() {
92             super.onDestroy();
93             mHandler.removeCallbacks(mDrawCube);
94             if (mAudioCapture != null) {
95                 mAudioCapture.stop();
96                 mAudioCapture.release();
97                 mAudioCapture = null;
98             }
99         }
100 
101         @Override
onVisibilityChanged(boolean visible)102         public void onVisibilityChanged(boolean visible) {
103             mVisible = visible;
104             if (visible) {
105                 if (mAudioCapture == null) {
106                     mAudioCapture = new AudioCapture(AudioCapture.TYPE_PCM, 1024);
107                 }
108                 mAudioCapture.start();
109                 drawFrame();
110             } else {
111                 mHandler.removeCallbacks(mDrawCube);
112                 if (mAudioCapture != null) {
113                     mAudioCapture.stop();
114                     mAudioCapture.release();
115                     mAudioCapture = null;
116                 }
117             }
118         }
119 
120         @Override
onSurfaceChanged(SurfaceHolder holder, int format, int width, int height)121         public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
122             super.onSurfaceChanged(holder, format, width, height);
123             mWidth = width;
124             mCenterX = width/2.0f;
125             mCenterY = height/2.0f;
126             drawFrame();
127         }
128 
129         @Override
onSurfaceCreated(SurfaceHolder holder)130         public void onSurfaceCreated(SurfaceHolder holder) {
131             super.onSurfaceCreated(holder);
132         }
133 
134         @Override
onSurfaceDestroyed(SurfaceHolder holder)135         public void onSurfaceDestroyed(SurfaceHolder holder) {
136             super.onSurfaceDestroyed(holder);
137             mVisible = false;
138             mHandler.removeCallbacks(mDrawCube);
139         }
140 
141         @Override
onOffsetsChanged(float xOffset, float yOffset, float xStep, float yStep, int xPixels, int yPixels)142         public void onOffsetsChanged(float xOffset, float yOffset,
143                 float xStep, float yStep, int xPixels, int yPixels) {
144             mOffset = xOffset;
145             drawFrame();
146         }
147 
148         @Override
onTouchEvent(MotionEvent event)149         public void onTouchEvent(MotionEvent event) {
150             // touch events don't actually work for wallpapers, but if they did,
151             // we'd be using them to draw a circle around the touch point
152             if (event.getAction() == MotionEvent.ACTION_MOVE) {
153                 mTouchX = event.getX();
154                 mTouchY = event.getY();
155             } else {
156                 mTouchX = -1;
157                 mTouchY = -1;
158             }
159             super.onTouchEvent(event);
160         }
161 
drawFrame()162         void drawFrame() {
163             final SurfaceHolder holder = getSurfaceHolder();
164             final Rect frame = holder.getSurfaceFrame();
165             final int width = frame.width();
166             final int height = frame.height();
167 
168             Canvas c = null;
169             try {
170                 c = holder.lockCanvas();
171                 if (c != null) {
172                     // draw something
173                     drawCube(c);
174                     drawTouchPoint(c);
175                 }
176             } finally {
177                 if (c != null) holder.unlockCanvasAndPost(c);
178             }
179 
180             mHandler.removeCallbacks(mDrawCube);
181             if (mVisible) {
182                 mHandler.postDelayed(mDrawCube, 1000 / 25);
183             }
184         }
185 
drawCube(Canvas c)186         void drawCube(Canvas c) {
187             c.save();
188             c.drawColor(0xff000000);
189 
190             if (mAudioCapture != null) {
191                 mVizData = mAudioCapture.getFormattedData(1, 1);
192             } else {
193                 Arrays.fill(mVizData, (int)0);
194             }
195 
196             for (int i = 0; i < mWidth; i++) {
197                 c.drawPoint(i, mCenterY + mVizData[i], mPaint);
198             }
199             c.restore();
200         }
201 
drawTouchPoint(Canvas c)202         void drawTouchPoint(Canvas c) {
203             if (mTouchX >=0 && mTouchY >= 0) {
204                 c.drawCircle(mTouchX, mTouchY, 50, mPaint);
205             }
206         }
207 
208     }
209 }
210