AudioRecord.h revision a553c25b33c99b345cf1c8688f8df0ed8df14e5a
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 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Constructs an uninitialized AudioRecord. No connection with 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * AudioFlinger takes place. 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioRecord(); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Creates an AudioRecord track and registers it with AudioFlinger. 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Once created, the track needs to be started before it can be used. 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unspecified values are set to the audio hardware's current 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * values. 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parameters: 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 115a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * inputSource: Select the audio input to record to (e.g. AUDIO_SOURCE_DEFAULT). 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sampleRate: Track sampling rate in Hz. 117a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * format: Audio format (e.g AudioSystem::PCM_16_BIT for signed 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16 bits per sample). 119a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * channels: Channel mask: see AudioSystem::audio_channels. 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * frameCount: Total size of track PCM buffer in frames. This defines the 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * latency of the track. 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * flags: A bitmask of acoustic values from enum record_flags. It enables 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * AGC, NS, and IIR. 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * cbf: Callback function. If not null, this function is called periodically 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to provide new PCM data. 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * notificationFrames: The callback function is called each time notificationFrames PCM 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * frames are ready in record track output buffer. 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * user Context for use by the callback receiver. 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum record_flags { 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RECORD_AGC_ENABLE = AudioSystem::AGC_ENABLE, 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RECORD_NS_ENABLE = AudioSystem::NS_ENABLE, 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RECORD_IIR_ENABLE = AudioSystem::TX_IIR_ENABLE 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1374bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent AudioRecord(int inputSource, 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate = 0, 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format = 0, 140a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t channels = AudioSystem::CHANNEL_IN_MONO, 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount = 0, 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags = 0, 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callback_t cbf = 0, 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* user = 0, 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int notificationFrames = 0); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Terminates the AudioRecord and unregisters it from AudioFlinger. 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Also destroys all resources assotiated with the AudioRecord. 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~AudioRecord(); 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Initialize an uninitialized AudioRecord. 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returned status (from utils/Errors.h) can be: 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - NO_ERROR: successful intialization 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - INVALID_OPERATION: AudioRecord is already intitialized or record device is already in use 158a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * - BAD_VALUE: invalid parameter (channels, format, sampleRate...) 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - NO_INIT: audio server or audio hardware not initialized 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - PERMISSION_DENIED: recording is not allowed for the requesting process 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * */ 1624bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent status_t set(int inputSource = 0, 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t sampleRate = 0, 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format = 0, 165a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent uint32_t channels = AudioSystem::CHANNEL_IN_MONO, 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameCount = 0, 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t flags = 0, 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callback_t cbf = 0, 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* user = 0, 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int notificationFrames = 0, 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool threadCanCallJava = false); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Result of constructing the AudioRecord. This must be checked 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * before using any AudioRecord API (except for set()), using 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an uninitialized AudioRecord produces undefined results. 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See set() method above for possible return codes. 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t initCheck() const; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Returns this track's latency in milliseconds. 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This includes the latency due to AudioRecord buffer size 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and audio hardware driver. 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t latency() const; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* getters, see constructor */ 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int format() const; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelCount() const; 191a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent int channels() const; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t frameCount() const; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frameSize() const; 1944bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent int inputSource() const; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* After it's created the track is not active. Call start() to 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * make it active. If set, the callback will start being called. 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t start(); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Stop a track. If set, the callback will cease being called and 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * obtainBuffer returns STOPPED. Note that obtainBuffer() still works 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and will fill up buffers until the pool is exhausted. 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t stop(); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool stopped() const; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20988e209dcf8c2ebddda5c272f46d1bd5478bc639cEric Laurent /* get sample rate for this record track 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t getSampleRate(); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Sets marker position. When record reaches the number of frames specified, 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a callback with event type EVENT_MARKER is called. Calling setMarkerPosition 215a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * with marker == 0 cancels marker notification callback. 216a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * If the AudioRecord has been opened with no callback function associated, 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the operation will fail. 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parameters: 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * marker: marker position expressed in frames. 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returned status (from utils/Errors.h) can be: 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - NO_ERROR: successful operation 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - INVALID_OPERATION: the AudioRecord has no callback installed. 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t setMarkerPosition(uint32_t marker); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t getMarkerPosition(uint32_t *marker); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 231a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent /* Sets position update period. Every time the number of frames specified has been recorded, 232a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * a callback with event type EVENT_NEW_POS is called. 233a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * Calling setPositionUpdatePeriod with updatePeriod == 0 cancels new position notification 234a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * callback. 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the AudioRecord has been opened with no callback function associated, 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the operation will fail. 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parameters: 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * updatePeriod: position update notification period expressed in frames. 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returned status (from utils/Errors.h) can be: 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - NO_ERROR: successful operation 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - INVALID_OPERATION: the AudioRecord has no callback installed. 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t setPositionUpdatePeriod(uint32_t updatePeriod); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t getPositionUpdatePeriod(uint32_t *updatePeriod); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 250a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent /* Gets record head position. The position is the total number of frames 251a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * recorded since record start. 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parameters: 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * position: Address where to return record head position within AudioRecord buffer. 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 * - BAD_VALUE: position is NULL 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t getPosition(uint32_t *position); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 263a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent /* returns a handle on the audio input used by this AudioRecord. 264a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * 265a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * Parameters: 266a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * none. 267a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * 268a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * Returned value: 269a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent * handle on audio hardware input 270a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent */ 271a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent audio_io_handle_t getInput() { return mInput; } 272a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* obtains a buffer of "frameCount" frames. The buffer must be 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * filled entirely. If the track is stopped, obtainBuffer() returns 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * STOPPED instead of NO_ERROR as long as there are buffers availlable, 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * at which point NO_MORE_BUFFERS is returned. 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Buffers will be returned until the pool (buffercount()) 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is exhausted, at which point obtainBuffer() will either block 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or return WOULD_BLOCK depending on the value of the "blocking" 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parameter. 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum { 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NO_MORE_BUFFERS = 0x80000001, 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project STOPPED = 1 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t obtainBuffer(Buffer* audioBuffer, int32_t waitCount); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void releaseBuffer(Buffer* audioBuffer); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* As a convenience we provide a read() interface to the audio buffer. 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is implemented on top of lockBuffer/unlockBuffer. 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t read(void* buffer, size_t size); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* copying audio tracks is not allowed */ 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioRecord(const AudioRecord& other); 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioRecord& operator = (const AudioRecord& other); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* a small internal class to handle the callback */ 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class ClientRecordThread : public Thread 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ClientRecordThread(AudioRecord& receiver, bool bCanCallJava = false); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project friend class AudioRecord; 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual bool threadLoop(); 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t readyToRun() { return NO_ERROR; } 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void onFirstRef() {} 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioRecord& mReceiver; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex mLock; 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool processAudioBuffer(const sp<ClientRecordThread>& thread); 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IAudioRecord> mAudioRecord; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IMemory> mCblkMemory; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<ClientRecordThread> mClientRecordThread; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex mRecordThreadLock; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mFrameCount; 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_track_cblk_t* mCblk; 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t mFormat; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t mChannelCount; 3284bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent uint8_t mInputSource; 3294bc035a65cac177be9294e69f110497e3b6e34e6Eric Laurent uint8_t mReserved; 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t mStatus; 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mLatency; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project volatile int32_t mActive; 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callback_t mCbf; 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* mUserData; 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mNotificationFrames; 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mRemainingFrames; 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mMarkerPosition; 34078c131473165830c8d042a0f445ca858aaa7a4b1Jean-Michel Trivi bool mMarkerReached; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mNewPosition; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mUpdatePeriod; 343a553c25b33c99b345cf1c8688f8df0ed8df14e5aEric Laurent audio_io_handle_t mInput; 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif /*AUDIORECORD_H_*/ 349