xref: /aosp_15_r20/frameworks/av/services/oboeservice/AAudioServiceEndpointMMAP.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2017 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 AAUDIO_SERVICE_ENDPOINT_MMAP_H
18*ec779b8eSAndroid Build Coastguard Worker #define AAUDIO_SERVICE_ENDPOINT_MMAP_H
19*ec779b8eSAndroid Build Coastguard Worker 
20*ec779b8eSAndroid Build Coastguard Worker #include <atomic>
21*ec779b8eSAndroid Build Coastguard Worker #include <functional>
22*ec779b8eSAndroid Build Coastguard Worker #include <vector>
23*ec779b8eSAndroid Build Coastguard Worker 
24*ec779b8eSAndroid Build Coastguard Worker #include "client/AudioStreamInternal.h"
25*ec779b8eSAndroid Build Coastguard Worker #include "client/AudioStreamInternalPlay.h"
26*ec779b8eSAndroid Build Coastguard Worker #include "binding/AAudioServiceMessage.h"
27*ec779b8eSAndroid Build Coastguard Worker #include "AAudioServiceEndpointShared.h"
28*ec779b8eSAndroid Build Coastguard Worker #include "AAudioServiceStreamShared.h"
29*ec779b8eSAndroid Build Coastguard Worker #include "AAudioServiceStreamMMAP.h"
30*ec779b8eSAndroid Build Coastguard Worker #include "AAudioMixer.h"
31*ec779b8eSAndroid Build Coastguard Worker #include "AAudioService.h"
32*ec779b8eSAndroid Build Coastguard Worker #include "SharedMemoryWrapper.h"
33*ec779b8eSAndroid Build Coastguard Worker 
34*ec779b8eSAndroid Build Coastguard Worker namespace aaudio {
35*ec779b8eSAndroid Build Coastguard Worker 
36*ec779b8eSAndroid Build Coastguard Worker /**
37*ec779b8eSAndroid Build Coastguard Worker  * This is used by AAudioServiceStreamMMAP to access the MMAP devices
38*ec779b8eSAndroid Build Coastguard Worker  * through AudioFlinger.
39*ec779b8eSAndroid Build Coastguard Worker  */
40*ec779b8eSAndroid Build Coastguard Worker class AAudioServiceEndpointMMAP
41*ec779b8eSAndroid Build Coastguard Worker         : public AAudioServiceEndpoint
42*ec779b8eSAndroid Build Coastguard Worker         , public android::MmapStreamCallback {
43*ec779b8eSAndroid Build Coastguard Worker 
44*ec779b8eSAndroid Build Coastguard Worker public:
45*ec779b8eSAndroid Build Coastguard Worker     explicit AAudioServiceEndpointMMAP(android::AAudioService &audioService);
46*ec779b8eSAndroid Build Coastguard Worker 
47*ec779b8eSAndroid Build Coastguard Worker     ~AAudioServiceEndpointMMAP() override = default;
48*ec779b8eSAndroid Build Coastguard Worker 
49*ec779b8eSAndroid Build Coastguard Worker     std::string dump() const override;
50*ec779b8eSAndroid Build Coastguard Worker 
51*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t open(const aaudio::AAudioStreamRequest &request) override;
52*ec779b8eSAndroid Build Coastguard Worker 
53*ec779b8eSAndroid Build Coastguard Worker     void close() override EXCLUDES(mMmapStreamLock);
54*ec779b8eSAndroid Build Coastguard Worker 
55*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t startStream(android::sp<AAudioServiceStreamBase> stream,
56*ec779b8eSAndroid Build Coastguard Worker                                 audio_port_handle_t *clientHandle) override;
57*ec779b8eSAndroid Build Coastguard Worker 
58*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t stopStream(android::sp<AAudioServiceStreamBase> stream,
59*ec779b8eSAndroid Build Coastguard Worker                                audio_port_handle_t clientHandle) override;
60*ec779b8eSAndroid Build Coastguard Worker 
61*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t startClient(const android::AudioClient& client,
62*ec779b8eSAndroid Build Coastguard Worker                                 const audio_attributes_t *attr,
63*ec779b8eSAndroid Build Coastguard Worker                                 audio_port_handle_t *clientHandle)  override
64*ec779b8eSAndroid Build Coastguard Worker                                 EXCLUDES(mMmapStreamLock);
65*ec779b8eSAndroid Build Coastguard Worker 
66*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t stopClient(audio_port_handle_t clientHandle)  override
67*ec779b8eSAndroid Build Coastguard Worker             EXCLUDES(mMmapStreamLock);
68*ec779b8eSAndroid Build Coastguard Worker 
69*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t standby() override EXCLUDES(mMmapStreamLock);
70*ec779b8eSAndroid Build Coastguard Worker 
71*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t exitStandby(AudioEndpointParcelable* parcelable) override
72*ec779b8eSAndroid Build Coastguard Worker             EXCLUDES(mMmapStreamLock);
73*ec779b8eSAndroid Build Coastguard Worker 
74*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t getFreeRunningPosition(int64_t *positionFrames, int64_t *timeNanos) override
75*ec779b8eSAndroid Build Coastguard Worker              EXCLUDES(mMmapStreamLock);
76*ec779b8eSAndroid Build Coastguard Worker 
77*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t getTimestamp(int64_t *positionFrames, int64_t *timeNanos) override;
78*ec779b8eSAndroid Build Coastguard Worker 
79*ec779b8eSAndroid Build Coastguard Worker     void handleTearDownAsync(audio_port_handle_t portHandle);
80*ec779b8eSAndroid Build Coastguard Worker 
81*ec779b8eSAndroid Build Coastguard Worker     // -------------- Callback functions for MmapStreamCallback ---------------------
82*ec779b8eSAndroid Build Coastguard Worker     void onTearDown(audio_port_handle_t portHandle) override;
83*ec779b8eSAndroid Build Coastguard Worker 
84*ec779b8eSAndroid Build Coastguard Worker     void onVolumeChanged(float volume) override;
85*ec779b8eSAndroid Build Coastguard Worker 
86*ec779b8eSAndroid Build Coastguard Worker     void onRoutingChanged(const android::DeviceIdVector& deviceIds) override;
87*ec779b8eSAndroid Build Coastguard Worker     // ------------------------------------------------------------------------------
88*ec779b8eSAndroid Build Coastguard Worker 
89*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t getDownDataDescription(AudioEndpointParcelable* parcelable);
90*ec779b8eSAndroid Build Coastguard Worker 
getHardwareTimeOffsetNanos()91*ec779b8eSAndroid Build Coastguard Worker     int64_t getHardwareTimeOffsetNanos() const {
92*ec779b8eSAndroid Build Coastguard Worker         return mHardwareTimeOffsetNanos;
93*ec779b8eSAndroid Build Coastguard Worker     }
94*ec779b8eSAndroid Build Coastguard Worker 
95*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t getExternalPosition(uint64_t *positionFrames, int64_t *timeNanos)
96*ec779b8eSAndroid Build Coastguard Worker             EXCLUDES(mMmapStreamLock);
97*ec779b8eSAndroid Build Coastguard Worker 
98*ec779b8eSAndroid Build Coastguard Worker     int64_t nextDataReportTime() EXCLUDES(mMmapStreamLock);
99*ec779b8eSAndroid Build Coastguard Worker 
100*ec779b8eSAndroid Build Coastguard Worker     void reportData() EXCLUDES(mMmapStreamLock);
101*ec779b8eSAndroid Build Coastguard Worker 
102*ec779b8eSAndroid Build Coastguard Worker private:
103*ec779b8eSAndroid Build Coastguard Worker 
104*ec779b8eSAndroid Build Coastguard Worker     /**
105*ec779b8eSAndroid Build Coastguard Worker      *
106*ec779b8eSAndroid Build Coastguard Worker      * @return true if mMapStream was cleared
107*ec779b8eSAndroid Build Coastguard Worker      */
108*ec779b8eSAndroid Build Coastguard Worker     bool close_l() REQUIRES(mMmapStreamLock);
109*ec779b8eSAndroid Build Coastguard Worker 
110*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t openWithConfig(audio_config_base_t* config) EXCLUDES(mMmapStreamLock);
111*ec779b8eSAndroid Build Coastguard Worker 
112*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t createMmapBuffer_l() REQUIRES(mMmapStreamLock);
113*ec779b8eSAndroid Build Coastguard Worker 
114*ec779b8eSAndroid Build Coastguard Worker     MonotonicCounter                          mFramesTransferred;
115*ec779b8eSAndroid Build Coastguard Worker 
116*ec779b8eSAndroid Build Coastguard Worker     // Interface to the AudioFlinger MMAP support.
117*ec779b8eSAndroid Build Coastguard Worker     mutable std::mutex                        mMmapStreamLock;
118*ec779b8eSAndroid Build Coastguard Worker     android::sp<android::MmapStreamInterface> mMmapStream GUARDED_BY(mMmapStreamLock);
119*ec779b8eSAndroid Build Coastguard Worker 
120*ec779b8eSAndroid Build Coastguard Worker     struct audio_mmap_buffer_info             mMmapBufferinfo;
121*ec779b8eSAndroid Build Coastguard Worker 
122*ec779b8eSAndroid Build Coastguard Worker     // There is only one port associated with an MMAP endpoint.
123*ec779b8eSAndroid Build Coastguard Worker     audio_port_handle_t                       mPortHandle = AUDIO_PORT_HANDLE_NONE;
124*ec779b8eSAndroid Build Coastguard Worker 
125*ec779b8eSAndroid Build Coastguard Worker     android::AAudioService                    &mAAudioService;
126*ec779b8eSAndroid Build Coastguard Worker 
127*ec779b8eSAndroid Build Coastguard Worker     std::unique_ptr<SharedMemoryWrapper>      mAudioDataWrapper;
128*ec779b8eSAndroid Build Coastguard Worker 
129*ec779b8eSAndroid Build Coastguard Worker     int64_t                                   mHardwareTimeOffsetNanos = 0; // TODO get from HAL
130*ec779b8eSAndroid Build Coastguard Worker 
131*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t                           mHalExternalPositionStatus = AAUDIO_OK;
132*ec779b8eSAndroid Build Coastguard Worker     uint64_t                                  mLastPositionFrames = 0;
133*ec779b8eSAndroid Build Coastguard Worker     int64_t                                   mTimestampNanosForLastPosition = 0;
134*ec779b8eSAndroid Build Coastguard Worker     int32_t                                   mTimestampGracePeriodMs;
135*ec779b8eSAndroid Build Coastguard Worker     int32_t                                   mFrozenPositionCount = 0;
136*ec779b8eSAndroid Build Coastguard Worker     int32_t                                   mFrozenTimestampCount = 0;
137*ec779b8eSAndroid Build Coastguard Worker     int64_t                                   mDataReportOffsetNanos = 0;
138*ec779b8eSAndroid Build Coastguard Worker 
139*ec779b8eSAndroid Build Coastguard Worker };
140*ec779b8eSAndroid Build Coastguard Worker 
141*ec779b8eSAndroid Build Coastguard Worker } /* namespace aaudio */
142*ec779b8eSAndroid Build Coastguard Worker 
143*ec779b8eSAndroid Build Coastguard Worker #endif //AAUDIO_SERVICE_ENDPOINT_MMAP_H
144*ec779b8eSAndroid Build Coastguard Worker 
145