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