AudioRecord.h revision 73493688f4190f790ee15d9ca54831cd64f4e195
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 2008 The Android Open Source Project 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License"); 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * you may not use this file except in compliance with the License. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * You may obtain a copy of the License at 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * http://www.apache.org/licenses/LICENSE-2.0 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Unless required by applicable law or agreed to in writing, software 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS, 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * See the License for the specific language governing permissions and 14a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch * limitations under the License. 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */ 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#ifndef ANDROID_AUDIORECORD_H 18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#define ANDROID_AUDIORECORD_H 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <cutils/sched_policy.h> 21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <media/AudioSystem.h> 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <media/IAudioRecord.h> 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utils/threads.h> 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 250de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)namespace android { 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// ---------------------------------------------------------------------------- 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class audio_track_cblk_t; 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AudioRecordClientProxy; 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// ---------------------------------------------------------------------------- 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AudioRecord : public RefBase 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccipublic: 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const int DEFAULT_SAMPLE_RATE = 8000; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Events used by AudioRecord callback function (callback_t). 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Keep in sync with frameworks/base/media/java/android/media/AudioRecord.java NATIVE_EVENT_*. 421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) */ 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci enum event_type { 4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EVENT_MORE_DATA = 0, // Request to read more data from PCM buffer. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_OVERRUN = 1, // PCM buffer overrun occurred. 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EVENT_MARKER = 2, // Record head is at the specified marker position 476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // (See setMarkerPosition()). 4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EVENT_NEW_POS = 3, // Record head is at a new position 4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // (See setPositionUpdatePeriod()). 5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EVENT_NEW_IAUDIORECORD = 4, // IAudioRecord was re-created, either due to re-routing and 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // voluntary invalidation by mediaserver, or mediaserver crash. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Client should declare Buffer on the stack and pass address to obtainBuffer() 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and releaseBuffer(). See also callback_t for EVENT_MORE_DATA. 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Buffer 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public: 610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // FIXME use m prefix 620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch size_t frameCount; // number of sample frames corresponding to size; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on input it is the number of frames available, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on output is the number of frames actually drained 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t size; // input/output in bytes == frameCount * frameSize 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FIXME this is redundant with respect to frameCount, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and TRANSFER_OBTAIN mode is broken for 8-bit data 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // since we don't define the frame format 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) union { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* raw; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) short* i16; // signed 16-bit 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int8_t* i8; // unsigned 8-bit, offset by 0x80 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* As a convenience, if a callback is supplied, a handler thread 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is automatically created with the appropriate priority. This thread 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * invokes the callback when a new buffer becomes ready or various conditions occur. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Parameters: 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * event: type of event notified (see enum AudioRecord::event_type). 84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * user: Pointer to context for use by the callback receiver. 85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * info: Pointer to optional parameter according to event type: 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - EVENT_MORE_DATA: pointer to AudioRecord::Buffer struct. The callback must not read 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * more bytes than indicated by 'size' field and update 'size' if fewer bytes are 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * consumed. 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * - EVENT_OVERRUN: unused. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - EVENT_MARKER: pointer to const uint32_t containing the marker position in frames. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - EVENT_NEW_POS: pointer to const uint32_t containing the new position in frames. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - EVENT_NEW_IAUDIORECORD: unused. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef void (*callback_t)(int event, void* user, void *info); 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch /* Returns the minimum frame count required for the successful creation of 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * an AudioRecord object. 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Returned status (from utils/Errors.h) can be: 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - NO_ERROR: successful operation 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - NO_INIT: audio server or audio hardware not initialized 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - BAD_VALUE: unsupported configuration 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static status_t getMinFrameCount(size_t* frameCount, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t sampleRate, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio_format_t format, 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) audio_channel_mask_t channelMask); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* How data is transferred from AudioRecord 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum transfer_type { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRANSFER_DEFAULT, // not specified explicitly; determine from other parameters 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRANSFER_CALLBACK, // callback EVENT_MORE_DATA 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRANSFER_OBTAIN, // FIXME deprecated: call obtainBuffer() and releaseBuffer() 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRANSFER_SYNC, // synchronous read() 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Constructs an uninitialized AudioRecord. No connection with 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * AudioFlinger takes place. Use set() after this. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AudioRecord(); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Creates an AudioRecord object and registers it with AudioFlinger. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Once created, the track needs to be started before it can be used. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Unspecified values are set to appropriate default values. 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Parameters: 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * inputSource: Select the audio input to record from (e.g. AUDIO_SOURCE_DEFAULT). 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * sampleRate: Data sink sampling rate in Hz. 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * format: Audio format (e.g AUDIO_FORMAT_PCM_16_BIT for signed 13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * 16 bits per sample). 13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * channelMask: Channel mask, such that audio_is_input_channel(channelMask) is true. 13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * frameCount: Minimum size of track PCM buffer in frames. This defines the 13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * application's contribution to the 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * latency of the track. The actual size selected by the AudioRecord could 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * be larger if the requested size is not compatible with current audio HAL 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * latency. Zero means to use a default value. 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * cbf: Callback function. If not null, this function is called periodically 141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * to consume new PCM data and inform of marker, position updates, etc. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * user: Context for use by the callback receiver. 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * notificationFrames: The callback function is called each time notificationFrames PCM 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * frames are ready in record track output buffer. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * sessionId: Not yet supported. 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * transferType: How data is transferred from AudioRecord. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * flags: See comments on audio_input_flags_t in <system/audio.h> 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * threadCanCallJava: Not present in parameter list, and so is fixed at false. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AudioRecord(audio_source_t inputSource, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t sampleRate, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio_format_t format, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio_channel_mask_t channelMask, 1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) int frameCount = 0, 1561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) callback_t cbf = NULL, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* user = NULL, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int notificationFrames = 0, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sessionId = 0, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transfer_type transferType = TRANSFER_DEFAULT, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio_input_flags_t flags = AUDIO_INPUT_FLAG_NONE); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Terminates the AudioRecord and unregisters it from AudioFlinger. 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Also destroys all resources associated with the AudioRecord. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)protected: 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~AudioRecord(); 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* Initialize an AudioRecord that was created using the AudioRecord() constructor. 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Don't call set() more than once, or after an AudioRecord() constructor that takes parameters. 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Returned status (from utils/Errors.h) can be: 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * - NO_ERROR: successful intialization 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * - INVALID_OPERATION: AudioRecord is already initialized or record device is already in use 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * - BAD_VALUE: invalid parameter (channels, format, sampleRate...) 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * - NO_INIT: audio server or audio hardware not initialized 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * - PERMISSION_DENIED: recording is not allowed for the requesting process 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * 17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * Parameters not listed in the AudioRecord constructors above: 18046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * 18146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * threadCanCallJava: Whether callbacks are made from an attached thread and thus can call JNI. 18246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) */ 18346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) status_t set(audio_source_t inputSource, 18446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) uint32_t sampleRate, 18546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) audio_format_t format, 18646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) audio_channel_mask_t channelMask, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int frameCount = 0, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_t cbf = NULL, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* user = NULL, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int notificationFrames = 0, 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool threadCanCallJava = false, 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int sessionId = 0, 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) transfer_type transferType = TRANSFER_DEFAULT, 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) audio_input_flags_t flags = AUDIO_INPUT_FLAG_NONE); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Result of constructing the AudioRecord. This must be checked 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * before using any AudioRecord API (except for set()), because using 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * an uninitialized AudioRecord produces undefined results. 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See set() method above for possible return codes. 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status_t initCheck() const { return mStatus; } 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Returns this track's estimated latency in milliseconds. 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This includes the latency due to AudioRecord buffer size, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and audio hardware driver. 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t latency() const { return mLatency; } 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* getters, see constructor and set() */ 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio_format_t format() const { return mFormat; } 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t channelCount() const { return mChannelCount; } 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t frameCount() const { return mFrameCount; } 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t frameSize() const { return mFrameSize; } 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio_source_t inputSource() const { return mInputSource; } 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* After it's created the track is not active. Call start() to 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * make it active. If set, the callback will start being called. 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If event is not AudioSystem::SYNC_EVENT_NONE, the capture start will be delayed until 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the specified event occurs on the specified trigger session. 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */ 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) status_t start(AudioSystem::sync_event_t event = AudioSystem::SYNC_EVENT_NONE, 223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int triggerSession = 0); 224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /* Stop a track. If set, the callback will cease being called. Note that obtainBuffer() still 2260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * works and will drain buffers until the pool is exhausted, and then will return WOULD_BLOCK. 2270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch */ 2280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void stop(); 22968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool stopped() const; 23068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 23168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) /* Return the sink sample rate for this record track in Hz. 23268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * Unlike AudioTrack, the sample rate is const after initialization, so doesn't need a lock. 23368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) */ 23468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) uint32_t getSampleRate() const { return mSampleRate; } 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* Sets marker position. When record reaches the number of frames specified, 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * a callback with event type EVENT_MARKER is called. Calling setMarkerPosition 2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * with marker == 0 cancels marker notification callback. 2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * To set a marker at a position which would compute as 0, 2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * a workaround is to the set the marker at a nearby position such as ~0 or 1. 2418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) * If the AudioRecord has been opened with no callback function associated, 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * the operation will fail. 2438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) * 2448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) * Parameters: 245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * 246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * marker: marker position expressed in wrapping (overflow) frame units, 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * like the return value of getPosition(). 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * 249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * Returned status (from utils/Errors.h) can be: 250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * - NO_ERROR: successful operation 251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * - INVALID_OPERATION: the AudioRecord has no callback installed. 252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) */ 253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) status_t setMarkerPosition(uint32_t marker); 254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) status_t getMarkerPosition(uint32_t *marker) const; 255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /* Sets position update period. Every time the number of frames specified has been recorded, 257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * a callback with event type EVENT_NEW_POS is called. 258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * Calling setPositionUpdatePeriod with updatePeriod == 0 cancels new position notification 259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * callback. 260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * If the AudioRecord has been opened with no callback function associated, 2610de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) * the operation will fail. 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Extremely small values may be rounded up to a value the implementation can support. 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Parameters: 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * updatePeriod: position update notification period expressed in frames. 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Returned status (from utils/Errors.h) can be: 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * - NO_ERROR: successful operation 2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * - INVALID_OPERATION: the AudioRecord has no callback installed. 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status_t setPositionUpdatePeriod(uint32_t updatePeriod); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status_t getPositionUpdatePeriod(uint32_t *updatePeriod) const; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Return the total number of frames recorded since recording started. 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The counter will wrap (overflow) periodically, e.g. every ~27 hours at 44.1 kHz. 277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * It is reset to zero by stop(). 278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Parameters: 280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * position: Address where to return record head position. 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returned status (from utils/Errors.h) can be: 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - NO_ERROR: successful operation 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - BAD_VALUE: position is NULL 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status_t getPosition(uint32_t *position) const; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Returns a handle on the audio input used by this AudioRecord. 2905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * 2915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * Parameters: 2925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * none. 2935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * 2945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * Returned value: 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * handle on audio hardware input 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio_io_handle_t getInput() const; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Returns the audio session ID associated with this AudioRecord. 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Parameters: 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * none. 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 30446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * Returned value: 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * AudioRecord session ID. 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * No lock needed because session ID doesn't change after first set(). 308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) */ 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int getSessionId() const { return mSessionId; } 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Obtains a buffer of up to "audioBuffer->frameCount" full frames. 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * After draining these frames of data, the caller should release them with releaseBuffer(). 313a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * If the track buffer is not empty, obtainBuffer() returns as many contiguous 314a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * full frames as are available immediately. 315a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * If the track buffer is empty and track is stopped, obtainBuffer() returns WOULD_BLOCK 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * regardless of the value of waitCount. 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If the track buffer is empty and track is not stopped, obtainBuffer() blocks with a 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * maximum timeout based on waitCount; see chart below. 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Buffers will be returned until the pool 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is exhausted, at which point obtainBuffer() will either block 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * or return WOULD_BLOCK depending on the value of the "waitCount" 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parameter. 323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * 324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * obtainBuffer() and releaseBuffer() are deprecated for direct use by applications, 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * which should use read() or callback EVENT_MORE_DATA instead. 326f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * 327f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Interpretation of waitCount: 328f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * +n limits wait time to n * WAIT_PERIOD_MS, 329f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * -1 causes an (almost) infinite wait time, 330f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * 0 non-blocking. 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * 332f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Buffer fields 333f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * On entry: 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * frameCount number of frames requested 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * After error return: 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * frameCount 0 3375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * size 0 3385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * raw undefined 3395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * After successful return: 340eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * frameCount actual number of frames available, <= number requested 341eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * size actual number of bytes available 342eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * raw pointer to the buffer 343eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */ 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* FIXME Deprecated public API for TRANSFER_OBTAIN mode */ 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status_t obtainBuffer(Buffer* audioBuffer, int32_t waitCount) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __attribute__((__deprecated__)); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private: 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* New internal API. 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If nonContig is non-NULL, it is an output parameter that will be set to the number of 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * additional non-contiguous frames that are available immediately. 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * FIXME We could pass an array of Buffers instead of only one Buffer to obtainBuffer(), 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in case the requested amount of frames is in two or more non-contiguous regions. 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * FIXME requested and elapsed are both relative times. Consider changing to absolute time. 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status_t obtainBuffer(Buffer* audioBuffer, const struct timespec *requested, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct timespec *elapsed = NULL, size_t *nonContig = NULL); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Release an emptied buffer of "audioBuffer->frameCount" frames for AudioFlinger to re-fill. */ 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FIXME make private when obtainBuffer() for TRANSFER_OBTAIN is removed 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void releaseBuffer(Buffer* audioBuffer); 3644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /* As a convenience we provide a read() interface to the audio buffer. 3664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Input parameter 'size' is in byte units. 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This is implemented on top of obtainBuffer/releaseBuffer. For best 3683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) * performance use callbacks. Returns actual number of bytes read >= 0, 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or a negative status code. 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssize_t read(void* buffer, size_t size); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Return the number of input frames lost in the audio driver since the last call of this 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * function. Audio driver is expected to reset the value to 0 and restart counting upon 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * returning the current value by this function call. Such loss typically occurs when the 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * user space process is blocked longer than the capacity of audio driver buffers. 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Units: the number of input audio frames. 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int getInputFramesLost() const; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private: 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* copying audio record objects is not allowed */ 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AudioRecord(const AudioRecord& other); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AudioRecord& operator = (const AudioRecord& other); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* a small internal class to handle the callback */ 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class AudioRecordThread : public Thread 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AudioRecordThread(AudioRecord& receiver, bool bCanCallJava = false); 391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Do not call Thread::requestExitAndWait() without first calling requestExit(). 393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Thread::requestExitAndWait() is not virtual, and the implementation doesn't do enough. 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void requestExit(); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void pause(); // suspend thread from execution at next loop boundary 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void resume(); // allow thread to execute, if not requested to exit 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void pauseConditional(); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // like pause(), but only if prior resume() wasn't latched 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class AudioRecord; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool threadLoop(); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AudioRecord& mReceiver; 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~AudioRecordThread(); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mutex mMyLock; // Thread::mLock is private 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Condition mMyCond; // Thread::mThreadExitedCondition is private 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool mPaused; // whether thread is currently paused 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool mResumeLatch; // whether next pauseConditional() will be a nop 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 411cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // body of AudioRecordThread::threadLoop() 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // returns the maximum amount of time before we would like to run again, where: 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 0 immediately 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // > 0 no later than this many nanoseconds from now 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // NS_WHENEVER still active but no particular deadline 417868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // NS_INACTIVE inactive so don't run again until re-started 418868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // NS_NEVER never again 419868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static const nsecs_t NS_WHENEVER = -1, NS_INACTIVE = -2, NS_NEVER = -3; 420868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) nsecs_t processAudioBuffer(const sp<AudioRecordThread>& thread); 4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // caller must hold lock on mLock for all _l methods 4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) status_t openRecord_l(uint32_t sampleRate, 4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) audio_format_t format, 4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t frameCount, 4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) audio_input_flags_t flags, 4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) audio_io_handle_t input, 4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t epoch); 429a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 430a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) audio_io_handle_t getInput_l(); 431a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // FIXME enum is faster than strcmp() for parameter 'from' 4331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) status_t restoreRecord_l(const char *from); 43468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 43568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) sp<AudioRecordThread> mAudioRecordThread; 43668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) mutable Mutex mLock; 43768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Current client state: false = stopped, true = active. Protected by mLock. If more states 4391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // are added, consider changing this to enum State { ... } mState as in AudioTrack. 4401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool mActive; 4411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // for client callback handler 4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback_t mCbf; // callback handler for events, or NULL 44446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void* mUserData; // for client callback handler 44546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 44646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // for notification APIs 447f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t mNotificationFrames; // frames between each notification callback 448f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool mRefreshRemaining; // processAudioBuffer() should refresh next 2 449f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 45046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // These are private to processAudioBuffer(), and are not protected by a lock 4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint32_t mRemainingFrames; // number of frames to request in obtainBuffer() 4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool mRetryOnPartialBuffer; // sleep and retry after partial obtainBuffer() 453a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int mObservedSequence; // last observed value of mSequence 454a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 455effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch uint32_t mMarkerPosition; // in wrapping (overflow) frame units 456effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool mMarkerReached; 457effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch uint32_t mNewPosition; // in frames 45823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) uint32_t mUpdatePeriod; // in frames, zero means no EVENT_NEW_POS 45923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status_t mStatus; 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // constant after constructor or set() 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t mSampleRate; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t mFrameCount; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio_format_t mFormat; 466 uint32_t mChannelCount; 467 size_t mFrameSize; // app-level frame size == AudioFlinger frame size 468 audio_source_t mInputSource; 469 uint32_t mLatency; // in ms 470 audio_channel_mask_t mChannelMask; 471 audio_input_flags_t mFlags; 472 int mSessionId; 473 transfer_type mTransfer; 474 475 audio_io_handle_t mInput; // returned by AudioSystem::getInput() 476 477 // may be changed if IAudioRecord object is re-created 478 sp<IAudioRecord> mAudioRecord; 479 sp<IMemory> mCblkMemory; 480 audio_track_cblk_t* mCblk; // re-load after mLock.unlock() 481 482 int mPreviousPriority; // before start() 483 SchedPolicy mPreviousSchedulingGroup; 484 bool mAwaitBoost; // thread should wait for priority boost before running 485 486 // The proxy should only be referenced while a lock is held because the proxy isn't 487 // multi-thread safe. 488 // An exception is that a blocking ClientProxy::obtainBuffer() may be called without a lock, 489 // provided that the caller also holds an extra reference to the proxy and shared memory to keep 490 sp<AudioRecordClientProxy> mProxy; 491 492 bool mInOverrun; // whether recorder is currently in overrun state 493 494private: 495 class DeathNotifier : public IBinder::DeathRecipient { 496 public: 497 DeathNotifier(AudioRecord* audioRecord) : mAudioRecord(audioRecord) { } 498 protected: 499 virtual void binderDied(const wp<IBinder>& who); 500 private: 501 const wp<AudioRecord> mAudioRecord; 502 }; 503 504 sp<DeathNotifier> mDeathNotifier; 505 uint32_t mSequence; // incremented for each new IAudioRecord attempt 506}; 507 508}; // namespace android 509 510#endif // ANDROID_AUDIORECORD_H 511