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