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