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> 290795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IInterface.h> 300795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/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 static const int DEFAULT_SAMPLE_RATE = 8000; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Events used by AudioRecord callback function (callback_t). 45a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to keep in sync with frameworks/base/media/java/android/media/AudioRecord.java 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum event_type { 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EVENT_MORE_DATA = 0, // Request to reqd more data from PCM buffer. 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EVENT_OVERRUN = 1, // PCM buffer overrun occured. 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EVENT_MARKER = 2, // Record head is at the specified marker position 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // (See setMarkerPosition()). 53a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent EVENT_NEW_POS = 3, // Record head is at a new position 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // (See setPositionUpdatePeriod()). 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Create Buffer on the stack and pass it to obtainBuffer() 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and releaseBuffer(). 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class Buffer 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum { 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MUTE = 0x00000001 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t frameCount; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t size; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project union { 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* raw; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project short* i16; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int8_t* i8; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* These are static methods to control the system-wide AudioFlinger 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * only privileged processes can have access to them 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// static status_t setMasterMute(bool mute); 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* As a convenience, if a callback is supplied, a handler thread 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is automatically created with the appropriate priority. This thread 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * invokes the callback when a new buffer becomes ready or an overrun condition occurs. 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parameters: 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * event: type of event notified (see enum AudioRecord::event_type). 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * user: Pointer to context for use by the callback receiver. 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * info: Pointer to optional parameter according to event type: 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - EVENT_MORE_DATA: pointer to AudioRecord::Buffer struct. The callback must not read 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * more bytes than indicated by 'size' field and update 'size' if less bytes are 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * read. 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - EVENT_OVERRUN: unused. 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - EVENT_MARKER: pointer to an uin32_t containing the marker position in frames. 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - EVENT_NEW_POS: pointer to an uin32_t containing the new position in frames. 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project typedef void (*callback_t)(int event, void* user, void *info); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10397d61f751899d3d68f53fb14d0025766bf1be3f7Chia-chi Yeh /* Returns the minimum frame count required for the successful creation of 10497d61f751899d3d68f53fb14d0025766bf1be3f7Chia-chi Yeh * an AudioRecord object. 10597d61f751899d3d68f53fb14d0025766bf1be3f7Chia-chi Yeh * Returned status (from utils/Errors.h) can be: 10697d61f751899d3d68f53fb14d0025766bf1be3f7Chia-chi Yeh * - NO_ERROR: successful operation 10797d61f751899d3d68f53fb14d0025766bf1be3f7Chia-chi Yeh * - NO_INIT: audio server or audio hardware not initialized 10897d61f751899d3d68f53fb14d0025766bf1be3f7Chia-chi Yeh * - BAD_VALUE: unsupported configuration 10997d61f751899d3d68f53fb14d0025766bf1be3f7Chia-chi Yeh */ 11097d61f751899d3d68f53fb14d0025766bf1be3f7Chia-chi Yeh 11197d61f751899d3d68f53fb14d0025766bf1be3f7Chia-chi Yeh static status_t getMinFrameCount(int* frameCount, 11297d61f751899d3d68f53fb14d0025766bf1be3f7Chia-chi Yeh uint32_t sampleRate, 11397d61f751899d3d68f53fb14d0025766bf1be3f7Chia-chi Yeh int format, 11497d61f751899d3d68f53fb14d0025766bf1be3f7Chia-chi Yeh int channelCount); 11597d61f751899d3d68f53fb14d0025766bf1be3f7Chia-chi Yeh 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Constructs an uninitialized AudioRecord. No connection with 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * AudioFlinger takes place. 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioRecord(); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Creates an AudioRecord track and registers it with AudioFlinger. 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Once created, the track needs to be started before it can be used. 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unspecified values are set to the audio hardware's current 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * values. 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parameters: 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 128a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * inputSource: Select the audio input to record to (e.g. AUDIO_SOURCE_DEFAULT). 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sampleRate: Track sampling rate in Hz. 130a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * format: Audio format (e.g AudioSystem::PCM_16_BIT for signed 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16 bits per sample). 132a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * channels: Channel mask: see AudioSystem::audio_channels. 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * frameCount: Total size of track PCM buffer in frames. This defines the 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * latency of the track. 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * flags: A bitmask of acoustic values from enum record_flags. It enables 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * AGC, NS, and IIR. 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * cbf: Callback function. If not null, this function is called periodically 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to provide new PCM data. 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * notificationFrames: The callback function is called each time notificationFrames PCM 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * frames are ready in record track output buffer. 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * user Context for use by the callback receiver. 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum record_flags { 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RECORD_AGC_ENABLE = AudioSystem::AGC_ENABLE, 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RECORD_NS_ENABLE = AudioSystem::NS_ENABLE, 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RECORD_IIR_ENABLE = AudioSystem::TX_IIR_ENABLE 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1504bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent AudioRecord(int inputSource, 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate = 0, 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format = 0, 153a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t channels = AudioSystem::CHANNEL_IN_MONO, 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount = 0, 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags = 0, 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callback_t cbf = 0, 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* user = 0, 15865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int notificationFrames = 0, 15965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int sessionId = 0); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Terminates the AudioRecord and unregisters it from AudioFlinger. 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Also destroys all resources assotiated with the AudioRecord. 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~AudioRecord(); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Initialize an uninitialized AudioRecord. 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returned status (from utils/Errors.h) can be: 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - NO_ERROR: successful intialization 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - INVALID_OPERATION: AudioRecord is already intitialized or record device is already in use 172a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * - BAD_VALUE: invalid parameter (channels, format, sampleRate...) 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - NO_INIT: audio server or audio hardware not initialized 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - PERMISSION_DENIED: recording is not allowed for the requesting process 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * */ 1764bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent status_t set(int inputSource = 0, 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate = 0, 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format = 0, 179a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t channels = AudioSystem::CHANNEL_IN_MONO, 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount = 0, 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags = 0, 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callback_t cbf = 0, 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* user = 0, 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int notificationFrames = 0, 18565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent bool threadCanCallJava = false, 18665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int sessionId = 0); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Result of constructing the AudioRecord. This must be checked 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * before using any AudioRecord API (except for set()), using 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an uninitialized AudioRecord produces undefined results. 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See set() method above for possible return codes. 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t initCheck() const; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Returns this track's latency in milliseconds. 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This includes the latency due to AudioRecord buffer size 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and audio hardware driver. 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t latency() const; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* getters, see constructor */ 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format() const; 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount() const; 206a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int channels() const; 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t frameCount() const; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameSize() const; 2094bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent int inputSource() const; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* After it's created the track is not active. Call start() to 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * make it active. If set, the callback will start being called. 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t start(); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Stop a track. If set, the callback will cease being called and 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * obtainBuffer returns STOPPED. Note that obtainBuffer() still works 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and will fill up buffers until the pool is exhausted. 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t stop(); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool stopped() const; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22488e209dcf8c2ebddda5c272f46d1bd5478bc639cEric Laurent /* get sample rate for this record track 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t getSampleRate(); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Sets marker position. When record reaches the number of frames specified, 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a callback with event type EVENT_MARKER is called. Calling setMarkerPosition 230a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * with marker == 0 cancels marker notification callback. 231a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * If the AudioRecord has been opened with no callback function associated, 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the operation will fail. 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parameters: 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * marker: marker position expressed in frames. 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returned status (from utils/Errors.h) can be: 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - NO_ERROR: successful operation 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - INVALID_OPERATION: the AudioRecord has no callback installed. 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t setMarkerPosition(uint32_t marker); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t getMarkerPosition(uint32_t *marker); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 246a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent /* Sets position update period. Every time the number of frames specified has been recorded, 247a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * a callback with event type EVENT_NEW_POS is called. 248a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * Calling setPositionUpdatePeriod with updatePeriod == 0 cancels new position notification 249a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * callback. 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the AudioRecord has been opened with no callback function associated, 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the operation will fail. 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parameters: 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * updatePeriod: position update notification period expressed in frames. 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returned status (from utils/Errors.h) can be: 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - NO_ERROR: successful operation 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - INVALID_OPERATION: the AudioRecord has no callback installed. 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t setPositionUpdatePeriod(uint32_t updatePeriod); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t getPositionUpdatePeriod(uint32_t *updatePeriod); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 265a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent /* Gets record head position. The position is the total number of frames 266a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * recorded since record start. 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parameters: 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * position: Address where to return record head position within AudioRecord buffer. 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returned status (from utils/Errors.h) can be: 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - NO_ERROR: successful operation 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - BAD_VALUE: position is NULL 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t getPosition(uint32_t *position); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 278a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent /* returns a handle on the audio input used by this AudioRecord. 279a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * 280a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * Parameters: 281a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * none. 282a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * 283a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * Returned value: 284a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * handle on audio hardware input 285a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent */ 28649f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent audio_io_handle_t getInput(); 287a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 28865b65459e6ac59f8a257009df8014467ae0838eeEric Laurent /* returns the audio session ID associated to this AudioRecord. 28965b65459e6ac59f8a257009df8014467ae0838eeEric Laurent * 29065b65459e6ac59f8a257009df8014467ae0838eeEric Laurent * Parameters: 29165b65459e6ac59f8a257009df8014467ae0838eeEric Laurent * none. 29265b65459e6ac59f8a257009df8014467ae0838eeEric Laurent * 29365b65459e6ac59f8a257009df8014467ae0838eeEric Laurent * Returned value: 29465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent * AudioRecord session ID. 29565b65459e6ac59f8a257009df8014467ae0838eeEric Laurent */ 29665b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int getSessionId(); 29765b65459e6ac59f8a257009df8014467ae0838eeEric Laurent 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* obtains a buffer of "frameCount" frames. The buffer must be 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * filled entirely. If the track is stopped, obtainBuffer() returns 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * STOPPED instead of NO_ERROR as long as there are buffers availlable, 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * at which point NO_MORE_BUFFERS is returned. 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Buffers will be returned until the pool (buffercount()) 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is exhausted, at which point obtainBuffer() will either block 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or return WOULD_BLOCK depending on the value of the "blocking" 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parameter. 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum { 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NO_MORE_BUFFERS = 0x80000001, 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project STOPPED = 1 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t obtainBuffer(Buffer* audioBuffer, int32_t waitCount); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void releaseBuffer(Buffer* audioBuffer); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* As a convenience we provide a read() interface to the audio buffer. 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is implemented on top of lockBuffer/unlockBuffer. 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t read(void* buffer, size_t size); 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32247d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent /* Return the amount of input frames lost in the audio driver since the last call of this function. 32347d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent * Audio driver is expected to reset the value to 0 and restart counting upon returning the current value by this function call. 32447d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent * Such loss typically occurs when the user space process is blocked longer than the capacity of audio driver buffers. 32547d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent * Unit: the number of input audio frames 32647d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent */ 32747d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent unsigned int getInputFramesLost(); 32847d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* copying audio tracks is not allowed */ 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioRecord(const AudioRecord& other); 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioRecord& operator = (const AudioRecord& other); 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* a small internal class to handle the callback */ 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class ClientRecordThread : public Thread 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ClientRecordThread(AudioRecord& receiver, bool bCanCallJava = false); 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class AudioRecord; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool threadLoop(); 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t readyToRun() { return NO_ERROR; } 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void onFirstRef() {} 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioRecord& mReceiver; 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex mLock; 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool processAudioBuffer(const sp<ClientRecordThread>& thread); 349bda7469d9b1ec6d9c9d6da40ddf64dc39ff271a9Eric Laurent status_t openRecord(uint32_t sampleRate, 350bda7469d9b1ec6d9c9d6da40ddf64dc39ff271a9Eric Laurent int format, 351bda7469d9b1ec6d9c9d6da40ddf64dc39ff271a9Eric Laurent int channelCount, 352bda7469d9b1ec6d9c9d6da40ddf64dc39ff271a9Eric Laurent int frameCount, 35349f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent uint32_t flags, 35449f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent audio_io_handle_t input); 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IAudioRecord> mAudioRecord; 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IMemory> mCblkMemory; 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ClientRecordThread> mClientRecordThread; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex mRecordThreadLock; 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mFrameCount; 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_track_cblk_t* mCblk; 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t mFormat; 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t mChannelCount; 3664bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent uint8_t mInputSource; 3674bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent uint8_t mReserved; 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t mStatus; 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mLatency; 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project volatile int32_t mActive; 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callback_t mCbf; 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* mUserData; 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mNotificationFrames; 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mRemainingFrames; 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mMarkerPosition; 37878c131473165830c8d042a0f445ca858aaa7a4b1Jean-Michel Trivi bool mMarkerReached; 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mNewPosition; 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mUpdatePeriod; 381bda7469d9b1ec6d9c9d6da40ddf64dc39ff271a9Eric Laurent uint32_t mFlags; 38249f02be9d7fafb8841f75394a90f1409c6f82c1fEric Laurent uint32_t mChannels; 38347d0a9264fa5297db6333697ad750e6bc06822aaEric Laurent audio_io_handle_t mInput; 38465b65459e6ac59f8a257009df8014467ae0838eeEric Laurent int mSessionId; 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif /*AUDIORECORD_H_*/ 390