• 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     virtual ~AAudioServiceEndpoint();
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(android::sp<AAudioServiceStreamBase> stream);
59 
60     aaudio_result_t unregisterStream(android::sp<AAudioServiceStreamBase> stream);
61 
62     virtual aaudio_result_t startStream(android::sp<AAudioServiceStreamBase> stream,
63                                         audio_port_handle_t *clientHandle) = 0;
64 
65     virtual aaudio_result_t stopStream(android::sp<AAudioServiceStreamBase> stream,
66                                        audio_port_handle_t clientHandle) = 0;
67 
startClient(const android::AudioClient & client,const audio_attributes_t * attr,audio_port_handle_t * clientHandle)68     virtual aaudio_result_t startClient(const android::AudioClient& client,
69                                         const audio_attributes_t *attr,
70                                         audio_port_handle_t *clientHandle) {
71         ALOGD("AAudioServiceEndpoint::startClient(...) AAUDIO_ERROR_UNAVAILABLE");
72         return AAUDIO_ERROR_UNAVAILABLE;
73     }
74 
stopClient(audio_port_handle_t clientHandle)75     virtual aaudio_result_t stopClient(audio_port_handle_t clientHandle) {
76         ALOGD("AAudioServiceEndpoint::stopClient(...) AAUDIO_ERROR_UNAVAILABLE");
77         return AAUDIO_ERROR_UNAVAILABLE;
78     }
79 
80     /**
81      * @param positionFrames
82      * @param timeNanos
83      * @return AAUDIO_OK or AAUDIO_ERROR_UNAVAILABLE or other negative error
84      */
85     virtual aaudio_result_t getFreeRunningPosition(int64_t *positionFrames, int64_t *timeNanos) = 0;
86 
87     /**
88      * Set time that the associated frame was presented to the hardware.
89      *
90      * @param positionFrames receive position, input value is ignored
91      * @param timeNanos receive time, input value is ignored
92      * @return AAUDIO_OK or AAUDIO_ERROR_UNAVAILABLE or other negative error
93      */
94     virtual aaudio_result_t getTimestamp(int64_t *positionFrames, int64_t *timeNanos) = 0;
95 
getFramesPerBurst()96     int32_t getFramesPerBurst() const {
97         return mFramesPerBurst;
98     }
99 
getRequestedDeviceId()100     int32_t getRequestedDeviceId() const { return mRequestedDeviceId; }
101 
102     bool matches(const AAudioStreamConfiguration& configuration);
103 
104     // This should only be called from the AAudioEndpointManager under a mutex.
getOpenCount()105     int32_t getOpenCount() const {
106         return mOpenCount;
107     }
108 
109     // This should only be called from the AAudioEndpointManager under a mutex.
setOpenCount(int32_t count)110     void setOpenCount(int32_t count) {
111         mOpenCount = count;
112     }
113 
isConnected()114     bool isConnected() const {
115         return mConnected;
116     }
117 
118     static audio_attributes_t getAudioAttributesFrom(const AAudioStreamParameters *params);
119 
120     // Stop, disconnect and release any streams registered on this endpoint.
121     void releaseRegisteredStreams();
122 
isForSharing()123     bool isForSharing() const {
124         return mForSharing;
125     }
126 
127     /**
128      *
129      * @param flag true if this endpoint is to be shared between multiple streams
130      */
setForSharing(bool flag)131     void setForSharing(bool flag) {
132         mForSharing = flag;
133     }
134 
135 protected:
136 
137     /**
138      * @param portHandle
139      * @return return true if a stream with the given portHandle is registered
140      */
141     bool                     isStreamRegistered(audio_port_handle_t portHandle);
142 
143     std::vector<android::sp<AAudioServiceStreamBase>> disconnectRegisteredStreams();
144 
145     mutable std::mutex       mLockStreams;
146     std::vector<android::sp<AAudioServiceStreamBase>> mRegisteredStreams
147             GUARDED_BY(mLockStreams);
148 
149     SimpleDoubleBuffer<Timestamp>  mAtomicEndpointTimestamp;
150 
151     android::AudioClient     mMmapClient;   // set in open, used in open and startStream
152 
153     int32_t                  mFramesPerBurst = 0;
154     int32_t                  mOpenCount = 0;
155     int32_t                  mRequestedDeviceId = 0;
156 
157     // True if this will be shared by one or more other streams.
158     bool                     mForSharing = false;
159 
160     std::atomic<bool>        mConnected{true};
161 
162 };
163 
164 } /* namespace aaudio */
165 
166 
167 #endif //AAUDIO_SERVICE_ENDPOINT_H
168