AudioRecord.h revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef AUDIORECORD_H_ 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define AUDIORECORD_H_ 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioFlinger.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/IAudioRecord.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/AudioTrack.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/RefBase.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Errors.h> 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/IInterface.h> 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/IMemory.h> 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h> 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AudioRecord 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum stream_type { 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DEFAULT_INPUT =-1, 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MIC_INPUT = 0, 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NUM_STREAM_TYPES 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static const int DEFAULT_SAMPLE_RATE = 8000; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Events used by AudioRecord callback function (callback_t). 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to keep in sync with frameworks/base/media/java/android/media/AudioRecord.java 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum event_type { 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EVENT_MORE_DATA = 0, // Request to reqd more data from PCM buffer. 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EVENT_OVERRUN = 1, // PCM buffer overrun occured. 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EVENT_MARKER = 2, // Record head is at the specified marker position 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // (See setMarkerPosition()). 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EVENT_NEW_POS = 3, // Record head is at a new position 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // (See setPositionUpdatePeriod()). 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Create Buffer on the stack and pass it to obtainBuffer() 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and releaseBuffer(). 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class Buffer 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum { 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MUTE = 0x00000001 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t frameCount; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t size; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project union { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* raw; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project short* i16; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int8_t* i8; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* These are static methods to control the system-wide AudioFlinger 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * only privileged processes can have access to them 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// static status_t setMasterMute(bool mute); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* As a convenience, if a callback is supplied, a handler thread 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is automatically created with the appropriate priority. This thread 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * invokes the callback when a new buffer becomes ready or an overrun condition occurs. 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parameters: 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * event: type of event notified (see enum AudioRecord::event_type). 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * user: Pointer to context for use by the callback receiver. 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * info: Pointer to optional parameter according to event type: 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - EVENT_MORE_DATA: pointer to AudioRecord::Buffer struct. The callback must not read 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * more bytes than indicated by 'size' field and update 'size' if less bytes are 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * read. 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - EVENT_OVERRUN: unused. 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - EVENT_MARKER: pointer to an uin32_t containing the marker position in frames. 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - EVENT_NEW_POS: pointer to an uin32_t containing the new position in frames. 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project typedef void (*callback_t)(int event, void* user, void *info); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Constructs an uninitialized AudioRecord. No connection with 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * AudioFlinger takes place. 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioRecord(); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Creates an AudioRecord track and registers it with AudioFlinger. 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Once created, the track needs to be started before it can be used. 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unspecified values are set to the audio hardware's current 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * values. 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parameters: 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * streamType: Select the audio input to record to (e.g. AudioRecord::MIC_INPUT). 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sampleRate: Track sampling rate in Hz. 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * format: PCM sample format (e.g AudioSystem::PCM_16_BIT for signed 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16 bits per sample). 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * channelCount: Number of PCM channels (e.g 2 for stereo). 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * frameCount: Total size of track PCM buffer in frames. This defines the 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * latency of the track. 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * flags: A bitmask of acoustic values from enum record_flags. It enables 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * AGC, NS, and IIR. 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * cbf: Callback function. If not null, this function is called periodically 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to provide new PCM data. 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * notificationFrames: The callback function is called each time notificationFrames PCM 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * frames are ready in record track output buffer. 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * user Context for use by the callback receiver. 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum record_flags { 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RECORD_AGC_ENABLE = AudioSystem::AGC_ENABLE, 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RECORD_NS_ENABLE = AudioSystem::NS_ENABLE, 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RECORD_IIR_ENABLE = AudioSystem::TX_IIR_ENABLE 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioRecord(int streamType, 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate = 0, 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format = 0, 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount = 0, 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount = 0, 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags = 0, 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callback_t cbf = 0, 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* user = 0, 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int notificationFrames = 0); 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Terminates the AudioRecord and unregisters it from AudioFlinger. 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Also destroys all resources assotiated with the AudioRecord. 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~AudioRecord(); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Initialize an uninitialized AudioRecord. 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returned status (from utils/Errors.h) can be: 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - NO_ERROR: successful intialization 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - INVALID_OPERATION: AudioRecord is already intitialized or record device is already in use 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - BAD_VALUE: invalid parameter (channelCount, format, sampleRate...) 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - NO_INIT: audio server or audio hardware not initialized 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - PERMISSION_DENIED: recording is not allowed for the requesting process 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * */ 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t set(int streamType = 0, 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate = 0, 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format = 0, 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount = 0, 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount = 0, 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags = 0, 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callback_t cbf = 0, 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* user = 0, 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int notificationFrames = 0, 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool threadCanCallJava = false); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Result of constructing the AudioRecord. This must be checked 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * before using any AudioRecord API (except for set()), using 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an uninitialized AudioRecord produces undefined results. 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See set() method above for possible return codes. 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t initCheck() const; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Returns this track's latency in milliseconds. 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This includes the latency due to AudioRecord buffer size 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and audio hardware driver. 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t latency() const; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* getters, see constructor */ 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate() const; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format() const; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount() const; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t frameCount() const; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameSize() const; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* After it's created the track is not active. Call start() to 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * make it active. If set, the callback will start being called. 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t start(); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Stop a track. If set, the callback will cease being called and 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * obtainBuffer returns STOPPED. Note that obtainBuffer() still works 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and will fill up buffers until the pool is exhausted. 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t stop(); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool stopped() const; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* get sample rate for this track 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t getSampleRate(); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Sets marker position. When record reaches the number of frames specified, 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a callback with event type EVENT_MARKER is called. Calling setMarkerPosition 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with marker == 0 cancels marker notification callback. 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the AudioRecord has been opened with no callback function associated, 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the operation will fail. 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parameters: 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * marker: marker position expressed in frames. 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returned status (from utils/Errors.h) can be: 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - NO_ERROR: successful operation 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - INVALID_OPERATION: the AudioRecord has no callback installed. 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t setMarkerPosition(uint32_t marker); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t getMarkerPosition(uint32_t *marker); 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Sets position update period. Every time the number of frames specified has been recorded, 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a callback with event type EVENT_NEW_POS is called. 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Calling setPositionUpdatePeriod with updatePeriod == 0 cancels new position notification 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * callback. 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the AudioRecord has been opened with no callback function associated, 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the operation will fail. 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parameters: 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * updatePeriod: position update notification period expressed in frames. 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returned status (from utils/Errors.h) can be: 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - NO_ERROR: successful operation 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - INVALID_OPERATION: the AudioRecord has no callback installed. 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t setPositionUpdatePeriod(uint32_t updatePeriod); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t getPositionUpdatePeriod(uint32_t *updatePeriod); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Gets record head position. The position is the total number of frames 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * recorded since record start. 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parameters: 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * position: Address where to return record head position within AudioRecord buffer. 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returned status (from utils/Errors.h) can be: 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - NO_ERROR: successful operation 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - BAD_VALUE: position is NULL 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t getPosition(uint32_t *position); 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* obtains a buffer of "frameCount" frames. The buffer must be 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * filled entirely. If the track is stopped, obtainBuffer() returns 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * STOPPED instead of NO_ERROR as long as there are buffers availlable, 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * at which point NO_MORE_BUFFERS is returned. 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Buffers will be returned until the pool (buffercount()) 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is exhausted, at which point obtainBuffer() will either block 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or return WOULD_BLOCK depending on the value of the "blocking" 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parameter. 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum { 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NO_MORE_BUFFERS = 0x80000001, 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project STOPPED = 1 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t obtainBuffer(Buffer* audioBuffer, int32_t waitCount); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void releaseBuffer(Buffer* audioBuffer); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* As a convenience we provide a read() interface to the audio buffer. 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is implemented on top of lockBuffer/unlockBuffer. 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t read(void* buffer, size_t size); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* copying audio tracks is not allowed */ 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioRecord(const AudioRecord& other); 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioRecord& operator = (const AudioRecord& other); 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* a small internal class to handle the callback */ 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class ClientRecordThread : public Thread 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ClientRecordThread(AudioRecord& receiver, bool bCanCallJava = false); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class AudioRecord; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool threadLoop(); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t readyToRun() { return NO_ERROR; } 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void onFirstRef() {} 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioRecord& mReceiver; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex mLock; 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool processAudioBuffer(const sp<ClientRecordThread>& thread); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IAudioFlinger> mAudioFlinger; 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IAudioRecord> mAudioRecord; 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IMemory> mCblkMemory; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ClientRecordThread> mClientRecordThread; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex mRecordThreadLock; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mSampleRate; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mFrameCount; 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_track_cblk_t* mCblk; 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t mFormat; 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t mChannelCount; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t mReserved[2]; 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t mStatus; 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mLatency; 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project volatile int32_t mActive; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callback_t mCbf; 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* mUserData; 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mNotificationFrames; 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mRemainingFrames; 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mMarkerPosition; 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mNewPosition; 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mUpdatePeriod; 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif /*AUDIORECORD_H_*/ 345