PageRenderTime 23ms CodeModel.GetById 13ms app.highlight 8ms RepoModel.GetById 1ms app.codeStats 0ms

/ime/latinime/src/com/googlecode/eyesfree/inputmethod/voice/WaveformImage.java

http://eyes-free.googlecode.com/
Java | 90 lines | 57 code | 10 blank | 23 comment | 8 complexity | ca1b0656f1eaf56322ce8383a7de0ffa MD5 | raw file
 1/*
 2 * Copyright (C) 2008-2009 Google Inc.
 3 * 
 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 5 * use this file except in compliance with the License. You may obtain a copy of
 6 * 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, WITHOUT
12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 * License for the specific language governing permissions and limitations under
14 * the License.
15 */
16
17package com.googlecode.eyesfree.inputmethod.voice;
18
19import android.graphics.Bitmap;
20import android.graphics.Canvas;
21import android.graphics.Paint;
22
23import java.io.ByteArrayOutputStream;
24import java.nio.ByteBuffer;
25import java.nio.ByteOrder;
26import java.nio.ShortBuffer;
27
28/**
29 * Utility class to draw a waveform into a bitmap, given a byte array
30 * that represents the waveform as a sequence of 16-bit integers.
31 * Adapted from RecognitionActivity.java.
32 */
33public class WaveformImage {
34    private static final int SAMPLING_RATE = 8000;
35
36    private WaveformImage() {}
37
38    public static Bitmap drawWaveform(
39        ByteArrayOutputStream waveBuffer, int w, int h, int start, int end) {
40        final Bitmap b = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
41        final Canvas c = new Canvas(b);
42        final Paint paint = new Paint();
43        paint.setColor(0xFFFFFFFF); // 0xRRGGBBAA
44        paint.setAntiAlias(true);
45        paint.setStrokeWidth(0);
46
47        final ShortBuffer buf = ByteBuffer
48            .wrap(waveBuffer.toByteArray())
49            .order(ByteOrder.nativeOrder())
50            .asShortBuffer();
51        buf.position(0);
52
53        final int numSamples = waveBuffer.size() / 2;
54        final int delay = (SAMPLING_RATE * 100 / 1000);
55        int endIndex = end / 2 + delay;
56        if (end == 0 || endIndex >= numSamples) {
57            endIndex = numSamples;
58        }
59        int index = start / 2 - delay;
60        if (index < 0) {
61            index = 0;
62        }
63        final int size = endIndex - index;
64        int numSamplePerPixel = 32;
65        int delta = size / (numSamplePerPixel * w);
66        if (delta == 0) {
67            numSamplePerPixel = size / w;
68            delta = 1;
69        }
70
71        final float scale = 3.5f / 65536.0f;
72        // do one less column to make sure we won't read past
73        // the buffer.
74        try {
75            for (int i = 0; i < w - 1 ; i++) {
76                final float x = i;
77                for (int j = 0; j < numSamplePerPixel; j++) {
78                    final short s = buf.get(index);
79                    final float y = (h / 2) - (s * h * scale);
80                    c.drawPoint(x, y, paint);
81                    index += delta;
82                }
83            }
84        } catch (IndexOutOfBoundsException e) {
85            // this can happen, but we don't care
86        }
87
88        return b;
89    }
90}