1d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent// Copyright 2008, The Android Open Source Project
2d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent//
3d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent// Licensed under the Apache License, Version 2.0 (the "License");
4d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent// you may not use this file except in compliance with the License.
5d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent// You may obtain a copy of the License at
6d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent//
7d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent//     http://www.apache.org/licenses/LICENSE-2.0
8d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent//
9d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent// Unless required by applicable law or agreed to in writing, software
10d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent// distributed under the License is distributed on an "AS IS" BASIS,
11d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent// See the License for the specific language governing permissions and
13d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent// limitations under the License.
14d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
15d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent//
16d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent#define LOG_NDEBUG 0
17d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent#define LOG_TAG "shared_mem_test"
18d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
19d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent#include <stdlib.h>
20d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent#include <stdio.h>
21d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent#include <cutils/properties.h>
22d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent#include <media/AudioSystem.h>
23d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent#include <media/AudioTrack.h>
24d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent#include <math.h>
25d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
26d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent#include "shared_mem_test.h"
27d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent#include <binder/MemoryDealer.h>
28d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent#include <binder/MemoryHeapBase.h>
29d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent#include <binder/MemoryBase.h>
30d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent#include <binder/ProcessState.h>
31d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
32d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
33d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent#include <utils/Log.h>
34d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
35d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent#include <fcntl.h>
36d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
37d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurentnamespace android {
38d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
39d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent/************************************************************
40d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent*
41d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent*    Constructor
42d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent*
43d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent************************************************************/
44d5da9de8165fff06e488faabde82f3e68cc4407fEric LaurentAudioTrackTest::AudioTrackTest(void) {
45d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
46d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    InitSine();         // init sine table
47d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
48d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent}
49d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
50d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
51d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent/************************************************************
52d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent*
53d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent*
54d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent************************************************************/
55d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurentvoid AudioTrackTest::Execute(void) {
56d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    if (Test01() == 0) {
57d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        ALOGD("01 passed\n");
58d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    } else {
59d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        ALOGD("01 failed\n");
60d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    }
61d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent}
62d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
63d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent/************************************************************
64d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent*
65d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent*    Shared memory test
66d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent*
67d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent************************************************************/
68d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent#define BUF_SZ 44100
69d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
70d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurentint AudioTrackTest::Test01() {
71d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
72d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    sp<MemoryDealer> heap;
73d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    sp<IMemory> iMem;
74d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    uint8_t* p;
75d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
76d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    short smpBuf[BUF_SZ];
77d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    long rate = 44100;
78d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    unsigned long phi;
79d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    unsigned long dPhi;
80d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    long amplitude;
81d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    long freq = 1237;
82d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    float f0;
83d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
84d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    f0 = pow(2., 32.) * freq / (float)rate;
85d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    dPhi = (unsigned long)f0;
86d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    amplitude = 1000;
87d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    phi = 0;
88d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    Generate(smpBuf, BUF_SZ, amplitude, phi, dPhi);  // fill buffer
89d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
90d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    for (int i = 0; i < 1024; i++) {
91d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        heap = new MemoryDealer(1024*1024, "AudioTrack Heap Base");
92d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
93d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        iMem = heap->allocate(BUF_SZ*sizeof(short));
94d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
95d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        p = static_cast<uint8_t*>(iMem->pointer());
96d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        memcpy(p, smpBuf, BUF_SZ*sizeof(short));
97d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
98d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        sp<AudioTrack> track = new AudioTrack(AUDIO_STREAM_MUSIC,// stream type
99d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent               rate,
100d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent               AUDIO_FORMAT_PCM_16_BIT,// word length, PCM
101d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent               AUDIO_CHANNEL_OUT_MONO,
102d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent               iMem);
103d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
104d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        status_t status = track->initCheck();
105d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        if(status != NO_ERROR) {
106d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent            track.clear();
107d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent            ALOGD("Failed for initCheck()");
108d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent            return -1;
109d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        }
110d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
111d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        // start play
112d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        ALOGD("start");
113d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        track->start();
114d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
115d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        usleep(20000);
116d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
117d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        ALOGD("stop");
118d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        track->stop();
119d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        iMem.clear();
120d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        heap.clear();
121d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        usleep(20000);
122d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    }
123d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
124d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    return 0;
125d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
126d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent}
127d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
128d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent/************************************************************
129d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent*
130d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent*    Generate a mono buffer
131d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent*    Error is less than 3lsb
132d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent*
133d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent************************************************************/
134d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurentvoid AudioTrackTest::Generate(short *buffer, long bufferSz, long amplitude, unsigned long &phi, long dPhi)
135d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent{
136d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    long pi13 = 25736;   // 2^13*pi
137d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    // fill buffer
138d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    for(int i0=0; i0<bufferSz; i0++) {
139d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        long sample;
140d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        long l0, l1;
141d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
142d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        buffer[i0] = ComputeSine( amplitude, phi);
143d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        phi += dPhi;
144d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    }
145d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent}
146d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
147d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent/************************************************************
148d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent*
149d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent*    Generate a sine
150d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent*    Error is less than 3lsb
151d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent*
152d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent************************************************************/
153d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurentshort AudioTrackTest::ComputeSine(long amplitude, long phi)
154d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent{
155d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    long pi13 = 25736;   // 2^13*pi
156d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    long sample;
157d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    long l0, l1;
158d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
159d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    sample = (amplitude*sin1024[(phi>>22) & 0x3ff]) >> 15;
160d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    // correct with interpolation
161d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    l0 = (phi>>12) & 0x3ff;         // 2^20 * x / (2*pi)
162d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    l1 = (amplitude*sin1024[((phi>>22) + 256) & 0x3ff]) >> 15;    // 2^15*cosine
163d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    l0 = (l0 * l1) >> 10;
164d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    l0 = (l0 * pi13) >> 22;
165d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    sample = sample + l0;
166d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
167d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    return (short)sample;
168d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent}
169d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
170d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
171d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent/************************************************************
172d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent*
173d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent*    init sine table
174d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent*
175d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent************************************************************/
176d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurentvoid AudioTrackTest::InitSine(void) {
177d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    double phi = 0;
178d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    double dPhi = 2 * M_PI / SIN_SZ;
179d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    for(int i0 = 0; i0<SIN_SZ; i0++) {
180d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        long d0;
181d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
182d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        d0 = 32768. * sin(phi);
183d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        phi += dPhi;
184d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        if(d0 >= 32767) d0 = 32767;
185d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        if(d0 <= -32768) d0 = -32768;
186d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent        sin1024[i0] = (short)d0;
187d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    }
188d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent}
189d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
190d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent/************************************************************
191d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent*
192d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent*    main in name space
193d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent*
194d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent************************************************************/
195d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurentint main() {
196d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    ProcessState::self()->startThreadPool();
197d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    AudioTrackTest *test;
198d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
199d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    test = new AudioTrackTest();
200d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    test->Execute();
201d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    delete test;
202d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
203d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    return 0;
204d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent}
205d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
206d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent}
207d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
208d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent/************************************************************
209d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent*
210d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent*    global main
211d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent*
212d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent************************************************************/
213d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurentint main(int argc, char *argv[]) {
214d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent
215d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent    return android::main();
216d5da9de8165fff06e488faabde82f3e68cc4407fEric Laurent}
217