/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.musicvis.vis1; import com.android.musicvis.AudioCapture; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.media.MediaPlayer; import android.os.Handler; import android.os.SystemClock; import android.service.wallpaper.WallpaperService; import android.util.Log; import android.view.MotionEvent; import android.view.SurfaceHolder; import java.util.Arrays; public class Visualization1 extends WallpaperService { private final Handler mHandler = new Handler(); @Override public void onCreate() { super.onCreate(); } @Override public void onDestroy() { super.onDestroy(); } @Override public Engine onCreateEngine() { return new CubeEngine(); } class CubeEngine extends Engine { private final Paint mPaint = new Paint(); private float mOffset; private float mTouchX = -1; private float mTouchY = -1; private long mStartTime; private int mWidth; private float mCenterX; private float mCenterY; private AudioCapture mAudioCapture; private int [] mVizData = new int[1024]; private final Runnable mDrawCube = new Runnable() { public void run() { drawFrame(); } }; private boolean mVisible; CubeEngine() { } @Override public void onCreate(SurfaceHolder surfaceHolder) { super.onCreate(surfaceHolder); final Paint paint = mPaint; paint.setColor(0xffffffff); paint.setAntiAlias(true); paint.setStrokeWidth(2); paint.setStrokeCap(Paint.Cap.ROUND); paint.setStyle(Paint.Style.STROKE); mStartTime = SystemClock.elapsedRealtime(); } @Override public void onDestroy() { super.onDestroy(); mHandler.removeCallbacks(mDrawCube); if (mAudioCapture != null) { mAudioCapture.stop(); mAudioCapture.release(); mAudioCapture = null; } } @Override public void onVisibilityChanged(boolean visible) { mVisible = visible; if (visible) { if (mAudioCapture == null) { mAudioCapture = new AudioCapture(AudioCapture.TYPE_PCM, 1024); } mAudioCapture.start(); drawFrame(); } else { mHandler.removeCallbacks(mDrawCube); if (mAudioCapture != null) { mAudioCapture.stop(); mAudioCapture.release(); mAudioCapture = null; } } } @Override public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) { super.onSurfaceChanged(holder, format, width, height); mWidth = width; mCenterX = width/2.0f; mCenterY = height/2.0f; drawFrame(); } @Override public void onSurfaceCreated(SurfaceHolder holder) { super.onSurfaceCreated(holder); } @Override public void onSurfaceDestroyed(SurfaceHolder holder) { super.onSurfaceDestroyed(holder); mVisible = false; mHandler.removeCallbacks(mDrawCube); } @Override public void onOffsetsChanged(float xOffset, float yOffset, float xStep, float yStep, int xPixels, int yPixels) { mOffset = xOffset; drawFrame(); } @Override public void onTouchEvent(MotionEvent event) { // touch events don't actually work for wallpapers, but if they did, // we'd be using them to draw a circle around the touch point if (event.getAction() == MotionEvent.ACTION_MOVE) { mTouchX = event.getX(); mTouchY = event.getY(); } else { mTouchX = -1; mTouchY = -1; } super.onTouchEvent(event); } void drawFrame() { final SurfaceHolder holder = getSurfaceHolder(); final Rect frame = holder.getSurfaceFrame(); final int width = frame.width(); final int height = frame.height(); Canvas c = null; try { c = holder.lockCanvas(); if (c != null) { // draw something drawCube(c); drawTouchPoint(c); } } finally { if (c != null) holder.unlockCanvasAndPost(c); } mHandler.removeCallbacks(mDrawCube); if (mVisible) { mHandler.postDelayed(mDrawCube, 1000 / 25); } } void drawCube(Canvas c) { c.save(); c.drawColor(0xff000000); if (mAudioCapture != null) { mVizData = mAudioCapture.getFormattedData(1, 1); } else { Arrays.fill(mVizData, (int)0); } for (int i = 0; i < mWidth; i++) { c.drawPoint(i, mCenterY + mVizData[i], mPaint); } c.restore(); } void drawTouchPoint(Canvas c) { if (mTouchX >=0 && mTouchY >= 0) { c.drawCircle(mTouchX, mTouchY, 50, mPaint); } } } }