AudioStreamInternal.h revision 3316d5e6d375a4f09c681205e9094d30a0bfc4a2
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_AUDIOSTREAMINTERNAL_H
185ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#define AAUDIO_AUDIOSTREAMINTERNAL_H
19204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
20204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include <stdint.h>
215ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#include <aaudio/AAudio.h>
22204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
235ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#include "binding/IAAudioService.h"
24204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "binding/AudioEndpointParcelable.h"
25204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "client/IsochronousClockModel.h"
26204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "client/AudioEndpoint.h"
27204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "core/AudioStream.h"
28204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
29204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkusing android::sp;
305ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burkusing android::IAAudioService;
31204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
325ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burknamespace aaudio {
33204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
345ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk// A stream that talks to the AAudioService or directly to a HAL.
35204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkclass AudioStreamInternal : public AudioStream {
36204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
37204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkpublic:
38204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    AudioStreamInternal();
39204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    virtual ~AudioStreamInternal();
40204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
41204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    // =========== Begin ABSTRACT methods ===========================
425ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    virtual aaudio_result_t requestStart() override;
43204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
445ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    virtual aaudio_result_t requestPause() override;
45204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
465ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    virtual aaudio_result_t requestFlush() override;
47204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
485ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    virtual aaudio_result_t requestStop() override;
49204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
505ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    // TODO use aaudio_clockid_t all the way down to AudioClock
515ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    virtual aaudio_result_t getTimestamp(clockid_t clockId,
523316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk                                       int64_t *framePosition,
533316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk                                       int64_t *timeNanoseconds) override;
54204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
55204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
565ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    virtual aaudio_result_t updateState() override;
57204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    // =========== End ABSTRACT methods ===========================
58204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
595ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    virtual aaudio_result_t open(const AudioStreamBuilder &builder) override;
60204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
615ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    virtual aaudio_result_t close() override;
62204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
635ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    virtual aaudio_result_t write(const void *buffer,
64204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk                             int32_t numFrames,
653316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk                             int64_t timeoutNanoseconds) override;
66204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
675ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    virtual aaudio_result_t waitForStateChange(aaudio_stream_state_t currentState,
685ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk                                          aaudio_stream_state_t *nextState,
693316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk                                          int64_t timeoutNanoseconds) override;
70204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
713316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk    virtual aaudio_result_t setBufferSize(int32_t requestedFrames) override;
72204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
733316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk    virtual int32_t getBufferSize() const override;
74204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
753316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk    virtual int32_t getBufferCapacity() const override;
76204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
773316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk    virtual int32_t getFramesPerBurst() const override;
78204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
793316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk    virtual int64_t getFramesRead() override;
80204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
81204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    virtual int32_t getXRunCount() const override {
82204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        return mXRunCount;
83204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    }
84204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
855ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    virtual aaudio_result_t registerThread() override;
86204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
875ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    virtual aaudio_result_t unregisterThread() override;
88204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
89204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkprotected:
90204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
915ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    aaudio_result_t processCommands();
92204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
93204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk/**
94204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * Low level write that will not block. It will just write as much as it can.
95204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk *
96204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * It passed back a recommended time to wake up if wakeTimePtr is not NULL.
97204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk *
98204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * @return the number of frames written or a negative error code.
99204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk */
1005ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    virtual aaudio_result_t writeNow(const void *buffer,
101204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk                                int32_t numFrames,
1023316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk                                int64_t currentTimeNanos,
1033316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk                                int64_t *wakeTimePtr);
104204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
105204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    void onFlushFromServer();
106204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
1075ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    aaudio_result_t onEventFromServer(AAudioServiceMessage *message);
108204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
1095ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    aaudio_result_t onTimestampFromServer(AAudioServiceMessage *message);
110204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
111204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkprivate:
112204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    IsochronousClockModel    mClockModel;
113204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    AudioEndpoint            mAudioEndpoint;
1143316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk    aaudio_handle_t          mServiceStreamHandle;
115204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    EndpointDescriptor       mEndpointDescriptor;
116204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    // Offset from underlying frame position.
1173316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk    int64_t                  mFramesOffsetFromService = 0;
1183316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk    int64_t                  mLastFramesRead = 0;
1193316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk    int32_t                  mFramesPerBurst;
120204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    int32_t                  mXRunCount = 0;
121204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
1223316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk    void processTimestamp(uint64_t position, int64_t time);
123204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk};
124204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
1255ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk} /* namespace aaudio */
126204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
1275ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk#endif //AAUDIO_AUDIOSTREAMINTERNAL_H
128