xref: /aosp_15_r20/frameworks/av/services/oboeservice/AAudioServiceStreamMMAP.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_AAUDIO_SERVICE_STREAM_MMAP_H
18*ec779b8eSAndroid Build Coastguard Worker #define AAUDIO_AAUDIO_SERVICE_STREAM_MMAP_H
19*ec779b8eSAndroid Build Coastguard Worker 
20*ec779b8eSAndroid Build Coastguard Worker #include <atomic>
21*ec779b8eSAndroid Build Coastguard Worker 
22*ec779b8eSAndroid Build Coastguard Worker #include <android-base/thread_annotations.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <android-base/unique_fd.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <media/audiohal/StreamHalInterface.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <media/MmapStreamCallback.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <media/MmapStreamInterface.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <utils/RefBase.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <utils/String16.h>
29*ec779b8eSAndroid Build Coastguard Worker #include <utils/Vector.h>
30*ec779b8eSAndroid Build Coastguard Worker 
31*ec779b8eSAndroid Build Coastguard Worker #include "binding/AAudioServiceMessage.h"
32*ec779b8eSAndroid Build Coastguard Worker #include "AAudioServiceStreamBase.h"
33*ec779b8eSAndroid Build Coastguard Worker #include "binding/AudioEndpointParcelable.h"
34*ec779b8eSAndroid Build Coastguard Worker #include "SharedMemoryProxy.h"
35*ec779b8eSAndroid Build Coastguard Worker #include "TimestampScheduler.h"
36*ec779b8eSAndroid Build Coastguard Worker #include "utility/MonotonicCounter.h"
37*ec779b8eSAndroid Build Coastguard Worker 
38*ec779b8eSAndroid Build Coastguard Worker namespace aaudio {
39*ec779b8eSAndroid Build Coastguard Worker 
40*ec779b8eSAndroid Build Coastguard Worker /**
41*ec779b8eSAndroid Build Coastguard Worker  * These corresponds to an EXCLUSIVE mode MMAP client stream.
42*ec779b8eSAndroid Build Coastguard Worker  * It has exclusive use of one AAudioServiceEndpointMMAP to communicate with the underlying
43*ec779b8eSAndroid Build Coastguard Worker  * device or port.
44*ec779b8eSAndroid Build Coastguard Worker  */
45*ec779b8eSAndroid Build Coastguard Worker class AAudioServiceStreamMMAP : public AAudioServiceStreamBase {
46*ec779b8eSAndroid Build Coastguard Worker 
47*ec779b8eSAndroid Build Coastguard Worker public:
48*ec779b8eSAndroid Build Coastguard Worker     AAudioServiceStreamMMAP(android::AAudioService &aAudioService,
49*ec779b8eSAndroid Build Coastguard Worker                             bool inService);
50*ec779b8eSAndroid Build Coastguard Worker     ~AAudioServiceStreamMMAP() override = default;
51*ec779b8eSAndroid Build Coastguard Worker 
52*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t open(const aaudio::AAudioStreamRequest &request) override
53*ec779b8eSAndroid Build Coastguard Worker             EXCLUDES(mUpMessageQueueLock);
54*ec779b8eSAndroid Build Coastguard Worker 
55*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t startClient(const android::AudioClient& client,
56*ec779b8eSAndroid Build Coastguard Worker                                 const audio_attributes_t *attr,
57*ec779b8eSAndroid Build Coastguard Worker                                 audio_port_handle_t *clientHandle) override;
58*ec779b8eSAndroid Build Coastguard Worker 
59*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t stopClient(audio_port_handle_t clientHandle) override;
60*ec779b8eSAndroid Build Coastguard Worker 
getTypeText()61*ec779b8eSAndroid Build Coastguard Worker     const char *getTypeText() const override { return "MMAP"; }
62*ec779b8eSAndroid Build Coastguard Worker 
63*ec779b8eSAndroid Build Coastguard Worker protected:
64*ec779b8eSAndroid Build Coastguard Worker 
65*ec779b8eSAndroid Build Coastguard Worker     /**
66*ec779b8eSAndroid Build Coastguard Worker      * Stop the flow of data so that start() can resume without loss of data.
67*ec779b8eSAndroid Build Coastguard Worker      *
68*ec779b8eSAndroid Build Coastguard Worker      * This is not guaranteed to be synchronous but it currently is.
69*ec779b8eSAndroid Build Coastguard Worker      * An AAUDIO_SERVICE_EVENT_PAUSED will be sent to the client when complete.
70*ec779b8eSAndroid Build Coastguard Worker     */
71*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t pause_l() REQUIRES(mLock) override;
72*ec779b8eSAndroid Build Coastguard Worker 
73*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t stop_l() REQUIRES(mLock) override;
74*ec779b8eSAndroid Build Coastguard Worker 
75*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t standby_l() REQUIRES(mLock) override;
isStandbyImplemented()76*ec779b8eSAndroid Build Coastguard Worker     bool isStandbyImplemented() override {
77*ec779b8eSAndroid Build Coastguard Worker         return true;
78*ec779b8eSAndroid Build Coastguard Worker     }
79*ec779b8eSAndroid Build Coastguard Worker 
80*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t exitStandby_l(AudioEndpointParcelable* parcelable) REQUIRES(mLock) override;
81*ec779b8eSAndroid Build Coastguard Worker 
82*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t getAudioDataDescription_l(
83*ec779b8eSAndroid Build Coastguard Worker             AudioEndpointParcelable* parcelable) REQUIRES(mLock) override;
84*ec779b8eSAndroid Build Coastguard Worker 
85*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t getFreeRunningPosition_l(int64_t *positionFrames,
86*ec779b8eSAndroid Build Coastguard Worker             int64_t *timeNanos) REQUIRES(mLock) override;
87*ec779b8eSAndroid Build Coastguard Worker 
88*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t getHardwareTimestamp_l(
89*ec779b8eSAndroid Build Coastguard Worker             int64_t *positionFrames, int64_t *timeNanos) REQUIRES(mLock) override;
90*ec779b8eSAndroid Build Coastguard Worker 
91*ec779b8eSAndroid Build Coastguard Worker     int64_t nextDataReportTime_l() REQUIRES(mLock) override;
92*ec779b8eSAndroid Build Coastguard Worker 
93*ec779b8eSAndroid Build Coastguard Worker     void reportData_l() REQUIRES(mLock) override;
94*ec779b8eSAndroid Build Coastguard Worker 
95*ec779b8eSAndroid Build Coastguard Worker     /**
96*ec779b8eSAndroid Build Coastguard Worker      * Device specific startup.
97*ec779b8eSAndroid Build Coastguard Worker      * @return AAUDIO_OK or negative error.
98*ec779b8eSAndroid Build Coastguard Worker      */
99*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t startDevice_l() REQUIRES(mLock) override;
100*ec779b8eSAndroid Build Coastguard Worker 
101*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t startClient_l(const android::AudioClient& client,
102*ec779b8eSAndroid Build Coastguard Worker                                   const audio_attributes_t *attr,
103*ec779b8eSAndroid Build Coastguard Worker                                   audio_port_handle_t *clientHandle) REQUIRES(mLock) override;
104*ec779b8eSAndroid Build Coastguard Worker 
105*ec779b8eSAndroid Build Coastguard Worker     aaudio_result_t stopClient_l(audio_port_handle_t clientHandle) REQUIRES(mLock) override;
106*ec779b8eSAndroid Build Coastguard Worker 
107*ec779b8eSAndroid Build Coastguard Worker private:
108*ec779b8eSAndroid Build Coastguard Worker 
109*ec779b8eSAndroid Build Coastguard Worker     bool                     mInService = false;
110*ec779b8eSAndroid Build Coastguard Worker };
111*ec779b8eSAndroid Build Coastguard Worker 
112*ec779b8eSAndroid Build Coastguard Worker } // namespace aaudio
113*ec779b8eSAndroid Build Coastguard Worker 
114*ec779b8eSAndroid Build Coastguard Worker #endif //AAUDIO_AAUDIO_SERVICE_STREAM_MMAP_H
115