AudioStreamInternal.h revision 5204d315c6c6f53188f8d1414dd1b55b6c90142b
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
175204d315c6c6f53188f8d1414dd1b55b6c90142bPhil Burk#ifndef ANDROID_AAUDIO_AUDIO_STREAM_INTERNAL_H
185204d315c6c6f53188f8d1414dd1b55b6c90142bPhil Burk#define ANDROID_AAUDIO_AUDIO_STREAM_INTERNAL_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"
25e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk#include "binding/AAudioServiceInterface.h"
26204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "client/IsochronousClockModel.h"
27204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "client/AudioEndpoint.h"
28204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk#include "core/AudioStream.h"
29e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk#include "utility/LinearRamp.h"
30c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk
31204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkusing android::sp;
325ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burkusing android::IAAudioService;
33204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
345ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burknamespace aaudio {
35204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
365ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk// A stream that talks to the AAudioService or directly to a HAL.
37204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkclass AudioStreamInternal : public AudioStream {
38204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
39204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkpublic:
40c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    AudioStreamInternal(AAudioServiceInterface  &serviceInterface, bool inService = false);
41204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    virtual ~AudioStreamInternal();
42204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
43204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    // =========== Begin ABSTRACT methods ===========================
44c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    aaudio_result_t requestStart() override;
45204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
46c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    aaudio_result_t requestPause() override;
47204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
48c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    aaudio_result_t requestFlush() override;
49204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
50c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    aaudio_result_t requestStop() override;
51204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
52c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    aaudio_result_t getTimestamp(clockid_t clockId,
533316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk                                       int64_t *framePosition,
543316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk                                       int64_t *timeNanoseconds) override;
55204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
56e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk    virtual aaudio_result_t updateStateWhileWaiting() override;
57204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    // =========== End ABSTRACT methods ===========================
58204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
59c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    aaudio_result_t open(const AudioStreamBuilder &builder) override;
60204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
61c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    aaudio_result_t close() override;
62204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
63c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    aaudio_result_t write(const void *buffer,
64204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk                             int32_t numFrames,
653316d5e6d375a4f09c681205e9094d30a0bfc4a2Phil Burk                             int64_t timeoutNanoseconds) override;
66204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
67c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    aaudio_result_t setBufferSize(int32_t requestedFrames) override;
68204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
69c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    int32_t getBufferSize() const override;
70204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
71c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    int32_t getBufferCapacity() const override;
72204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
73c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    int32_t getFramesPerBurst() const override;
74204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
75c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    int64_t getFramesRead() override;
764c5129b410884ec0400cbe65fce56d0ade12d11bPhil Burk    int64_t getFramesWritten() override;
77204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
78c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    int32_t getXRunCount() const override {
79204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk        return mXRunCount;
80204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    }
81204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
82c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    aaudio_result_t registerThread() override;
83204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
84c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    aaudio_result_t unregisterThread() override;
85204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
86e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk    // Called internally from 'C'
87e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk    void *callbackLoop();
88e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk
89e2fbb59e729f6c3cade3b531f6f6411417ccbf40Phil Burk
90e2fbb59e729f6c3cade3b531f6f6411417ccbf40Phil Burk    bool isMMap() override {
91e2fbb59e729f6c3cade3b531f6f6411417ccbf40Phil Burk        return true;
92e2fbb59e729f6c3cade3b531f6f6411417ccbf40Phil Burk    }
93e2fbb59e729f6c3cade3b531f6f6411417ccbf40Phil Burk
94204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkprotected:
95204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
965ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    aaudio_result_t processCommands();
97204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
98e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk    aaudio_result_t requestPauseInternal();
9971f35bb687476694882a617ba4a810a0bb56fe23Phil Burk    aaudio_result_t requestStopInternal();
100e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk
101e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk    aaudio_result_t stopCallback();
102e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk
103204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk/**
104204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * Low level write that will not block. It will just write as much as it can.
105204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk *
106204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * It passed back a recommended time to wake up if wakeTimePtr is not NULL.
107204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk *
108204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk * @return the number of frames written or a negative error code.
109204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk */
110c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    aaudio_result_t writeNow(const void *buffer,
111c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk                                     int32_t numFrames,
112c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk                                     int64_t currentTimeNanos,
113c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk                                     int64_t *wakeTimePtr);
114204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
115204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    void onFlushFromServer();
116204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
1175ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    aaudio_result_t onEventFromServer(AAudioServiceMessage *message);
118204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
1195ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk    aaudio_result_t onTimestampFromServer(AAudioServiceMessage *message);
120204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
121e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk    // Calculate timeout for an operation involving framesPerOperation.
122e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk    int64_t calculateReasonableTimeout(int32_t framesPerOperation);
123e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk
124204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burkprivate:
125c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    /*
126c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk     * Asynchronous write with data conversion.
127c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk     * @param buffer
128c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk     * @param numFrames
129c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk     * @return fdrames written or negative error
130c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk     */
131c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    aaudio_result_t writeNowWithConversion(const void *buffer,
132c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk                                     int32_t numFrames);
133c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    void processTimestamp(uint64_t position, int64_t time);
134c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk
13571f35bb687476694882a617ba4a810a0bb56fe23Phil Burk
13671f35bb687476694882a617ba4a810a0bb56fe23Phil Burk    const char *getLocationName() const {
13771f35bb687476694882a617ba4a810a0bb56fe23Phil Burk        return mInService ? "SERVICE" : "CLIENT";
13871f35bb687476694882a617ba4a810a0bb56fe23Phil Burk    }
13971f35bb687476694882a617ba4a810a0bb56fe23Phil Burk
140c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    // Adjust timing model based on timestamp from service.
141c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk
142c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    IsochronousClockModel    mClockModel;      // timing model for chasing the HAL
143c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    AudioEndpoint            mAudioEndpoint;   // sink for writes
144c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    aaudio_handle_t          mServiceStreamHandle; // opaque handle returned from service
145c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk
146c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    AudioEndpointParcelable  mEndPointParcelable; // description of the buffers filled by service
147c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    EndpointDescriptor       mEndpointDescriptor; // buffer description with resolved addresses
148c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk
149c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    aaudio_audio_format_t    mDeviceFormat = AAUDIO_FORMAT_UNSPECIFIED;
150c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk
151e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk    uint8_t                 *mCallbackBuffer = nullptr;
152e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk    int32_t                  mCallbackFrames = 0;
153e4d7bb418df0fdc4c708c334ba3601f5ed8d89b3Phil Burk
154204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk    // Offset from underlying frame position.
155c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    int64_t                  mFramesOffsetFromService = 0; // offset for timestamps
156c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    int64_t                  mLastFramesRead = 0; // used to prevent retrograde motion
157c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    int32_t                  mFramesPerBurst;     // frames per HAL transfer
158c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    int32_t                  mXRunCount = 0;      // how many underrun events?
159e572f469de5dca1078a79d3d80e5b04f96ae7505Phil Burk    LinearRamp               mVolumeRamp;
160c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk
161c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    AAudioServiceInterface  &mServiceInterface;   // abstract interface to the service
162c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk
163c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    // The service uses this for SHARED mode.
164c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk    bool                     mInService = false;  // Are running in the client or the service?
165204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk};
166204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
1675ed503c7a66c90f93759c90237a9b432dbd93f9fPhil Burk} /* namespace aaudio */
168204a163c86f357a878873fe7d4c4164f3d55c9b6Phil Burk
1695204d315c6c6f53188f8d1414dd1b55b6c90142bPhil Burk#endif //ANDROID_AAUDIO_AUDIO_STREAM_INTERNAL_H
170