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