AudioEndpoint.h revision c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fb
1204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk/*
2204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * Copyright (C) 2016 The Android Open Source Project
3204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk *
4204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * Licensed under the Apache License, Version 2.0 (the "License");
5204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * you may not use this file except in compliance with the License.
6204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * You may obtain a copy of the License at
7204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk *
8204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk *      http://www.apache.org/licenses/LICENSE-2.0
9204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk *
10204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * Unless required by applicable law or agreed to in writing, software
11204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * distributed under the License is distributed on an "AS IS" BASIS,
12204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * See the License for the specific language governing permissions and
14204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * limitations under the License.
15204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk */
16204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
175ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#ifndef AAUDIO_AUDIO_ENDPOINT_H
185ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#define AAUDIO_AUDIO_ENDPOINT_H
19204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
205ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#include <aaudio/AAudio.h>
21204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
22c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include "binding/AAudioServiceMessage.h"
23c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#include "binding/AudioEndpointParcelable.h"
24204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "fifo/FifoBuffer.h"
25204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
265ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burknamespace aaudio {
27204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
28c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk#define ENDPOINT_DATA_QUEUE_SIZE_MIN   48
29204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
30204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk/**
31204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * A sink for audio.
32204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * Used by the client code.
33204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk */
34204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkclass AudioEndpoint {
35204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
36204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkpublic:
37204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    AudioEndpoint();
38204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    virtual ~AudioEndpoint();
39204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
40204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    /**
41204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk     * Configure based on the EndPointDescriptor_t.
42204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk     */
435ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    aaudio_result_t configure(const EndpointDescriptor *pEndpointDescriptor);
44204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
45204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    /**
46204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk     * Read from a command passed up from the Server.
47204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk     * @return 1 if command received, 0 for no command, or negative error.
48204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk     */
495ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    aaudio_result_t readUpCommand(AAudioServiceMessage *commandPtr);
50204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
51204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    /**
52204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk     * Non-blocking write.
53204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk     * @return framesWritten or a negative error code.
54204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk     */
555ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    aaudio_result_t writeDataNow(const void *buffer, int32_t numFrames);
56204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
57c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    void getEmptyRoomAvailable(android::WrappingBuffer *wrappingBuffer);
58c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk
59c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    void advanceWriteIndex(int32_t deltaFrames);
60c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk
61204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    /**
62204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk     * Set the read index in the downData queue.
63204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk     * This is needed if the reader is not updating the index itself.
64204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk     */
65c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    void setDownDataReadCounter(android::fifo_counter_t framesRead);
66c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    android::fifo_counter_t getDownDataReadCounter();
67204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
68c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    void setDownDataWriteCounter(android::fifo_counter_t framesWritten);
69c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    android::fifo_counter_t getDownDataWriteCounter();
70204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
71204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    /**
72204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk     * The result is not valid until after configure() is called.
73204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk     *
74204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk     * @return true if the output buffer read position is not updated, eg. DMA
75204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk     */
76204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    bool isOutputFreeRunning() const { return mOutputFreeRunning; }
77204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
783316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk    int32_t setBufferSizeInFrames(int32_t requestedFrames,
793316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk                                  int32_t *actualFrames);
803316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk    int32_t getBufferSizeInFrames() const;
81204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
823316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk    int32_t getBufferCapacityInFrames() const;
83204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
843316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk    int32_t getFullFramesAvailable();
85204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
86204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkprivate:
87c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    android::FifoBuffer    *mUpCommandQueue;
88c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    android::FifoBuffer    *mDownDataQueue;
89c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    bool                    mOutputFreeRunning;
90c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    android::fifo_counter_t mDataReadCounter; // only used if free-running
91c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    android::fifo_counter_t mDataWriteCounter; // only used if free-running
92204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk};
93204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
945ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk} // namespace aaudio
95204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
965ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#endif //AAUDIO_AUDIO_ENDPOINT_H
97