try this, turn on audio record permission

package com.aiti.vumeter;
//vumeter
//May 21 2010 Bob Gardner at aol.com

import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.TextView;

public class vumeter extends Activity {
        public AudioRecord audioRecord;
        public VuView vuview;
    public Timer timer;
    public int channelConfiguration =
AudioFormat.CHANNEL_CONFIGURATION_MONO;
    public int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
        public int mSamplesRead;        //how many samples read
        public int buffersizebytes;
        public int buflen;
        public int scrwidth;
        public int scrheight;
        public int cursamprate;
        public final int SAMPPERSEC = 48000; //samp per sec 8000, 11025,
22050 44100 or 48000
        public float vin;    //input volts
        public float iavg;   //avg of input volts
        public float ipk;    //peak input volts
        public float isum;   //sum of ans of input volts
        public float idbavg; //db below 0 of avg input volts
        public float idbpk;
        public float pixperdb;
        public float pixperdiv;
        public final float rangedb=60.0f;
        public final float dbperdiv=3.0f;
        public final float barwid=30f;
        public float scrbot;
        public long t1,t2,dt, t3,t4,dt2;
        public short[] buffer; //+-32767

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
//      setContentView(R.layout.main);
        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        scrwidth=metrics.widthPixels;   //
        scrheight=metrics.heightPixels; //
        scrbot=scrheight-100;     //480-100->380
        pixperdb=scrbot/rangedb;  //380/60->5
            pixperdiv=dbperdiv*pixperdb; //3*5->15

        buffersizebytes =
AudioRecord.getMinBufferSize(SAMPPERSEC,channelConfiguration,audioEncoding); //
4096 on ion
        buffer = new short[buffersizebytes]; //4096
        buflen=buffersizebytes/2;            //2048
        audioRecord = new
AudioRecord(android.media.MediaRecorder.AudioSource.MIC,SAMPPERSEC,
                    channelConfiguration, audioEncoding,
buffersizebytes); //constructor
        cursamprate=audioRecord.getSampleRate();
        vuview = new VuView(this);
            setContentView(vuview);

            timer = new Timer();
        timer.schedule(new TimerTask(){
                @Override
                    public void run(){
                        TimerMethod();
                }
            }, 0, 200); //every 200 ms
//          trigger(); //grab samples and calc db
    }//oncreate

    private void TimerMethod(){
            //This method is called directly by the timer
            //and runs in the same thread as the timer.
            //We call the method that will work with the UI
            //through the runOnUiThread method.
            this.runOnUiThread(Timer_Tick);
    }

    private Runnable Timer_Tick = new Runnable(){
            public void run() {
            //This method runs in the same thread as the UI.
                //Do something to the UI thread here
                trigger();
        }
    };

    //--------------------------------------
    public void acquire(){
        try {
            audioRecord.startRecording(); //48khz
        } catch (Throwable t) {
//          Log.e("AudioRecord", "startrecording Failed");
        }
//            SystemClock.sleep(50L);       //one period of 20 hz
         mSamplesRead = audioRecord.read(buffer, 0, buflen);
         try{
           audioRecord.stop();
         } catch (Throwable t) {
//           Log.e("AudioRecord", "stoprecording Failed");
         }
    }

    //-----------------------
    public void avg(){
    int i;
    float ftmp;

        ipk=0f;
        isum=0f;
                for(i=0; i < buflen; i++){      //2048 samples
                        vin=(float)buffer[i];       //get a sample
                        ftmp=Math.abs(vin);         //abs of input sample
                        isum += ftmp;               //sum of input samples
                        if(ftmp > ipk) ipk=ftmp;    //remember input peak
                }
                iavg=isum/buflen;                               //avg of input
samples
                idbavg= (float)(20.0*Math.log10(iavg/32767.0)); //db below clip 
of
input signal
                idbpk=  (float)(20.0*Math.log10(ipk/32767.0));  //db of input 
signal
    }//avg

    //--------------------------------
    public void trigger(){
        t1=System.currentTimeMillis();
        acquire();           //grab buffer full of samples
        avg();               //calc avg and db
//        dump();
        vuview.invalidate(); //tell os to call ondraw
            t2=System.currentTimeMillis();
        dt=t2-t1;
        t1=t2;
    }//trigger

    //--------------------------------------
        void dump(){
            TextView tv = new TextView(this);
            setContentView(tv);
            tv.setTextColor(Color.WHITE);
            tv.setText("buffersizebytes "+buffersizebytes+"\n");
        for (int i = 0; i < buflen; i++){
              tv.append(" "+buffer[i]);
        }
    }//dump

    //-------lifecycle callbacks-------------------
    @Override
    public void onResume(){
        super.onResume();
        trigger();
    }//onresume

    @Override
    public void onPause(){
        super.onPause();
        audioRecord.stop();
    }//onpause

    @Override
    public void onStop(){
        super.onStop();
        audioRecord.release();
    }//onstop

//    @Override
//    public boolean onTouchEvent(MotionEvent motionevent){
//          if(motionevent.getAction()==MotionEvent.ACTION_DOWN){
//                  trigger(); //acquire buffer full of samples
//          }
//          return true;
//    }

        //--------------------------------------
        private class VuView extends View {
                public VuView(Context context) {
                        super(context);
                }

                @Override
                protected void onDraw(Canvas canvas) {
                        super.onDraw(canvas);
                t3=System.currentTimeMillis();
                        graticule(canvas);
                        drawvu(canvas);
                t4=System.currentTimeMillis();
                dt2=t4-t3;
                t3=t4;
                }//ondraw

                //------------------------------------------------
                public void graticule(Canvas canvas){ //draw graticule
                int i;
        float TL=7;

            Paint paint = new Paint();
                        paint.setColor(Color.BLACK);
                        canvas.drawPaint(paint); //clear screen

                        paint.setColor(Color.GRAY);
                        paint.setStyle(Paint.Style.STROKE);
                        paint.setStrokeWidth(1);
                        canvas.drawLine(0f,0f,0f,scrbot, paint); //y axis 
(vertical)
                        for(i=0; i < (int)scrbot; i++){
                                if((i % (int)pixperdiv)==0){
                                        canvas.drawLine(0,i,TL,i, paint); //y 
axis tics (horizontal)
                                }
                        }
                }//graticule

                //-----------------------------------------
                public void drawvu(Canvas canvas){ //draw vu
                float x;
                float ftmp;

                        Paint paint = new Paint();
                        paint.setColor(Color.GREEN);
                        paint.setStyle(Paint.Style.STROKE);
                        paint.setStrokeWidth(1);
                        x=20f; //left side of vu
                        ftmp=Math.abs(idbpk)*pixperdb; //abs of db, cvt to pix
                        if(ftmp > scrbot) ftmp=scrbot; //clip at bottom
                        canvas.drawLine(x, ftmp, x+barwid, ftmp, paint); //db 
peak bar

                        paint.setStyle(Paint.Style.FILL);
                    canvas.drawRect(x,(float)Math.abs(idbavg)*pixperdb, 
x+barwid,
scrbot, paint); //input db avg

                        paint.setColor(Color.WHITE);
                        paint.setTextSize(15);
                    canvas.drawText("ms     " + dt,       100, 20, paint);  //
                    canvas.drawText("ms     " + dt2,      100, 40, paint); //
                    canvas.drawText("db/div " + dbperdiv, 100, 60, paint);
                    canvas.drawText("range  " + rangedb,  100, 80, paint);
                    canvas.drawText("avg    " + idbavg,   100, 100, paint);
//                  canvas.drawText("ht " + scrheight,    100, 120, paint);
//                  canvas.drawText("sr     " + cursamprate,100,120, paint);
                }//drawvus
        }//graphview
}//activity
//-----------------------eof-----------------------

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to