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