1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #ifndef ANDROID_AUDIO_MMAP_STREAM_INTERFACE_H 18*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_AUDIO_MMAP_STREAM_INTERFACE_H 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker #include <system/audio.h> 21*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioClient.h> 22*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioContainers.h> 23*ec779b8eSAndroid Build Coastguard Worker #include <utils/Errors.h> 24*ec779b8eSAndroid Build Coastguard Worker #include <utils/RefBase.h> 25*ec779b8eSAndroid Build Coastguard Worker 26*ec779b8eSAndroid Build Coastguard Worker #include <time.h> 27*ec779b8eSAndroid Build Coastguard Worker 28*ec779b8eSAndroid Build Coastguard Worker namespace android { 29*ec779b8eSAndroid Build Coastguard Worker 30*ec779b8eSAndroid Build Coastguard Worker class MmapStreamCallback; 31*ec779b8eSAndroid Build Coastguard Worker 32*ec779b8eSAndroid Build Coastguard Worker class MmapStreamInterface : public virtual RefBase 33*ec779b8eSAndroid Build Coastguard Worker { 34*ec779b8eSAndroid Build Coastguard Worker public: 35*ec779b8eSAndroid Build Coastguard Worker 36*ec779b8eSAndroid Build Coastguard Worker /** 37*ec779b8eSAndroid Build Coastguard Worker * Values for direction argument passed to openMmapStream() 38*ec779b8eSAndroid Build Coastguard Worker */ 39*ec779b8eSAndroid Build Coastguard Worker typedef enum { 40*ec779b8eSAndroid Build Coastguard Worker DIRECTION_OUTPUT = 0, /**< open a playback mmap stream */ 41*ec779b8eSAndroid Build Coastguard Worker DIRECTION_INPUT, /**< open a capture mmap stream */ 42*ec779b8eSAndroid Build Coastguard Worker } stream_direction_t; 43*ec779b8eSAndroid Build Coastguard Worker 44*ec779b8eSAndroid Build Coastguard Worker /** 45*ec779b8eSAndroid Build Coastguard Worker * Open a playback or capture stream in MMAP mode at the audio HAL. 46*ec779b8eSAndroid Build Coastguard Worker * 47*ec779b8eSAndroid Build Coastguard Worker * \note This method is implemented by AudioFlinger 48*ec779b8eSAndroid Build Coastguard Worker * 49*ec779b8eSAndroid Build Coastguard Worker * \param[in] direction open a playback or capture stream. 50*ec779b8eSAndroid Build Coastguard Worker * \param[in] attr audio attributes defining the main use case for this stream 51*ec779b8eSAndroid Build Coastguard Worker * \param[in,out] config audio parameters (sampling rate, format ...) for the stream. 52*ec779b8eSAndroid Build Coastguard Worker * Requested parameters as input, 53*ec779b8eSAndroid Build Coastguard Worker * Actual parameters as output 54*ec779b8eSAndroid Build Coastguard Worker * \param[in] client a AudioClient struct describing the first client using this stream. 55*ec779b8eSAndroid Build Coastguard Worker * \param[in,out] deviceIds audio devices the stream should preferably be routed to/from. 56*ec779b8eSAndroid Build Coastguard Worker * Leave empty if there are no preferred devices. 57*ec779b8eSAndroid Build Coastguard Worker * Requested as input, 58*ec779b8eSAndroid Build Coastguard Worker * Actual as output 59*ec779b8eSAndroid Build Coastguard Worker * \param[in,out] sessionId audio sessionId for the stream 60*ec779b8eSAndroid Build Coastguard Worker * Requested as input, may be AUDIO_SESSION_ALLOCATE 61*ec779b8eSAndroid Build Coastguard Worker * Actual as output 62*ec779b8eSAndroid Build Coastguard Worker * \param[in] callback the MmapStreamCallback interface used by AudioFlinger to notify 63*ec779b8eSAndroid Build Coastguard Worker * condition changes affecting the stream operation 64*ec779b8eSAndroid Build Coastguard Worker * \param[out] interface the MmapStreamInterface interface controlling the created stream 65*ec779b8eSAndroid Build Coastguard Worker * \param[out] same unique handle as the one used for the first client stream started. 66*ec779b8eSAndroid Build Coastguard Worker * \return OK if the stream was successfully created. 67*ec779b8eSAndroid Build Coastguard Worker * NO_INIT if AudioFlinger is not properly initialized 68*ec779b8eSAndroid Build Coastguard Worker * BAD_VALUE if the stream cannot be opened because of invalid arguments 69*ec779b8eSAndroid Build Coastguard Worker * INVALID_OPERATION if the stream cannot be opened because of platform limitations 70*ec779b8eSAndroid Build Coastguard Worker */ 71*ec779b8eSAndroid Build Coastguard Worker static status_t openMmapStream(stream_direction_t direction, 72*ec779b8eSAndroid Build Coastguard Worker const audio_attributes_t *attr, 73*ec779b8eSAndroid Build Coastguard Worker audio_config_base_t *config, 74*ec779b8eSAndroid Build Coastguard Worker const AudioClient& client, 75*ec779b8eSAndroid Build Coastguard Worker DeviceIdVector *deviceIds, 76*ec779b8eSAndroid Build Coastguard Worker audio_session_t *sessionId, 77*ec779b8eSAndroid Build Coastguard Worker const sp<MmapStreamCallback>& callback, 78*ec779b8eSAndroid Build Coastguard Worker sp<MmapStreamInterface>& interface, 79*ec779b8eSAndroid Build Coastguard Worker audio_port_handle_t *handle); 80*ec779b8eSAndroid Build Coastguard Worker 81*ec779b8eSAndroid Build Coastguard Worker /** 82*ec779b8eSAndroid Build Coastguard Worker * Retrieve information on the mmap buffer used for audio samples transfer. 83*ec779b8eSAndroid Build Coastguard Worker * Must be called before any other method after opening the stream or entering standby. 84*ec779b8eSAndroid Build Coastguard Worker * 85*ec779b8eSAndroid Build Coastguard Worker * \param[in] min_size_frames minimum buffer size requested. The actual buffer 86*ec779b8eSAndroid Build Coastguard Worker * size returned in struct audio_mmap_buffer_info can be larger. 87*ec779b8eSAndroid Build Coastguard Worker * \param[out] info address at which the mmap buffer information should be returned. 88*ec779b8eSAndroid Build Coastguard Worker * 89*ec779b8eSAndroid Build Coastguard Worker * \return OK if the buffer was allocated. 90*ec779b8eSAndroid Build Coastguard Worker * NO_INIT in case of initialization error 91*ec779b8eSAndroid Build Coastguard Worker * BAD_VALUE if the requested buffer size is too large 92*ec779b8eSAndroid Build Coastguard Worker * INVALID_OPERATION if called out of sequence (e.g. buffer already allocated) 93*ec779b8eSAndroid Build Coastguard Worker */ 94*ec779b8eSAndroid Build Coastguard Worker virtual status_t createMmapBuffer(int32_t minSizeFrames, 95*ec779b8eSAndroid Build Coastguard Worker struct audio_mmap_buffer_info *info) = 0; 96*ec779b8eSAndroid Build Coastguard Worker 97*ec779b8eSAndroid Build Coastguard Worker /** 98*ec779b8eSAndroid Build Coastguard Worker * Read current read/write position in the mmap buffer with associated time stamp. 99*ec779b8eSAndroid Build Coastguard Worker * 100*ec779b8eSAndroid Build Coastguard Worker * \param[out] position address at which the mmap read/write position should be returned. 101*ec779b8eSAndroid Build Coastguard Worker * 102*ec779b8eSAndroid Build Coastguard Worker * \return OK if the position is successfully returned. 103*ec779b8eSAndroid Build Coastguard Worker * NO_INIT in case of initialization error 104*ec779b8eSAndroid Build Coastguard Worker * NOT_ENOUGH_DATA if the position cannot be retrieved 105*ec779b8eSAndroid Build Coastguard Worker * INVALID_OPERATION if called before createMmapBuffer() 106*ec779b8eSAndroid Build Coastguard Worker */ 107*ec779b8eSAndroid Build Coastguard Worker virtual status_t getMmapPosition(struct audio_mmap_position *position) = 0; 108*ec779b8eSAndroid Build Coastguard Worker 109*ec779b8eSAndroid Build Coastguard Worker /** 110*ec779b8eSAndroid Build Coastguard Worker * Get a recent count of the number of audio frames presented/received to/from an 111*ec779b8eSAndroid Build Coastguard Worker * external observer. 112*ec779b8eSAndroid Build Coastguard Worker * 113*ec779b8eSAndroid Build Coastguard Worker * \param[out] position count of presented audio frames 114*ec779b8eSAndroid Build Coastguard Worker * \param[out] timeNanos associated clock time 115*ec779b8eSAndroid Build Coastguard Worker * 116*ec779b8eSAndroid Build Coastguard Worker * \return OK if the external position is set correctly. 117*ec779b8eSAndroid Build Coastguard Worker * NO_INIT in case of initialization error 118*ec779b8eSAndroid Build Coastguard Worker * INVALID_OPERATION if the interface is not implemented 119*ec779b8eSAndroid Build Coastguard Worker */ 120*ec779b8eSAndroid Build Coastguard Worker virtual status_t getExternalPosition(uint64_t* position, int64_t* timeNanos) = 0; 121*ec779b8eSAndroid Build Coastguard Worker 122*ec779b8eSAndroid Build Coastguard Worker /** 123*ec779b8eSAndroid Build Coastguard Worker * Start a stream operating in mmap mode. 124*ec779b8eSAndroid Build Coastguard Worker * createMmapBuffer() must be called before calling start() 125*ec779b8eSAndroid Build Coastguard Worker * 126*ec779b8eSAndroid Build Coastguard Worker * \param[in] client a AudioClient struct describing the client starting on this stream. 127*ec779b8eSAndroid Build Coastguard Worker * \param[in] attr audio attributes provided by the client. 128*ec779b8eSAndroid Build Coastguard Worker * \param[out] handle unique handle for this instance. Used with stop(). 129*ec779b8eSAndroid Build Coastguard Worker * \return OK in case of success. 130*ec779b8eSAndroid Build Coastguard Worker * NO_INIT in case of initialization error 131*ec779b8eSAndroid Build Coastguard Worker * INVALID_OPERATION if called out of sequence 132*ec779b8eSAndroid Build Coastguard Worker */ 133*ec779b8eSAndroid Build Coastguard Worker virtual status_t start(const AudioClient& client, 134*ec779b8eSAndroid Build Coastguard Worker const audio_attributes_t *attr, 135*ec779b8eSAndroid Build Coastguard Worker audio_port_handle_t *handle) = 0; 136*ec779b8eSAndroid Build Coastguard Worker 137*ec779b8eSAndroid Build Coastguard Worker /** 138*ec779b8eSAndroid Build Coastguard Worker * Stop a stream operating in mmap mode. 139*ec779b8eSAndroid Build Coastguard Worker * Must be called after start() 140*ec779b8eSAndroid Build Coastguard Worker * 141*ec779b8eSAndroid Build Coastguard Worker * \param[in] handle unique handle allocated by start(). 142*ec779b8eSAndroid Build Coastguard Worker * \return OK in case of success. 143*ec779b8eSAndroid Build Coastguard Worker * NO_INIT in case of initialization error 144*ec779b8eSAndroid Build Coastguard Worker * INVALID_OPERATION if called out of sequence 145*ec779b8eSAndroid Build Coastguard Worker */ 146*ec779b8eSAndroid Build Coastguard Worker virtual status_t stop(audio_port_handle_t handle) = 0; 147*ec779b8eSAndroid Build Coastguard Worker 148*ec779b8eSAndroid Build Coastguard Worker /** 149*ec779b8eSAndroid Build Coastguard Worker * Put a stream operating in mmap mode into standby. 150*ec779b8eSAndroid Build Coastguard Worker * Must be called after createMmapBuffer(). Cannot be called if any client is active. 151*ec779b8eSAndroid Build Coastguard Worker * It is recommended to place a mmap stream into standby as often as possible when no client is 152*ec779b8eSAndroid Build Coastguard Worker * active to save power. 153*ec779b8eSAndroid Build Coastguard Worker * 154*ec779b8eSAndroid Build Coastguard Worker * \return OK in case of success. 155*ec779b8eSAndroid Build Coastguard Worker * NO_INIT in case of initialization error 156*ec779b8eSAndroid Build Coastguard Worker * INVALID_OPERATION if called out of sequence 157*ec779b8eSAndroid Build Coastguard Worker */ 158*ec779b8eSAndroid Build Coastguard Worker virtual status_t standby() = 0; 159*ec779b8eSAndroid Build Coastguard Worker 160*ec779b8eSAndroid Build Coastguard Worker /** 161*ec779b8eSAndroid Build Coastguard Worker * Report when data being written to a playback buffer. Currently, this is used by mmap 162*ec779b8eSAndroid Build Coastguard Worker * playback thread for sound dose computation. 163*ec779b8eSAndroid Build Coastguard Worker * 164*ec779b8eSAndroid Build Coastguard Worker * \param[in] buffer a pointer to the audio data 165*ec779b8eSAndroid Build Coastguard Worker * \param[in] frameCount the number of frames written by the CPU 166*ec779b8eSAndroid Build Coastguard Worker * \return OK in case of success. 167*ec779b8eSAndroid Build Coastguard Worker * NO_INIT in case of initialization error 168*ec779b8eSAndroid Build Coastguard Worker * INVALID_OPERATION in case of wrong thread type 169*ec779b8eSAndroid Build Coastguard Worker */ 170*ec779b8eSAndroid Build Coastguard Worker virtual status_t reportData(const void* buffer, size_t frameCount) = 0; 171*ec779b8eSAndroid Build Coastguard Worker 172*ec779b8eSAndroid Build Coastguard Worker protected: 173*ec779b8eSAndroid Build Coastguard Worker // Subclasses can not be constructed directly by clients. MmapStreamInterface()174*ec779b8eSAndroid Build Coastguard Worker MmapStreamInterface() {} 175*ec779b8eSAndroid Build Coastguard Worker 176*ec779b8eSAndroid Build Coastguard Worker // The destructor automatically closes the stream. ~MmapStreamInterface()177*ec779b8eSAndroid Build Coastguard Worker virtual ~MmapStreamInterface() {} 178*ec779b8eSAndroid Build Coastguard Worker }; 179*ec779b8eSAndroid Build Coastguard Worker 180*ec779b8eSAndroid Build Coastguard Worker } // namespace android 181*ec779b8eSAndroid Build Coastguard Worker 182*ec779b8eSAndroid Build Coastguard Worker #endif // ANDROID_AUDIO_MMAP_STREAM_INTERFACE_H 183