1c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk/* 2c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * Copyright (C) 2017 The Android Open Source Project 3c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * 4c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * Licensed under the Apache License, Version 2.0 (the "License"); 5c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * you may not use this file except in compliance with the License. 6c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * You may obtain a copy of the License at 7c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * 8c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * http://www.apache.org/licenses/LICENSE-2.0 9c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * 10c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * Unless required by applicable law or agreed to in writing, software 11c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * distributed under the License is distributed on an "AS IS" BASIS, 12c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * See the License for the specific language governing permissions and 14c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * limitations under the License. 15c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk */ 16c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 17c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#ifndef AAUDIO_SERVICE_ENDPOINT_H 18c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#define AAUDIO_SERVICE_ENDPOINT_H 19c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 20c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include <atomic> 21c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include <functional> 22c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include <mutex> 23c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include <vector> 24c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 25c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include "client/AudioStreamInternal.h" 2687c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk#include "client/AudioStreamInternalPlay.h" 2739f02ddfbfd9313370d862a6c4727826379a319aPhil Burk#include "core/AAudioStreamParameters.h" 28c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include "binding/AAudioServiceMessage.h" 2939f02ddfbfd9313370d862a6c4727826379a319aPhil Burk#include "binding/AAudioStreamConfiguration.h" 3039f02ddfbfd9313370d862a6c4727826379a319aPhil Burk 3139f02ddfbfd9313370d862a6c4727826379a319aPhil Burk#include "AAudioServiceStreamBase.h" 32c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 33c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burknamespace aaudio { 34c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 3539f02ddfbfd9313370d862a6c4727826379a319aPhil Burk/** 3639f02ddfbfd9313370d862a6c4727826379a319aPhil Burk * AAudioServiceEndpoint is used by a subclass of AAudioServiceStreamBase 3739f02ddfbfd9313370d862a6c4727826379a319aPhil Burk * to communicate with the underlying audio device or port. 3839f02ddfbfd9313370d862a6c4727826379a319aPhil Burk */ 3939f02ddfbfd9313370d862a6c4727826379a319aPhil Burkclass AAudioServiceEndpoint 4039f02ddfbfd9313370d862a6c4727826379a319aPhil Burk : public virtual android::RefBase 4139f02ddfbfd9313370d862a6c4727826379a319aPhil Burk , public AAudioStreamParameters { 42c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burkpublic: 43c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 4439f02ddfbfd9313370d862a6c4727826379a319aPhil Burk virtual ~AAudioServiceEndpoint(); 454501b3510f9b2af2ff63a0471de24e3feea1d0a8Phil Burk 4639f02ddfbfd9313370d862a6c4727826379a319aPhil Burk virtual std::string dump() const; 47c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 4839f02ddfbfd9313370d862a6c4727826379a319aPhil Burk virtual aaudio_result_t open(const aaudio::AAudioStreamRequest &request) = 0; 49c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 5039f02ddfbfd9313370d862a6c4727826379a319aPhil Burk virtual aaudio_result_t close() = 0; 51c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 5239f02ddfbfd9313370d862a6c4727826379a319aPhil Burk virtual aaudio_result_t registerStream(android::sp<AAudioServiceStreamBase> stream); 53c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 5439f02ddfbfd9313370d862a6c4727826379a319aPhil Burk virtual aaudio_result_t unregisterStream(android::sp<AAudioServiceStreamBase> stream); 55c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 5639f02ddfbfd9313370d862a6c4727826379a319aPhil Burk virtual aaudio_result_t startStream(android::sp<AAudioServiceStreamBase> stream, 5739f02ddfbfd9313370d862a6c4727826379a319aPhil Burk audio_port_handle_t *clientHandle) = 0; 58c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 5939f02ddfbfd9313370d862a6c4727826379a319aPhil Burk virtual aaudio_result_t stopStream(android::sp<AAudioServiceStreamBase> stream, 6039f02ddfbfd9313370d862a6c4727826379a319aPhil Burk audio_port_handle_t clientHandle) = 0; 61c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 6239f02ddfbfd9313370d862a6c4727826379a319aPhil Burk virtual aaudio_result_t startClient(const android::AudioClient& client, 6339f02ddfbfd9313370d862a6c4727826379a319aPhil Burk audio_port_handle_t *clientHandle) { 6439f02ddfbfd9313370d862a6c4727826379a319aPhil Burk ALOGD("AAudioServiceEndpoint::startClient(%p, ...) AAUDIO_ERROR_UNAVAILABLE", &client); 6539f02ddfbfd9313370d862a6c4727826379a319aPhil Burk return AAUDIO_ERROR_UNAVAILABLE; 6671f35bb687476694882a617ba4a810a0bb56fe23Phil Burk } 6771f35bb687476694882a617ba4a810a0bb56fe23Phil Burk 6839f02ddfbfd9313370d862a6c4727826379a319aPhil Burk virtual aaudio_result_t stopClient(audio_port_handle_t clientHandle) { 6939f02ddfbfd9313370d862a6c4727826379a319aPhil Burk ALOGD("AAudioServiceEndpoint::stopClient(...) AAUDIO_ERROR_UNAVAILABLE"); 7039f02ddfbfd9313370d862a6c4727826379a319aPhil Burk return AAUDIO_ERROR_UNAVAILABLE; 7171f35bb687476694882a617ba4a810a0bb56fe23Phil Burk } 7271f35bb687476694882a617ba4a810a0bb56fe23Phil Burk 7339f02ddfbfd9313370d862a6c4727826379a319aPhil Burk /** 7439f02ddfbfd9313370d862a6c4727826379a319aPhil Burk * @param positionFrames 7539f02ddfbfd9313370d862a6c4727826379a319aPhil Burk * @param timeNanos 7639f02ddfbfd9313370d862a6c4727826379a319aPhil Burk * @return AAUDIO_OK or AAUDIO_ERROR_UNAVAILABLE or other negative error 7739f02ddfbfd9313370d862a6c4727826379a319aPhil Burk */ 7839f02ddfbfd9313370d862a6c4727826379a319aPhil Burk virtual aaudio_result_t getFreeRunningPosition(int64_t *positionFrames, int64_t *timeNanos) = 0; 7939f02ddfbfd9313370d862a6c4727826379a319aPhil Burk 8039f02ddfbfd9313370d862a6c4727826379a319aPhil Burk virtual aaudio_result_t getTimestamp(int64_t *positionFrames, int64_t *timeNanos) = 0; 8139f02ddfbfd9313370d862a6c4727826379a319aPhil Burk 8239f02ddfbfd9313370d862a6c4727826379a319aPhil Burk int32_t getFramesPerBurst() const { 8339f02ddfbfd9313370d862a6c4727826379a319aPhil Burk return mFramesPerBurst; 8439f02ddfbfd9313370d862a6c4727826379a319aPhil Burk } 8539f02ddfbfd9313370d862a6c4727826379a319aPhil Burk 8639f02ddfbfd9313370d862a6c4727826379a319aPhil Burk int32_t getRequestedDeviceId() const { return mRequestedDeviceId; } 8797350f9df7252c881f011a410fcd9e6d766d2beePhil Burk 88a17ae74e3570a5afa2ece02d2b4090ba7b731bc1Eric Laurent bool matches(const AAudioStreamConfiguration& configuration); 89a17ae74e3570a5afa2ece02d2b4090ba7b731bc1Eric Laurent 9039f02ddfbfd9313370d862a6c4727826379a319aPhil Burk // This should only be called from the AAudioEndpointManager under a mutex. 9139f02ddfbfd9313370d862a6c4727826379a319aPhil Burk int32_t getOpenCount() const { 9239f02ddfbfd9313370d862a6c4727826379a319aPhil Burk return mOpenCount; 9339f02ddfbfd9313370d862a6c4727826379a319aPhil Burk } 9439f02ddfbfd9313370d862a6c4727826379a319aPhil Burk 9539f02ddfbfd9313370d862a6c4727826379a319aPhil Burk // This should only be called from the AAudioEndpointManager under a mutex. 9639f02ddfbfd9313370d862a6c4727826379a319aPhil Burk void setOpenCount(int32_t count) { 9739f02ddfbfd9313370d862a6c4727826379a319aPhil Burk mOpenCount = count; 9839f02ddfbfd9313370d862a6c4727826379a319aPhil Burk } 99c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 10039f02ddfbfd9313370d862a6c4727826379a319aPhil Burkprotected: 10139f02ddfbfd9313370d862a6c4727826379a319aPhil Burk void disconnectRegisteredStreams(); 102c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 1034501b3510f9b2af2ff63a0471de24e3feea1d0a8Phil Burk mutable std::mutex mLockStreams; 10439f02ddfbfd9313370d862a6c4727826379a319aPhil Burk std::vector<android::sp<AAudioServiceStreamBase>> mRegisteredStreams; 10587c9f646a94259d7c321c3b3d5947fa1778f5ac2Phil Burk 10639f02ddfbfd9313370d862a6c4727826379a319aPhil Burk SimpleDoubleBuffer<Timestamp> mAtomicTimestamp; 10711e8d335b1da528ee771b19b63df23ae6fd52f41Phil Burk 10839f02ddfbfd9313370d862a6c4727826379a319aPhil Burk android::AudioClient mMmapClient; // set in open, used in open and startStream 10971f35bb687476694882a617ba4a810a0bb56fe23Phil Burk 11039f02ddfbfd9313370d862a6c4727826379a319aPhil Burk int32_t mFramesPerBurst = 0; 11139f02ddfbfd9313370d862a6c4727826379a319aPhil Burk int32_t mOpenCount = 0; 112ec89b2e2f8c84a7d3936db1a888034f4a4b0df16Phil Burk int32_t mRequestedDeviceId = 0; 11339f02ddfbfd9313370d862a6c4727826379a319aPhil Burk 114c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk}; 115c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 116c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk} /* namespace aaudio */ 117c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 118c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 119c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#endif //AAUDIO_SERVICE_ENDPOINT_H 120