• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 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 
17 #ifndef AAUDIO_SERVICE_ENDPOINT_H
18 #define AAUDIO_SERVICE_ENDPOINT_H
19 
20 #include <atomic>
21 #include <functional>
22 #include <mutex>
23 #include <vector>
24 
25 #include <android-base/thread_annotations.h>
26 
27 #include "client/AudioStreamInternal.h"
28 #include "client/AudioStreamInternalPlay.h"
29 #include "core/AAudioStreamParameters.h"
30 #include "binding/AAudioServiceMessage.h"
31 #include "binding/AAudioStreamConfiguration.h"
32 
33 #include "AAudioServiceStreamBase.h"
34 
35 namespace aaudio {
36 
37 /**
38  * AAudioServiceEndpoint is used by a subclass of AAudioServiceStreamBase
39  * to communicate with the underlying audio device or port.
40  */
41 class AAudioServiceEndpoint
42         : public virtual android::RefBase
43         , public AAudioStreamParameters {
44 public:
45 
46     ~AAudioServiceEndpoint() override;
47 
48     virtual std::string dump() const;
49 
50     virtual aaudio_result_t open(const aaudio::AAudioStreamRequest &request) = 0;
51 
52     /*
53      * Perform any cleanup necessary before deleting the stream.
54      * This might include releasing and closing internal streams.
55      */
56     virtual void close() = 0;
57 
58     aaudio_result_t registerStream(const android::sp<AAudioServiceStreamBase>& stream)
59             EXCLUDES(mLockStreams);
60 
61     aaudio_result_t unregisterStream(const android::sp<AAudioServiceStreamBase>& stream)
62             EXCLUDES(mLockStreams);
63 
64     virtual aaudio_result_t startStream(android::sp<AAudioServiceStreamBase> stream,
65                                         audio_port_handle_t *clientHandle) = 0;
66 
67     virtual aaudio_result_t stopStream(android::sp<AAudioServiceStreamBase> stream,
68                                        audio_port_handle_t clientHandle) = 0;
69 
startClient(const android::AudioClient &,const audio_attributes_t *,audio_port_handle_t *)70     virtual aaudio_result_t startClient(const android::AudioClient& /*client*/,
71                                         const audio_attributes_t* /*attr*/,
72                                         audio_port_handle_t* /*clientHandle*/) {
73         ALOGD("AAudioServiceEndpoint::startClient(...) AAUDIO_ERROR_UNAVAILABLE");
74         return AAUDIO_ERROR_UNAVAILABLE;
75     }
76 
stopClient(audio_port_handle_t)77     virtual aaudio_result_t stopClient(audio_port_handle_t /*clientHandle*/) {
78         ALOGD("AAudioServiceEndpoint::stopClient(...) AAUDIO_ERROR_UNAVAILABLE");
79         return AAUDIO_ERROR_UNAVAILABLE;
80     }
81 
standby()82     virtual aaudio_result_t standby() {
83         ALOGD("AAudioServiceEndpoint::standby() AAUDIO_ERROR_UNAVAILABLE");
84         return AAUDIO_ERROR_UNAVAILABLE;
85     }
86 
exitStandby(AudioEndpointParcelable *)87     virtual aaudio_result_t exitStandby(AudioEndpointParcelable* /*parcelable*/) {
88         ALOGD("AAudioServiceEndpoint::exitStandby() AAUDIO_ERROR_UNAVAILABLE");
89         return AAUDIO_ERROR_UNAVAILABLE;
90     }
91 
92     /**
93      * @param positionFrames
94      * @param timeNanos
95      * @return AAUDIO_OK or AAUDIO_ERROR_UNAVAILABLE or other negative error
96      */
97     virtual aaudio_result_t getFreeRunningPosition(int64_t *positionFrames, int64_t *timeNanos) = 0;
98 
99     /**
100      * Set time that the associated frame was presented to the hardware.
101      *
102      * @param positionFrames receive position, input value is ignored
103      * @param timeNanos receive time, input value is ignored
104      * @return AAUDIO_OK or AAUDIO_ERROR_UNAVAILABLE or other negative error
105      */
106     virtual aaudio_result_t getTimestamp(int64_t *positionFrames, int64_t *timeNanos) = 0;
107 
getFramesPerBurst()108     int32_t getFramesPerBurst() const {
109         return mFramesPerBurst;
110     }
111 
getRequestedDeviceId()112     int32_t getRequestedDeviceId() const { return mRequestedDeviceId; }
113 
114     bool matches(const AAudioStreamConfiguration& configuration);
115 
116     // This should only be called from the AAudioEndpointManager under a mutex.
getOpenCount()117     int32_t getOpenCount() const {
118         return mOpenCount;
119     }
120 
121     // This should only be called from the AAudioEndpointManager under a mutex.
setOpenCount(int32_t count)122     void setOpenCount(int32_t count) {
123         mOpenCount = count;
124     }
125 
isConnected()126     bool isConnected() const {
127         return mConnected;
128     }
129 
130     static audio_attributes_t getAudioAttributesFrom(const AAudioStreamParameters *params);
131 
132     // Stop, disconnect and release any streams registered on this endpoint.
133     void releaseRegisteredStreams();
134 
isForSharing()135     bool isForSharing() const {
136         return mForSharing;
137     }
138 
139     /**
140      *
141      * @param flag true if this endpoint is to be shared between multiple streams
142      */
setForSharing(bool flag)143     void setForSharing(bool flag) {
144         mForSharing = flag;
145     }
146 
147 protected:
148 
149     /**
150      * @param portHandle
151      * @return return true if a stream with the given portHandle is registered
152      */
153     bool                     isStreamRegistered(audio_port_handle_t portHandle)
154                                     EXCLUDES(mLockStreams);
155 
156     std::vector<android::sp<AAudioServiceStreamBase>> disconnectRegisteredStreams()
157             EXCLUDES(mLockStreams);
158 
159     mutable std::mutex       mLockStreams;
160     std::vector<android::sp<AAudioServiceStreamBase>> mRegisteredStreams
161             GUARDED_BY(mLockStreams);
162 
163     SimpleDoubleBuffer<Timestamp>  mAtomicEndpointTimestamp;
164 
165     android::AudioClient     mMmapClient;   // set in open, used in open and startStream
166 
167     int32_t                  mFramesPerBurst = 0;
168     int32_t                  mOpenCount = 0;
169     int32_t                  mRequestedDeviceId = 0;
170 
171     // True if this will be shared by one or more other streams.
172     bool                     mForSharing = false;
173 
174     std::atomic<bool>        mConnected{true};
175 
176 };
177 
178 } /* namespace aaudio */
179 
180 
181 #endif //AAUDIO_SERVICE_ENDPOINT_H
182