• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *
3  * Copyright 2015, The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 #pragma once
19 
20 #include <stdint.h>
21 #include <sys/types.h>
22 
23 #include <system/audio.h>
24 #include <utils/Errors.h>
25 #include <utils/RefBase.h>
26 
27 namespace android {
28 
29 class AudioHwDevice;
30 class DeviceHalInterface;
31 class StreamOutHalInterface;
32 
33 /**
34  * Managed access to a HAL output stream.
35  */
36 class AudioStreamOut {
37 public:
38     AudioHwDevice * const audioHwDev;
39     sp<StreamOutHalInterface> stream;
40     const audio_output_flags_t flags;
41 
42     [[nodiscard]] sp<DeviceHalInterface> hwDev() const;
43 
44     AudioStreamOut(AudioHwDevice *dev, audio_output_flags_t flags);
45 
46     virtual status_t open(
47             audio_io_handle_t handle,
48             audio_devices_t deviceType,
49             struct audio_config *config,
50             const char *address);
51 
52     virtual ~AudioStreamOut();
53 
54     virtual status_t getRenderPosition(uint64_t *frames);
55 
56     virtual status_t getPresentationPosition(uint64_t *frames, struct timespec *timestamp);
57 
58     /**
59     * Write audio buffer to driver. Returns number of bytes written, or a
60     * negative status_t. If at least one frame was written successfully prior to the error,
61     * it is suggested that the driver return that successful (short) byte count
62     * and then return an error in the subsequent call.
63     *
64     * If set_callback() has previously been called to enable non-blocking mode
65     * the write() is not allowed to block. It must write only the number of
66     * bytes that currently fit in the driver/hardware buffer and then return
67     * this byte count. If this is less than the requested write size the
68     * callback function must be called when more space is available in the
69     * driver/hardware buffer.
70     */
71     virtual ssize_t write(const void *buffer, size_t bytes);
72 
73     /**
74      * @return frame size from the perspective of the application and the AudioFlinger.
75      */
getFrameSize()76     [[nodiscard]] virtual size_t getFrameSize() const { return mHalFrameSize; }
77 
78     /**
79      * @return audio stream configuration: channel mask, format, sample rate:
80      *   - channel mask from the perspective of the application and the AudioFlinger,
81      *     The HAL is in stereo mode when playing multi-channel compressed audio over HDMI;
82      *   - format from the perspective of the application and the AudioFlinger;
83      *   - sample rate from the perspective of the application and the AudioFlinger,
84      *     The HAL may be running at a higher sample rate if, for example, playing wrapped EAC3.
85      */
86     [[nodiscard]] virtual audio_config_base_t getAudioProperties() const;
87 
88     virtual status_t flush();
89     virtual status_t standby();
90 
91     virtual void presentationComplete();
92 
93 protected:
94     uint64_t mFramesWritten = 0; // reset by flush
95     uint64_t mFramesWrittenAtStandby = 0;
96     int mRateMultiplier = 1;
97     bool mHalFormatHasProportionalFrames = false;
98     size_t mHalFrameSize = 0;
99 };
100 
101 } // namespace android
102