• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (C) 2019 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
17package android.hardware.audio@6.0;
18
19import android.hardware.audio.common@6.0;
20import IStream;
21import IStreamOutCallback;
22import IStreamOutEventCallback;
23
24interface IStreamOut extends IStream {
25    /**
26     * Return the audio hardware driver estimated latency in milliseconds.
27     *
28     * @return latencyMs latency in milliseconds.
29     */
30    getLatency() generates (uint32_t latencyMs);
31
32    /**
33     * This method is used in situations where audio mixing is done in the
34     * hardware. This method serves as a direct interface with hardware,
35     * allowing to directly set the volume as apposed to via the framework.
36     * This method might produce multiple PCM outputs or hardware accelerated
37     * codecs, such as MP3 or AAC.
38     * Optional method
39     *
40     * @param left left channel attenuation, 1.0f is unity, 0.0f is zero.
41     * @param right right channel attenuation, 1.0f is unity, 0.0f is zero.
42     * @return retval operation completion status.
43     *        If a volume is outside [0,1], return INVALID_ARGUMENTS
44     */
45    setVolume(float left, float right) generates (Result retval);
46
47    /**
48     * Commands that can be executed on the driver writer thread.
49     */
50    enum WriteCommand : int32_t {
51        WRITE,
52        GET_PRESENTATION_POSITION,
53        GET_LATENCY
54    };
55
56    /**
57     * Data structure passed back to the client via status message queue
58     * of 'write' operation.
59     *
60     * Possible values of 'retval' field:
61     *  - OK, write operation was successful;
62     *  - INVALID_ARGUMENTS, stream was not configured properly;
63     *  - INVALID_STATE, stream is in a state that doesn't allow writes;
64     *  - INVALID_OPERATION, retrieving presentation position isn't supported.
65     */
66    struct WriteStatus {
67        Result retval;
68        WriteCommand replyTo;  // discriminator
69        union Reply {
70            uint64_t written;  // WRITE command, amount of bytes written, >= 0.
71            struct PresentationPosition {  // same as generated by
72                uint64_t frames;           // getPresentationPosition.
73                TimeSpec timeStamp;
74            } presentationPosition;
75            uint32_t latencyMs; // Same as generated by getLatency.
76        } reply;
77    };
78
79    /**
80     * Called when the metadata of the stream's source has been changed.
81     * @param sourceMetadata Description of the audio that is played by the clients.
82     */
83    updateSourceMetadata(SourceMetadata sourceMetadata);
84
85    /**
86     * Set up required transports for passing audio buffers to the driver.
87     *
88     * The transport consists of three message queues:
89     *  -- command queue is used to instruct the writer thread what operation
90     *     to perform;
91     *  -- data queue is used for passing audio data from the client
92     *     to the driver;
93     *  -- status queue is used for reporting operation status
94     *     (e.g. amount of bytes actually written or error code).
95     *
96     * The driver operates on a dedicated thread. The client must ensure that
97     * the thread is given an appropriate priority and assigned to correct
98     * scheduler and cgroup. For this purpose, the method returns identifiers
99     * of the driver thread.
100     *
101     * @param frameSize the size of a single frame, in bytes.
102     * @param framesCount the number of frames in a buffer.
103     * @return retval OK if both message queues were created successfully.
104     *                INVALID_STATE if the method was already called.
105     *                INVALID_ARGUMENTS if there was a problem setting up
106     *                                  the queues.
107     * @return commandMQ a message queue used for passing commands.
108     * @return dataMQ a message queue used for passing audio data in the format
109     *                specified at the stream opening.
110     * @return statusMQ a message queue used for passing status from the driver
111     *                  using WriteStatus structures.
112     * @return threadInfo identifiers of the driver's dedicated thread.
113     */
114    prepareForWriting(uint32_t frameSize, uint32_t framesCount)
115    generates (
116            Result retval,
117            fmq_sync<WriteCommand> commandMQ,
118            fmq_sync<uint8_t> dataMQ,
119            fmq_sync<WriteStatus> statusMQ,
120            ThreadInfo threadInfo);
121
122    /**
123     * Return the number of audio frames written by the audio DSP to DAC since
124     * the output has exited standby.
125     * Optional method
126     *
127     * @return retval operation completion status.
128     * @return dspFrames number of audio frames written.
129     */
130    getRenderPosition() generates (Result retval, uint32_t dspFrames);
131
132    /**
133     * Get the local time at which the next write to the audio driver will be
134     * presented. The units are microseconds, where the epoch is decided by the
135     * local audio HAL.
136     * Optional method
137     *
138     * @return retval operation completion status.
139     * @return timestampUs time of the next write.
140     */
141    getNextWriteTimestamp() generates (Result retval, int64_t timestampUs);
142
143    /**
144     * Set the callback interface for notifying completion of non-blocking
145     * write and drain.
146     *
147     * Calling this function implies that all future 'write' and 'drain'
148     * must be non-blocking and use the callback to signal completion.
149     *
150     * 'clearCallback' method needs to be called in order to release the local
151     * callback proxy on the server side and thus dereference the callback
152     * implementation on the client side.
153     *
154     * @return retval operation completion status.
155     */
156    setCallback(IStreamOutCallback callback) generates (Result retval);
157
158    /**
159     * Clears the callback previously set via 'setCallback' method.
160     *
161     * Warning: failure to call this method results in callback implementation
162     * on the client side being held until the HAL server termination.
163     *
164     * If no callback was previously set, the method should be a no-op
165     * and return OK.
166     *
167     * @return retval operation completion status: OK or NOT_SUPPORTED.
168     */
169    clearCallback() generates (Result retval);
170
171    /**
172     * Set the callback interface for notifying about an output stream event.
173     *
174     * Calling this method with a null pointer will result in releasing
175     * the local callback proxy on the server side and thus dereference
176     * the callback implementation on the client side.
177     *
178     * @return retval operation completion status.
179     */
180    setEventCallback(IStreamOutEventCallback callback)
181            generates (Result retval);
182
183    /**
184     * Returns whether HAL supports pausing and resuming of streams.
185     *
186     * @return supportsPause true if pausing is supported.
187     * @return supportsResume true if resume is supported.
188     */
189    supportsPauseAndResume()
190            generates (bool supportsPause, bool supportsResume);
191
192    /**
193     * Notifies to the audio driver to stop playback however the queued buffers
194     * are retained by the hardware. Useful for implementing pause/resume. Empty
195     * implementation if not supported however must be implemented for hardware
196     * with non-trivial latency. In the pause state, some audio hardware may
197     * still be using power. Client code may consider calling 'suspend' after a
198     * timeout to prevent that excess power usage.
199     *
200     * Implementation of this function is mandatory for offloaded playback.
201     *
202     * @return retval operation completion status.
203     */
204    pause() generates (Result retval);
205
206    /**
207     * Notifies to the audio driver to resume playback following a pause.
208     * Returns error INVALID_STATE if called without matching pause.
209     *
210     * Implementation of this function is mandatory for offloaded playback.
211     *
212     * @return retval operation completion status.
213     */
214    resume() generates (Result retval);
215
216    /**
217     * Returns whether HAL supports draining of streams.
218     *
219     * @return supports true if draining is supported.
220     */
221    supportsDrain() generates (bool supports);
222
223    /**
224     * Requests notification when data buffered by the driver/hardware has been
225     * played. If 'setCallback' has previously been called to enable
226     * non-blocking mode, then 'drain' must not block, instead it must return
227     * quickly and completion of the drain is notified through the callback. If
228     * 'setCallback' has not been called, then 'drain' must block until
229     * completion.
230     *
231     * If 'type' is 'ALL', the drain completes when all previously written data
232     * has been played.
233     *
234     * If 'type' is 'EARLY_NOTIFY', the drain completes shortly before all data
235     * for the current track has played to allow time for the framework to
236     * perform a gapless track switch.
237     *
238     * Drain must return immediately on 'stop' and 'flush' calls.
239     *
240     * Implementation of this function is mandatory for offloaded playback.
241     *
242     * @param type type of drain.
243     * @return retval operation completion status.
244     */
245    drain(AudioDrain type) generates (Result retval);
246
247    /**
248     * Notifies to the audio driver to flush the queued data. Stream must
249     * already be paused before calling 'flush'.
250     * Optional method
251     *
252     * Implementation of this function is mandatory for offloaded playback.
253     *
254     * @return retval operation completion status.
255     */
256    flush() generates (Result retval);
257
258    /**
259     * Return a recent count of the number of audio frames presented to an
260     * external observer. This excludes frames which have been written but are
261     * still in the pipeline. The count is not reset to zero when output enters
262     * standby. Also returns the value of CLOCK_MONOTONIC as of this
263     * presentation count. The returned count is expected to be 'recent', but
264     * does not need to be the most recent possible value. However, the
265     * associated time must correspond to whatever count is returned.
266     *
267     * Example: assume that N+M frames have been presented, where M is a 'small'
268     * number. Then it is permissible to return N instead of N+M, and the
269     * timestamp must correspond to N rather than N+M. The terms 'recent' and
270     * 'small' are not defined. They reflect the quality of the implementation.
271     *
272     * Optional method
273     *
274     * @return retval operation completion status.
275     * @return frames count of presented audio frames.
276     * @return timeStamp associated clock time.
277     */
278    getPresentationPosition()
279            generates (Result retval, uint64_t frames, TimeSpec timeStamp);
280
281    /**
282     * Selects a presentation for decoding from a next generation media stream
283     * (as defined per ETSI TS 103 190-2) and a program within the presentation.
284     * Optional method
285     *
286     * @param presentationId selected audio presentation.
287     * @param programId refinement for the presentation.
288     * @return retval operation completion status.
289     */
290    selectPresentation(int32_t presentationId, int32_t programId)
291            generates (Result retval);
292
293    /**
294     * Returns the Dual Mono mode presentation setting.
295     *
296     * Optional method
297     *
298     * @return retval operation completion status.
299     * @return mode current setting of Dual Mono mode.
300     */
301    getDualMonoMode() generates (Result retval, DualMonoMode mode);
302
303    /**
304     * Sets the Dual Mono mode presentation on the output device.
305     *
306     * The Dual Mono mode is generally applied to stereo audio streams
307     * where the left and right channels come from separate sources.
308     *
309     * Optional method
310     *
311     * @param mode selected Dual Mono mode.
312     * @return retval operation completion status.
313     */
314    setDualMonoMode(DualMonoMode mode) generates (Result retval);
315
316    /**
317     * Returns the Audio Description Mix level in dB.
318     *
319     * The level is applied to streams incorporating a secondary Audio
320     * Description stream. It specifies the relative level of mixing for
321     * the Audio Description with a reference to the Main Audio.
322     *
323     * Optional method
324     *
325     * The value of the relative level is in the range from negative infinity
326     * to +48.
327     *
328     * @return retval operation completion status.
329     * @return leveldB the current Audio Description Mix Level in dB.
330     */
331    getAudioDescriptionMixLevel() generates (Result retval, float leveldB);
332
333    /**
334     * Sets the Audio Description Mix level in dB.
335     *
336     * For streams incorporating a secondary Audio Description stream
337     * the relative level of mixing of the Audio Description to the Main Audio
338     * is controlled by this method.
339     *
340     * Optional method
341     *
342     * The value of the relative level must be in the range from negative
343     * infinity to +48.
344     *
345     * @param leveldB Audio Description Mix Level in dB
346     * @return retval operation completion status.
347     */
348    setAudioDescriptionMixLevel(float leveldB) generates (Result retval);
349
350    /**
351     * Retrieves current playback rate parameters.
352     *
353     * Optional method
354     *
355     * @return retval operation completion status.
356     * @return playbackRate current playback parameters
357     */
358    getPlaybackRateParameters()
359            generates (Result retval, PlaybackRate playbackRate);
360
361    /**
362     * Sets the playback rate parameters that control playback behavior.
363     * This is normally used when playing encoded content and decoding
364     * is performed in hardware. Otherwise, the framework can apply
365     * necessary transformations.
366     *
367     * Optional method
368     *
369     * If the HAL supports setting the playback rate, it is recommended
370     * to support speed and pitch values at least in the range
371     * from 0.5f to 2.0f, inclusive (see the definition of PlaybackRate struct).
372     *
373     * @param playbackRate playback parameters
374     * @return retval operation completion status.
375     */
376    setPlaybackRateParameters(PlaybackRate playbackRate)
377            generates (Result retval);
378};
379